Dzień dobry
Postanowiłem zgłosić się z problemem odnośnie przykładu 04_LCD książki Pana Mirka (wydanie z DVD z 2011 roku), z którym mierzę się od dłuższego czasu. Pomimo iż problemów tego rodzaju sam znalazłem sporo, to postanowiłem, że muszę o tym napisać z dwóch przyczyn:
1) Pozostałe wątki na ten temat są różnej daty, a najnowszy toolchain (ja osobiście mam tego, który był proponowany przez Pana Mirka przy okazji obszernego poradnika video do Eclipse Mars - chyba że umknął mi jeszcze nowszy toolchain) który z przykładami programów ze starszego DVD (jak np. to moje z 2011 roku) trochę się "gryzie"... Ale o tym za chwilę
2) Przykład 04_LCD był docelowo przeznaczony na ATMega32. Wiadomym jest, że w kodzie może być w związku z tym poprawek raczej niewiele (np. kwestia dopasowania portów i pinów) i tutaj swój ewentualny problem raczej wykluczam i wskazywałbym raczej, jak wspomniałem wyżej, na dopasowanie kodu do aktualnego toolchain'a. Jednak na wszelki wypadek wolałem o tym napisać - może wyjdzie na jaw jakiś niuans, o którym zapominam.
Dodam na marginesie, że udało mi się uruchomić inny program (może to nieeleganckie, ale pozwolę się do niego odnieść - jest on tutaj:
http://mikrokontrolery.net/avr_c_08.htm), który jest krótszy. Lecz z oczywistych względów czuję potrzebę bazowania na przykładzie Pana Mirka z oczywistych względów (chociażby na tym, że uczy stworzenia własnej biblioteki do LCD).
Jednak forsowanie się z przykładem z DVD to troszkę inna bajka i postaram się opisać krok po kroku, co wykonuję. Możliwe, że się mocno obnażę z brakami wiedzy i dziwacznym podejściem do tej tematyki, ale może przynajmniej utnę wszelkie ewentualne niejasności związane z tematyką "początków na LCD" i zamkną się one na tym temacie:
1) Mam przygotowane LCD i mikrokontroler do pracy. Piny LCD podłączyłem tak: D7-D4 odpowiednio do PD7-PD4 mikrokontrolera. Pin E zaś do PD3, RS do PD2 i RW do PD1. Czyli wszystko na porcie D.
2) Sięgam po przykład 04_LCD. Ustawiam w Properties z "ATmega32" na "ATmega8" i zmieniam taktowanie na 8 MHz.
3) Mając świadomość, że przykład ten jest on dużo starszy niż toolchain, sięgam też po poprawkę do tego przykładu (cytuję: (...)aktualizacje dla biblioteki wyświetlacza LCD - dotyczy wszystkich wydań książki. W bibliotece poprawiono tylko funkcję inicjalizacji wyświetlacza LCD w związku z problemami jego inicjalizacji gdy mikrokontroler był taktowany częstotliwością poniżej 8MHz. W obecnej wersji biblioteka zachowuje się poprawnie przy każdej wartości taktowania(...).) Przypuszczam, że to była jedna jedyna poprawka, jaka wyszła do tego akurat przykładu, więc podmieniam umieszczony w niej również jedyny plik lcd44780.c z tym, który mam w starym przykładzie.
4) Teraz studiując kod programu w przykładzie sprawdzam, co muszę zmienić w związku z tym, że mam inną konfigurację pinów i portów na płytce stykowej niż w przykładzie i dostrzegam, że ten oto fragment (w bibliotece lcd44780.h):
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
podmieniam na taki:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
czyli zamieniam port B na port D i dopasowuję odpowiednio piny sterujące. Dalej innych koniecznych poprawek w kodzie odnośnie konfiguracji pinów niestety nie dostrzegam (tutaj może być mój pierwszy błąd).
5) Teraz, mając na względzie podane przez Pana Mirka informacje stąd:
http://mirekk36.blogspot.com/2012/08/ec ... zytaj.htmlmówiące o wprowadzonym bezwzględnym zakazie definiowania zmiennych w pamięci FLASH, postanowiłem z pomocą w/w artykułu poszukać we wszystkich 3 plikach (tj. lcd44780.h, lcd44780.c - już tym nowym, po podmianie - oraz main.c), w których miejscach kodu trzeba tą kwestię załatwić.
Wyciąg błędów (zakładka Console):
Kod:
15:29:22 **** Clean-only build of configuration Release for project 04_LCD ****
make clean
rm -rf ./main.o ./LCD/lcd44780.o ./main.d ./LCD/lcd44780.d 04_LCD.eep 04_LCD.hex 04_LCD.lss sizedummy 04_LCD.elf
' '
15:29:22 Build Finished (took 329ms)
15:29:22 **** Build of configuration Release for project 04_LCD ****
make all
'Building file: ../LCD/lcd44780.c'
'Invoking: AVR Compiler'
avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=8000000UL -MMD -MP -MF"LCD/lcd44780.d" -MT"LCD/lcd44780.o" -c -o "LCD/lcd44780.o" "../LCD/lcd44780.c"
'Finished building: ../LCD/lcd44780.c'
' '
'Building file: ../main.c'
'Invoking: AVR Compiler'
avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=8000000UL -MMD -MP -MF"main.d" -MT"main.o" -c -o "main.o" "../main.c"
../main.c:17:14: error: variable 'tab1' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char PROGMEM tab1[] = {"FLASH"};
^
../main.c:22:9: error: variable 'znak_buzka' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
uint8_t znak_buzka[] PROGMEM = {14,17,27,17,17,21,17,14}; // wzór znaku buźki w pamięci FLASH
^
../main.c:23:9: error: variable 'znak_termo' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
uint8_t znak_termo[] PROGMEM = {4,10,10,10,17,31,31,14}; // wzór znaku termometru w pamięci FLASH
^
../main.c: In function 'main':
../main.c:36:2: warning: passing argument 1 of 'lcd_str_P' discards 'const' qualifier from pointer target type [enabled by default]
lcd_str_P( PSTR("Linia1") ); // napis z pamięci FLASH
^
In file included from ../main.c:11:0:
../LCD/lcd44780.h:172:6: note: expected 'char *' but argument is of type 'const char *'
void lcd_str_P(char * str); // domyślnie wyłączona z kompilacji w pliku lcd.c
^
make: *** [main.o] Error 1
15:29:23 Build Finished (took 1s.65ms)
a) Pierwsze, co widzę (w zasadzie jest to ostatnia rzecz na liście błędów, ale rzuciła mi się w oczy najprędzej) to że trzeba dopisać "const" w tym oto miejscu w pliku .h:

