Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 17 lut 2026, o 15:24


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 2 lis 2015, o 16:11 
Offline
Nowy

Dołączył(a): 08 paź 2015
Posty: 9
Pomógł: 0

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):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



podmieniam na taki:
Składnia: [ Pobierz ] [ Ukryj ]
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.html
mó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:
Obrazek
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:
Obrazek
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:
Obrazek
i odnajduję w pliku lcd44780.c taki oto fragment:
Obrazek
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



Ostatnio edytowano 2 lis 2015, o 20:32 przez krzysiekS, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lis 2015, o 16:46 
Offline
Użytkownik

Dołączył(a): 29 mar 2012
Posty: 595
Lokalizacja: Jaworzno
Pomógł: 39

W plikach w których używasz PROGMEM musisz dodać
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Pozdrawiam
PP



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lis 2015, o 18:21 
Offline
Nowy

Dołączył(a): 08 paź 2015
Posty: 9
Pomógł: 0

Piotrek_P pgmspace.h jest załączone domyślnie (tak jak było zresztą w kodzie Pana Mirka)
1Yokoon Skąd to LCD_ROWS i LCD_COLS? :/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lis 2015, o 23:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
A czy zapis o sposobie podłączenia RW zgadza się z jego fizycznym podłączeniem?
Może jaśniej: jak masz podłączony PIN RW a co masz w kodzie?
Czy po każdym "dłubaniu" w kodzie robisz CLEAN czy w kółko kompilujesz?

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lis 2015, o 00:27 
Offline
Nowy

Dołączył(a): 08 paź 2015
Posty: 9
Pomógł: 0

Dziękuję za odpowiedź. Żeby nie było niejasności, cały kod to nic innego jak kod Pana Mirka, taki jakim go Pan Mirek stworzył - z drobnymi dotychczasowymi zmianami, które opisałem w pierwszym poście.

(Pin RW mam normalnie podłączony do tego wejścia PD1 mikrokontrolera, nie zaś do masy)

Z tym CLEAN'em to przyznam się szczerze, że jak dotąd nie używałem tej opcji, gdyż przy wcześniejszych kompilacjach i wgrywaniach na µC dawało radę bez tej opcji. Tym razem jednak to wypróbowałem, i po ponownym wgraniu zobaczyłem coś niepokojacego - mianowicie pojawiły się białe prostokąty na wyświetlaczu - lecz nie w 2 pełnych rzędach, a tylko ich część (tak jakby ktoś wymazał pośrodku niektóre z nich). Po odłączeniu i podłączeniu programatora (USBasp) z powrotem pojawiło się tym razem coś takiego: pierwszy prostokąt wyświetlacza jak gdyby prążkowany (jak żaluzje) i mrugający bardzo szybko. W obawie, czy coś się nie stało wgrałem ten kod, o którym wspomniałem w pierwszym poście, który jako jedyny tak naprawdę mi zadziałał jak dotychczas (ze strony mikrokontrolery.net) i pojawił się już normalny napis. Z jednym tylko niuansem: każde naciśnięcie ikonki "upload current project to ATMEL target" w Eclipsie pokazywał na chwilę w pierwszym (tylko pierwszym) rzędzie wyświetlacza białe prostokąty wypełniające się od lewej do prawej - ale znowuż tylko w tych polach, w których nie było wyświetlonych liter tekstu. Coś namieszane z inicjalizacją wyświetlacza? Jakaś "pozostałość" w mikrokontrolerze? Zupełnie nie wiem, jak to rozumieć... Tak czy inaczej - nadal walczę z kodem Pana Mirka :/



Ostatnio edytowano 3 lis 2015, o 00:35 przez krzysiekS, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lis 2015, o 00:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Na forum panuje taka zasada, że nie pokazujemy kodów bibliotek z książek. Jedynie kody z pliku main można.
Tak więc usuń kody ze swojego poprzedniego postu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lis 2015, o 07:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
krzysiekS napisał(a):
...taki jakim go Pan Mirek stworzył - z drobnymi dotychczasowymi zmianami, które opisałem w pierwszym poście.

