» Advertenties

Zo 20 Mei 2012, 07:32

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.

C code -
  1. #define F_CPU 8000000 ///< kloksnelheid van avr
  2.  
  3. #include "s/g.h" ///< include global I/O file
  4. #include "util/delay.h" ///< delay functies
  5.  
  6.  
  7. //! main functie, start programma, moet altijd aanwezich zijn
  8. int main(void){
  9.   outb(PORTC, 0xFF); ///< alle pinnen van PORTC hoog
  10.   outb(DDRC, 0xFF); ///< alle pinnen van PORTC als uitgang
  11.  
  12.   while(1){ ///< start eindeloze loop
  13.     cbi(PORTC, 0); ///< PC0 laag - Clear BIt(port, bit) -
  14.     _delay_ms(500); ///< doe 500ms niets
  15.     sbi(PORTC, 0); ///< PC0 hoog - Set BIt(port, bit) -
  16.     _delay_ms(500); ///< doe 500ms niets
  17.   } ///< einde while loop
  18.  
  19.   return 0; ///< main fuctie moet raturn hebben
  20.                 ///< return-value maakt niets uit
  21.                 ///< 0 is gebruikelijk
  22. }


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.

C code -
  1. #define F_CPU 8000000
  2.  
  3. #include "s/g.h"
  4. #include "util/delay.h"
  5.  
  6.  
  7. //! main functie, start programma, moet altijd aanwezich zijn
  8. int main(void){
  9.   outb(PORTC, 0xFF);
  10.   outb(DDRC, 0xFF);
  11.  
  12.   u08 i; ///< 8bits (unsigned char) variable
  13.   while(1){
  14.     for(i=0; i<8; i++){ ///< variabele i initialiseren
  15.                 ///< in de loop blijven zolang i kleiner dan 8 is
  16.                 ///< telkens de loop wordt uigevoerd, i verhogen
  17.       outb(PORTC, 0xFF); ///< volledige PORTC hoog (= leds uit, actief laag)
  18.       cbi(PORTC, i); ///< pin i van PORTC laag maken (=led aan)
  19.       _delay_ms(500); ///< 500ms wachten
  20.     }    
  21.   }
  22.  
  23.   return 0;
  24. }

Grove opbouw is hetzelfde gebleven.
Een verschillende plaatsing van outb(PORTC, 0xFF); geeft een totaal ander eindresultaat. (Zie vorig voorbeeld r17 / en nu r14)

C code -
  1. #define F_CPU 8000000
  2.  
  3. #include "s/g.h"
  4. #include "util/delay.h"
  5.  
  6.  
  7. //! main functie, start programma, moet altijd aanwezich zijn
  8. int main(void){
  9.   outb(PORTC, 0xFF);
  10.   outb(DDRC, 0xFF);
  11.  
  12.   u08 i;
  13.   while(1){
  14.     outb(PORTC, 0xFF); ///< voor de for-loop start met tellen, alle leds uit doen
  15.     for(i=0; i<8; i++){      
  16.       cbi(PORTC, i); ///< telkens weer de volgende led laten oplichten door de PC.i laag te maken
  17.       _delay_ms(500);
  18.     }    
  19.   }
  20.  
  21.   return 0;
  22. }
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.

C code -
  1. #define F_CPU 8000000
  2.  
  3. #include "s/g.h"
  4. #include "util/delay.h"
  5.  
  6.  
  7. //! main functie, start programma, moet altijd aanwezich zijn
  8. int main(void){
  9.   outb(PORTC, 0xFF);
  10.   outb(DDRC, 0xFF);
  11.  
  12.   u08 i;
  13.   while(1){    
  14.     for(i=0; i<8; i++){ ///< eerst optellen, starten bij 0
  15.       outb(PORTC, 0xFF);    
  16.       cbi(PORTC, i);
  17.       _delay_ms(500);
  18.     } ///< einde eerste for-loop
  19.     for(i=6; i>0; i--){ ///< terug aftellen, starten bij 6
  20.       outb(PORTC, 0xFF);    
  21.       cbi(PORTC, i);
  22.       _delay_ms(500);
  23.     } ///< einde tweede for-loop    
  24.   }
  25.  
  26.   return 0;
  27. }
Ook hier maak ik gebruik van 2 loops, eentje die led voor led aan doet. De tweede loop doet led voor led uit.

C code -
  1. #define F_CPU 8000000
  2.  
  3. #include "s/g.h"
  4. #include "util/delay.h"
  5.  
  6.  
  7. //! main functie, start programma, moet altijd aanwezich zijn
  8. int main(void){
  9.   outb(PORTC, 0xFF); ///< starten met alle leds uit
  10.   outb(DDRC, 0xFF);
  11.  
  12.   u08 i;
  13.   while(1){
  14.     for(i=0; i<8; i++){ ///< doe led-voor-led-aan-loop
  15.       cbi(PORTC, i);
  16.       _delay_ms(500);
  17.     } ///< einde eerste for-loop
  18.     for(i=0; i<8; i++){ ///< doe led-voor-led-uit-loop
  19.       sbi(PORTC, i);
  20.       _delay_ms(500);
  21.     } ///< einde tweede for-loop    
  22.   }
  23.  
  24.   return 0;
  25. }
Nog geen reacties.
Naam
a-z A-Z 0-9 _

 
E-mail
Wordt niet getoont.
  (niet verplicht)
 
Mail sturen als
(optie)
Smoerijf reageerd
Eender wie reageaard
Nooit
 
Mail sturen
(optie)
Enkel mailen bij eerste reactie
Bij elke reactie mailen
 
Reactie
Laatste wijziging: Wo 15 April 2009, 21:18