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 w WinAvr - undefined reference to `sbi` w programie AVR

Tomcio7 20 Lip 2005 09:49 1259 2
REKLAMA
  • #1 1666948
    Tomcio7
    Poziom 17  
    Posty: 297
    Pomógł: 8
    Ocena: 19
    Mam bardzo prosty dla niektórych z was problem. Do WinAvr wpisałem program znajdujący się na stronie:

    http://www.patron.net.pl/AVRintropl.htm

    Mój program
    ///////

    #include <avr/io.h>
    int main (void)
    {
    sbi(DDRB,PB1);
    sbi(PORTB,PB1);
    for (;;)
    {

    }
    return (0);
    }
    ///////

    Robiłem wszystko dokładnie tak jak jest tam napisane. Problem nastąpił gdy miałem skompilować. Kompilacja się nie udała bo wystąpił jakiś błąd. Wyswietliły się następujące komunikaty:

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

    > Process Exit Code: 2
    ///////
    Według autora nie powinno być żadnego błędu, ale ja jakies mam. Co może być przyczyną tych błędów??[/i]
  • REKLAMA
  • Pomocny post
    #2 1666986
    mystic
    Poziom 11  
    Posty: 65
    Pomógł: 2
    Stało się tak gdyż użyłeś nowszej wersji kompilatora niż autor programu. Autorzy WinAVR probują upodobnić go do standardu ANSI C ,a instrukcje(mnemoniki) sbi i cbi są wzięte "na żywca" z asemblera.
    Polecenia:

    sbi(DDRB,PB1);
    sbi(PORTB,PB1);

    musisz zastąpić przez:


    DDRB|=1<<1; //ustaw DDRB,1
    PORTB|=1<<1; //ustaw PORTB,1

    Może wyglądają one troche tajemniczo ale w sumie są proste. Oznaczają one, o ile miejsc w lewo trzeba przesunąć jedynkę ustawioną na bicie 0 a operator | (suma logiczna) zapewnia brak zmiany pozostałych bitów. Przy zerowaniu bitów posługujemy się instrukcją:

    DDRB&=~(1<<5); //zeruj DDRB,5;

    Pozdrawiam.
  • #3 1666998
    Tomcio7
    Poziom 17  
    Posty: 297
    Pomógł: 8
    Ocena: 19
    Dzięki za pomoc, już wszystko gra.
REKLAMA