Odlučio sam napraviti svoj vlastiti timer za osvjetljivač.
Ovdje ću postaviti simulaciju u proteusu i cijeli kod, te ima jedan dio programa koji još ne radi, a to je odbrojavanje. Zamišljeno je da hardver ima tri gumba, postavi vrijeme (u koracima po 30 sekundi), obrisi postavljeno vrijeme i kreni-stani sa odbrojavanjem. Inače izlaz je relejni (na simulaciji je samo LED-ica ali to je najmanji problem)
Sada još trebam pomoć oko odbrojavanja.
Ovo je simulacija u proteusu:
Uz liniju koda ide i objasnjenje, treba dakle samo jos dio odbrojavanja i gotovo.
Ovo je kod:
Code: Select all
SET var PORTB.4 'set na portb.4 gumb
OCISTI var PORTB.5 'ocisti na portb.5
KRENI_STANI VAR PORTB.6 kreni-stani na portb.6
RELEJ var PORTB.7 'relej na portb.7
druge_dvije var word 'definicija varijable
prve_dvije var word 'definicija varijable
prve_dvije = 0 'pocetno postavljanje na 0
druge_dvije = 0 'pocetno postavljanje na 0
stanje var word 'stanje varijabla
pause 500 'pauza pola sekunde zbog inicijalizacije LCD-a
lcdout $FE, 1, "PIC TIMER" 'u prvu liniju ide PIC TIMER
lcdout $FE, $C0, "SIJECANJ 2009" 'u drugu liniju ide kad je nastao timer
pause 2000 'znaci spash screen traje 2 sekunde
CISCENJE: 'i onda ide ciscenje displeja i ovo se ispisuje
lcdout $FE, 1, "Ostalo: 00:00" ' Ostalo: 00:00
lcdout $FE, $C0, "Ukupno: 00:00" 'Ukupno : 00:00
postava: 'labela postava
if ocisti = 0 then 'znaci ako je gumb ocisti stisnut tada on kopira na LCD same nule, to koristimo kada ubacimo neko vrijeme i onda zelimo ponistiti, a da ne moramo resetirati cijeli uredaj
lcdout $FE, $C0, "Ukupno: 00:00" 'ukupno:00:00
prve_dvije = 0 'opet sve postavlja na nulu
druge_dvije = 0 'na nulu
pause 200 'pause 20 stotinki
endif 'kraj uvjeta
if kreni_stani = 0 then 'ako je tipka krenistani stisnuta onda
if prve_dvije = 0 and druge_dvije = 0 then 'provjerava jeli bilo sto od postavljenog na nuli, ako je onda ispisuje prekinuto
lcdout $FE, 1, " PREKINUTO"
lcdout $FE, $C0, "Ukupno: 00:00"
end 'zaustavlja program i tu sada mora ici reset preko MCLR
else 'u protivnom
'konacno krece dio programa za odbrojavanje!!!
high relej 'pali relej
lcdout $FE, 1 'formatira lcd
if prve_dvije < 10 then 'ako su prve dvije manje od 10, a prve dvije su minute znaci da se ne ispise 1 nego 01
lcdout "Ostalo: ", "0", dec prve_dvije, ":", dec druge_dvije, "0" ' ispis
else 'u protivnom
lcdout "Ostalo: ", dec prve_dvije , ":" , dec druge_dvije, "0" 'ispis
endif 'kraj uvjeta
lcdout $FE, $C0 ,prebacuje se na drugu liniju
if prve_dvije < 10 then 'ista provjera
lcdout "Ukupno: ", "0", dec prve_dvije, ":", dec druge_dvije, "0"
else
lcdout "Ukupno: ", dec prve_dvije , ":" , dec druge_dvije, "0"
endif 'kraj uvjeta
endif 'kraj uvjeta
'sada kada je sve sredio program idemo na odbrojavanje, sekundu po sekundu
odbrojavanje:
'ovaj kod mi nedostaje,to trebam pomoc
endif
'a ovo je dio za podesavanje vremena
if prve_dvije = 99 then 'ako su minute vece od 99 onda nemoj reagirati
else 'ako nisu vece onda obavi sljedece:
if set = 0 then 'provjeri jeli tipka set stisnuta, ako je
druge_dvije = druge_dvije + 30 'sekunde povecaj za 30 sekundi (to je korak)
'IDE JOŠ JEDNA PROVJERA
if druge_dvije = 60 then 'ako su sekunde = 60 tada
pause 200
prve_dvije = prve_dvije + 1 'povecava minutu za jedan
druge_dvije = 0 'a sekunde vraca na nulu
endif 'kraj uvjeta
lcdout $FE, 1,"Ostalo: 00:00" 'ovo je konstanto tu, to se mjenja tek kod odbrojavanja
lcdout $FE, $C0 'prebacuje se na drugu liniju
if prve_dvije < 10 then , ako su minute manje od deset onda se prije minuta ispisuje jedna 0
lcdout "Ukupno: ", "0", dec prve_dvije, ":", dec druge_dvije, "0"
else 'ako nisu minute manje od 10 onda nema nule (ne ispisuje se)
lcdout "Ukupno: ", dec prve_dvije , ":" , dec druge_dvije, "0" 'to je ta linija di nema nula
endif 'kraj uvjeta
pause 200 'pausa 200 milisekundi
goto postava 'ide ispocetka u provjeru
else 'ovo je else od nekog uvjeta - nebitno
goto postava 'opet provjera
endif 'kraj uvjeta
endif 'kraj uvjeta
end 'postavljamo program na "sleep" i gotovo