8

AVR C – Linijka diodowa

Napisaliśmy swój pierwszy program w C dla mikrokontrolerów rodziny AVR. Czas poćwiczyć swoje umiejętności i napisać coś więcej. Prostym programem do poćwiczenia swoich umiejętności programowania jest linijka diodowa.

Koncepcja zadania polega na wyświetlaniu cyklicznym jednej zaświeconej diody LED której miejsce się zmienia. W momencie kiedy zaświeca się nam ostatnia dioda to następnym krokiem będzie powrót do pierwszej sekwencji diod.

Aby nie pisać wielu zapytań warunkowych IF wykorzystamy fakt iż w systemie dwójkowym dzielenie oraz mnożenie wartości przez dwa oznacza przesunięcie bitów w prawo lub lewo. Dzięki temu wystarczy sprawdzenie warunku końcowego sekwencji.

Dla sprawdzenia swoich umiejętności proponuje napisanie tego kodu samego, w razie potrzeby można sprawdzić go z tym zamieszczonym.

/*****************************************************************
 * 
 *	R01_Diody
 *	Linijka_diodowa
 *	main.c
 *	Plik : main.c	
 *	Mikrokontroler : Atmel AVR atmega644p
 *	Kompilator : avr-gcc Toolchain
 *	Autor : Mariusz Czajkowski
 *	Źródło : http://uengineering.net/
 *	Data : 08.12.2012
 *
 *****************************************************************/

 /*****************************************************************
 * 
 *	PORTB podlaczony do diod LED
 *
 *****************************************************************/

/*	Definicje	*/
#define F_CPU 16000000UL	//Definicja czestotliwosci procesora
#define LEDS	PORTB


/*	Dolaczane biblioteki	*/
#include <avr/io.h>			//Biblioteka wejsc/wyjsc
#include <util/delay.h>		//Biblioteka opoznien
#include <stdint.h>			//Biblioteka typow liczb

/*	Funkcje wlasne	*/
void ConfIO(void)
{
	/*	DDRx rejestr ustawiajacy tryb pracy pinow, 1 - wyjscie, 0 - wejscie	*/
	DDRB = 0xff;			//Port diod LED
	/*	PORTx rejestr ustawiajacy stany pinow	*/ 
	PORTB = 0xff; 			//Ustawienie wartosci stanu niskiego
}

/*	Funckja main()	*/
int main()
{
	/*	Konfiguracja procesora	*/
	ConfIO();
	
	/*	Petla nieskonczona	*/
	while(1)
	{	
		if ( LEDS == 0x00 )	//Sprawdzenie czy wszystkie diody nie sa zapalone
		{
			LEDS = 0xff;	//Zgaszenie diod
		}
		else
		{	
			LEDS = LEDS * 2;//Przesoniecie rejestru w prawo
		}

		_delay_ms(500);		//Opoznienie 0.5s

	}
}

 

Mariusz Czajkowski

Wykształcenie: magister inżynier Automatyki i Robotyki. Zainteresowania techniczne: Programowanie, Elektronika, Mikrokontrolery, Sterowniki PLC.