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.
Copyright Tomasz Pachołek
Strona 2 z 11
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
Copyright Tomasz Pachołek
Strona 3 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
Copyright Tomasz Pachołek
Strona 4 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
Copyright Tomasz Pachołek
Strona 5 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 */
Warunkowa (na tak)
If else
if (wyrażenie) {
/* blok wykonany, jeśli
wyrażenie jest prawdziwe */
}
else {
/* blok wykonany, jeśli
wyrażenie jest nieprawdziwe */
}
/* dalsze instrukcje */
Warunkowa(na tak i na nie)
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;
}
Wielokrotnego wyboru
While
while (warunek) {
/* instrukcje do wykonania w
pętli */
}
/* dalsze instrukcje */
Pętla – wykonuje się tak długo,
jak warunek jest PRAWDZIWY
for
for (wyrażenie1; wyrażenie2;
wyrażenie3) {
/* instrukcje do wykonania w
pętli */
}
/* dalsze instrukcje */
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
Copyright Tomasz Pachołek
Strona 6 z 11
pętla się wykona
Wyrażenie 3 – wyrażenie
wykonywane co każde
wykonanie pętli(i++)
do.. while
do {
/* instrukcje do wykonania w
pętli */
} while (warunek);
/* dalsze instrukcje */
Pętla, której kod wykona się
zawsze przynajmniej jeden raz.
Wykonuje się tak długo, jak
warunek jest PRAWDZIWY
break
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
Rejestr kierunku pinów/portu
PORTx
Rejestr WYJŚCIOWY
PINx
Rejestr WEJŚCIOWY
DDRx |= (1<<PD1)
Ustalenie kierunku WYJŚCIOWEGO
portu
Zamiast x podajemy A,B,C,D
DDR=0xFF
Ustalenie kierunku WYJŚCIOWEGO
portu na wszystkich pinach portu
PORTD |= (1<<PD1)
Stan WYSOKI na wyjście PD1
PORTD =0xFF
Stan WYSOKI na wszystkich wyjściach
portu
PORTD &= ~(1<<PD2)
Stan NISKI na wyjście PD2
DDRx &= ~(1<<PD0)
Ustalenie kierunku WEJŚCIOWEGO
portu
Zamiast PD0 podajemy numer
pinu
PORTD |=(1<<PD0)
Podciągnięcie programowe
wewnętrznym rezystorem do VCC
If( !(PIND & (1<<PD0))
LED_ON
else LED_OFF;
Jeżeli pin zwarty do masy wykonaj
LED_ON, jeżeli nie zwarty wykonaj
LED_OFF
Po włączeniu programowego
podciągnięcia do VCC pin
sterowany jest zwarciem do masy
PWM
DDRB |= (1<<PB1);
TCCR1A |= (1<<WGM10);
TCCR1B |= (1<<WGM12);
Fast PWM 8bit - tryb PWM wybrany z noty
katalogowej atmega8
TCCR1A |= (1<<COM1A1)|(1<<COM1B1) ;
Tryb wyjścia – na początku wystawiany jest
stan wysoki, a po odliczeniu zadanej wartości
licznika sterującego PWM następuje stan niski.
TCCR1B |= (1<<CS10)|(1<<CS11); //64
TCCR1B |= (1<<CS11); //8
TCCR1B |= (1<<CS10); //1
Preskaler
=64 Przy taktowaniu atmegi 1MHz f
pwm
=61Hz
= 8 Przy taktowaniu atmegi 1MHz f
pwm
=488Hz
Copyright Tomasz Pachołek
Strona 7 z 11
= 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
OCR1A = 0;
Zmienna sterująca licznikiem PWM – przy
8bitach maksymalna wartość to 255 – sygnał
będzie wypełniony maksymalnie(ciągły stan
wysoki)
ADC
ADCSRA = (1<<ADEN)
|(1<<ADPS0)
|(1<<ADPS1)
|(1<<ADPS2);
ADEN=1 włączenie przetwornika ADC
ADPS - ustawienie preskalera, tu na 128
ADMUX = (1<<REFS1) |(1<<REFS0)
|(1<<MUX2)
|(1<<MUX0);
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
DDRC &=~ (1<<PC5);
Ustawienie Wejścia ADC
ADCSRA |= (1<<ADSC);
Uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC));
Oczekiwanie na zakończenie konwersji
przetwornika
wynik_float = (ADC * Vref) /1024;
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
M
UX
3
M
U
X
2
M
U
X
1
M
U
X
0
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)
Copyright Tomasz Pachołek
Strona 8 z 11
7. OPIS WYPROWADZEŃ PINÓW ATMEGA 8
Rysunek 1 Atmega8 w wersji przewlekanej(THT)
Rysunek 2Atmega8 w wersji powierzchniowej(SMD)
Copyright Tomasz Pachołek
Strona 9 z 11
Rysunek 3 Minimalne podłączenie zasilania procesora ATMEGA8
Rysunek 4 Zalecane podłączenie zasilania procesora ATMEGA8
Copyright Tomasz Pachołek
Strona 10 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
Copyright Tomasz Pachołek
Strona 11 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.