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
}
}
420 Comments
You must log in to post a comment.