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