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

Błąd kompilacji AVR-GCC: undefined reference to `sbi` w kodzie na Atmega8-16pi

osamar 16 Mar 2005 12:53 2765 11
  • #1 1320208
    osamar
    Poziom 11  
    Posty: 21
    Na poczatku chce powiedziec ze o prockach nie wiem nic i dopiero zaczynam z nimi zabawe. Przejrzalem tutortial z tej strony http://www.patron.net.pl/AVRintropl.htm i kupilem procka atmega8-16pi. Zbudowalem programator, a nastepnie probowalem skompilowac pierwszy program jaki jest w tym tutorialu. Skopiowalem kod tego sterownika diody led, stworzylem makefile i jak dalem "make all" to mi wyrzucil:

    > "make.exe" all
    avr-gcc -g -Wall -O2 -mmcu=atmega8 -c -o led.o led.c
    led.c: In function `main':
    led.c:11: warning: implicit declaration of function `sbi'
    avr-gcc -g -Wall -O2 -mmcu=atmega8 -Wl,-Map,led.map -o led.elf led.o
    led.o(.text+0x10): In function `main':
    C:\WinAVR\projekty\led/led.c:11: undefined reference to `sbi'
    led.o(.text+0x1a):C:\WinAVR\projekty\led/led.c:11: undefined reference to `sbi'
    make.exe: *** [led.elf] Error 1

    > Process Exit Code: 2

    Pomozcie, nic nie wiem o tych prockach.
  • #2 1320445
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Widocznie masz najnowszą wersję avr-gcc , a ona nie zawiara makr sbi,cbi.
    Aby skompilować źródło powinieneś dokonać pewnej zmiany.
    Jest tak:
    
    #define LED_ON sbi(DDRB,PB1);sbi(PORTB,PB1)
    

    a może być tak:
    
    #define LED_ON DDRB|=1<<PB1;PORTB|=1<<PB1
    


    Radzę poczytać o swoim procku i o używanym kompilatorze , bo to dopiero początek kłopotów jakie napotkasz.

    Pozdrawiam
    Piotrek
  • #3 1320528
    osamar
    Poziom 11  
    Posty: 21
    Dzieki, jeszcze jakbys mogl podac jakis link gdzie moge znalezc informacje to bylbym wdzieczny
  • #4 1320635
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Na początek proponuję ściągnąć instalkę WinAvr oraz dokumentację ATMega8.

    Piotrek
  • #5 1320677
    osamar
    Poziom 11  
    Posty: 21
    winavr zainstalowalem juz jakis czas temu tylko męczyłem się z tymi instrukcjami. Dokumentacja to troche skomplikowana jest. Nie znacie czegos prostszego?? Albo jakas dobra ksiazka o prockach. Jaka jest dobra książka o mikrokontroleach avr??
  • #6 1334112
    Svavo
    Poziom 23  
    Posty: 800
    Pomógł: 42
    Ocena: 30
    "Mikrokontrolery AVR w praktyce" wydawnictwa BTC
  • #7 1382087
    Etalon
    Poziom 2  
    Posty: 2
    zumek napisał:
    Widocznie masz najnowszą wersję avr-gcc , a ona nie zawiara makr sbi,cbi.
    Aby skompilować źródło powinieneś dokonać pewnej zmiany.

    
    #define LED_ON DDRB|=1<<PB1;PORTB|=1<<PB1
    



    czy istnieje rownie sprytny sposob na zastapienie cbi ?
  • #8 1382118
    osamar
    Poziom 11  
    Posty: 21
    ej wiesz co zrób to tak jak ja zrobiłem ściągnij sobie starszą wersję avr-gcc tj. 20040404 a potem to juz sie dowiesz jak nowej uzywac :D :D
  • #9 1397786
    Etalon
    Poziom 2  
    Posty: 2
    osamar napisał:
    ej wiesz co zrób to tak jak ja zrobiłem ściągnij sobie starszą wersję avr-gcc tj. 20040404 a potem to juz się dowiesz jak nowej uzywac :D :D


    nic madrzejszego nie wymyslilem. dzieki za namiar na w miare swieza wersje!
  • #11 1398698
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Viperus napisał:

    #define LED_OF DDRB&=~(1<<PB1);PORTB&=~(1<<PB1)

    Pozdrawiam, Grzesiek

    Przedobrzyłeś :wink:
    Powyższe ustawi bit PB1 portu PORTB jako wejście bez pullup-a , a chodzi zapewne o ustawienie niskiego stanu na tym pinie tzn.
    #define LED_OF DDRB|=(1<<PB1);PORTB&=~(1<<PB1)

    w oryginale wygląda to tak:
    
    ...
    #define LED_ON sbi(DDRB,PB1);sbi(PORTB,PB1)
    #define LED_OFF sbi(DDRB,PB1);cbi(PORTB,PB1)
    ...
    


    Piotrek
  • #12 1401207
    Viperus
    Poziom 14  
    Posty: 75
    Pomógł: 6
    Ocena: 5
    Faktycznie -dziekuje za poprawkę ;) nie zwrociłem na to uwagi, ale chodziło o pokazanie w jaki sposób pozbyć sie cbi().
    Zresztą rozpoczynającemu wątek polecam przeszukanie forum, sam jestem początkujący a podobnych tematów już wiele widziałem.

    Pozdrawiam, Grzesiek

Podsumowanie tematu

LABEL_AI_GENERATED
Początkujący użytkownik AVR napotkał błąd kompilacji w środowisku avr-gcc podczas próby użycia funkcji makro `sbi` w kodzie dla mikrokontrolera Atmega8-16pi. Kompilator zgłaszał ostrzeżenie o niejawnej deklaracji oraz błąd "undefined reference to `sbi`". Problem wynika z faktu, że nowsze wersje avr-gcc nie zawierają makr `sbi` i `cbi`. Rozwiązaniem jest zastąpienie tych makr bezpośrednimi operacjami bitowymi na rejestrach, np. `DDRB |= 1
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA