Forum: Mikrocontroller und Digitale Elektronik DCF77 Wecker mit ATtiny in Bascom


von Philipp (Gast)


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:

von Jope (Gast)


Lesenswert?

Hast du 'ne konkrete Frage oder willst Du, dass Dir jemand hier das 
Programm schreibt?

von Thomas D. (thomasderbastler)


Lesenswert?

Philipp schrieb:
> 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...

ja wie denn sonst ???

Wenn die aktuelle Zeit = Alarm Zeit dann Alarm auslösen..

von Philipp (Gast)


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??

von Thomas D. (thomasderbastler)


Lesenswert?

Philipp schrieb:
> Muss man einen Pullup setzten?

Sicher...

Also so ganz verstehe ich nicht dein Problem.

Normal wenn ein taster gedrück wird, spingt man in einem SUB

SUB:
incr Sec
Return

von Philipp (Gast)


Lesenswert?

Und wie kann man Wecken_min sekündlich inkrementieren?
sub:
if Neue_sekunde = 1 Then
incr Wecken_min
?

von Thomas D. (thomasderbastler)


Lesenswert?

Wie soll Wecken Minute aussehen ?

14:49....

Warum nicht die Minuten erhöhen ?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.