logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega8 - Błędy po kopilacji przykładu z ksiązki

Philut 26 Paź 2014 10:41 1344 13
  • #1 14074377
    Philut
    Poziom 11  
    Witam.
    Jestem w czasie kompilacji programu do obsługi wyświetlacza LCD (hd44780), z przykładu z książki "AVR & ARM7 Programowanie mikrokontrolerów dla każdego" - Paweł Borkowski. Wszystko robię według instrukcji, a kompilator wywala mi następujący błąd:

    > "make.exe" all
    avr-gcc -g -Wall -Os -mmcu=atmega8    -c -o hd44780.o hd44780.c
    hd44780.c:62:22: error: macro "SET_" requires 3 arguments, but only 2 given
    hd44780.c: In function 'hd44780_pulse_e':
    hd44780.c:62: error: 'SET_' undeclared (first use in this function)
    hd44780.c:62: error: (Each undeclared identifier is reported only once
    hd44780.c:62: error: for each function it appears in.)
    hd44780.c:89:29: error: macro "READ_" requires 3 arguments, but only 2 given
    hd44780.c:89: error: 'READ_' undeclared (first use in this function)
    hd44780.c:92:22: error: macro "CLR_" requires 3 arguments, but only 2 given
    hd44780.c:92: error: 'CLR_' undeclared (first use in this function)
    hd44780.c:103:23: error: macro "CLR_" requires 3 arguments, but only 2 given
    hd44780.c: In function 'hd44780_outnibble':
    hd44780.c:103: error: 'CLR_' undeclared (first use in this function)
    hd44780.c:105:25: error: macro "SET_" requires 3 arguments, but only 2 given
    hd44780.c:105: error: 'SET_' undeclared (first use in this function)
    hd44780.c:107:25: error: macro "CLR_" requires 3 arguments, but only 2 given
    hd44780.c:108:29: error: macro "ASSIGN_" requires 4 arguments, but only 3 given
    hd44780.c:108: error: 'ASSIGN_' undeclared (first use in this function)
    hd44780.c:131:23: error: macro "SET_" requires 3 arguments, but only 2 given
    hd44780.c: In function 'hd44780_innibble':
    hd44780.c:131: error: 'SET_' undeclared (first use in this function)
    hd44780.c:132:31: error: macro "ASSIGN_" requires 4 arguments, but only 3 given
    hd44780.c:132: error: 'ASSIGN_' undeclared (first use in this function)
    hd44780.c:134:25: error: macro "SET_" requires 3 arguments, but only 2 given
    hd44780.c:136:25: error: macro "CLR_" requires 3 arguments, but only 2 given
    hd44780.c:136: error: 'CLR_' undeclared (first use in this function)
    hd44780.c:138:31: error: macro "ASSIGN_" requires 4 arguments, but only 3 given
    hd44780.c:139:23: error: macro "CLR_" requires 3 arguments, but only 2 given
    hd44780.c: At top level:
    hd44780.c:162: error: conflicting types for 'hd44780_wait_ready'
    hd44780.c:163: note: an argument type that has a default promotion can't match an empty parameter name list declaration
    hd44780.h:30: error: previous declaration of 'hd44780_wait_ready' was here
    hd44780.c:185:22: error: macro "SET_" requires 3 arguments, but only 2 given
    hd44780.c: In function 'hd44780_init':
    hd44780.c:185: error: 'SET_' undeclared (first use in this function)
    hd44780.c:186:22: error: macro "SET_" requires 3 arguments, but only 2 given
    hd44780.c:187:21: error: macro "SET_" requires 3 arguments, but only 2 given
    hd44780.c:188:31: error: macro "ASSIGN_" requires 4 arguments, but only 3 given
    hd44780.c:188: error: 'ASSIGN_' undeclared (first use in this function)
    hd44780.c:212:29: error: macro "ASSIGN_" requires 4 arguments, but only 3 given
    hd44780.c: In function 'hd44780_powerdown':
    hd44780.c:212: error: 'ASSIGN_' undeclared (first use in this function)
    hd44780.c:213:23: error: macro "CLR_" requires 3 arguments, but only 2 given
    hd44780.c:213: error: 'CLR_' undeclared (first use in this function)
    hd44780.c:214:23: error: macro "CLR_" requires 3 arguments, but only 2 given
    hd44780.c:215:22: error: macro "CLR_" requires 3 arguments, but only 2 given
    make.exe: *** [hd44780.o] Error 1
    
    > Process Exit Code: 2
    > Time Taken: 00:00


    Nie możliwe, żeby tyle błędów było w książkowym przykładzie, myślę, że tu jakiś nie zauważalny drobiazg psuje mi całą zabawę.
    Korzystam jeszcze z pliku HD44780.c autora Joerg Wunsch
    Poniżej zamieszczę jeszcze kod programu main:

    Kod: C#
    Zaloguj się, aby zobaczyć kod
  • #2 14074762
    michalko12
    Specjalista - Mikrokontrolery
    Przecież wszystko masz jasno opisane w czym jest problem. Masz kilka makr które dostają niewystarczającą liczbę argumentów. Albo użyłeś niewłaściwych plików, albo pliki są właściwe, ale w starszej wersji.
  • #3 14074792
    Philut
    Poziom 11  
    Makra są na pewno dobre. Pliki powinny być też dobre. Co masz na myśli pisząc, że pliki ze starszej wersji?
  • #4 14074843
    michalko12
    Specjalista - Mikrokontrolery
    Skoro uważasz że wszystko jest dobre to znakiem tego "kompilator ma błędy"

    Masz taką linię:
    Cytat:
    hd44780.c:62: error: 'SET_' undeclared (first use in this function)


    W pliku hd44780.c w linii 62 jest użyte makro "SET_" które wcześniej nigdzie nie jest zadeklarowane. Kompilator nie jest aż na tyle sprawny, żeby sobie takie makro wygenerować.

    Dalej jest linie komunikatu:
    Cytat:
    hd44780.c:92:22: error: macro "CLR_" requires 3 arguments, but only 2 given

    Ten sam plik hd44780.c, linia 92, jest użyte makro które jest gdzieś wcześniej zadeklarowane i wymaga podania 3 argumentów, ale dostaje tylko dwa argumenty.

    Zacznij naukę programowania od podstaw C. Nie od nauki składni tylko od nauki budowy i struktury plików w programie.
  • #5 14074904
    Philut
    Poziom 11  
    Jak widzisz staram się uczyć od podstaw, właśnie dlatego kupiłem tę książkę. Lece wszystkie lekcje po kolei i sprawa z wyświetlaczem LCD, która wydawała by się prosta, sprawia mi już od kilku dni problemy, których nie potrafię rozwiązać. W książce jest zawarta płyta CD z wszystkimi przykładami i plikami, więc wydawało mi się, że w nich nie powinno być błędów, dla tego napisałem, że pliki i makra powinny być ok. A na załączonych przez autora przykładach dobrze mi się do tej pory uczyło i rozumiałem zasadę działania programów dotychczasowych. W dziale LCD, kiedy zaczynam dowiadywać się czym są makra, pojawia się tyle pytań i błędów. Dla tego liczę na pomoc ludzi z tego forum.
  • #6 14074956
    michalko12
    Specjalista - Mikrokontrolery
    Philut napisał:
    Korzystam jeszcze z pliku HD44780.c autora Joerg Wunsch


    Chyba jest jakaś nieścisłość w tym co piszesz. Widzisz, nikt Ci nie pomoże jak nie będzie wiedział na czym pracujesz. Ja nie mam tej książki i nie wiem o jakich kodach źródłowych piszesz. Musisz zamieścić kod który sprawia Ci problemy i wtedy dalej będziemy rozmawiać jeśli będziesz miał dalej problemy.
  • #8 14075119
    michalko12
    Specjalista - Mikrokontrolery
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    To nie ma prawa działać. Jeśli to są oryginalne kody dołączone do książki to proponuję zaprzestać dalszej nauki na tej podstawie. Ewentualnie poszukaj oryginalnych kodów, może w necie są działające.

    Przyjżyj się tym makrom
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Czy widzisz tutaj nieprawidłowości? Oprócz błędów kod jest skomplikowany chyba do granic możliwości i kategorycznie nie nadaje się do nauki programowania.
  • #9 14075186
    Philut
    Poziom 11  
    michalko12 - Nie rozumiem jeszcze za bardzo tych makr. Jeżeli chodzi o nieprawidłowości - chodzi ci o wprowadzanie jakiś działań logicznych w definicjach makr, których nie powinno być? Czy nazewnictwo funkcji?

    Skoro mi odradzasz korzystania z tej książki, masz jakaś inna propozycję?

    Jaki sposób programowania wyświetlacza ze sterownikiem jest wygodniejszy - korzystając z biblioteki hd44780 czy pisząc funkcje obsługujące wyświetlacz samodzielnie?
  • Pomocny post
    #10 14075294
    michalko12
    Specjalista - Mikrokontrolery
    Philut napisał:
    czy pisząc funkcje obsługujące wyświetlacz samodzielnie

    Najlepsza opcja do nauki, nie uczysz się czyichś błędów jak w tym przypadku powyżej.

    Philut napisał:
    koro mi odradzasz korzystania z tej książki, masz jakaś inna propozycję?
    W internecie jest wszystko. W razie czego to co napiszesz sam tutaj ktoś Ci pomoże skorygować jeśli nie będzie działało.
    Jak będziesz miał problemy to skorzystaj z bibliotek zamieszczonych na tej stronie http://radzio.dxp.pl/hd44780/ Z tego co widziałem większość początkujących daje sobie radę z nimi.

    Philut napisał:
    Nie rozumiem jeszcze za bardzo tych makr

    Dlatego nie powinieneś się na ich podstawie uczyć. Makra odłóż sobie na później.
    Philut napisał:
    Jeżeli chodzi o nieprawidłowości - chodzi ci o wprowadzanie jakiś działań logicznych w definicjach makr, których nie powinno być

    Problemem jest ilość argumentów w nawiasach. Kod ma już 10 lat, może na starszych kompilatorach to jakimś cudem przez przypadek działało. Jest co prawda jakaś możliwość ruszenia tych makr, ale nie widzę, żeby to było zastosowane w tym kodzie.


    Edit:

    Cytat:
    Jest co prawda jakaś możliwość ruszenia tych makr, ale nie widzę, żeby to było zastosowane w tym kodzie.

    Spróbuj zmienić w pliku defines.h

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    na

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #11 14075622
    Philut
    Poziom 11  
    Dzięki michalko12 za pomoc. Co prawda zmiany, które mi zaproponowałeś nie rozwiązały problemu z kompilacją, ale zacząłem pisać własne funkcje do obsługi LCD i odnoszę już pierwsze sukcesy. Zresztą cały kod staje się dla mnie bardziej czytelny i zrozumiały, więc na razie nie będę korzystał z gotowych bibliotek pod sterownik hd44780. W przyszłości pobawię się jeszcze z bibliotekami które mi wskazałeś.
    Co do książki, nie jest ona zła. Do tej pory czegoś mnie nauczyła, zresztą w niej jest też sposób na własne funkcje do obsługi LCD. Akurat przykład z wykorzystaniem gotowych bibliotek był jakiś taki felerny.
  • #12 14075651
    michalko12
    Specjalista - Mikrokontrolery
    Philut napisał:
    Co prawda zmiany, które mi zaproponowałeś nie rozwiązały problemu z kompilacją

    To była jakaś tam próba na szybko, ale jak widać, żeby ten problem rozwiązać trzeba się wgryzać w czyjś kod, który nie jest za specjalnie czytelny. Nie ma sensu uczyć się posługiwać czyjąś nieudokumentowaną biblioteką, lepiej ten czas przeznaczyć na naukę przy pisaniu własnej nad którą będzie się w pełni panować.

    Powodzenia w nauce.
  • #13 14076330
    tmf
    VIP Zasłużony dla elektroda
    michalko12 - zgodzę się z tym, że powyższe makra są małoczytelne, ale piekielnie wygodne i właściwie użyte działają poprawnie. IMHO biblioteka Joerga Wunscha do obsługi LCD jest jedną z najlepiej napisanych, jakie można dostać za darmo. Jednakże używa makr, dzięki czemu dla jednych (tych bardziej zaawansowanych) jest megaprzejrzysta, dla innych zawiła. Problem jak to zwykle bywa z przykładami, zapewne polega na tym, że ktoś je sobie zmodyfikował na własną rękę i magicznie przestały działać. Trudno o to winić autora.
  • #14 14076451
    michalko12
    Specjalista - Mikrokontrolery
    tmf napisał:

    michalko12 - zgodzę się z tym, że powyższe makra są mało czytelne, ale piekielnie wygodne i właściwie użyte działają poprawnie


    Nie przeczę.

    Spróbowałem skompilować te źródła i po zaproponowanych zmianach w pliku defines.h wystąpił jeszcze jeden błąd związany z funkcją void hd44780_wait_ready(bool islong);
    Nie dość, że został użyty niezdefiniowany typ bool to jeszcze funkcja była wywoływana bez żadnego parametru.
REKLAMA