|
|
|
Ik gebruik een 8Mhz clocksignaal voor de AVR, deze kan afkomstig zijn van de interne oscilator van de AVR, maar ook van een crystal. Dit kun je instellen door middel van de fusebits.
#define F_CPU 8000000 ///< kloksnelheid van avr #include "s/g.h" ///< include global I/O file #include "util/delay.h" ///< delay functies //! main functie, start programma, moet altijd aanwezich zijn int main(void){ outb(PORTC, 0xFF); ///< alle pinnen van PORTC hoog outb(DDRC, 0xFF); ///< alle pinnen van PORTC als uitgang while(1){ ///< start eindeloze loop cbi(PORTC, 0); ///< PC0 laag - Clear BIt(port, bit) - _delay_ms(500); ///< doe 500ms niets sbi(PORTC, 0); ///< PC0 hoog - Set BIt(port, bit) - _delay_ms(500); ///< doe 500ms niets } ///< einde while loop return 0; ///< main fuctie moet raturn hebben ///< return-value maakt niets uit ///< 0 is gebruikelijk }
Elk programma heeft ongeveer deze basisopbouw, bovenaan de clocksnelheid, daaronder een lijst met alle nodige file, includes. Gevolgd door de main-functie. De opbouw van de main-functie is ook vrij universieel, eerst I/O pinnen initialiseren, dan variabelen (zie volgend voorbeeld), dan de while, oneindige loop. Op het einde van de main-functie hoort een return, deze heeft geen nut, dus de waarde maakt niet. Deze is meestal 0. De variabele i verhoogt telkens wanneer de loop een keer is doorlopen. Deze variabele houdt bij waar het looplicht is. Als i=0 dan licht de led van PC0 op. Bij i=1 licht PC1 op. Als i 7 is, en wi verhogen naar 8, springt het programma voorbij de for-loop.
#define F_CPU 8000000 #include "s/g.h" #include "util/delay.h" //! main functie, start programma, moet altijd aanwezich zijn int main(void){ outb(PORTC, 0xFF); outb(DDRC, 0xFF); u08 i; ///< 8bits (unsigned char) variable while(1){ for(i=0; i<8; i++){ ///< variabele i initialiseren ///< in de loop blijven zolang i kleiner dan 8 is ///< telkens de loop wordt uigevoerd, i verhogen outb(PORTC, 0xFF); ///< volledige PORTC hoog (= leds uit, actief laag) cbi(PORTC, i); ///< pin i van PORTC laag maken (=led aan) _delay_ms(500); ///< 500ms wachten } } return 0; }
Grove opbouw is hetzelfde gebleven. Een verschillende plaatsing van outb(PORTC, 0xFF); geeft een totaal ander eindresultaat. (Zie vorig voorbeeld r17 / en nu r14)
#define F_CPU 8000000 #include "s/g.h" #include "util/delay.h" //! main functie, start programma, moet altijd aanwezich zijn int main(void){ outb(PORTC, 0xFF); outb(DDRC, 0xFF); u08 i; while(1){ outb(PORTC, 0xFF); ///< voor de for-loop start met tellen, alle leds uit doen for(i=0; i<8; i++){ cbi(PORTC, i); ///< telkens weer de volgende led laten oplichten door de PC.i laag te maken _delay_ms(500); } } return 0; }
Om het looplicht van de ene kant naar de andere te krijgen, en weer terug, gebruikt ik 2 for-loop. De eerste telt van 0 ... 7 en de 2 de telt af van 6 ... 1.
Waarom bij 6 beginnen aftellen? Omdat led PC7 nog brandt van het optellen, om het vloeiend te laten bewegen is het niet de bedoeling PC7 2 maal zo lang te laten branden. Juiste hetzelfde wordt gedaan bij PC0, door slechts af te tellen tot 1. De optel-for-loop doet PC0 aan, dan moet de aftel-lus dit niet nog eens doen.
#define F_CPU 8000000 #include "s/g.h" #include "util/delay.h" //! main functie, start programma, moet altijd aanwezich zijn int main(void){ outb(PORTC, 0xFF); outb(DDRC, 0xFF); u08 i; while(1){ for(i=0; i<8; i++){ ///< eerst optellen, starten bij 0 outb(PORTC, 0xFF); cbi(PORTC, i); _delay_ms(500); } ///< einde eerste for-loop for(i=6; i>0; i--){ ///< terug aftellen, starten bij 6 outb(PORTC, 0xFF); cbi(PORTC, i); _delay_ms(500); } ///< einde tweede for-loop } return 0; }
Ook hier maak ik gebruik van 2 loops, eentje die led voor led aan doet. De tweede loop doet led voor led uit.
#define F_CPU 8000000 #include "s/g.h" #include "util/delay.h" //! main functie, start programma, moet altijd aanwezich zijn int main(void){ outb(PORTC, 0xFF); ///< starten met alle leds uit outb(DDRC, 0xFF); u08 i; while(1){ for(i=0; i<8; i++){ ///< doe led-voor-led-aan-loop cbi(PORTC, i); _delay_ms(500); } ///< einde eerste for-loop for(i=0; i<8; i++){ ///< doe led-voor-led-uit-loop sbi(PORTC, i); _delay_ms(500); } ///< einde tweede for-loop } return 0; }
|
|