atmega8l + program

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

Reply to
Wojtek
Loading thread data ...

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.

Reply to
Adam Dybkowski

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

Reply to
Wojtek

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

Reply to
Adam Dybkowski

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.