Bascom - krótka instrukcja, przekroczony rozmiar pamięci

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Bascom - krótka instrukcja, przekroczony rozmiar pamięci

Post autor: matrix » 14 lip 2010, 8:07

słuchajcie, mam mały zgryz. otóż chciałem sobie napisać prosty program na attiny2313 do zamiany kodu RC5 na SONYSEND, który wyglądać miał mniej więcej tak:

Kod: Zaznacz cały

odbior:
 home
 shift command , left , 3

  incr wysylanie
  select case wysylanie
   case 5:
    sonysend &HA91                 ' Power 1010 1001 0001
   case 10:
    sonysend &H4D1                 'Play  0100 1101 0001
   case 15:
    sonysend &H1D1                 'Stop  0001 1101 0001
   case 20:
    sonysend &H9D1                 'Pause  1001 1101 0001
   case 30:
    sonysend &HB91                 'Continue  1011 1001 0001
   case 35:
    sonysend &HAD1                 'Shuffle  1010 1101 0001
   case 40:
    sonysend &HF91                 'Program  1111 1001 0001
   case 45:
    sonysend &H531                 'Disc  0101 0011 0001
   case 50:
    sonysend &H011                 '1  0000 0001 0001
   case 55:
    sonysend &H811                 '2  1000 0001 0001
   case 60:
    sonysend &H411                 '3  0100 0001 0001
   case 65:
    sonysend &HC11                 '4  1100 0001 0001
   case 70:
    sonysend &H211                 '5  0010 0001 0001
   case 75:
    sonysend &HA11                 '6  1010 0001 0001
   case 80:
    sonysend &H611                 '7  0110 0001 0001
   case 85:
    sonysend &HE11                 '8  1110 0001 0001
   case 90:
    sonysend &H111                 '9  0001 0001 0001
   case 95:
    sonysend &H051                 '0  0000 0101 0001
   case 100:
    sonysend &HE51                 '>10  1110 0101 0001
   case 105:
    sonysend &HD11                 'Enter  1101 0001 0001
   case 110:
    sonysend &HF11                 'Clear  1111 0001 0001
   case 115:
    sonysend &H351                 'Repeat  0011 0101 0001
   case 120:
    sonysend &HBD1                 'Disc -  1011 1101 0001
   case 125:
    sonysend &H7D1                 'Disc +  0111 1101 0001
   case 130:
    sonysend &H0D1                 '|<<  0000 1101 0001
   case 135:
    sonysend &H8D1                 '>>|  1000 1101 0001
   case 140:
    sonysend &HCD1                 '<<  1100 1101 0001
   case 145:
    sonysend &H2D1                 '>>  0010 1101 0001
   end select

return
ale mam dwa problemy:
1 - rozmiar wykorzystywanej pamięci przy takim kodzie to aż 235% procka
2 - wywala masę błędów o nazwie duplitate label sonysend w liniach select case

możecie mi wyjaśnić ocb? przed select case jest tylko deklaracja zmiennych:
- address
- command
- wysylanie
jako zmienne typu byte.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 14 lip 2010, 12:17

Tak się nie konwertuje jednego kodu w drugi.
Robi się to za pomocą tablicy stałych umieszczonej w pamięci programu lub wygodniej EEPROM CPU, co ma o wiele więcej zalet, jak:
- szybsze wykonywanie kodu, nie ma żadnego Case ani Ifa bo wykorzystuje sie adresowanie.
- mniejszy kod wynikowy
- łatwiejsze wprowadzanie zmian do konwertera, bo zmieniasz tylko maskę kodów w pamięci.
A dla czego taki kosmiczny rozmiar po kompilacji :?: To proste kompilator BASCOM widocznie nie traktuje wywołana SONYSend jako skoku do procedury (podprogramu) tylko jako kod który trzeba wstawić pod każdym Case wiec kopiuje go tyle razy ile masz Casów.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 14 lip 2010, 12:55

kayron pisze:Tak się nie konwertuje jednego kodu w drugi.
Robi się to za pomocą tablicy stałych umieszczonej w pamięci programu
miałem tak zrobić, ale chciałem na szybko wpisać kody żeby zobaczyć czy radio mi zareaguje w samochodzie?
w pętli głównej jest wywołanie procedury wysyłania co 500ms, więc wysyłało by mi te kody co pół sek.

jak pisałem, chodziło mi tylko o sprawdzenie na szybko czy radio w samochodzie zareaguje? jak widać na szybko nic z tego nie wyszło.

ODPOWIEDZ