WORK IN PROGRESS
Nu när vi gått igenom en basala bitarna för vad man behöver göra för att komma igång så ska vi gå vidare med att försöka få samma LED från föregående exempel att blinka. Vi har dock ett litet problem som vi behöver kommer över. För att få något att blinka innebär i princip att vi måste stänga av och sätta på den tillräckligt långsamt för att ögat skall kunna uppfatta föränderingen. Skulle vi nu få för oss att bara skriva något i stil med detta;
#include <avr/io.h> int main (void) { uint32_t i = 0; //(2) DDRD = 0xff; while(1) { PORTD = 0x1; //(1) PORTD = 0x0; //(2) } return 0; }
så skulle vi inte se något alls. Vi skulle snarare uppfatta det som att dioden lös konstant. Pröva gärna denna kod och se själv vad som händer! Vad som händer på rad 1 och 2 är att vi ettställer ena halva av port D och gör motsatden på nästa rad. På så vis får vi
…
Repetera föregående steg med att skapa ett nytt tomt projekt för detta.
Vi har inte lärt oss än om hur man använder tidsberäkningar i vår krets och det kan därför vara knepigt att skapa fördröjningsrutiner om man inte har gjort detta tidigare. Ett simpelt sätt att slösa CPU-tid är for-loopar som inte gör annat än loopar ett visst antal gånger.
#include <avr/io.h> int main (void) { uint32_t i = 0; //(2) DDRD = 0xff; while(1) { PORTD = 0b11110000; for(i=0; i < 10000; i++)asm volatile ("nop"); //(6) PORTD = 0b00001111; for(i=0; i < 10000; i++)asm volatile ("nop"); } return 0; }
Rinnande ljus fick namnet nightrider efter den gamla serien Nightrider. Det går helt enkelt ut på att ha en lysdiod tänd (== en utgång hög) och växla pinnarna hela tiden. Detta kan ni säkert lista ut hur ni ska göra själva, men för er som är lata kommer en variant här nedan.
#include <avr/io.h> /* Nightrider */ int main (void) { uint32_t i = 0; //(2) DDRD = 0xFF; // Set all as outputs PORTD = 0; // LEDs off while(1) { if(!PORTD){ // All LEDs off, light first PORTD = 0x01 else{ PORTD = (PORTD<<1); // Step one LED } for(i=0; i < 10000; i++); // Delay } return 0; }