teraz Atmegowa "zerówka" dla tych , których przeraża obudowa Atmegi32 z 40-toma wyprowadzeniami i którzy nie są w stanie ogarnąć swoim umysłem o co chodzi w moich dotychczasowych lekcjach. Powinienem to wcześniej napisać, ale powiem wam jedno: NIE PODDAWAJCIE SIĘ. Atmega16/32/64 to bardzo przyjazny pająk.
Pinologię przewdstawia poniższy rysunek:
Na razie udawajcie że nie widzicie napisów w nawiasach - na tym etapie są nieistotne. Istotne dla was są natomiast Wyprowadzenia PORTÓW A, B, C i D.
Jak widzicie każdy port jest "8-mio bitowy" (ma 8 wyprowadzeń) bo Atmega to mikrokontroler 8-mio bitowy. Każde z tych wyprowadzeń może spełniać role wejścia logicznego lub wyjścia - w zależności jak ją zaprogramujecie. Port A posiada wyprowadzenia od PA0 do PA7. PORT B posiada wyprowadzenia od PB0 do PB7. PORT C od PC0 do PC7 no i PORT D już pewnie wiecie jak ...
Przypuśćmy że chcemy by wyprowadzenia portu A od PA0 do PA6 były wyjściami, a PA7 wejściem ...
w kodzie programu musimy zatem umieścić taką linijkę:
Po "0b" wstawiamy odpowiednio 0 lub 1 (0=wejście, 1-wyjscie) które reprezentują kolejno wyprowadzenia PA7, PA6, PA5, PA4, PA3, PA2, PA1, PA0. Wyjaśnia to poniższy rysunek
Analogicznie do powyższego przykładu ustawić można stan wyprowadzeń portu, poprzez przypisanie wartości do rejestru PORTA, np.:
powyższa linijka spowoduje że porty PA7, PA6, PA5, PA4 będą w stanie niskim, a porty PA3, PA2, PA1, PA0 będa w stanie wysokim. Już macie obcykany port A
Reszta portów czyli B, C, D działa analogicznie, musicie tylko zmienić literkę A na inną. Można powiedziec że jeśli to zrozumiecie to macie 32 wyprowadzenia Atmegi wytłumaczone zostaje 8 pinów, z których musicie tylko znać teraz dwa piny do zasilania, dwa do masy, dwa do generatora kwarcowego, jeden pin RESET, który po podaniu stanu niskiego (zwarciu do masy) resetuje nam Atmegę - potrzebne po zaprogramowaniu na płycie ewaluacyjnej. Zostaje nam ostatni PIN "AREF" - nie musicie nic wiedzieć na jego temat na tym etapie nauki. Mam nadzieję, że po takim prościutkim i króciutkim wprowadzeniu, Atmega nie jest już dla was "postrachem" lecz zaczyna być "znajomym kumplem".
lekcja 4
Kod:
/* Jest to czwarta lekcja Kursu Programowania mikrokontrolera Atmega w języku C
Należy podłączyć 8 diód LED do Portu A, każdą poprzez rezystor 680 OHm (od 500 do 1k), druga noga każdej diody do masy.
oraz przycisk (microswitch lub inny) do Wyprowadzenia B0 (PORT B wypr.0) - drugi biegun do masy.*/
/* zanim przejdziemy dalej przedstawię różne sposoby zapisu wartości, jeśli ktoś widzi to pierwszy raz to niech w internecie poszuka informacji na ten temat:
zapis dziesiętny zapis binarny zapis hexadecymalny(szestnastkowy)
0 = 0b00000000 = 0x00
1 = 0b00000001 = 0x01
10 = 0b00001010 = 0x0a
16 = 0b00010000 = 0x10
255 = 0b11111111 = 0xff (może byc też 0xFF)
Jak pewnie zauważyliście do zapisu binarnego używany jest prefix "0b" a do szasnastkowego "0x" */
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRA = 0xff; // (tożsame z: DDRA = 0b11111111)
DDRB = 0; // mógłbym napisać 0x00
PORTB= 1; // to jest to samo co 0x01
PORTA= 0b01010101; // tam gdzie jedynka dioda świeci - zatem świeci co druga dioda (co drugie wyjście PORTU A ma stan wysoki)
// jak widzicie stosuje sobie taki zapis jaki jest mi wygodny kiedy chcę i gdzie chcę i to działa !!!
// bez względu na to czy podacie wartość szasnastkowo czy binarnie - kompilator sobie to przetłumaczy
while(1)
{
if(bit_is_clear(PINB, 0)) // to musicie pamiętać z poprzedniej lekcji
{
/* UWAGA! */PORTA=PORTA^3; // zmieńcie liczbę poprawej stronie znaku "^" , następnie skompilujcie i zaprogramujcie Atmegę (dobry efekt jest jak wpiszecie 255)
_delay_ms(160);
}
}
}
/* komentarz do linijki z UWAGĄ:
wstawiajcie inne liczby zamiast jedynki, za każdym razem kompilujcie i wgrywajcie hexa do atmegi
zobaczcie co sie zmienia po przyciśnięciu przycisku (lub po jego przytrzymaniu) - to bardzo ciekawy efekt
jeżeli ktoś tego nie zrozumie po kilku(nastu) próbach - ułatwieniem będzie zamiana tej liczby na 8 bitowy zapis binarny np. 0b00001111 */
/* autor: SP4EJT nie zastrzega sobie praw autorskich, pod warunkiem że nie czerpiesz z tego korzysci materialnych, możecie kopiować i zmieniać ten plik */
lekcja 5
Kod:
/* Jest to czwarta lekcja Kursu Programowania mikrokontrolera Atmega w języku C
Należy podłączyć 8 diód LED do Portu A, każdą poprzez rezystor 680 OHm (od 500 do 1k), druga noga każdej diody do masy.
oraz przycisk (microswitch lub inny) do Wyprowadzenia B0 (PORT B wypr.0) - drugi biegun do masy.*/
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRA = 255;
DDRB = 0x00;
PORTB= 0x01;
PORTA= 0b01010101;
while(1)
{
if(bit_is_clear(PINB, 0))
{
/* UWAGA! */PORTA=(PORTA^255) & 0b00001111; // zmieńcie liczbę (poprzestawiajcie jedynki) poprawej stronie znaku "&" ,
// następnie skompilujcie i zaprogramujcie Atmegę
_delay_ms(160);
}
}
}
/* komentarz do linijki z UWAGĄ:
wyrażenie "& 0b00001111" "nakłada maskę" na wcześniejsze wyrażenie w taki sposób, że pozwala na zaświecanie tylko tych diód (pojawienie sie stanu wysokiego na wyprowadzeniach portu),
które są "oznaczone" jedynką. Fachowo nazywa sie to koniunkcja (tak jak w bramce logicznej AND).
Działa to tak:
0 1 0 1 0 1 0 1
&
0 0 1 1 0 0 1 1
=
0 0 0 1 0 0 0 1
autor: SP4EJT nie zastrzega sobie praw autorskich, pod warunkiem że nie czerpiesz z tego korzysci materialnych, możecie kopiować i zmieniać ten plik */
lub w plikach poniżej
ps. następnym razem będziemy katować popularny wyświetlacz alfanumeryczny: 2linijki po 16 znaków na sterowniku HD44780, więc się zapoznajcie z jego budową i sposobem podłaczenia oraz z symulatorem który jest do pobrania poniżej. Człowiek, który go zrobił pozwala powielać i umieszczać na swojej stronie ten programik napisany w javie.
Ja właśnie z takiego symulatora wziąłem swoja umiejętność obsługi tego LCD
lekcja4.zip (Rozmiar: 11.26 KB / Pobrań: 983)
lekcja5.zip (Rozmiar: 10.51 KB / Pobrań: 1023)
lcd.zip (Rozmiar: 96.94 KB / Pobrań: 1029)
Napisał by ktos czy za trudne rzeczy wam wciskam w głowy czy moze za łatwe i się tak nudzicie, że straciliście zainteresowanie ???
Dla tych którzy się już nudzą to zapodaje programik który ma wyświetlić na wyswietlaczu alfanumerycznym tylko cztery litery "ABCD" (na początek, potem będzie weselej). Sposób zasilenia i podłączenia potencjometru kontrastu znajdźcie w sieci, może potem wkleje schemat ( jak znajdę/zrobię). Ci , którzy maja płytę ewaluacyjną maja z górki bo tam już wszystko jest przygotowane pod wyswietlacz.
Kod:
/* Jest to szósta lekcja Kursu Programowania mikrokontrolera Atmega w języku C
Należy podłączyć Wyświetlacz alfanumeryczny do Portu A, w następujący sposób:
ATMEGA <--> wyświetlacz
A7 - D7
A6 - D6
A5 - D5
A4 - D4
A3 - RS
A2 - E
4 młodze bity wy świetlacza podłaczone do masy (czyli D3, D2, D1, D0 do masy)
Program wyświetla cztery litery "ABCD" na wyświetlaczu */
#include <avr/io.h>
#include <util/delay.h>
unsigned char znak;
/* TO PONIŻEJ jest to funkcja o nazwie "bajt_lcd" wykonująca linie kodu zamknięte
w nawias klamrowy. Wywołuje się nią pisząc "bajt_out(bajt_który_chcesz_wysłać_do_LCD)"
np. "bajt_out(0x28);" lub "bajt_out(0b00100100);" - ujrzycie to w części głównej programu.
Funkcja ta dzieli na pół bajt który chcemy wysłać(bo używamy 4-bitowego interfejsu)
i przesyła najpierw 4 starsze bity, a potem 4 młodsze bity bajtu, który chcemy wysłać */
void bajt_lcd(unsigned char znak)
{
PORTA = (PORTA&0x0f)|(znak&0xf0);
_delay_ms(5);
PORTA = PORTA|0b00000100; //wyprowadzenie PA2 w stan wysoki = E=1
_delay_ms(5);
PORTA = PORTA&(~0b00000100); //wyprowadzenie PA2 w stan niski = E=0
_delay_ms(50);
PORTA = (PORTA&0x0f)|(znak<<4);
_delay_ms(5);
PORTA = PORTA|4; //wyprowadzenie PA2 w stan wysoki = E=1
_delay_ms(5);
PORTA = PORTA&(~4); //wyprowadzenie PA2 w stan niski = E=0
_delay_ms(50);
}
//zaczynamy część główną programu
int main(void)
{
DDRA = 0xfc;
unsigned char i;
for(i=0;i<3;i++) // zaleca się 3 x tą operację c.d.n.
{
PORTA = (PORTA&0x0f)|(0x30&0xf0); // inicjalicacja 8bit
_delay_ms(5);
PORTA = PORTA | 4; //wyprowadzenie PA2 w stan wysoki = E=1
_delay_ms(5);
PORTA = PORTA & ~4; //wyprowadzenie PA2 w stan niski = E=0
_delay_ms(10);
}
PORTA = (PORTA&0x0f)|(0x20&0xf0); // inicjacja według zaleceń c.d.
_delay_ms(5);
PORTA |= 4; //wyprowadzenie PA2 w stan wysoki = E=1
_delay_ms(5);
PORTA &= ~4; //wyprowadzenie PA2 w stan niski = E=0
_delay_ms(5);
bajt_lcd(0x28); // Interfejs 4-bit, Wyświetlacz dwuwierszowy, Matryca znaków 5x7
bajt_lcd(0x01); // czyszczenie i przesuniecie na poczatek LCD
bajt_lcd(0x0e); // włączenie wyświetlacza kursor widoczny niemrygający
PORTA = PORTA|0b00001000; //wyprowadzenie PA3 w stan wysoki = RS=1 (wyświetlanie znaków)
bajt_lcd(0b01000001); // wyświetlam literę A
bajt_lcd(0x42); // wyświetlam literę B
bajt_lcd(67); // wyświetlam literę C
bajt_lcd('D'); // wyświetlam literę D
}
/* autor: SP4EJT nie zastrzega sobie praw autorskich, pod warunkiem że nie czerpiesz z tego korzysci materialnych, możecie kopiować i zmieniać ten plik */
lub plik z lekcją6
lekcja6.zip (Rozmiar: 14.48 KB / Pobrań: 978)