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

Problemy podczas kompilacji w AVR studio [C]

jaros85 19 Lip 2009 00:21 4147 11
  • #1 6795476
    jaros85
    Poziom 20  
    Witam mam taki problem.
    Oto kod ze strony http://ds5.agh.edu.pl/~czaro/naukowo/avr_rs232.htm

    #include <avr/io.h>
    
    //I	NICJALIZACJA uart-U
    UCSRS=(1<<URSEL) | (1<<UPM1) | (1<<UCSZ1) | (1<<UCSZ0);
    //URSEL=1 korzystanie z rejestru UCSRC
    //UPM1=1 sprawdzenie parzystości even parity
    //UCSZ1=1 UCSZ0=1 8bitów danych
    UBRRL=51; //prędkość transmisji 9600bps
    UCSRB=(1<<RXEN) | (1<<TXEN); //uaktywnienie odbioru i nadawania
    
    //nadawanie pojedynczego znaku
    void nadajznak (char dana1)
    {
    while(!(UCSRA&(1<<UDRE))); //czekaj na wysłanie poprzedniej danej
    UDR=dana1;
    }
    
    //nadawanie całego zapisu
    void nadajstring (char *dana)
    {
    int dlugosc; //dlugosc napisu
    int k=0; //zmienna licznikowa
    
    dlugosc=strlen(dana); //pobranie dlugości napisu
    
    for(k=0;k<dlugosc;k++)
    {
    nadaj(dana[k]); //wyslij pojedynczy znak
    }
    }
    
    //ODBIOR POJ RAMKI
    //odbior znaku
    //funkcja zwraca wartosc w poztaci zmiennej uint8_t
    uint8_t odbierz (void)
    {
    while(!(UCSRA&(1<<RXC))); //dopuki bufor nie bedzieczysty
    return UDR; //zwroc wart funkcji
    }
    
    //ustawienie portu
    DDRB=0xFF;
    PORTB=0xFF;
    
    uint8_t odebrano;
    
    while(1)
    {
    odebrano=odbierz(); //sprawdzanie caly czas bufora
    if(odebrano==0x31) {PORTB=0xFF; PORTB&=~_BV(1); nadajznak(odebrano);}
    if(odebrano==0x32) {PORTB=0xFF; PORTB&=~_BV(2); nadajznak(odebrano);}
    }
    


    Oraz taką listę błędów:
    ../rs232.c:4: error: 'URSEL' undeclared here (not in a function)
    ../rs232.c:4: error: 'UPM1' undeclared here (not in a function)
    ../rs232.c:4: error: 'UCSZ1' undeclared here (not in a function)
    ../rs232.c:4: error: 'UCSZ0' undeclared here (not in a function)
    ../rs232.c:9: error: 'RXEN' undeclared here (not in a function)
    ../rs232.c:9: error: 'TXEN' undeclared here (not in a function)
    ../rs232.c: In function 'nadajznak':
    ../rs232.c:14: error: 'UCSRA' undeclared (first use in this function)
    ../rs232.c:14: error: (Each undeclared identifier is reported only once
    ../rs232.c:14: error: for each function it appears in.)
    ../rs232.c:14: error: 'UDRE' undeclared (first use in this function)
    ../rs232.c:15: error: 'UDR' undeclared (first use in this function)
    ../rs232.c:37: error: 'UCSRA' undeclared (first use in this function)
    ../rs232.c:37: error: 'RXC' undeclared (first use in this function)
    ../rs232.c:38: error: 'UDR' undeclared (first use in this function)
    ../rs232.c:42: error: expected identifier or '(' before 'volatile'
    ../rs232.c:42: error: expected ')' before '(' token
    ../rs232.c:43: error: expected identifier or '(' before 'volatile'
    ../rs232.c:43: error: expected ')' before '(' token
    ../rs232.c:47: error: expected identifier or '(' before 'while'
    

    Dodatkowo jest jeszcze kila ostrzeżeń.

    Programik przepisałem z pdf-a którego można pobrać ze strony którą podałem wyżej ale nie wiem dlaczego aż tak dużo błędów się wysypało. Wiem że nie są zadeklarowane niektóre zmienne ale w tym pdf-ie jest opis całego tego programu i niema ani słowa na temat aby używać np innych bibliotek.

    Czy może wina leży w tym że mam inne biblioteki i w nich niema deklaracji tych zmiennych.
  • #2 6795505
    acid12
    Poziom 21  
    spr cos takiego ;) niemasz wogole funkcji main, a te ustawienia uarta niesa wogole w zadneg funkcji.

    oczywiscie plik makefile masz poprawnie stworzony, odpowiedni procek i predkosc etc? jezeli nie to nie dziw sie ze kompilator nie wie skad ma wziac nazwy rejestrow skoro nie podales mu z jakiego uC one są


    #include <avr/io.h>
    
    //nadawanie pojedynczego znaku
    void nadajznak (char dana1)
    {
    while(!(UCSRA&(1<<UDRE))); //czekaj na wysłanie poprzedniej danej
    UDR=dana1;
    }
    
    //nadawanie całego zapisu
    void nadajstring (char *dana)
    {
    int dlugosc; //dlugosc napisu
    int k=0; //zmienna licznikowa
    
    dlugosc=strlen(dana); //pobranie dlugości napisu
    
    for(k=0;k<dlugosc;k++)
    {
    nadaj(dana[k]); //wyslij pojedynczy znak
    }
    }
    
    //ODBIOR POJ RAMKI
    //odbior znaku
    //funkcja zwraca wartosc w poztaci zmiennej uint8_t
    uint8_t odbierz (void)
    {
    while(!(UCSRA&(1<<RXC))); //dopuki bufor nie bedzieczysty
    return UDR; //zwroc wart funkcji
    }
    
    int main(void){
    
    //I   NICJALIZACJA uart-U
    UCSRS=(1<<URSEL) | (1<<UPM1) | (1<<UCSZ1) | (1<<UCSZ0);
    //URSEL=1 korzystanie z rejestru UCSRC
    //UPM1=1 sprawdzenie parzystości even parity
    //UCSZ1=1 UCSZ0=1 8bitów danych
    UBRRL=51; //prędkość transmisji 9600bps
    UCSRB=(1<<RXEN) | (1<<TXEN); //uaktywnienie odbioru i nadawania
    
    
    //ustawienie portu
    DDRB=0xFF;
    PORTB=0xFF;
    
    uint8_t odebrano;
    
    while(1)
    {
    odebrano=odbierz(); //sprawdzanie caly czas bufora
    if(odebrano==0x31) {PORTB=0xFF; PORTB&=~_BV(1); nadajznak(odebrano);}
    if(odebrano==0x32) {PORTB=0xFF; PORTB&=~_BV(2); nadajznak(odebrano);}
    } 
    
    }
  • #3 6802634
    jaros85
    Poziom 20  
    Mam uC Atmega8 a dokładnie płytkę uruchomieniową ZL2AVR i uczę się programować tego procka a ze względu na brak dobrze opisanych podstaw programowania uC AVR w C to tak trochę po omacku to robię i nie zawsze mi to wychodzi.

    To co mam jeszcze w swoim kodzie zmienić żeby dla Atmega8 to wszystko dobrze działało :?:
  • #4 6803174
    Dr.Vee
    VIP Zasłużony dla elektroda
    Dodaj wcięcia w kodzie - inaczej za chwilę się w nim zupełnie zagubisz :)

    Pozdrawiam,
    Dr.Vee
  • #5 6803303
    acid12
    Poziom 21  
    jaros85 napisał:
    Mam uC Atmega8 a dokładnie płytkę uruchomieniową ZL2AVR i uczę się programować tego procka a ze względu na brak dobrze opisanych podstaw programowania uC AVR w C to tak trochę po omacku to robię i nie zawsze mi to wychodzi.

    To co mam jeszcze w swoim kodzie zmienić żeby dla Atmega8 to wszystko dobrze działało :?:


    jeżeli dopiero zaczynasz zabawe z uC to obsługę UARTA zostawiłbym na okres kiedy już bedziesz spokojnie wiedział jak:
    1) pisac programy w C
    2) pisac programy w C dla uC
    3) kompilowac programy w C dla uC
    4) uzywac pliku makefile

    absolutnie nie zgodze sie ze stwierdzeniem ze niema dobrze opisanych podstaw programowania avrów.

    wejdz na strone http://avr.elektroda.eu/?q=node/8
    i naprawde czytaj wszystko pokolei, zwracam uwage na działy

    Wstęp
    Kompilator
    Dystrybucja WinAVR
    Kompilacja prostych programów
    Program make
    Programowanie układu (programatory)
    Dostęp do zasobów mikrokontrolera
    Wejście i wyjście binarne

    tj podstawa bez której niemasz co myslec zeby robic cokolwiek innego

    ----------------------
    odnosnie tej strony z kodem z ktorej sie uczysz, tam sa bledy w kodzie w tym pdfie, czesto niema jasno opisanych (dobrze opisanych) rzeczy, to niejest plik dzieki ktoremu mozna sie uczyc, tj plik dla osob ktore juz cos wiedza i ma sluzyc jako pomoc, wprowadzenie do problemu oraz daje przyklad rozwiazania, jednak brakuje ciaglego jednolitego listigu, funkcje i uzycia sa wyjete z kontekstu.

    ----------------------

    ten kurs używania kompilatora avr-gcc pod srodowiskiem WINAVR jest b.dobry

    ----------------------

    taka bardzo podstawa programowania uC AVR w C
    1) potrzebujesz kompilatora avr-gcc
    2) srodowisko w ktorym mozesz pisac
    3) plik makefile
    4) programator

    polecam WinAVR, dlaczego? bo jest to kompletne rozwiazanie, instalujac winavr instalujesz kompilator avr-gcc, srodowisko programmers-notepad, konfigurator plikow makefile "M-file" oraz program avrdude (program do programowania jeszcze hardware potrzebny)

    ---------------------
    teraz poco jest plik makefile ?
    podczas kompilacji, wywołanej poleceniem make z linii komend, kompilator wyszukuje plik "makefile" w katalogu z plikiem *.c, a wnim zawarte sa wszystkie podstawewe opcje konfiguracyjne dla uC, np jego nazwa "MCU = atmega163" , a zmienna MCU jest pozniej wykorzystywna przez kompilator do wyszukania odpowiedniego pliku naglowka zeby zalaczyc m.in odpowiednie nazwy rejestrów (ten Twój blad ze nazwy sa nierozpoznawalne)

    ---------------------

    na prawde polecam te lekturke ze stronki http://avr.elektroda.eu/?q=node/8 , tam jest wszystko wylozone czarno na białym
  • #6 6807454
    jaros85
    Poziom 20  
    Dzięki wielkie za wyczerpującą odpowiedź. Ale pisząc programy w avr studio w C i tak musiałem zainstalować win avr żeby móc kompilować programy. A po wrzuceniu dowolnego kodu ze stronki http://avr.elektroda.eu/?q=node/11 program nie chce się kompilować czy to dlatego że niema pliku makefile :?:

    Bo gdy pisze własne programy od początku do końca to wszystko jest ok.

    Tak w ogóle to pojęcie o C mam tylko pisząc w C na PC kompilator czasami wyrzucał inne błędy niż ten dla AVR-ów. Chodzi mi o błędy składni tzn normalnie od razu zorientował bym się że brakuje w kodzie funkcji "main" (po prostu nie zwróciłem uwagi podczas przepisywania kodu) a tak to w tym kompilatorze trudno się zorientować o jaki błąd chodzi dokładnie.
  • #7 6807506
    acid12
    Poziom 21  
    kompilator C dla PC to zazwyczaj gcc, a dla avr tj avr-gcc, i przyzwyczaj sie ze pokazuje duuzo mniej konkretów :)
    ten kompilator tj zupelnie inna bajka, i podstawą jest plik makefile odpowiednio skonfigurowany.

    moze podam kolejny link, i przeczytaj, bo widzac twoje pytanie
    Cytat:
    program nie chce się kompilować czy to dlatego że niema pliku makefile
    dochodze do wniosku ze nie czytales tego co wyzej napisalem, jak chcesz zeby ludzie Ci pomagali to czytaj ich odpowiedzi.
    http://www.voytek.tkdami.net/111.html


    I radze Ci użyj google, w necie jest tysiace stron o programowaniu mikrokontrolerow, avr sa wedlug mnie w tej chwili najpopularniejsze dla zaczynajacych przygode i stron o tej tematyce jest ogrom
  • #8 6807993
    Freddie Chopin
    Specjalista - Mikrokontrolery
    acid12 napisał:
    kompilator C dla PC to zazwyczaj gcc, a dla avr tj avr-gcc

    Spore nadużycie, bo nawet jeśli już ktoś używa gcc na PC to jest on zwykle przykryty 10-cioma nakładkami typu auto-conf, auto-make, auto-do-everything itd. Może na linuxa popularny jest gcc (brak alternatyw [; ), na Windowsa jednak nie sądze aby był najpopularniejszy.

    4\/3!!
  • #9 6812020
    flapo213
    Poziom 21  
    Witaj.

    Wracając do tematu. Błędy które Ci się pojawiły są normalnymi błędami kompilator stwierdził iż wykorzystujesz nazwy rejestrów które w dodanych przez Ciebie bibliotekach poprostu nie istnieją, bądź pobrałeś kod z jakiegoś innego programu napisanego np na Atmegę128 lub jakiś inny gdzie istnieją np 2 uarty i niby rejestry są podobnie się nazywające ale to nie to samo. Najszybciej rozwiążesz problem szukając w katalogu winavr gdzie siedzą biblioteki rejestrowe pewnie jakiś katalog "Include" poszukaj gdzie siedzi plik "io.h". W tym pliku jeśli masz dobrego makefile to odblokuje Ci on z sekcji definów "iom8.h" gdzie powinny być Twoje brakujące elementy z biblioteki. Jeśli to Ci nie podejdzie to podeślę Ci gotowca taki mały szablon z na pewno działającymi funkcjami. Zgodzę się z F.Ch. że rzeczywiście Gcc nie ma alternatywy na linuxa, na windowsa jest alternatywa ale ta alternatywa to bardzo słono kosztuje i jest wykorzystywana pewnie jedynie przez firmy zajmujące się programowanie uP. No ale generalnie Gcc nie jest takie złe ja nigdy nie miałem żadnych problemów wszystko da się zrobić, ostatnimi czasy wydaje mi się że dogonili komercyjne kompilatory pod względem optymalizacji ;). Pozdrawiam
  • #10 6831859
    jaros85
    Poziom 20  
    Witam zapoznałem się z tą stroną http://avr.elektroda.eu/?q=node/8

    Czytałem na temat makefile i skopiowałem to co było na stronie całą zawartość make.
    Ale mimo wszystko nie mogę skompilować nawet najprostszego pliku z tej strony sterującego diodami. Błąd dotyczył cbi i sbi wiem że ich w nowszych wersjach winavr się nie używa ze względu na nowsze biblioteki w których niema ich deklaracji. Tak poza tym to nie taki programik jestem w stanie napisać i będzie działać.

    Tak samo nie mogę skompilować kodu z obsługą portu com. Nie chodzi mi o to że akurat się uparłem nad comem i chce go oprogramować tylko chodzi mi o to że mimo iż kopiuje cały kod który niby ma być ok to i tak nie chce się kompilować. Nie chodzi tu o błędy składni tylko właśnie coś najprawdopodobniej jest nie tak u mnie z bibliotekami są zbyt nowe :?: czy może dla mojego uC potrzebne są inne biblioteki.

    Czy jeżeli używam AvrStudio to też trzeba mieć plik make. Przecież to środowisko jest bardziej "user frendly" niż Winavr. I tam tylko wystarczy kliknąć na odpowiednią ikonkę i wszystko się kompiluje.
  • #11 6832144
    acid12
    Poziom 21  
    hej,
    wejdz na http://homepage.hispeed.ch/peterfleury/avr-software.html

    ja cenie biblioteki tego gostka, oszczedzily mi duzo czasu na poczatku :) zwlaszcza uart i i2c :) ta biblioteke uarta wzorowałem sie jak robiłem protokół na rs485 i mi smiga ładnie.

    jak sciagniesz http://homepage.hispeed.ch/peterfleury/uartlibrary.zip tam jest oprocz biblioteki rowniez przykład, razem z makefilem.

    w makefilu zmien MCU i F_CPU, reszty nie musisz, tam jest duzo opcji wlacznie z opcjami dla programatora / symulatora etc

    ---------------

    jak korzystasz z AVR Studio to nie uzywasz makefilów, ale typ procka i szybkosc i inne opcje wyboerasz w opcjach projektu, to wazne!
  • #12 7034810
    jaros85
    Poziom 20  
    Witam po dość długim czasie. Nie miałem zbytnio czasu żeby zająć się tym uartem. Jak do tej pory nie znalazłem żadnego kodu który kompilował by się bez problemów. Oprucz tego:
    #include <avr/io.h>
    #include <inttypes.h>
    
    void USARTInit(uint16_t ubrr_value)
    {
    UBRRL = ubrr_value;
    UBRRH = (ubrr_value>>8);
    UCSRC=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
    UCSRB=(1<<RXEN)|(1<<TXEN);
    UCSRA=(1<<U2X);
    }
    
    char USARTReadChar()
    {
    while(!(UCSRA & (1<<RXC)))
    {
    }
    return UDR;
    }
    
    
    void USARTWriteChar(char data)
    {
    while(!(UCSRA & (1<<UDRE)))
    {
    }
    UDR=data;
    }
    
    int main(void)
    {
    
    int i = 0;
    int a = 0;
    
    USARTInit(51); //UBRR = 51
    
    while(1)
    {
    USARTWriteChar('K');
    for(i = 0; i < 300; i++)
    {
    a = 10;
    }
    }
    } 

    Programik ten skompilował się bez problemu znalazłem go tutaj http://www.edaboard.com/ftopic342752.html Programik ten nic innego nie robi jak tylko cały czas wysyła przez koma literę K.
    Mam takie proste pytanie jak można zmienić ten program żeby można było odbierać informacje zapisywać je do zmiennej lub tablicy a następnie wysyłać je z powrotem do pc
REKLAMA