No więc dopisuję "const" tuż przed słowem "char" we wskazanym miejscu.
b) Jeszcze nie robię kompilacji, bo choć w pliku lcd44780.c nie znajduję żadnego niepokojącego komunikatu, to już w pliku main.c objawia mi się coś następującego:

Porównując to z komunikatami z zakładki Console oraz artykułem Pana Mirka wnioskuję, że przed tym "char PROGMEM..." na zdjęciu też przydałoby się "const". Ale co z pozostałymi problemami? Co do tej ostatniej zaznaczonej przeze mnie na zdjęciu linijki z PSTR, wyławiam z artykułu Pana Mirka taki oto fragment:

i odnajduję w pliku lcd44780.c taki oto fragment:

gdzie dopisuję również "const" przed "char". Ale co z "uint8_t znak_buzka..." i "uint8_t znak_termo..."? Gdybym się szaleńczo uparł i przed tymi dwoma linijkami też ustawił "const", to program skompilować... się skompiluje, ale nie wyświetli niczego (tylko "mrugnie" do mnie podświetleniem)...
O czym więc zapominam? Przepraszam za dość łopatologiczne rozłożenie tematu na czynniki pierwsze, ale postanowiłem, że może chociaż tym uda mi się zmazać braki w przygotowaniu do tego zadania, z którymi wciąż się zmagam, a które przez owy problem są nadal dla mnie nieosiągalne.
Pozdrawiam wszystkich forumowiczów
Krzysztof
PROSZĘ O POPRAWIENIE LISTINGÓW ZGODNIE Z ZALECENIAMI NA FORUM !!! -->> SunRiver