Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Program na AVR w C i problem z odczytem stanu wejść

_Wojciech_
-
-
Posty:269
Rejestracja:1 kwie 2003, o 20:32
Lokalizacja:Bielsko-Biała
Program na AVR w C i problem z odczytem stanu wejść

Postautor: _Wojciech_ » 27 mar 2004, o 16:23

Pisze sobie programik na AVR'a (kompilator WinAVR z nakładką Edytor Projektów AVR) i mam problem.
Port B jest ustawiony jako wejście, D jako wyjście.
Czemu poniższy kod nie działa?

Kod: Zaznacz cały

if (PINB1) cbi(PORTD,2); else sbi(PORTD,2);
I trzeba stosować takie cudo:

Kod: Zaznacz cały

if (PINB&2) cbi(PORTD,2); else sbi(PORTD,2);
W ogóle jak najprościej odczytać stan pojedynczego pinu na porcie np. B?

Jurek Szczesiul
-
-
Posty:175
Rejestracja:10 paź 2003, o 20:44
Lokalizacja:Białystok
Kontaktowanie:

Re: Program na AVR w C i problem z odczytem stanu wejść

Postautor: Jurek Szczesiul » 27 mar 2004, o 16:51


W ogóle jak najprościej odczytać stan pojedynczego pinu na porcie np. B?
AvrGcc nie wspiera operacji na pojedynczych bitach; więc właśnie tak jak zrobiłeś - przez iloczyn logiczny z maską. Można to obchodzić różnego rodzaju makrami ale IMHO to kwestia po prostu przyzwyczajenia
BTW - do tego też jest już gotowe makro : _BV ( albo BV ) a piny są nazwane w pliku nagłówkowym, więc kontrola pinu może wyglądać :
if (PINB & _BV(PB1)) ... itd.
Podobnie jest z ustawianiem :
PORTB |=_BV(PB2)
PORTB &=~_BV(PB2)
i przełączaniem
PORTB ^=_BV(PB2)
Zauważ , że jest to bardziej uniwersalne : 'wyższe' porty w większych uK są w rejestrach rozszerzonych gdzie nie masz sbi i cbi - zaś avrgcc sam wybiera sposób realizacji w zależności od portu i nie trzeba o tym pamiętać.
Drugie IMHO - w konkretnym projekcie i tak warto przypisać wejściom jakąś treść informacyjną - i wtedy mozna sobie dopisać proste konkretne makra, które później z niczym się nie mylą i wiadomo o co chodzi, np.

#define PRZYCISK_1 PB2
#define WCISNIETY_PRZYCISK_1 (!(PINB & _BV(PRZYCISK_1)))
// zazwyczaj przycisk zwiera pullup do masy, więc logicznie stany są odwrócone

i potem tylko piszesz if(WCISNIETY_PRZYCISK_1) ...

Pozdrowienia
Jurek Szczesiul

_Wojciech_
-
-
Posty:269
Rejestracja:1 kwie 2003, o 20:32
Lokalizacja:Bielsko-Biała

Postautor: _Wojciech_ » 27 mar 2004, o 18:10

Wielkie dzieki za odpowiedź!

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 15 gości