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:

Klicke auf die Grafik für eine größere Ansicht

Name:	Encoder.JPG
Hits:	11
Größe:	43,5 KB
ID:	26726

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