(Pin RW mam normalnie podłączony do tego wejścia PD1 mikrokontrolera, nie zaś do masy)

Jeśli RW masz do PD1 to w pliku konfigurującym LCD musisz to "zapisać" - masz tam opcję do wyboru.
LCD... .h
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lis 2015, o 20:09 
Offline
Nowy

Dołączył(a): 08 paź 2015
Posty: 9
Pomógł: 0

@kicajek Teraz dopiero do mnie dotarło, co miałeś na myśli, dziękuję za podpowiedź :) Wprawdzie RW był jak dotąd już ustawiony poprzez "USE_RW" na jedynkę (i nic to nie dawało), ale postanowiłem jeszcze podpiąć go do masy i ustawić USE_RW na 0, i wówczas udało się wyczytać napisy (tj. "FLASH Łó Linia 1" i "EEPROM <znak termometru> <znak buźki> linia 2"). Tak więc o dziwo działa to tylko przy RW do masy (???), a przy tym bez funkcji Clean nie da się obyć, bo co jakiś czas przy ponownych kompilacjach zawala się białymi kratkami. Wiem, że pytanie będzie dość laickie, ale - czy obie przyczyny wynikają raczej z kwestii programowej (czy też tych nieszczęsnych/albo i szczęsnych "const-ów" nałożonych na zmienne w pamięci flash), czy może po prostu wyświetlacz zaczyna szwankować?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lis 2015, o 20:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
Moja odpowiedź będzie również laicka
krzysiekS napisał(a):
a przy tym bez funkcji Clean nie da się obyć

Ja nigdy nie próbowałem "bez"; tak od początku zakodowałem że trzeba i nawet nie wnikałem w jakim celu. Jak legendarny (?) Roch Kowalski: "rozkaz to rozkaz". Na pewno są ku temu jakieś podstawy, ale w moim wieku nie muszę już wszystkiego wiedzieć.
Co do RW - nie wczytywałem się dokładnie w "warunki jego używania", ale u mnie na AT8 działa i z PORT'u i z GND. NIe przypominam sobie abym coś musiał dodatkowo zmieniać.
I na koniec: nie spotkałem się z wyświetlaczem "trochę popsutym".

Pozdr.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lis 2015, o 21:19 
Offline
Użytkownik

Dołączył(a): 04 paź 2011
Posty: 8631
Pomógł: 338

kicajek napisał(a):
Co do RW - nie wczytywałem się dokładnie w "warunki jego używania", ale u mnie na AT8 działa i z PORT'u i z GND. NIe przypominam sobie abym coś musiał dodatkowo zmieniać.
I na koniec: nie spotkałem się z wyświetlaczem "trochę popsutym".


RW po prostu przełącza Read / Write LCD
GND = Write

spotkałem się z kilkoma LCD które nie działają z RW na pinie procka , natomiast z GND bez problemu
pewnie to wynika z faktu że są "prawie zgodne z HD44780" i mają fizycznie konieczność otrzymania LOW w momencie inita sprzetowego
jak też i programowego , a pojawienie się HI blokuje i nie startuje kontroler , ale nie zastanawiałem się nad tym
gdyż nie widzę potrzeby i sensu używania tego .... jak i czytania czegokolwiek z wyświetlacza :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lis 2015, o 21:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Cytuj:
I na koniec: nie spotkałem się z wyświetlaczem "trochę popsutym".
Oj są wyświetlacze (szczególnie one) trochę popsute - najczęściej te w komórkach po sprawdzaniu praw grawitacji :lol:
Ale to widać od razu na pierwszy rzut oka :D

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lis 2015, o 18:52 
Offline
Nowy

Dołączył(a): 08 paź 2015
Posty: 9
Pomógł: 0

SunRiver Możliwe więc, że i ja trafiłem w ten odsetek przypadków z tym problemem :/

Tak czy inaczej bardzo dziękuję za pomoc i za rozjaśnienie pewnych kwestii :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO