Hallo!
Ich hänge mich jetzt mal an meinen Thread selbst dran, weil ich noch eine Frage zur selben Sache habe.
Erstmal kann ich mitteilen, daß dank eurer Hilfe die Uhr nun soweit läuft.
Zum Einstellen der Alarmzeit bin ich aber von den Tastern abgegangen, weil mid das doch zu aufwendig war, die werden
ja nur ein-zweimal im Jahr gebraucht.
Dazu kommt noch der Nachteil, das ich damit nur vorwärts stellen könnte.
Also hab ich mir bei Ebay diese Drehencoder besorgt:

Die gabs 15 Stück für 8 €, haben einen versenkbaren Drehknopf und einen Kontakt beim rausdrücken. Nach vielen Versuchen fand
ich auch einen Programmschnipsel, der für diese Type sehr gut läuft:
Code:
$regfile = "m8def.dat"
$crystal = 9830400
$hwstack = 40
$swstack = 16
$framesize = 32
$include "D:\PROG\INIT_LCD20x4.bas"
Deflcdchar 1 , 2 , 6 , 14 , 31 , 14 , 6 , 2 , 32 'Pfeil nach links
Portc = &B111 'Pullup
Enc_a Alias Pinc.1
Enc_b Alias Pinc.0
Ta_alarm Alias Pinc.2
Dim Al_min As Integer 'INT wegen Wert kleiner Null !
Dim Al_std As Integer
Dim Zw As Byte 'Zustandswechsel z.B.: &b0011_0010
Config Timer0 = Timer , Prescale = 1024 '= ~10MHz= ~0,1µs * 1024= 0,1ms
On Timer0 Enc_int 'Interrupt
Timer0 = 246 'Timerstartwert:10; ~0,1ms * 10= 1ms
Enable Timer0
Enable Interrupts
Locate 1 , 2 : Lcd "Encoder mit Timer0"
Locate 4 , 1 : Lcd "Alarmzeit: " '11 Zeichen
If Ta_alarm = 0 Then
Do
Locate 4 , 12
If Al_std < 10 Then Lcd " " ; Al_std Else Lcd Al_std ' ; " "
Locate 4 , 14
If Al_min < 10 Then Lcd ":0" ; Al_min Else Lcd ":" ; Al_min ; " "
Locate 4 , 17 : Lcd " " ; Chr(1) ; " "
If Al_min < 0 Then
Al_min = 59
Al_std = Al_std - 1
End If
If Al_std < 0 Then Al_std = 23
If Al_min > 59 Then
Al_min = 0
Al_std = Al_std + 1
End If
If Al_std > 23 Then Al_std = 0
'-------Ab hier die Alarmzeit mit GOSUB in RTC speichern !-------------
If Ta_alarm = 1 Then Exit Do
Loop
End If
Enc_int:
Timer0 = 246 'Timerstartwert
Zw.0 = Enc_a 'Zustandswechsel
Zw.1 = Enc_b
Select Case Zw
Case &H0_2 : Incr Al_min
Case &H0_1 : Decr Al_min
End Select
Zw.4 = Zw.0
Zw.5 = Zw.1
Return
Damit stelle ich die Minuten, die Stunden folgen selbst. Vorwärts und rückwärts. Das kenne ich so von meinem Herd, ist ganz praktisch.
Aber jetzt kommt die Frage!
Bei Übereinstimmung von Uhrzeit und Alarmzeit will ich ja ein Signal bekommen, und zwar in der Zeit einstellbar im Bereich eine
bis ca. 5 Sekunden. Das kann ich ja nicht in die Main-Schleife einbauen, weil die würde ja dann stehenbleiben!
Bei einer SUB passiert dasselbe, bis zum RETURN bleibt alles stehen.
Wie kann ich zu diesem "Unterprogramm" springen, ohne den normalen Ablauf zu unterbrechen?
Also zur gegebenen Zeit die 5 Sekunden nebenher ablaufen lassen, ohne weitere Aktionen.
Das kann ich nicht rausfinden, trotz intensiver Hilfesuche.
Vielleicht kann mir da jemand auf die Sprünge helfen! Ich hänge hier noch das ganze Uhrenprogramm dran, das könnte
Ja hilfreich sein:
Code:
$regfile = "m8def.dat"
$crystal = 9830400
$hwstack = 64
$swstack = 32
$framesize = 64
$include "D:\PROG\INIT_LCD20x4.bas" 'LCD an Port D
'------------------------------------------ 'für RTC ------------------------------------------------------------
$lib "I2C_TWI.lbx"
Config Sda = Portc.4
Config Scl = Portc.5
Config Twi = 100000
I2cinit
Dim Ds_weekday As Byte , Ds_day As Byte , Ds_month As Byte , Ds_year As Byte
Dim Ds_sec As Byte , Ds_min As Byte , Ds_hour As Byte
'-------------------------------------------------- 'für DCF ---------------------------------------------------
Config Dcf77 = Pinc.3 , Timer = 1
Config Date = Dmy , Separator = .
Config Pinb.3 = Output 'DCF - Status - LED
Config Pinb.4 = Output ' DCF - Blink - LED
'---------------------------------------für ENC ---------------------------------------------------------------
Portc = &B111 ' Pullups
Enc_a Alias Pinc.1
Enc_b Alias Pinc.0
Ta_alarm Alias Pinc.2 'Taste Alarmzeit stellen EIN - AUS
Deflcdchar 1 , 2 , 6 , 14 , 31 , 14 , 6 , 2 , 32 'Pfeil nach links
Dim Al_min As Integer , Al_std As Integer 'nötig wegen <Null !
Dim V_al_min As Byte , V_al_std As Byte 'für Anzeige
Dim Zw As Byte 'Zustandswechsel z.B.: &b0011_0010
Config Timer0 = Timer , Prescale = 1024 '= ~10MHz= ~0,1µs * 1024= 0,1ms
On Timer0 Enc_int 'Interrupt
Timer0 = 246 'Timerstartwert:10; ~0,1ms * 10= 1ms
Enable Timer0
Stop Timer0
Enable Interrupts
'---------------------------------------- für Ausgang --------------------------------------------------------
Config Pinb.0 = Input 'Schalter Alarm EIN - AUS
Portb.0 = 1 'Pullup
Config Pinb.1 = Output 'grüne LED für Ausgang EIN
'--------------------------MAIN - SCHLEIFE----------------------------------------------------------------
Do
If Pinc.3 = 1 Then Portb.4 = 1 Else Portb.4 = 0 ' LED für DCF-Impuls
If Dcf_status.7 = 1 Then Portb.3 = 1 Else Portb.3 = 0 'LED für DCF-Status
Gosub Show_clock ' Anzeige vom RCT - Speicher holen
Gosub Show_alarm ' Anzeige vom RCT - Speicher holen
If Ta_alarm = 0 Then Gosub Al_stellen
Loop
'------------------------------------------------------------------------------------------------------------------
Al_stellen:
Do
Start Timer0
Locate 3 , 12
If Al_std < 10 Then Lcd "0" ; Al_std Else Lcd Al_std ' ; " "
Locate 3 , 14
If Al_min < 10 Then Lcd ":0" ; Al_min Else Lcd ":" ; Al_min ; " "
Locate 3 , 17 : Lcd " " ; Chr(1) ; " "
If Al_min < 0 Then
Al_min = 59
Al_std = Al_std - 1
End If
If Al_std < 0 Then Al_std = 23
If Al_min > 59 Then
Al_min = 0
Al_std = Al_std + 1
End If
If Al_std > 23 Then Al_std = 0
Gosub Alarm_speichern
If Ta_alarm = 1 Then
Stop Timer0
Exit Do
End If
Loop
'----------TIMER 0 Interrupt für ENC -------------------------------------------------
Enc_int:
Timer0 = 246 'Timerstartwert für 1ms
Zw.0 = Enc_a 'Zustandswechsel
Zw.1 = Enc_b
Select Case Zw
Case &H0_2 : Incr Al_min 'bei jedem zweiten Tick
Case &H0_1 : Decr Al_min 'dito
End Select
Zw.4 = Zw.0
Zw.5 = Zw.1
Return
'----------RTC Uhrzeit und Datum auslesen und anzeigen----------------------
Show_clock:
I2cstart
I2cwbyte 208
I2cwbyte 0
I2cstop
I2cstart
I2cwbyte 209
I2crbyte Ds_sec , Ack
I2crbyte Ds_min , Ack
I2crbyte Ds_hour , Ack
I2crbyte Ds_weekday , Ack
I2crbyte Ds_day , Ack
I2crbyte Ds_month , Ack
I2crbyte Ds_year , Nack
I2cstop
Gosub Rtc_stellen
'------------------ANZEIGE-----------------------------------------------------
Locate 1 , 1 : Lcd "Uhrzeit: " ; Bcd(ds_hour) ; ":" ; Bcd(ds_min) ; ":" ; Bcd(ds_sec)
Locate 2 , 1 : Lcd "Datum: " ; Lookupstr(ds_weekday , Wochentag) ; ", "
Locate 2 , 12 : Lcd Bcd(ds_day) ; "." ; Bcd(ds_month) ; "." ; Bcd(ds_year)
'------------------ANZEIGE-----------------------------------------------------
Return
'-------------RTC Alarmzeit auslesen und anzeigen--------------------------
Show_alarm:
I2cstart
I2cwbyte 208
I2cwbyte 10
I2cstart
I2cwbyte 209
I2crbyte V_al_std , Ack
I2crbyte V_al_min , Nack
I2cstop
Locate 3 , 1 : Lcd "Alarmzeit: " ; Bcd(v_al_std) ; ":" ; Bcd(v_al_min) ; " "
If Pinb.0 = 0 Then
Locate 3 , 18 : Lcd "Aus"
Else
Locate 3 , 18 : Lcd "Ein"
End If
Return
'----------------- Uhrzeit in RTC speichern
Rtc_speichern:
Ds_sec = Makebcd(ds_sec)
Ds_min = Makebcd(ds_min)
Ds_hour = Makebcd(ds_hour)
Ds_day = Makebcd(ds_day)
Ds_month = Makebcd(ds_month)
Ds_year = Makebcd(ds_year)
Ds_weekday = Makebcd(ds_weekday)
I2cstart
I2cwbyte 208
I2cwbyte 0
I2cwbyte Ds_sec
I2cwbyte Ds_min
I2cwbyte Ds_hour
I2cwbyte Ds_weekday
I2cwbyte Ds_day
I2cwbyte Ds_month
I2cwbyte Ds_year
I2cstop
Return
'-------------------Alarmzeit in RTC speichern
Alarm_speichern:
V_al_min = Makebcd(al_min)
V_al_std = Makebcd(al_std)
I2cstart
I2cwbyte 208
I2cwbyte 10
I2cwbyte V_al_std
I2cwbyte V_al_min
I2cstop
Return
'----------------- RTC nach DCF77 stellen
Rtc_stellen:
If Dcf_status.7 = 1 And Ds_sec <> _sec Then
Ds_hour = _hour
Ds_min = _min
Ds_sec = _sec
Ds_weekday = _weekday
Ds_day = _day
Ds_month = _month
Ds_year = _year
Gosub Rtc_speichern
End If
Return
'-----------------AUSGANG - BAUSTELLE ! ---------------------------------------------
If Ta_alarm = 1 And Pinb.0 = 1 Then Gosub Ausgang
Ausgang:
If V_al_std = Ds_hour And V_al_min = Ds_min Then Portb.1 = 1
Wait 5
Portb = 1
Wochentag:
Data " " , "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa" , "So"
Joachim
Lesezeichen