WebElektronika

Portkezelés makrókkal az Atmel AVR mikrovezérlőknél

person access_time 2015.11.09.
Folytatjuk a 8 bites Atmel AVR-ek megismerését, maradunk a portkezelés témakörénél, de most a portok használatát makrókkal oldjuk meg. A felhasznált mikrovezérlő az ATmega8.


Folytatjuk az Atmel AVR-ek megismerését, most a makróhasználatot tekintjük át. A korábbi cikkünkben a közvetlen regiszterírással állítottuk be a portregiszterek értékeit, most inkább makrókkal fogjuk ugyanazt a feladatot megoldani.

A példákat a hamarosan megnyíló webáruházunkban is elérhető AVR tesztpanel segítségével teszteltük (1. ábra).

kep
1. ábra   A felhasznált AVR tesztpanel az összekötő vezetékekkel
 

 

1. példa

Az első példában definiáltuk a BTN0-t és a BTN1-et, noha nem használtuk fel, a nyomógomb (C port, 5, bit) figyelését nem ezzel valósítottuk meg.

A D port 0. bitje a LED0, amelyet makrókkal kapcsoljuk be (LED0On()), illetve ki (LED0Off()).

#include <avr/io.h>

#define BTN0        PORTC4
#define BTN1         PORTC5

#define LED0        PORTD0
#define LED1        PORTD1
#define LED2        PORTD2
#define LED3        PORTD3

#define LED0On()    {PORTD |= 1 << LED0;}
#define LED0Off()    {PORTD &= 0 << LED0;}
#define LED1On()    {PORTD |= 1 << LED1;}
#define LED1Off()    {PORTD &= 0 << LED1;}


int main(void)
{
    DDRC = 0xDF;            // 0b1101 1111
    DDRD = 0xFF;            // 0b1111 1111
    PORTD = 0x00;

    while(1)
    {
        if (PINC & 0x20)
        {
            LED0On();
            LED1Off();
        }
        else
        {
            LED0Off();
            LED1On();
        }
    }
}

 

A nyomógomb (C port, 5. bit) megnyomásával a két LED állapotot vált.

 

2. példa

Ebben a példában makrókkal szorzást, illetve négyzetreemelést valósítjuk meg. A nyomógomb állapotának a figyelését most a "BTN" definiálásával oldottuk meg.

#include <avr/io.h>

#define negyzet(n)        ((n) * (n))
#define szoroz(n,m)        (n * m)
#define LEDEK            PORTD
#define BTN                PINC & 0x20

int main(void)
{
    DDRC = 0xDF;            // 0b1101 1111
    DDRD = 0xFF;            // 0b1111 1111
    PORTD = 0x00;
    
    while(1)
    {
        if (BTN)
        {
            LEDEK = negyzet(2);
        }
        else
        {
            LEDEK = szoroz(2,4);
        }
    }
}

 

Amikor megnyomjuk a BTN-t, akkor a LED-eken a bináris 8 jelenik meg, egyébként a 4-est láthatjuk.

 

3. példa

Végül nézzük meg azokat a makrókat, amelyeknek a segítségével akár egy bitnek az állapotát tudjuk megváltoztatni, vagy logikai egybe / nullába írni.

#include <avr/io.h>
#include <avr/delay.h>

#define bitEgy(cim,bit) (cim |= (1 << bit))
#define bitNulla(cim,bit) (cim &= ~(1 << bit))
#define bitValt(cim,bit) (cim ^= (1 << bit))

int main(void)
{
    bitEgy(DDRD,0);
    bitEgy(DDRD,1);
    
    bitNulla(DDRC,5);
    
    while(1)
    {
        bitValt(PORTD,1);
        _delay_ms(1000);
    }
}