Bascom,Zegar RTC-Problem z dopisaniem budzika


Witam wszystkich.Zacząłem naukę programowania (Bascom),więc proszę o wyrozumiałość. Napisałem taki program zegara RTC z kwarcem 32768Hz i nie wiem jak dopisać mam guziki do ustawiania budzika.Siedzę dwa dni i nic mi nie wychodzi.Polski help i książka Marcina Wiązani w tym przypadku jakoś mi nie pomaga.Oto kod źródłowy:

                            $regfile = "m8def.dat"
 
$crystal = 8000000 .
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Clock = Soft
Config Date = Dmy , Separator = /
 
 '..............................................................................
 
Config Pind.0 = Input                                       'Ustaw godzinę.
Portd.0 = 1
Config Pind.1 = Input                                       'Ustaw minuty.
Portd.1 = 1
Config Pind.2 = Input                                       'Ustaw rok.
Portd.2 = 1
Config Pind.3 = Input                                       'Ustaw miesiąc.
Portd.3 = 1
Config Pind.4 = Input                                       'Ustaw dzień.
Portd.4 = 1
Config Pinb.0 = Input                                       'Powrót do zegara.
Portb.0 = 1
Config Pind.7 = Output                                      'Głośnik.
Portd.7 = 1
 
 '..............................................................................
 
Enable Interrupts
Date$ = "00/00/00"
Time$ = "00:00:00"
 
 '..............................................................................
 
Zegar:
Do
Waitms 100
Cls
If Pind.0 = 0 Then
Waitms 25
If Pind.0 = 0 Then
Incr _hour
If _hour = 24 Then
_hour = 0
End If
End If
End If
 
If Pind.1 = 0 Then
Waitms 25
If Pind.1 = 0 Then
Incr _min
If _min = 60 Then
_min = 0
End If
End If
End If
 
If Pind.2 = 0 Then
Waitms 25
If Pind.2 = 0 Then
Incr _year
If _year = 50 Then
_year = 0
End If
End If
End If
 
If Pind.3 = 0 Then
Waitms 25
If Pind.3 = 0 Then
Incr _month
If _month = 13 Then
_month = 0
End If
End If
End If
 
If Pind.4 = 0 Then
Waitms 25
If Pind.4 = 0 Then
Incr _day
If _day = 32 Then
_day = 0
End If
End If
End If
 
 
 
'BUDZIK ??? Nie wiem jak przypisać guziki do jego ustawiania...................
 
 
 
If _hour = 00 Then
If _min = 00 Then
If _sec = 05 Then
Gosub Budzik
End If
End If
End If
 
 '..............................................................................
 
 
Lcd Time$
Locate 1 , 10
Lcd "Czas"
Lowerline
Lcd Date$
Locate 2 , 10 .
Lcd "Data"
Loop
 
 '..............................................................................
 
 Budzik:
Do
Cls
Lcd "Budzik"
Sound Portd.7 , 300 , 600
If Pinb.0 = 0 Then
Waitms 25
If Pinb.0 = 0 Then
Gosub Zegar
End If
End If
Loop
End




Portret użytkownika mirley

Re: Zegar

gdzie w tym temacie jest coś na temat zegara RTC? Chodzi tu o wewnętrzny tryb timera procesora do odliczania czasu? Po pierwsze reszta programu nie może być napisana tak na chama w głównej pętli. Wykorzystaj drugi timer do odliczania czasu np co 4ms lub co 20ms i w obsłudze przerwania ustawiaj zmienną flagę, która potem sprawdzisz w pętli głównej. To standardowe rozwiązanie, pozwoli uniknąć tych waitms. Potem musisz dodać menu bo bezsensem jest ustawiać na każdym przycisku coś innego. Wystarczą 3 przyciski, +,- i select. Normalnie nic się nie ustawia, po kliknięciu select ustawiasz godziny za pomocą + i -, potem klikasz select drugi raz i ustawiają się teraz minuty za pomocą + i -. Poczytaj kody źródłowe na mojej stronie na temat obsługi klawiatury w mikrokontrolerze. Poza tym w prawie wszystkich programach mam takie menu do ustawień.

Dopisanie samego budzika to nie problem... wystarczy zrobić sobie dwie zmienne pomocnicze: h_budz i m_budz, do których tak samo jak teraz minuty i godziny, wpiszesz wartości czasu budzenia. potem sprawdzisz czy min = m_budz and h = h_budz i jeśli tak to włącz buzzer....... to jest tak w najprostszej wersji

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.