User Tools

Site Tools


user:guider:etaavrguide:projekt2

Projekt 2 - Lysdioder

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;
}	

Slutprojekt - Nightrider

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;
}	

user/guider/etaavrguide/projekt2.txt · Last modified: 2018/04/04 23:45 by 127.0.0.1