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

Błąd kompilacji ATmega8+C: brak definicji funkcji `sbi` w WinAVR v2.0.6.1

Ireq 30 Mar 2006 16:12 972 3
REKLAMA
  • #1 2475107
    Ireq
    Poziom 13  
    Posty: 56
    Pomógł: 1
    Ocena: 1
    Mecze sie z tym i mecze i nie wiem co jest grane.
    oto kod:
    
    #include <avr/io.h> 
    #define LED_ON sbi(DDRB,PB1);sbi(PORTB,PB1); 
    int main (void) 
    { 
    LED_ON; 
       for (;;) 
       { 
       asm volatile ("WDR"::); 
       } 
    return (0);      
    } 

    To jest przyklad z tej strony -> http://www.patron.net.pl/artykuly/AVR_tutorial.htm
    i bledy wyskakujace przy kompilacji:
    
    led.c:5: warning: implicit declaration of function `sbi' 
    <sciezka dostepu>/led.c:5: undefined reference to `sbi' 
    <sciezka dostepu>/led.c:5: undefined reference to `sbi' 
    

    Wiem ze cos z biblioteka nie tak, ale nie wiem co, biblioteka jest taka jaka powinna byc. Uzywam WinAVR v2.0.6.1
  • REKLAMA
  • #2 2475249
    grzesiekturski
    Poziom 10  
    Posty: 38
    Ocena: 1
    sprobuj zamienic sbi(...) na asm sbi(...).
  • REKLAMA
  • #3 2475312
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    W nowych kompilatorach WinAVR brak jest instrukcji sbi. Zapisz daną bezpośrednio do rejestru DDRx i PORTx. (DDRB = 0x02 i PORTB = 0x02). Jeżeli chcesz zmienić tylko wybrane bity zastosuj to:
    PORTx|=_BV(nr bitu) - aby bit ustawić na 1
    PORTx&=~_BV(nr bitu) - aby bit wyzerować.

    Za PORTx można wstawić nazwę zmiennej lub innego rejestru.

    Czyli

    sbi(DDRB,PB1); odpowiada DDRB|=_BV(1);
    sbi(PORTB,PB1); odpowiada PORTB|=_BV(1);
  • #4 2475328
    Ireq
    Poziom 13  
    Posty: 56
    Pomógł: 1
    Ocena: 1
    Dzieki juz dziala wszystko :D Rozumiem ze sbi i cbi nie bedzie dzialalo i moge o tych funkcjach zapomniec?

    EDIT: Zamykam temat.
REKLAMA