Poradnik programowania procesorów AVR na przykładzie ATMEGA8 Wersja 1.0 Tomasz Pachołek 2017-13-03 Opracowanie zawiera opis podstawowych procedur, funkcji, operatorów w języku C dla mikrokontrolerów AVR oraz opis podstawowych działań na pinach i portach, potrzebnych do zaprogramowania prostych układów opartych o procesor ATMEGA8. Autor nie ponosi odpowiedzialności za nieprawidłowe działanie kodu lub uszkodzenie sprzętu.
Spis treści 1. TYPY...3 2. OPERATORY...3 3. Tablice prawdy:...4 4. Tablice przesunięć bitowych:...4 5. INSTRUKCJE:...5 6. PROGRAMOWANIE AVR ATMEGA8...6 7. OPIS WYPROWADZEŃ PINÓW ATMEGA 8...8 8. OPIS WYPROWADZEŃ PINÓW - KANDA AVR... 10 9. OPIS WYPROWADZEŃ PINÓW LCD HD44780... 10 LITERATURA... 11 Strona 2 z 11
1. TYPY TYPY ZMIENNYCH i STAŁYCH bool 0 lub 1 Logiczny int Np. 15 Całkowita float Np. 3.14 Zmiennoprzecinkowa double Zmiennoprzecinkowa podwójnej precyzji(więcej miejsc po przecinku) char *, ;, a Znakowy(znaki z tablicy ASCII) uint8_t Int: 0, 1,2,3 8 bitowy int(zajmuje mniej miejsca w pamięci MODYFIKATORY const const int c Stałe signed signed char c Liczba ze znakiem (-127 do 127 dla char) unsigned unsigned char c Liczba bez znaku (0 do 255 dla char) volatile Volatile float c Ulotny (stosowane dla przycisków, zmienna nie jest optymalizowana przez kompilator register register int c Umieszczenie w rejestrze szybkiego dostępu extern Ex tern wyswietl() poinformowanie kompilatora, by nie szukał danej zmiennej/funkcji globalnej w aktualnym pliku 2. OPERATORY ARYTMETYCZNE = a = 5 Przypisanie * a * 2 Mnożenie / a / 2 Dzielenie całkowite (5/2=2) % a % 2 Reszta z dzielenia całkowitego (5%2=1) += a += 5 Skrócony zapis a = a + 5 -= a -= 5 Skrócony zapis a = a - 5 RZUTOWANIE int i = 42.7; Konwersja z double na int float f = i; Konwersja z int do float BINARNE ~ Negacja(NOT) & Koniunkcja(AND) Alternatywa(OR) ^ Alternatywa rozłączna(xor) PRZESUNIĘCIA BITOWE << a<<1 Przesunięcie bitowe w lewo >> a>>1 Przesunięcie bitowe w prawo PORÓWNIANIA == Równe!= Różne Strona 3 z 11
< Mniejsze > Większe <= Mniejsze lub równe >= Większe lub równe LOGICZNE! Negacja && Koniunkcja alternatywa &= a &= 3 a=a&3 = a = 3 a=a 3 ^= a ^= 3 a=a^3 ^działają do nich tablice prawdy^ 3. Tablice prawdy: ~ a Wynik 0 1 1 0 & a b Wynik 0 0 0 0 1 0 1 0 0 1 1 1 a b Wynik 0 0 0 0 1 1 1 0 1 1 1 1 ^ a b Wynik 0 0 0 0 1 1 1 0 1 1 1 0 Przykład: dla a= 0 i b = 1 operacja: a & b =0 4. Tablice przesunięć bitowych: a a << 1 a<<2 0001 0010 0100 0011 0110 1100 0101 1010 0100 1000 0000 0000 1111 1110 1100 1001 0010 0100 Strona 4 z 11
a a>>1 a>>2 0001 0000 0000 0011 0001 0000 0101 0010 0001 1000 1100 1110 1111 1111 1111 1001 1100 1110 5. INSTRUKCJE: if if (wyrażenie) { /* blok wykonany, jeśli wyrażenie jest prawdziwe */ /* dalsze instrukcje */ If else if (wyrażenie) { /* blok wykonany, jeśli wyrażenie jest prawdziwe */ else { /* blok wykonany, jeśli wyrażenie jest nieprawdziwe */ /* dalsze instrukcje */ switch switch (wyrażenie) { case wartość1: /* instrukcje, jeśli wyrażenie == wartość1 */ break; case wartość2: /* instrukcje, jeśli wyrażenie == wartość2 */ break; /*... */ default: /* instrukcje, jeśli żaden z wcześniejszych warunków nie został spełniony */ break; While while (warunek) { /* instrukcje do wykonania w pętli */ /* dalsze instrukcje */ for for (wyrażenie1; wyrażenie2; wyrażenie3) { /* instrukcje do wykonania w pętli */ /* dalsze instrukcje */ Warunkowa (na tak) Warunkowa(na tak i na nie) Wielokrotnego wyboru Pętla wykonuje się tak długo, jak warunek jest PRAWDZIWY Pętla wykonuje się tak długo, jak warunek jest PRAWDZIWY Wyrażenie 1- ustawienie zmiennej sterującej pętlą(i=1) Wyrażenie 2 sprawdzany warunek, jeżeli prawdziwy Strona 5 z 11
do.. while do { /* instrukcje do wykonania w pętli */ while (warunek); /* dalsze instrukcje */ break pętla się wykona Wyrażenie 3 wyrażenie wykonywane co każde wykonanie pętli(i++) Pętla, której kod wykona się zawsze przynajmniej jeden raz. Wykonuje się tak długo, jak warunek jest PRAWDZIWY Opuszczenie pętli w dowolnym momencie programu #include #include <avr/io.h> Dołączanie bibliotek/plików #define #define LED_PIN (1<<PC7) Przypisanie nazwy do instrukcji/portu/pinu 6. PROGRAMOWANIE AVR ATMEGA8 PORTY I PINY DDRx PORTx PINx Rejestr kierunku pinów/portu Rejestr WYJŚCIOWY Rejestr WEJŚCIOWY DDRx = (1<<PD1) DDR=0xFF PORTD = (1<<PD1) PORTD =0xFF PORTD &= ~(1<<PD2) Ustalenie kierunku WYJŚCIOWEGO portu Ustalenie kierunku WYJŚCIOWEGO portu na wszystkich pinach portu Stan WYSOKI na wyjście PD1 Stan WYSOKI na wszystkich wyjściach portu Stan NISKI na wyjście PD2 Zamiast x podajemy A,B,C,D DDRx &= ~(1<<PD0) PORTD =(1<<PD0) If(!(PIND & (1<<PD0)) LED_ON else LED_OFF; Ustalenie kierunku WEJŚCIOWEGO portu Podciągnięcie programowe wewnętrznym rezystorem do VCC Jeżeli pin zwarty do masy wykonaj LED_ON, jeżeli nie zwarty wykonaj LED_OFF Zamiast PD0 podajemy numer pinu Po włączeniu programowego podciągnięcia do VCC pin sterowany jest zwarciem do masy DDRB = (1<<PB1); TCCR1A = (1<<WGM10); TCCR1B = (1<<WGM12); TCCR1A = (1<<COM1A1) (1<<COM1B1) ; TCCR1B = (1<<CS10) (1<<CS11); //64 TCCR1B = (1<<CS11); //8 TCCR1B = (1<<CS10); //1 PWM Fast PWM 8bit - tryb PWM wybrany z noty katalogowej atmega8 Tryb wyjścia na początku wystawiany jest stan wysoki, a po odliczeniu zadanej wartości licznika sterującego PWM następuje stan niski. Preskaler =64 Przy taktowaniu atmegi 1MHz f pwm =61Hz = 8 Przy taktowaniu atmegi 1MHz f pwm =488Hz Strona 6 z 11
OCR1A = 0; ADCSRA = (1<<ADEN) (1<<ADPS0) (1<<ADPS1) (1<<ADPS2); ADMUX = (1<<REFS1) (1<<REFS0) (1<<MUX2) (1<<MUX0); DDRC &=~ (1<<PC5); ADCSRA = (1<<ADSC); while(adcsra & (1<<ADSC)); wynik_float = (ADC * Vref) /1024; = 1 Przy taktowaniu atmegi 1MHz f pwm =3,9kHz Wzór: f=f taktowania /Prescaler/256 256 to pojemność rejestru, zależy od ilości bitów : 2 8 =256 Zmienna sterująca licznikiem PWM przy 8bitach maksymalna wartość to 255 sygnał będzie wypełniony maksymalnie(ciągły stan wysoki) ADC ADEN=1 włączenie przetwornika ADC ADPS - ustawienie preskalera, tu na 128 REFS - wybór napięcia odniesienia, tu wewnętrzne źródło 2,56V z koniecznością podłączenia zewnętrznego kondensatora na pinie AREF MUX - wybór kanału ADC5 na pinie PC5 Ustawienie Wejścia ADC Uruchomienie pojedynczej konwersji Oczekiwanie na zakończenie konwersji przetwornika Przeliczenie odczytu na jednostki w woltach Ustawienie rejestrów MUX dla poszczególnych kanałów pomiarowych(wybranego pinu z którego wykonywany jest pomiar: Rejestr Numer kanału MUX3 MUX2 MUX1 MUX0 0 0 0 0 ADC0(PC0) 0 0 0 1 ADC1(PC1) 0 0 1 0 ADC2(PC2) 0 0 1 1 ADC3(PC3) 0 1 0 0 ADC4(PC4) 0 1 0 1 ADC5(PC5) 0 1 1 0 ADC6(tylko w smd) 0 1 1 1 ADC7(tylko w smd) Strona 7 z 11
7. OPIS WYPROWADZEŃ PINÓW ATMEGA 8 Rysunek 1 Atmega8 w wersji przewlekanej(tht) Rysunek 2Atmega8 w wersji powierzchniowej(smd) Strona 8 z 11
Rysunek 3 Minimalne podłączenie zasilania procesora ATMEGA8 Rysunek 4 Zalecane podłączenie zasilania procesora ATMEGA8 Strona 9 z 11
8. OPIS WYPROWADZEŃ PINÓW - KANDA AVR Rysunek 5 Złącze do programowania (Kanda) 9. OPIS WYPROWADZEŃ PINÓW LCD HD44780 Rysunek 6 Opis wyprowadzeń pinów wyświetlacza LCD HD44780 Strona 10 z 11
LITERATURA http://mikrokontrolery.blogspot.com https://pl.wikibooks.org/wiki/c http://forbot.pl Nota katalogowa układu Atmega8 wydanie 09.2015r. http://radzio.dxp.pl Nota katalogowa układu rejestru przesuwnego74hc595 wydanie 02.2016r. Strona 11 z 11