Witam. Zaczynam nauke pisania programow w C dla AVR'ow. Sa to moje poczatki jezeli chodzi o mikrokontrolery. Probuje napisac prosty, przykladowy programik i tu zaczynaja sie schody:
przy probie kompilacji dostaje: B³êdy linkowania plików relokowalnych led.c:4 - warning: implict declaration of function 'outp' led.c:4 error - undefined reference to 'outp'
Moze ktos spotkal sie z czyms takim i moglby pomoc, bo ja nie mam pojecia co z tym zrobic :(
Dodam, ze uzywam AvrSide, WinAVR oraz AVR Studio 4 Z gory dziekuje za kazda wskazowke. Pozdrawiam.
Didn't find your answer? Ask the community — no account required.
J
Jurek Szczesiul
Sun, 6 Mar 2005 18:07:03 +0100, na pl.misc.elektronika, lucash napisał(a):
jeśli io.h to raczej <avr/io.h>
Nie ma potrzeby - kompilator ładuje to sobie sam na podstawie podanego typu procesora.
Nowe WinAvr ma avr-libc w wersji chyba 1.2.3 - po wielokrotnych ostrzeżeniach makra sbi/cbi/outp/inp odeszły do lamusa ;-) Pisz po prostu DDRB=0xff; PORTB=0xff; itd.
BTW - mocno proponuję nie korzystać już z przestarzałej serii 90x i zaczynać od razu od Atmega / Attiny.
L
lucash
dzieki serdeczne za pomoc. pozdrawiam.
L
lucash
a jeszcze jedno pytanie: w jaki sposob (nie korzystajac z sbi oraz cbi) ustawic np.: bit 4 portu B na "1" lub "0" ?
sorki jesli to pytanie jest bardzo lamerskie, ale to moje pierwsze kroczki :)
z gory dziekuje i pozdrawiam lukasz
J
Jurek Szczesiul
Sun, 6 Mar 2005 21:01:59 +0100, na pl.misc.elektronika, lucash napisał(a):
Przez standardowe operacje bitowe C z użyciem maski bitowej : Ustawienie bitu to zsumowanie ( nie logiczne ale bitowe ) wartości ( dla przykładu niech będzie bajt ) z maską, w której tylko jeden, ten potrzebny bit jest ustawiony :
1000 0001 | 0000 1000 = 1000 1001 - ustawiamy 3. bit w praktycznym zapisie maskę tworzymy przesuwając w lewo liczbę 1 o potrzebną ilość miejsc. Powyższe będzie wyglądać : value |= (1<<3); albo z użyciem przewidzianego w tym celu makra _BV : value |= _BV(3);
Do skasowania bitu używamy iloczynu bitowego i maski zanegowanej ( czyli same jedynki i zero tylko na potrzebnym miejscu ) :
1000 1001 & ~(0000 1000) = 1000 1001 & 1111 0111 = 1000 0001 - kasujemy 3. bit. W praktycznym zapisie : value &=~(1<<3); albo value &=~_BV(3);
Dodatkowo używając operaci ex-or dla wybranego bitu możemy zmienić jego stan na przeciwny : value ^=_BV(3);
BTW właśnie z użyciem _BV() były zdefiniowane wycofane makra sbi,cbi więc jest to dokładnie to samo ( jeśli komuś bardzo ich brakuje może je sobie zdefiniować ponownie ).
Definiowanie to zresztą bardzo wygodne narzędzie. Jeśli np. podłączysz sobie led Vcc-led-rezystor-port B-3 ( a więc zapalany niskim stanem ) to i tak dużo wygodniej niż pamiętać numery i stany będzie zapisać definicje :
Maski są też dużo wygodniejsze jeśli chcesz obsłużyć na raz kilka bitów : zamiast pisać kolejno sbi,sbi,sbi używasz w operacji sumowania maski z odpowiednimi bitami ustawionymi. Np. PORTB |= _BV(PB1) | _BV(PB3); ustawi jednocześnie bit 1. i 3. BTW jest to standardowa technika ustawiania rejestrów konfiguracyjnych.
L
lucash
jeszcze raz dziekuje Ci za pomoc.
pozdrawiam serdecznie. lukasz filipiuk
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.