Nå som ting fungerer, kan vi skrive en kode som gjør noe. Det koden skal gjøre er å telle fra 0 til 255 binært og hvise dette ved å skru av/på lysdiodene på port c.
Kode
#define F_CPU 16000000 //Klokkefrekvens
#include <avr/io.h>
#include <util/delay.h> //Header for _delay_ms()
int main(){
DDRC = 0xFF; //Sett alle pinner på PORTC til utganger
PORTC = 0x00; //Sett alle pinner på PORTC til 0 (av)
int tall = 0; //Variabel som holder tellingen
while(1){
_delay_ms(500); //Vent 500ms
PORTC = tall++; //Sett PORTC til tall, og øk tall med 1
if(tall>=255) //Hvis tall er større eller lik 255 (0xFF)
tall = 0; //Sett tall til 0
}
}
Jeg har kommenter de viktigste delene av koden, men går alikevell gjennom noen.
DDRC = 0xFF;
Dette er registeret jeg skrev om lengre opp, som bestemmer om det er utgang eller inngang.
0xFF er skrevet i hex, og dette er den mest vanlige måten å skrive det på. 0X sier at det er hex, og FF betyr 255 desimalt. Men den letteste måten å forstå det på, er å oversette det til binært, som blir:
11111111. Altså, alle pinnene er utganger. Vi kunne selvfølgelig skrevet 0x5A feks., som blir 01011010 binært. Da ville pinne 0,2,5 og 7 vært innganger, og pinne 1,3,4 og 6, vært utganger.
PORTC = 0x00;
Her setter vi PORT-registeret til port c til 0x00, som tilsvarer 00000000 i binært. Altså alle pinne av.
_delay_ms(500);
Denne funksjonen kommer fra
delay.h som vi inkluderte i starten. Ved å gi den 500, vil den stoppe mikrokontrolleren i 500 ms, altså et halvt sekund før den går videre. Dette er ikke den beste måten å gjøre det på, men i dette tilfellet går det bra.
PORTC = tall++;
Her setter vi port c til variabelen
tall, og øker den med 1. Neste gang vil den sette port c til 1, så 2, 3, 4..
if(tall>=255)
tall = 0;
Siden vi har 8 pinner, kan vi vise maks 255 binært, derfor setter vi tall til 0 når vi kommer til 255, og alt begynner på nytt.