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

KIT AVT592 - w jakiej wersji C napisano program?

janbabinicz 12 Gru 2010 19:30 3439 35
  • #1 8860332
    janbabinicz
    Poziom 10  
    Witam,

    na samym początku dziękuję za przeczytanie postu.
    Dodam również, że nie jestem specjalistą w Avr-GCC.
    Czy ktoś biegły może oszacować pod jaką wersją WinAVR został napisany ten program? Link
    Wszedłem na AVR-GCC, pobrałem pierwszy lepszy plik ze środka (około daty 2004, i error po kompilacji). Najprostszy program do zmiany statusu portów działa, ale ten już nie chce się skompilować. Doczytałem się gdzieś, że wersje nie są ze sobą kompatybilne co wolę przemilczeć.

    Dziękuję i pozdrawiam.
  • Pomocny post
    #2 8860806
    Andrzej__S
    Poziom 28  
    Nie napisałeś, jakiej wersji WinAVR używasz (ja mam WinAVR-20100110), ale spróbuj na początku pliku 'watomierz.c' dodać linijkę:
    
    #include <compat/deprecated.h>
    

    i usuń:
    
    #include <avr/signal.h>
    

    Jeśli oprócz tego w plikach 'lcd4bit.h' i 'lcd4bit.c' w funkcji 'lcd_string' zmienisz typ parametru z 'unsigned char*' na 'char*', to powinno się skompilować bez błędów i ostrzeżeń. Czy po kompilacji będzie działać, tego nie wiem. Musisz sprawdzić sam.
  • #3 8864175
    janbabinicz
    Poziom 10  
    Witam,

    dziękuję za odpowiedź. Niestety nie pomogło, ale pewnie z mojej winy.
    Coś mam nie tak. W kompilatorze? Wersja WinAVR20100110.

    Otrzymuję takie komunikaty.
    
    Linking: watomierz.elf
    avr-gcc -mmcu=at90s2313 -I. -gdwarf-2 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=watomierz.o  -std=gnu99 -MMD -MP -MF .dep/watomierz.elf.d watomierz.o --output watomierz.elf -Wl,-Map=watomierz.map,--cref     -lm
    watomierz.o: In function `show_time':
    f:\temp\winavrc2010\watomierz/watomierz.c:67: undefined reference to `lcd_goto'
    f:\temp\winavrc2010\watomierz/watomierz.c:69: undefined reference to `lcd_print_x_digit'
    f:\temp\winavrc2010\watomierz/watomierz.c:69: undefined reference to `lcd_data'
    f:\temp\winavrc2010\watomierz/watomierz.c:71: undefined reference to `lcd_print_x_digit'
    f:\temp\winavrc2010\watomierz/watomierz.c:72: undefined reference to `lcd_data'
    f:\temp\winavrc2010\watomierz/watomierz.c:73: undefined reference to `lcd_print_x_digit'
    f:\temp\winavrc2010\watomierz/watomierz.c:74: undefined reference to `lcd_data'
    f:\temp\winavrc2010\watomierz/watomierz.c:75: undefined reference to `lcd_print_x_digit'
    watomierz.o: In function `main':
    f:\temp\winavrc2010\watomierz/watomierz.c:98: undefined reference to `lcd_init'
    f:\temp\winavrc2010\watomierz/watomierz.c:99: undefined reference to `lcd_command'
    f:\temp\winavrc2010\watomierz/watomierz.c:102: undefined reference to `lcd_string'
    f:\temp\winavrc2010\watomierz/watomierz.c:103: undefined reference to `lcd_goto'
    f:\temp\winavrc2010\watomierz/watomierz.c:104: undefined reference to `lcd_string'
    f:\temp\winavrc2010\watomierz/watomierz.c:105: undefined reference to `delay_long'
    f:\temp\winavrc2010\watomierz/watomierz.c:107: undefined reference to `lcd_clear'
    f:\temp\winavrc2010\watomierz/watomierz.c:108: undefined reference to `lcd_goto'
    f:\temp\winavrc2010\watomierz/watomierz.c:109: undefined reference to `lcd_string'
    f:\temp\winavrc2010\watomierz/watomierz.c:118: undefined reference to `lcd_goto'
    f:\temp\winavrc2010\watomierz/watomierz.c:119: undefined reference to `lcd_print_x_digit'
    f:\temp\winavrc2010\watomierz/watomierz.c:120: undefined reference to `lcd_data'
    f:\temp\winavrc2010\watomierz/watomierz.c:121: undefined reference to `lcd_print_x_digit'
    f:\temp\winavrc2010\watomierz/watomierz.c:123: undefined reference to `lcd_string'
    f:\temp\winavrc2010\watomierz/watomierz.c:129: undefined reference to `lcd_goto'
    f:\temp\winavrc2010\watomierz/watomierz.c:130: undefined reference to `lcd_string'
    f:\temp\winavrc2010\watomierz/watomierz.c:139: undefined reference to `lcd_goto'
    f:\temp\winavrc2010\watomierz/watomierz.c:144: undefined reference to `lcd_print_x_digit'
    f:\temp\winavrc2010\watomierz/watomierz.c:149: undefined reference to `lcd_print_x_digit'
    f:\temp\winavrc2010\watomierz/watomierz.c:150: undefined reference to `lcd_data'
    f:\temp\winavrc2010\watomierz/watomierz.c:151: undefined reference to `lcd_print_x_digit'
    f:\temp\winavrc2010\watomierz/watomierz.c:152: undefined reference to `lcd_string'
    make.exe: *** [watomierz.elf] Error 1
    
    > Process Exit Code: 2
    > Time Taken: 00:03
    
  • Pomocny post
    #5 8864275
    Piotrek_P
    Poziom 18  
    Mogę się mylić, ale chyba zmieniłeś domyślną ścieżkę instalacji WinAvr. A jaką masz ścieżkę w zmiennych środowiskowych systemu :?:
  • #7 8864380
    janbabinicz
    Poziom 10  
    Zaznaczam w lewej stronie zakładki nazwę projektu i uruchamiam kompilację.
    Czy każdy plik trzeba jakoś kompilować osobno?

    Dziękuję za pomoc.
    Dopiero uczę się tego środowiska.
  • Pomocny post
    #8 8864642
    Piotrek_P
    Poziom 18  
    To może inaczej. W paczce do której linka podałeś nie ma pliku projektu a nawet makefile. Pokaż to co masz u siebie w projekcie (tzn które pliki dodałeś do projektu) to wtedy można coś podpowiedzieć.
  • Pomocny post
    #10 8864724
    Andrzej__S
    Poziom 28  
    Spróbuj zamienić Twój plik Makefile (we folderze z projektem) i skompiluj ponownie.

    EDIT: Jeśli pracujesz pod Windows, to pewnie wygodniej byłoby Ci używać AVR Studio. Tam plik 'Makefile' jest tworzony automatycznie, a pewne zmienne projektu (typ procesora, częstotliwość taktowania itp.) zmienia się za pomocą interfejsu graficznego.
  • #11 8866260
    janbabinicz
    Poziom 10  
    Walczę, walczę z pomocą Szanownych Forumowiczów.

    Wprowadziłem wszystkie proponowane zmiany, podmieniłem plik makefile, i zostało mi jeszcze coś takiego:

    f:\temp\winavrc2010\watomierz>make.exe
    avr-gcc  -mmcu=at90s2313 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT watomierz.o -MF dep/watomierz.o.d  -c  watomierz.c
    In file included from watomierz.c:16:
    lcd.h:41: error: expected ')' before '*' token
    make.exe: *** [watomierz.o] Error 1
    
    > Process Exit Code: 2
    > Time Taken: 00:00


    Dotyczy się to linijki:
    
    oid lcd_str_P(prog_char* str);


    Nie wiem dlaczego odwołuje się do pliku lcd.h, skoro nie mam go w okienku po lewej.

    Dziękuję za pomoc
  • Pomocny post
    #12 8866381
    Andrzej__S
    Poziom 28  
    janbabinicz napisał:

    Nie wiem dlaczego odwołuje się do pliku lcd.h, skoro nie mam go w okienku po lewej.

    No ale przecież masz napisane:
    
    In file included from watomierz.c:16:
    

    czyli masz ten plik dołączony w pliku 'watomierz.c'.

    janbabinicz napisał:

    Dotyczy się to linijki:
    
    void lcd_str_P(prog_char* str); //powinno być 'void' a nie 'oid'
    


    W projekcie, do którego link podałeś nie ma przecież pliku 'lcd.h' tylko 'lcd4bit.h'. Dodatkowo w pliku 'lcd4bit.h' nie ma takiej linijki 'void lcd_str_P(prog_char* str);'. Porady dotyczą projektu, o którym pjsałeś w pierwszym poście, więc nic dziwnego, że nie chce działać. Skompiluj ten projekt z pierwszego postu - po wprowadzeniu proponowanych przeze mnie wcześniej zmian - z plikiem 'Makefile', który załączyłem i powinno być OK.
    janbabinicz napisał:

    
    lcd.h:41: error: expected ')' before '*' token 
    


    Oznacza to, że prawdopodobnie nie domknąłeś jakiegoś nawiasu ')' w poprzedniej linijce.
    ...albo nie dołączyłeś pliku '<avr/pgmspace.h>' do pliku 'lcd.h'.
  • #13 8868363
    janbabinicz
    Poziom 10  
    Dziękuję, dziękuję!

    Założyłem projekt od podstaw, wprowadziłem zmiany zalecone przez szanownych forumowiczów i kompilacja poszła.

    Czy ktoś mógł mnie nakierować (jakie funkcje, pliki nagłówkowe etc) aby dołożyć do tego transmisję RS232?

    Tam jest taki fragment,
    if (nowasekunda == 1)	//co sekundę
    	{
    
    		{
    		lcd_goto(0x42);
    		lcd_print_x_digit(energia/100,6,1);
    		lcd_data('.');
    		lcd_print_x_digit(energia%100,2,0);
    		lcd_string("  kWh");
    		}

    który wyświetla co sekundę wskazanie na wyświetlaczu.
    Chciałbym dołożyć tam jakąś komendę, która równocześnie wyrzuca na port RS232 wskazania. Śledzę aktualnie kurs C z EdW. Znalazłem tam takie polecenia jak rs_put i plik nagłówkowy rs.h. Ściągnąłem również przykłady pod C dla zestawu ZL15AVR (Wydawnictwo BTC). Tam znajduję polecenia USART_putstring i plik nagłówkowy USART.h. Jak mam to rozumieć? Tam pisane jest to inaczej a tam inaczej?
  • Pomocny post
    #14 8868541
    Piotrek_P
    Poziom 18  
    Nazewnictwo bibliotek i zaimplementowanych w nich funkcji oraz zmiennych może się różnić, w zależności od koncepcji autora tychże. Przyjrzyj się bardziej i porównaj(!) co jest "w środku" funkcji w plikach *.c dwóch różnych bibliotek pod USART. Ich implementacja powinna być bardzo podobna, ale nie zawsze :wink:

    Pozdrawiam
    Piotrek
  • #15 8871962
    janbabinicz
    Poziom 10  
    Czy ten plik makefile da się jakoś wygenerować automatycznie?

    Czy ten polecenia były pisane ręcznie? Jeśli dojdzie jakiś dodatkowy plik typu .c czy .h to też trzeba go dopisać?



    Dziękuje

    
    ## Compile
    watomierz.o: watomierz.c
    	$(CC) $(INCLUDES) $(CFLAGS) -c  $<
    
    delay.o: delay.c
    	$(CC) $(INCLUDES) $(CFLAGS) -c  $<
    
    lcd4bit.o: lcd4bit.c
    	$(CC) $(INCLUDES) $(CFLAGS) -c  $<
  • Pomocny post
    #16 8872223
    piotrva
    VIP Zasłużony dla elektroda
    najlepiej na początku przygotowujesz sobie szablon pliku makefile (kilka jest dołączonych do Programmers Notepad) i potem tylko zmieniasz ewentualne parametry kwarcu lub procesora
  • Pomocny post
    #17 8872234
    Andrzej__S
    Poziom 28  
    Cytat:

    Czy ten polecenia były pisane ręcznie? Jeśli dojdzie jakiś dodatkowy plik typu .c czy .h to też trzeba go dopisać?

    Można dopisać te polecenia ręcznie, można również użyć programu 'Mfile' do wygenerowania tego pliku. Program ten jest dołączony do WinAVR. Wystarczy tam z menu 'Makefile' ustawić odpowiednie opcje, wybrać pliki do kompilacji i zapisać ten plik w odpowiednim folderze projektu. Nie jestem pewien, czy uda się edytować ten plik, który Ci przesłałem, więc lepiej będzie, jak utworzysz sobie nowy i przy okazji to przetrenujesz.

    Do projektu (do Makefile) dołączasz tylko pliki *.c, pliki *.h musisz dołączyć dyrektywą '#include' w plikach, w których potrzebujesz funkcje, których prototypy dany plik *.h zawiera.

    P.S. Jeżeli będziesz dopisywał ręcznie, to musisz oprócz tego fragmentu, który przedstawiłeś dopisać ten plik z rozszerzeniem *.o do linijki 'OBJECTS = watomierz.o delay.o lcd4bit.o nowy.o'.
  • #19 8872291
    Andrzej__S
    Poziom 28  
    Cytat:

    AVRStudio z WinAvr robią to same...

    Może nie zauważyłeś, ale już to wcześniej proponowałem :). Niestety nie spotkało się to z zainteresowaniem autora tematu. Może po prostu chce używać 'Progrmmers Notepad', a może pracuje na Linuksie (o ile się dobrze orientuję, to nie ma wersji AVR Studio dla Linuksa)?
  • #20 8873139
    janbabinicz
    Poziom 10  
    To nie tak, że nie spotkało się z zainteresowaniem, tylko po prostu nie udało mi się uzyskać korzystnego rezultatu. Nie wiem jak w AVR Studio wygenerować taki plik.
    Analizowałem jeden z tematów, który jest na początku forum WinAVR + AVR Studio, jednak tam nie wiele znalazłem. Przy tworzeniu projektu w AVR Studio nie ma pliku makefile a ja naprawdę nie wiem jak go stworzyć. Próba kompilacji kończy się komunikatem ze wskazaniem właśnie na brak tego pliku.

    Dziękuję za cierpliwość i wyrozumiałość.
  • #21 8873276
    Andrzej__S
    Poziom 28  
    Cytat:

    Nie wiem jak w AVR Studio wygenerować taki plik.

    Tam nic nie trzeba generować. Jeśli masz prawidłowo zainstalowane AVR Studio oraz WinAVR, to po stworzeniu nowego projektu (trzeba oczywiście wybrać typ projektu "AVR GCC") piszesz kod lub dodajesz do projektu gotowe pliki, wciskasz F7 lub wybierasz menu "Build/Build" i plik 'Makefile' stworzy się sam (a właściwie zostanie stworzony przez AVR Studio w podfolderze 'default' w folderze projektu). Wszelkie zmiany w tym pliku wykonywane są automatycznie np. po dodaniu do projektu nowych plików lub zmianie opcji konfiguracyjnych projektu (menu "Project/Configuration Options").

    Dodano po 22 [minuty]:

    Cytat:

    Próba kompilacji kończy się komunikatem ze wskazaniem właśnie na brak tego pliku.

    Prawdopodobnie WinAVR nie zainstalowało się prawidłowo. Spróbuj odinstalować i zainstalować ponownie. Użyj domyślnej lokalizacji. Jak będą spacje w nazwach katalogów instalacji WinAVR, to może być problem.
  • #22 8874233
    janbabinicz
    Poziom 10  
    Dziękuję wszystkim!
    Posuwam się dalej.
    Namierzyłem na forum taki kod i sprawdziłem Działa.

    #include <stdint.h>
    #include <util/delay.h>
    #include <avr/io.h>
    void USART_Init()
    {
    /* Set baud rate */
    
    UBRRH = 0x00;
    UBRRL = 51;
    //wyłączenie trybu podwójnej prędkości...
    UCSRA = (0<<U2X);
    /* Enable receiver and transmitter */
    UCSRB = (1<<RXEN)|(1<<TXEN);
    // tryb asynchroniczny
    UCSRC = (0<<UMSEL);
    /* Set frame format: 8data, 2stop bit, brak parzystości */
    UCSRC = (1<<UCSZ0)|(1<<UCSZ1)|(0<<UCSZ2)|(1<<USBS)|(0<<UPM1)|(0<<UPM0);
    //UCSRC = (1<<USBS)|(0<<UPM1)|(0<<UPM0);
    
    }
    void USART_Transmit( unsigned char data )
    {
    /* Wait for empty transmit buffer */
    while ( !( UCSRA & (1<<UDRE)) )
    ;
    /* Put data into buffer, sends the data */
    UDR = data;
    }
    unsigned char USART_Receive( void )
    {
    /* Wait for data to be received */
    while ( !(UCSRA & (1<<RXC)) )
    ;
    /* Get and return received data from buffer */
    return UDR;
    }
    
    unsigned char temp;
    int main(void){
    DDRB = 0xff;
    USART_Init();
     while(1)
    
    {
    temp = USART_Receive();
    USART_Transmit(temp);
    
    PORTB = 0x00;
    
    temp = USART_Receive();
    USART_Transmit(temp);
    
    PORTB = 0xff;
    
    }
    return 0;
    } 


    Do pełni szczęścia i zamknięcia tematu brakuje mi jeszcze tylko jednego.
    Chciałbym wysyłać jakiś string lub zmienna. A tutaj wysyła się tylko jeden znak.
  • #23 8874632
    Andrzej__S
    Poziom 28  
    Cytat:

    Chciałbym wysyłać jakiś string lub zmienna. A tutaj wysyła się tylko jeden znak.

    Przecież wysłanie np. ciągu znaków to nic innego jak wysłanie jakiejś ilości pojedynczych znaków. Można dopisać sobie przykładowo taką funkcję:
    
    void USART_Transmit_string(char * str)
    {
       while(*str)
       {
          USART_Transmit(*str);
          str++;
       }
    }
    

    i wywoływać ją mniej więcej tak:
    
       int zmienna_typu_integer;
       char tmp_string[] = "Jakis ciag znakow";
       char tmp_buffer[16];
       ...
       USART_Transmit_string(tmp_string);
       ...
       USART_Transmit_string("Inny ciag znakow");
       ...
       itoa(zmienna_typu_integer, tmp_buffer, 10); //przekształcenie zmiennej
                                                  //liczbowej na ciąg znaków
       USART_Transmit_string(tmp_buffer);
       ...
    
  • #24 8874724
    janbabinicz
    Poziom 10  
    No i pojechane.. :(
    Wrzuciłem te procedury do watomierz.c i wyskoczyły błędy :(
    Usuwam procedury i wszystko OK :(

    watomierz.c: In function 'USART_Init':
    watomierz.c:33: error: 'UBRRH' undeclared (first use in this function)
    watomierz.c:33: error: (Each undeclared identifier is reported only once
    watomierz.c:33: error: for each function it appears in.)
    watomierz.c:34: error: 'UBRRL' undeclared (first use in this function)
    watomierz.c:36: error: 'UCSRA' undeclared (first use in this function)
    watomierz.c:36: error: 'U2X' undeclared (first use in this function)
    watomierz.c:38: error: 'UCSRB' undeclared (first use in this function)
    watomierz.c:40: error: 'UCSRC' undeclared (first use in this function)
    watomierz.c:40: error: 'UMSEL' undeclared (first use in this function)
    watomierz.c:42: error: 'UCSZ0' undeclared (first use in this function)
    watomierz.c:42: error: 'UCSZ1' undeclared (first use in this function)
    watomierz.c:42: error: 'UCSZ2' undeclared (first use in this function)
    watomierz.c:42: error: 'USBS' undeclared (first use in this function)
    watomierz.c:42: error: 'UPM1' undeclared (first use in this function)
    watomierz.c:42: error: 'UPM0' undeclared (first use in this function)
    watomierz.c: In function 'USART_Transmit':
    watomierz.c:49: error: 'UCSRA' undeclared (first use in this function)
    watomierz.c: In function 'USART_Receive':
    watomierz.c:57: error: 'UCSRA' undeclared (first use in this function)
    make.exe: *** [watomierz.o] Error 1
    
    > Process Exit Code: 2
    > Time Taken: 00:00
  • #25 8874725
    janbabinicz
    Poziom 10  
    Oczywiście miałem na myśli te pierwsze, które przedstawiłem wyżej, wysyłające jeden znak.
  • #26 8875088
    Andrzej__S
    Poziom 28  
    Cytat:

    Wrzuciłem te procedury do watomierz.c i wyskoczyły błędy
    Usuwam procedury i wszystko OK

    Bo te procedury są przeznaczone dla innego typu procesora. AT90S2313 nie ma takich rejestrów jak UCSRA czy UBRRL.
  • #27 8875157
    Piotrek_P
    Poziom 18  
    Tak jak kolega wyżej napisał, trzeba sprawdzić w datasheet czy nasz procek posiada takie rejestry jakie są w kodzie. Po weryfikacji należy zmienić w programie nazwy rejestrów na właściwe dla posiadanego mikrokontrolera.

    Pozdrawiam
    Piotrek
  • Pomocny post
    #29 8875462
    Balu
    Poziom 38  
    Myslę że powinieneś sięgnąc do książek o podstawach uC.
    Sorry ale dalsza pomoc z naszej strony nie wydaje się mieć sensu.
    Podpowiem, że poprawienie tych błedów to są z 2...3 minuty...
  • #30 8875552
    janbabinicz
    Poziom 10  
    Zapewne. Nie ukrywam, że jestem początkującym. Dużo czytam i szukam, no ale na razie nie mogę jakoś zatrybić. Tak jakbym się bał tego kompilatora.
    W tym momencie nie pozostaje mi nic innego jak tylko poprosić o znalezienie tych 2-3 minutek.... Żeby poszło to pod Attiny2313.
    Nie rozumiem jednego. Sam program do watomierza kompiluje się poprawnie.
    Sam program do obsługi uarta również. Po prostu nie potrafię połączyć tego razem.

    Dziękuję za wszelką pomoc.
    Szczerze to i tak jestem zaskoczony ogromem pomocy jaką otrzymałem.
REKLAMA