atmega8l + program

May 25, 2005 3 Replies

Witam szanownych grupowiczów



mam następujące zadanie do wykonania: jest atmel wspomniany w tytule i do niego podłączonych jest 12 diód. PC0-PC5 PD0-PD5, i mam z komputera zapalać te diody w ten sposób że na jedno wejście wysyłam ile diód ma się zaświecić a na drugie "zrób to" co spowoduje że stan wyświetlacza się zmieni, diody zapalane są po kolei od lewej do prawej czyli po 7 impulsach i "zrób to" zapali się 7 dioód od lewej.



na programowaniu Atmeli nie znam się wcale, nieobce mi jest C ale już odpalanie wyjść to trochę inna bajka, z wejściami podobnie.



chciałbym prosić kogoś aby podał mi szkielet (tzn. podstawowe funkcje typu "zapal diodę na PA1" albo pobierz wartość z wejścia jakiegośtam. (nie obrażę się oczywiście na bardziej kompletne rozwiązanie ;)



z góry dziękuję Wojtek


Do wszystkich poniższych przykładów trzeba dać: #include <avr/io.h>

Najpierw konfigurujemy cały port A jako wyjściowy:

DDRA = 0xff;

i gasimy wszystkie diody (podłączone przez rezystor między pin portu a masę):

PORTA = 0;

Zapalenie diody 0..7 (bitu 0..7 w rejestrze wyjściowym portu A):

PORTA |= (1 << n); // n - numer diody (0..7)

Zgaszenie diody:

PORTA &= ~(1 << n);

Aby skonfigurować pin jako wejście należy w rejestrze DDRA wyzerować odpowiedni bit, aby skonfigurować jako wyjście - ustawić bit. Na przykład piny 0..3 wejścia a 4..7 wyjścia:

DDRA = 0xf0;

No i na koniec odczytanie stanu wejścia czyli sprawdzenie rejestru PINA:

if (PINA & (1 << n)) // wejście równe 1 else // wejście równe 0

Można oczywiście operacje bardziej komplikować, np. jednocześnie zapalić w porcie A bit nr 0 a zgasić bit nr 2:

PORTA = (PORTA | (1 << 0)) & ~(1 << 2);

albo jak kto woli krócej:

PORTA = (PORTA | 0x01) & 0xfb;

Często aby zrobić operację na 2 bitach bardziej opłaca się napisać 2 linie kodu niż 1. Po prostu w powyższym przykładzie procesor musi odczytać PORTA, obliczyć operację OR, obliczyć operację AND a na końcu zapisać PORTA. Krócej (w pamięci programu) będzie jedną instrukcją zapalić bit a drugą zgasić:

PORTA |= (1 << 0); // to wygeneruje jedną instrukcję sbi PORTA &= ~(1 << 2); // to wygeneruje jedną instrukcję cbi

No ale tym razem bity nie zmienią swojego stanu _równocześnie_ - musisz uwzględnić na czym bardziej zależy w danym przypadku.

Podobne nazwy odnoszą się do innych portów: DDRB/PORTB/PINB, DDRC/PORTC/PINC itd.

wielkie dzięki za pomoc,

przykład jest super, zwłaszcza że zapomniałem dodać że o tą składnię mi chodzi a większość rzeczy które znalazłem używa sbi/cbi/outp i mój kompilator tego nie przyjmuje.

pozdrawiam Wojtek

Nie używaj tych makr. Wypadły z najnowszej wersji kompilatora i już nie wrócą.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required