- Dział: arts -
elektronika/lampa_rowerowa
Lampa Rowerowa rodziny AVR
wstęp
Projekt lampy rowerowej opartej na mikrokontrolerze rodziny AVR, opracowany przy współpracy z Dominikiem Binkowskim
przykładowa Implementacja:
(DOWNLOAD)
wymagane elementy:
Elementy układu:
- 4diody LED czerwone
- 2diody LED zielone
- switch
- 2 przełączniki
- mikrokontroler: attiny2313
Jak się zaczeło
Ten projekt zaczął się dość nietypowo: dostałem maila od osoby która przypadkowo weszła na moją stronę: Pan Dominik Binkowski był zainteresowany zrobieniem lampy rowerowej.
Po wstępnych ustaleniach chętnie zabrałem się do pracy i szybko napisałem pierwszy sterownik dla układu. Sam proces powstawania układu i programu jest kształcący dlatego też postanowiłem go tu opisać.
Przygotowanie
Przed rozpoczęciem projektowania układu musisz dokładnie wiedzieć co on ma robić.
Sparządź schemat ideowy:
Słownie opisz działanie układu:
wkładam baterie: układ nie swieci
naciskam guzik po raz 1: zapalają się diody czerwone, zielone nie świecą
naciskam guzik po raz 2: diody czerwone mrugają, zielone nie świecą
naciskam guzik po raz 3: diody zielone mrugają,czerwone nie świecą
naciskam guzik po raz 4: układ wraca do stanu przy włorzeniu baterii.
teraz jesteś gotowy możesz zaczynać.
Ewolucja
wersja 1.0
założenia: doprowadzenie układu do wykonywania sekwencji 'mrugania' oraz wybór sekwencji przez switch, łatwa zmiana logiki ukladu
Inicjacja mikroprocesora:
tu ustalamy które piny mają służyć do czego.
w tym przypadku:
- portD (DDRD) ma służyć jako wyjścia-diody LED
- ostatni pin na portcieB (PORTB)ma służyć jako wejscie - switch
Prototyp: (DOWNLOAD)
;output:
ldi tmp,0xFF ; same jedynki
out DDRD,tmp ; PORTD - wyjscie w stanie wysokim
;input:
ldi tmp,0b00000010 ; pin 1 (licząc od 0)
out PORTB,tmp ; PORTB - wejscia PULL-UP (w stanie wysokim)
W głownej pętli programu sprawdzamy czy nacisnieto przycisk:
;-----jezeli nacisniesz przycisk
; wczytaj z pinu
in tmp,PINB ; tmp = stan portu POTRTB
cpi tmp,0x01 ; na pinie 1
breq Nastepna ;przelacz do nastepnej funkcji
Oraz wybieramy sekwencję (o numerze tmp2):
;-----sekwencja 1
CPI tmp2,0x0 ;porownaj natychmiast
breq Main_0 ;takie same: Main_0
;-----sekwencja 2
CPI tmp2,0x1 ;porownaj natychmiast
breq Main_1 ;takie same: Main_1
za zmianę sekwencji po naciśnieciu guzika odpowiada opdowiada procedura 'Nastepna':
;=========================================
Nastepna:
INC tmp2 ; zwieksz (nastepna funkcja)
CPI tmp2,0x4 ; jezeli przekroczono zakrez zacznij od zera
breq Zeruj ; takie same: Zeruj
;czekaj
ldi clock,7
rcall Delay
rjmp Main ; powrot do petli
Zeruj:
ldi tmp2,0xFF ; zeruj
rjmp Main ; powrot do petli
;=========================================
A tak wygląda przykładowa sekwencja (diody czerwone zgaszone):
;=========================================
Main_0:
rcall PORTD_1_OFF
rcall PORTD_2_OFF
rcall PORTD_3_OFF
rcall PORTD_4_OFF
rjmp Main ; powrot do petli
;=========================================
wersja 1.01
ma umożliwiać długie czasowo sekencje bez utraty płynnośći reagowania na switch.
W OPRACOWANIU
software:
Wersja | opis | download |
1.0 |
prymitywna-brakuje przerwań, konieczność wyliczania dlugosci sekwencji w celu utrzmania płynnośći reakcji na nacisk switcha |
swiatlo_rowerowe_v1.0.asm |
1.01 |
dodanie przerwań wymusza zmiane schematu (switch musi być podpięty pod INT0) usunięto konieczność wyliczania dlugosci naciśniecia guzika w celu utrzmania płynnośći działania |
swiatlo_rowerowe_v1.01.asm |