DCF77 Wecker mit ATtiny in Bascom

Gast #3320475
Lesenswert?

Hello World!
Ich baue einen Wecker mit einem ATtiny2313 und dem Pollin-DFC1-Modul.
Zeit und Datum werden bereits auf einem LCD anzeigt... Soweit so gut...
Jetzt frage ich mich - um einen Wecker daraus zu bauen - soll die 
DCF77-Zeit mit den Variablen Dim Wecker_std und Dim Wecker_min (Byte) 
verglichen werden um dann das Bit Alarm für 3600 Sekunden (Variable 
Alarmzeit) auf 1 zu setzen...
Oder so ähnlich...
Kann mir jemand helfen?
Hier mal der Code, der teilweise aus Stefan Hoffmanns tollem Buch 
"Einstieg in die Elektronik mit AVR Microcontroller und Bascom" kommt - 
ab dem DCF-Config:

Config Dcf77 = Pinb.4 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 
, Gosub = Sectic
Config Date = Dmy , Separator = .
Enable Interrupts

Config Portb.3 = Input            'Pinb.3 Stunden Stellen
Config Portb.2 = Input            'Pinb.2 Minuten Stellen
Config Portb.1 = Input            'Pinb.1 Schlummer
Config Portb.0 = Input            'Pinb.0 Alarm_ein
Alarm_ein Alias Pinb.0            'Schalter gegen 0
Portb.0 = 1                       'Pullup-Widerstand

Config Portd.6 = Output
Relais Alias Portd.6

Dim Neue_sekunde As Bit
Dim Alarm As Bit
Dim Schlummer As Bit
Dim Wecker_std As Byte
Dim Wecker_min As Byte
Dim Alarmzeit As Byte

Do
'Relais = Dcf_status.0          'blinkt bei DCF77 empfang

Debounce Pinb.3 , 0 , Stdstellen , Sub  'Tasten an Pinb.3 gegen 0 
springt Stdstellen an
Debounce Pinb.2 , 0 , Minstellen , Sub  'Tasten an Pinb.2 gegen 0 
springt Minstellen an
Debounce Pinb.1 , 0 , Schlummern , Sub 'Tasten an Pinb.1 gegen 0 springt 
Minstellen an


If Neue_sekunde = 1 Then
Neue_sekunde = 0
Gosub Anzeige
End If
Loop
End

Sectic:
Neue_sekunde = 1
Return

Anzeige:
If Dcf_status.7 = 0 Then
Locate 1 , 1 : Lcd "wait... "
Locate 2 , 1 : Lcd Time$
Else
Locate 1 , 1 : Lcd Date$
Locate 2 , 1 : Lcd Time$
End If
Return

Minstellen:

Stdstellen:

Schlummern:
Gast #3320786
Lesenswert?

Hier ist was gutes (MagicWhiteSmoke / Bascom-Forum):

Time$ ist eine Stringvariable, Bascom erlaubt den alphabetischen 
Vergleich > und < zweier Strings, auf eine Uhrzeit angewendet ist das 
aber Unsinn.
Wandle die Uhrzeit in absolute Minuten oder Sekunden des Tages um und 
vergleich&#39; dann mit der absoluten Minuten/Sekundenschaltzeit.
Bascom stellt die internen Variablen _sec, _min und _hour bereit, diese 
entsprechen der Stringvariablen Time$.

Also Weckzeitvariablen setzen:
Wecker_std = 14
Wecker_min = 49

Und im Sub Anzeige:
Anzeige:
If Dcf_status.7 = 0 Then
Locate 1 , 1 : Lcd "wait... "
Locate 2 , 1 : Lcd Time$
Else
Locate 1 , 1 : Lcd Date$
Locate 2 , 1 : Lcd Time$
End If
If _hour = Wecker_std And _min = Wecker_min Then
Locate 1 , 1 : Lcd Time$    'Alarm = 1  'Bit Alarm = 1
End If
Return

Das hat funktioniert, für eine Minute war auf dem LCD oben und unten die 
Zeit!!!
Ich glaube die Sub Anzeige ist ein guter Platz, denn die wird jede 
Sekunde ausgeführt!

Jetzt Wecker_min und Wecker_std einstellen:
Debounce Pinb.3 , 0 , Stdstellen , Sub

Minstellen:
Locate 1 , 1 : Lcd "AlrmTime"
Locate 2 , 1 : Lcd Wecker_std + ":" + Wecker_min
If Neue_sekunde = 1 Then
Wecker_min = Wecker_min + 1
End If

Stdstellen:
Locate 1 , 1 : Lcd "AlrmTime"
Locate 2 , 1 : Lcd Wecker_std + ":" + Wecker_min
If Neue_sekunde = 1 Then
Wecker_std = Wecker_std + 1
End If

Problem: Auch so wird jede Sekunde Alrmtime ... auf dem LCD ausgegeben - 
Ohne, dass ein Taster gedrückt wird. Muss man einen Pullup setzten?
Das mit den Tastern funktioniert nicht, weil es mit der regulären 
Anzeige um die LCD konkurriert.
Wecker_min und Wecker_std werden nicht lesbar angezeigt...
Der Attiny2313 ist jetzt zu 97% ausgelastet. Wenn man Debounce für alle 
drei Taster rausnimmt bringt das nur 6 %... Sieht fast so aus, als würde 
mein Tiny nicht reichen :(

Wie kann man die Zeiten sekündlich inkrementieren am besten ohne 
Debounce und auf dem LCD dabei anzeigen??

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren