- posted
19 years ago
avrgcc i 'outp'
- Vote on answer
- posted
19 years ago
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.
- Vote on answer
- posted
19 years ago
dzieki serdeczne za pomoc. pozdrawiam.
- Vote on answer
- posted
19 years ago
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
- Vote on answer
- posted
19 years ago
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.
- Vote on answer
- posted
19 years ago
jeszcze raz dziekuje Ci za pomoc.
pozdrawiam serdecznie. lukasz filipiuk