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:
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.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
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:
JoachimCode:$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"







Zitieren

Lesezeichen