avrgcc i 'outp'

Loading thread data ...

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.

Reply to
Jurek Szczesiul

dzieki serdeczne za pomoc. pozdrawiam.

Reply to
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

Reply to
lucash

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);

KOnkretnie dla portu będzie np.

PORTB |= _BV(PB3); PORTB &=~_BV(PB3); PORTB ^=_BV(PB3);

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 :

#define LED PB3 #define ZAPAL_LED PORTB &=~_BV(LED) #define ZGAS_LED PORTB |= _BV(LED) #define PRZELACZ_LED PORTB ^=_BV(LED)

i potem je zupełnie bez kłopotów używać.

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.

Reply to
Jurek Szczesiul

jeszcze raz dziekuje Ci za pomoc.

pozdrawiam serdecznie. lukasz filipiuk

Reply to
lucash

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.