WebElektronika

Timer0 használata az AVR8-as családnál II.

person access_time 2015.12.10.
Folytatjuk az ATmega8 megismerését, a korábbi részben a Timer0-t néztük meg időzítő módban. Most szintén a Timer0-t alkalmazzuk, de számláló módra programozzuk fel ebben a cikkben.


Korábbi részben elkezdtük megismerni a Timer0 vezérlőt. Akkor időzítő módban használtuk, az az, a számolt periódikus jel a belső órajel volt.

Mostani cikkben a Timer0-t számláló módban alkalmazzuk, tehát a Tn (T0) bemenetre érkező impulzusok számát tároljuk el a TCNT0 regiszterben. A T0 bemenet az ATmega8-as mikrovezérlőnél a PD4 portbiten (6. láb) található (1. ábra).

kep
1. ábra   Az ATmega8 lábkiosztása
 

Nézzük meg újra a TCCR0 regisztert (2. ábra), ahol látható, hogy akkor tudjuk a Timer0-t számláló módban alkalmazni, ha a CS02 és a CS01 bitek logikai 1-ben vannak. A CS00 bit állapotától függ az, hogy a számlálandó jel fel- vagy lefutó élére számolunk.

kep
2. ábra   A TCCR0 regiszter
 

 

1. példa

Az első példában a D port alsó négy bitjét kimenetre állítjuk, míg a D port 4. bitjét bemenetre, hiszen itt van a T0 bemenet is (1. ábra).

Ezután töröljük a D port összes bitjét, majd a TCCR0 regiszterben csak a CS02-es bitet állítjuk be logikai egybe, ekkor a T0 lesz a bemenet, illetve falling_edge (lefutó él) miatt a lefutó éleket számláljuk.

A while(1) végtelen ciklusban állandóan megjelenítjük a D porton a TCNT0 értékét. (Nem "szép" megoldás a D portot használni, hiszen a D.4-en olvassuk be a számlálandó lefutó éleket.)

#include <avr/io.h>

void main()
{
    // D0 bemenet
    DDRD = 0B11101111;
    PORTD = 0x00;

    // Counter mód, falling edge
    TCCR0 = (1 << CS02) | (1 << CS01) | (0 << CS00);
    TCNT0 = 0;

    while(1)
    {
        PORTD = TCNT0;
    }
}

 

2. példa

A második példában a nyomógomb (PD.4) megnyomásával növelni tudjuk a D porton lévő négy LED-en megjelenített számlálás frekvenciáját.

#include <avr/io.h>

void szamlalo();

void main()
{
    // D0 bemenet
    DDRD = 0B11101111;
    PORTD = 0x00;

    // Counter mód, falling edge
    TCCR0 = (1 << CS02) | (1 << CS01) | (0 << CS00);
    TCNT0 = 0;

    while(1)
    {
        szamlalo();
    }
}

void szamlalo()
{
    int i;
    for(i = 0; i < TCNT0 * 1000; i++);
    PORTD++;
}