[AVRGCC] Problem z kompilacja + pytania początkującego.

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Bananera
-
Posty: 3
Rejestracja: 21 lip 2007, 10:56
Lokalizacja: Gryfice

[AVRGCC] Problem z kompilacja + pytania początkującego.

Post autor: Bananera » 21 lip 2007, 11:08

Witam wszystkich na forum bo jestem nowy i juz mowi o co mi chodzi :wink: .
Od jakiegos czasu interesuje sie programowanie uC. Wczoraj dostalem stk200/300 i chcialem skompilowac swoj pierwszy program:

Kod: Zaznacz cały

#include <avr/io.h> 

#define LED_ON sbi(DDRB,PB1);sbi(PORTB,PB1) 

  

int main (void) 

{ 

LED_ON; 

    

    for (;;) 

   { 

    

   } 

    return (0);      

}
I wyskoczył mi jakis głupi błąd:

Kod: Zaznacz cały

> "make.exe" all
avr-gcc -O -g -Wall -ffreestanding -mmcu=atmega8 -o led.out led.o
led.o: In function `main':
C:\Documents and Settings\XXX\Moje dokumenty\projekt proba/led.c:4: undefined reference to `sbi'
C:\Documents and Settings\XXX\Moje dokumenty\projekt proba/led.c:6: undefined reference to `sbi'
make.exe: *** [led.out] Error 1

> Process Exit Code: 2
> Time Taken: 00:02
Powiedzcie mi prosze o co chodzi. Wydaje mi sie ze cos jest z plikiem io.h.
HELP PLZ.
Greets
Bananera
Ostatnio zmieniony 01 sty 1970, 1:00 przez Bananera, łącznie zmieniany 1 raz.

ZbeeGin

Post autor: ZbeeGin » 21 lip 2007, 12:32

Masz po prostu nowszą wersję AVRGCC. W nowych wersjach makra sbi() cbi() zostały usunięte.
http://www.avrside.ep.com.pl/Opisy/tips.html pisze:Avr-gcc nie posiada składni bezpośredniego dostępu do bitów zmienna.numer_bitu. Operacje na bitach wykonujemy używając iloczynu i sumy bitowej, np. dla bajtu:

Kod: Zaznacz cały

  zmienna |= _BV(numer_bitu); // ustawienie bitu
  zmienna &= ~_BV(numer_bitu); //zgaszenie bitu
  zmienna ^= _BV(numer_bitu); // przełączenie bitu
( _BV() - bit value to proste pomocnicze makro równoznaczne z jedynką przesuniętą w lewo o numer_bitu ).
Link do tej strony: http://www.avrside.ep.com.pl/Opisy/tips.html

W twoim przypadku należy napisać:

Kod: Zaznacz cały

#define LED_ON DDRB |= _BV(PB1); PORTB |= _BV(PB1)

Bananera
-
Posty: 3
Rejestracja: 21 lip 2007, 10:56
Lokalizacja: Gryfice

Post autor: Bananera » 21 lip 2007, 12:42

OK. THX za odp, ale mam jeszcze takie jedno glupie pytanie. Nie wiem jak podlaczyc uC z dioda po zaprogramowaniu tego.
Mozesz mi powiedziec jak podlaczyc to? Bo dostalem taki schemat od kolegi:
http://www.dioda.com.pl/files/led2_560.png
I nie wiem zabardzo jak podlaczyc to do uC. To VCC to jest podlaczenie do zasialacza na "plus", czy do nogi ozaczonej VCC? Jak w tym drugim przypadku to gdzie podlaczyc zasilanie?
Aha. I jaki rezystor mam dac jak pede uzywal ATmega8 podlaczone pod 5v?
Z gory dzieki za pomoc.

Wojtek
Moderator
Posty: 2606
Rejestracja: 04 sie 2002, 19:00
Lokalizacja: --
Kontakt:

Post autor: Wojtek » 21 lip 2007, 12:54

Zobacz tu https://elportal.pl/ea/asm_prog001.html - opornik to daj np 330Ω jak dasz 1kΩ to też bedzie świecić tyle że słabo :)
To co kolega ci podał to jest ok. Vcc oznacza plus zasilania i musi być podłączony do anody diody przez opornik (oczywiście do mikroprocesora Vcc tez musi byc podłączone) - w pierwszym przypadku podanym przez kolegę dioda będzie świecić gdy na wyjsciu bedzie "1", a w drugim przypadku gdy na wyjsciu bedzie "0".
Ostatnio zmieniony 22 lip 2007, 7:36 przez Wojtek, łącznie zmieniany 1 raz.

Bananera
-
Posty: 3
Rejestracja: 21 lip 2007, 10:56
Lokalizacja: Gryfice

Post autor: Bananera » 21 lip 2007, 13:20

A czy ATmega8 konieczne jest zrobienie takiego czegos jak dalem w zalączniku?
JAk tak to jak to podlaczyc do ATMEGA8 i po co to jest?
Załączniki
bez tytułu.JPG
bez tytułu.JPG (3.72 KiB) Przejrzano 4829 razy

ZbeeGin

Post autor: ZbeeGin » 21 lip 2007, 16:45

Nie jest konieczne jeśli nie planujesz jakiś zadań wymagających bardzo dokładnego odmierzania czasu. Układy ATMega posiadają także wewnętrzny generator RC który - w uproszczeniu - taktuje procesor przebiegiem o częstotliwości 1MHz. Jest on włączony fabrycznie.
Jeśli zaś zależy Tobie na innej częstotliwości pracy procesora to rozwiązanie z kwarcem jest jak najbardziej odpowiednie. Układ jest taki jak na rysunku i podłącza się go do końcówek XTAL1 oraz XTAL2. Na Twoim rysunku zauważ jak nazwano - choć jest to znacznie ucięte - końcówki 4 oraz 5. Kojarzysz?

W tym miejscu jeszcze drobna sugestia. Zacznij studiować dokumentację procesorów których pragniesz użyć. Wiele się może wtedy wyjaśnić samo.
(...) po co to jest?
No, cóż. Procesor aby mógł wogóle pracować musisz mu dostarczyć przebiegu, który wykorzysta do synchronizacji swojej pracy. Układ z kwarcem to jeden z takich elementów - choć to tylko jeden szczegół takiego generatora przebiegu. Reszta znajduje się już w układzie scalonym.

Awatar użytkownika
Koppel
Użytkownik
Posty: 500
Rejestracja: 24 lip 2005, 18:05
Lokalizacja: Gliwice

Post autor: Koppel » 06 sie 2007, 14:10

ZbeeGin pisze:#define LED_ON DDRB |= _BV(PB1); PORTB |= _BV(PB1)
Bardzo "typowy" przykład definiowania makra które w przyszłości może napytać nam biedy. Proponuję od początku uczyć się pisać w taki sposób:

Kod: Zaznacz cały

#define LED_ON() {DDRB |= _BV(PB1); PORTB |= _BV(PB1);}
Po pierwsze, nawiasy na makrem. Powodują one, że makro wywołuje się jak funkcję. Bardzo upraszcza to ewentualne zmiany w kodzie oraz ułatwia jego analizę.
Po drugie i nawet ważniejsze: Ciało makra objęte klamrami. Dlaczego? Bez klamer też działa... do czasu, aż spróbujemy czegoś w tym stylu:

Kod: Zaznacz cały

for(;;)
LED_ON();
Akurat w tym przypadku wywołanie w pętli makra LED_ON może nie ma wielkiego sensu.... ale jakbyśmy mieli coś w stylu LED_BLINK byłoby sensownie. Różnica w generowanym kodzie z klamrami i bez jest zasadnicza. W pierwszym przypadku w pętli wywoływane jest całe makro. W drugim wewnątrz ciała pętli mamy tylko pierwszą instrukcję makra.

ODPOWIEDZ