WebElektronika

AD átalakító használata makrók segítségével az ATmega mikrovezérlőknél

person access_time 2015.11.23.
Újra elővesszük az AD átalakító alkalmazásának témakörét, de most olyan példákat valósítunk meg, amelyekben makrókat alkalmazunk.


Induljunk ki a következő programból, amellyel az átalakítandó analóg értéket vizsgáljuk, és attól függően, hogy ez az átalakított érték melyik tartományban van, annak megfelelő LED-et kapcsoljuk be.

A C port 0 bitje bemenet, ez lesz az analóg bemenetünk, az itt lévő jelet fogjuk digitálissá átalakítani. A négy tartomány kijelzésére a D port alsó négy bitjét fogjuk felhasználni.

Az AD átalakító elindításához szükséges az ADSC bit logikai 1-be állítása (1<<ADSC). Ezután a while(1) végtelen ciklusban állandóan figyeljük, hogy az AD átalakító befejezte-e a működését, ha igen, akkor az ADCH regiszter értékétől függően a D porton lévő egyik LED-et bekapcsoljuk. Ezután újra elindítjuk az AD átalakítót.

#include <avr/io.h>

int main(void)
{
    DDRD = 0xFF;
    DDRC = 0b11111110;
    ADCSRA = 0b10000111;
    ADMUX = 0b01100000;
    ADCSRA |= 1<<ADSC;
    while(1)
    {
        // várjuk a konverzió végét
        while(ADCSRA & (1 << ADSC));
        if(ADCH < 60)
            PORTD = 0b00000001;
        else if(ADCH <120)
            PORTD = 0b00000010;
        else if(ADCH < 180)
            PORTD = 0b00000100;
        else
            PORTD = 0b00001000;
        ADCSRA |= 1<<ADSC;
    }
}

 

Írjuk ezt át a mintaprogramot úgy, hogy ahol lehet, makrókat használunk!

#include <avr/io.h>

#define LED0        PORTD0
#define LED1        PORTD1
#define LED2        PORTD2
#define LED3        PORTD3
#define LEDEK        PORTD
#define LED0On()    {LEDEK = 1 << LED0;}
#define LED1On()    {LEDEK = 1 << LED1;}
#define LED2On()    {LEDEK = 1 << LED2;}
#define LED3On()    {LEDEK = 1 << LED3;}
#define    DportKi()    {DDRD = 0xFF;}
#define LEDEKKi()    {LEDEK = 0x00;}

#define ADBe()        {ADCSRA |= 1 << ADSC;}
    
int main(void)
{
    DportKi();
    DDRC = 0b11111110;
    ADCSRA = 0b10000111;
    ADMUX = 0b01100000;
    ADBe();

    while(1)
    {
        while(ADCSRA &= 1 << ADSC);
        if(ADCH < 60)
        {
            LED0On();
        }
        else if(ADCH <120)
        {
            LED1On();
        }
        else if(ADCH < 180)
        {
            LED2On();
        }
        else
        {
            LED3On();
        }
        ADBe();
    }
}

 

Tekintettel arra, hogy egy projektben több forrásfile is lehet, ahol ezeket a makrókat használnánk, ezért célszerű ezeket kitenni egy header file-ba (pl.: panel.h).

#define LED0        PORTD0
#define LED1        PORTD1
#define LED2        PORTD2
#define LED3        PORTD3
#define LEDEK        PORTD
#define LED0On()    {LEDEK = 1 << LED0;}
#define LED1On()    {LEDEK = 1 << LED1;}
#define LED2On()    {LEDEK = 1 << LED2;}
#define LED3On()    {LEDEK = 1 << LED3;}
#define    DportKi()    {DDRD = 0xFF;}
#define LEDEKKi()    {LEDEK = 0x00;}

#define ADBe()        {ADCSRA |= 1 << ADSC;

 

A végleges programunkban include-olni kell a panel.h file-t, és ezután a makrókat használni tudjuk.

#include <avr/io.h>
#include "panel.h"

int main(void)
{
    DportKi();
    DDRC = 0b11111110;
    ADCSRA = 0b10000111;
    ADMUX = 0b01100000;
    ADBe();

    while(1)
    {
        while(ADCSRA &= 1 << ADSC);
        if(ADCH < 60)
        {
            LED0On();
        }
        else if(ADCH <120)
        {
            LED1On();
        }
        else if(ADCH < 180)
        {
            LED2On();
        }
        else
        {
            LED3On();
        }
        ADBe();
    }
}