background image

 

 

 

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. 

background image

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 

 

 

 

 

 

 

 

background image

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 

background image

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 

 

& 

Wynik 

 

| 

Wynik 

 

^ 

Wynik 

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 

background image

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 

background image

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 

background image

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

M

U

X

2

 

M

U

X

1

 

M

U

X

0

 

 

ADC0(PC0) 

ADC1(PC1) 

ADC2(PC2) 

ADC3(PC3) 

ADC4(PC4) 

ADC5(PC5) 

ADC6(tylko w smd) 

ADC7(tylko w smd) 

 

 

background image

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) 

  

background image

Copyright Tomasz Pachołek 
 

Strona 9 z 11 

 

 

Rysunek 3 Minimalne podłączenie zasilania procesora ATMEGA8 

 

Rysunek 4 Zalecane podłączenie zasilania procesora ATMEGA8 

background image

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 

 

background image

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.