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();
}
}
Október közepén elindítjuk az Atmel 8 bites mikrovezérlőkről szóló sorozatunkat. Ehhez használnunk kell természetesen egy fejlesztőkörnyezetet is. Több ilyen is létezik, például a WinAVR, vagy az Atmel Studio. Mi az Atmel Studio-t fogjuk használni, e. . . .
A PIC18F mikrovezérlők ma is népszerű a fejlesztők körében. Noha 8 bites architektúráról beszélünk, számos érdekes és hasznos alkalmazás megvalósítható vele. Elég csak az USB-re, vagy akár az Ethernetre gondolnunk. Ezért a Szerkesztőség egy sorozat k. . . .
A Microchip által javasolt fejlesztőkörnyezet az MPLABX, amely felváltja az MPlab-ot. Használata nehézkesnek tűnhet, ezért megnézzük ennek az IDE környezetnek a használatát, készítünk egy egyszerű projektet, amely egy PIC32 mikrovezérlőre épül.. . . .