2008-02-12
Az ötödik program abszolút egyszerű. Megpróbálom szem elött tartani a kezdeti célkitűzésemet, hogy kis áttekinthető programokon keresztül ismerkedjünk meg az AVR chip-pekkel. Ebben a programban LED1-et villogtatjuk, 1 sec periódus idővel. Ebben éppen az az érdekes, hogy időnként szükségünk van pontos hosszúságú impulzusokra, időzítésekre. Ezt alapvetően úgy lehet megoldani, hogy írunk egy olyan hosszú ciklust, amivel a processzort a kívánt ideig lefoglaljuk. Eegy ilyen sima while, vagy for ciklusnak több hibája van. Az egyik, hogy a furmányos fordítóprogram észreveszi, hogy valójában nem csinálunk semmit, és simán kioptimalizálja (kivágja a kódból). Ki kell kísérleteznünk, hogy milyen hosszú legyen a ciklus, hogy elérjük a kívánt késleltetést. Ha megváltoztatjuk az órajelet, kezdhetjük előlről. A VinAVR készítői szerencsére erre készítettek egy jó megoldást. Részben egy macro, részben egy assembly betét (ha fontos mennyi idő alatt fut le a program... ). Az alábbi programban ennek felhasználásával 0,5 sec-ként ki/be kapcsolgatjuk LED1-et.
/*******************************************************************************
* Author - 3 BYTE MI *
* http://haromb.freeweb.hu *
* Date - 2009.01.03. *
* Chip - Atmel ATtiny2313 *
* Hardware - AVR1 tesztpanel *
* Compiler - avr-gcc (WinAVR 20080610) 4.3.0 *
* *
* LED1 es LED2 labakat kimenetre allitja. *
* LED1-t kikapcsolja, LED2-t bekapcsolja alaphelyzetben. *
* 0.5 sec periodussal villogtatja LED1-t. *
* *
********************************************************************************
* PonyProg Configuration and Security Bits (bepipalva): *
* Belso 4MHz-es osszc.: SUT0, CKSEL3, CKSEL2, CKSEL0 *
* Kulso keramia rezonator: SUT0 *
* *
*******************************************************************************/
#ifndef F_CPU
#define F_CPU 4MHz
#endif
#include "attiny2313_3bmi.h"
#include
// PORTD bitjei
#define LED1 3
#define LED2 4
// LED-ek vezerlese
#define LED1_ON PORTD BC( LED1)
#define LED1_OFF PORTD BS( LED1)
#define LED2_ON PORTD BC( LED2)
#define LED2_OFF PORTD BS( LED2)
int main( void)
{
DDRD BS( LED1); // szukseges labak kimenetre allitasa
DDRD BS( LED2);
LED1_OFF;
LED2_ON;
while( 1) // maga a program hurok
{
LED1_ON;
_delay_ms( 500);
LED1_OFF;
_delay_ms( 500);
}
return 0;
}
Itt a vége, fuss el véle, legytek az én vendégeim, innen letölthetitek a hozzávalókat összecsomagolva.