'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '%%%%%%%%%%%%%%%%%% Signalcounter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '%%%%%%%%%%%%%%%%%% By Actrena %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% $regfile = "8515def.dat" 'AT90S8515-Deklarationen $crystal = 3686400 'Verwendeter Quarz: 3.6864 MHz Dim A As Integer 'Variable für die Pulslänge Dim B As Byte 'High-Low-Vatiable Dim C As Integer 'Zählvariable Dim Menu As Byte 'Menü-Auswahl Dim Stellung As Byte 'Zur Alarmeinstellung Dim Stell1 As Byte 'Diese folgenden Dim Stell2 As Byte 'Variablen dienen Dim Stell2_2 As Byte 'zur Einstellung Dim Stell3 As Byte 'der Alarmzeit Dim Stell4 As Byte 'bei laufendem Dim Stell4_2 As Byte 'Betrieb der DCF- Dim Stell5 As Byte 'Uhr Dim Stellp As Byte Dim Sekunde As Integer 'Sekundenvariable Dim Minute As Byte 'Minutenvariable Dim Stunde As Byte 'Stundenvariable Dim Tag As Byte 'Tagesvariable Dim Wota As Byte 'Wochenvariable Dim Wotag As String * 5 'Wochentags ausgabe Dim Monat As Byte 'Monatsvariable Dim Jahr As Integer 'Jahresvariable Dim S_minute As Byte 'Minuten-speichervariable Dim S_stunde As Byte 'Stunden-speichervariable Dim S_tag As Byte 'Tages-speichervariable Dim S_wota As Byte 'Wochentag-speichervariable Dim S_wotag As String * 5 'Wochentag-speichervariable Dim S_monat As Byte 'Monats-speichervariable Dim S_jahr As Integer 'Jahres-speichervariable Dim A_minute As Byte 'Alarmminute Dim A_stunde As Byte 'Alarmstunde Dim A_wota As Byte 'Alarmwochentag Dim A_wotag As String * 5 'Alarmwochentag in Buchstaben Dim Au_minute As Byte 'Diese drei Variablen sind Dim Au_stunde As Byte 'dafür zuständig, dass der Dim Au_wota As Byte 'Alarm wieder ausgeht Declare Sub Anzeige 'Unterprogramm für die LCD anzeige Declare Sub Auswertung 'Unterprogramm für die Auswertung des DCF-Signals Declare Sub Kurze 'Unterprogramm für kurze Pulse Declare Sub Lange 'Unterprogramm für lange Pulse Declare Sub Minute 'Unterprogramm für die Minutenpause Declare Sub Zurueck 'Unterprogramm zum zurücksetzen der Zwischenwerte Declare Sub Alarm_an 'Unterprogramm zum Einschalten des Alarms Declare Sub Alarm_aus 'Unterprogramm zum Ausschalten des Alarms Declare Sub Alarm_berechnung 'Unterprogramm zum Berechnen des Alarms Declare Sub Alarmzeit 'Zum EInstellen der Alarmzeit Declare Sub Menu Enable Int0 'Einschalten des Interrupts 0 Enable Int1 'Einschalten des Interrupts 1 Enable Interrupts 'Globales Einschalten der Interrupts On Int0 Anmachen 'Definierung des Int0 On Int1 Ausmachen 'Definierung des Int1 '############################################################################### '#### Sonderzeichen ###################################################### '############################################################################### Deflcdchar 4 , 10 , 32 , 14 , 1 , 15 , 17 , 15 , 32 ' ein 'ä' '############################################################################### '#### Konfigurationen ###################################################### '############################################################################### Ddrb = 255 Portc = 12 Config Lcd = 16 * 4 '16x4 LCD initialisiert Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.3 '16x4 LCD initialisiert Config Lcdpin = Pin , Db6 = Portb.2 , Db7 = Portb.1 '16x4 LCD initialisiert Config Lcdpin = Pin , Rs = Portd.6 , E = Portb.0 '16x4 LCD initialisiert Config Timer1 = Timer , Prescale = 1024 'Counter mit dem Tackt 1/1024 getacktet Config Int0 = Rising 'Int0 auf steigende Flanken eingestellt Config Int1 = Falling 'Int1 auf fallende Flanken eingestellt Cls 'Löschung des Displays für den Start '############################################################################### '#### Initialisierung ###################################################### '############################################################################### C = 0 'Hier werden alle Stunde = 0 'Vatiablen zuerst Minute = 0 'auf null gesetzt, Tag = 0 'damit beim Start Monat = 0 'keine Dehler durch Wota = 0 'Falsche Variablen- Au_minute = 57 'werte auftreten. Au_stunde = 15 'Zusätzlich werden Au_wota = 3 'hier noch die Alarm Menu = 0 'zeiten eingetragen. 'Später jedoch im 'Programm. Portc.0 = 0 'Der Alarmport A_minute = 55 A_stunde = 15 A_wota = 3 '############################################################################### '#### Hauptprogramm ######################################################## '############################################################################### Do If Jahr > 2000 Then 'Testanzeige bin Uhrzeit stimmt If Pinc.2 = 0 And Pinc.3 = 0 Then Incr Menu Call Menu Else Locate 1 , 1 : Lcd "LOADING..." 'Begrüssungstext Locate 2 , 1 : Lcd "(bis zum n" ; Chr(4) ; "chten" 'wird angezeigt Locate 3 , 1 : Lcd "Minutenstart)" Locate 4 , 1 : Lcd " APAA 03/06" End If Select Case A 'Entscheidet sich Case 2710 To 3000 'zwischen Kurzer, Call Kurze 'Langer und Minuten Case 3180 To 3900 'Pulslänge Call Lange Case 6400 To 10000 Call Minute Cls End Select Call Zurueck 'Ruft Rücksetztprogramm auf Call Alarm_an 'Ruft Alarmeinschaltprogramm auf 'Call Alarm_aus 'Ruft Alarmausschaltprogramm auf Loop 'Geht wieder zurück zum Start End '############################################################################### '#### Subs ################################################################# '############################################################################### Sub Auswertung Select Case C 'Ab hier beginnt Case 23 And B = 1 : S_minute = S_minute + 1 'die Auswertung Case 24 And B = 1 : S_minute = S_minute + 2 'des DCF-Codes Case 25 And B = 1 : S_minute = S_minute + 4 'Sekunde 1 - 15 Case 26 And B = 1 : S_minute = S_minute + 8 'sind immer 1, Case 27 And B = 1 : S_minute = S_minute + 10 '17 und 18 für die Case 28 And B = 1 : S_minute = S_minute + 20 'MESZ und MEZ. Case 29 And B = 1 : S_minute = S_minute + 40 'Sekunde 20 ist das Case 31 And B = 1 : S_stunde = S_stunde + 1 'Startbit (high) Case 32 And B = 1 : S_stunde = S_stunde + 2 '28, 35 und 58 sind Case 33 And B = 1 : S_stunde = S_stunde + 4 'Prüfbits, welche Case 34 And B = 1 : S_stunde = S_stunde + 8 'bei ungerater Min.- Case 35 And B = 1 : S_stunde = S_stunde + 10 'Stunden oder Jahres Case 36 And B = 1 : S_stunde = S_stunde + 20 'zahl 'Null' und bei Case 38 And B = 1 : S_tag = S_tag + 1 'Gerader 'Eins' sind Case 39 And B = 1 : S_tag = S_tag + 2 Case 40 And B = 1 : S_tag = S_tag + 4 Case 41 And B = 1 : S_tag = S_tag + 8 Case 42 And B = 1 : S_tag = S_tag + 10 Case 43 And B = 1 : S_tag = S_tag + 20 Case 44 And B = 1 : S_wota = S_wota + 1 Case 45 And B = 1 : S_wota = S_wota + 2 Case 46 And B = 1 : S_wota = S_wota + 4 Case 47 And B = 1 : S_monat = S_monat + 1 Case 48 And B = 1 : S_monat = S_monat + 2 Case 49 And B = 1 : S_monat = S_monat + 4 Case 50 And B = 1 : S_monat = S_monat + 8 Case 51 And B = 1 : S_monat = S_monat + 10 Case 52 And B = 1 : S_jahr = S_jahr + 1 Case 53 And B = 1 : S_jahr = S_jahr + 2 Case 54 And B = 1 : S_jahr = S_jahr + 4 Case 55 And B = 1 : S_jahr = S_jahr + 8 Case 56 And B = 1 : S_jahr = S_jahr + 10 Case 57 And B = 1 : S_jahr = S_jahr + 20 Case 58 And B = 1 : S_jahr = S_jahr + 40 Case 59 And B = 1 : S_jahr = S_jahr + 80 End Select Select Case S_wota Case 1 : S_wotag = "(Mon)" Case 2 : S_wotag = "(Thu)" Case 3 : S_wotag = "(Wed)" Case 4 : S_wotag = "(Tue)" Case 5 : S_wotag = "(Fri)" Case 6 : S_wotag = "(Sat)" Case 7 : S_wotag = "(Sun)" Case Else : S_wotag = "(???)" End Select Select Case A_wota Case 1 : A_wotag = "(Mon)" Case 2 : A_wotag = "(Thu)" Case 3 : A_wotag = "(Wed)" Case 4 : A_wotag = "(Tue)" Case 5 : A_wotag = "(Fri)" Case 6 : A_wotag = "(Sat)" Case 7 : A_wotag = "(Sun)" Case Else : A_wotag = " Alarm aus" End Select End Sub '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- Sub Alarmzeit Locate 1 , 1 : Lcd "Zeit Einstellen!" Locate 2 , 1 : Lcd "Wota - Std - Min" Locate 3 , 1 : Lcd "================" Locate 4 , 1 : Lcd " " ; Stell1 ; " - " ; Stell2 ; Stell3 ; " - " ; Stell4 ; Stell5 ; " " If Pinc.2 = 0 Then Incr Stellung End If If Stellung = 13 Then Stellung = 1 Select Case Stellung Case 1 Locate 4 , 3 If Pinc.3 = 0 Then Incr Stell1 If Stell1 = 8 Then Stell1 = 1 Call Alarm_berechnung Case 2 Locate 4 , 8 If Pinc.3 = 0 Then Incr Stell2 If Stell2 = 3 Then Stell2 = 0 Call Alarm_berechnung Case 3 Locate 4 , 9 If Pinc.3 = 0 Then Incr Stell3 If Stell3 = 10 Then Stell3 = 0 Call Alarm_berechnung Case 4 Locate 4 , 13 If Pinc.3 = 0 Then Incr Stell4 If Stell4 = 6 Then Stell4 = 0 Call Alarm_berechnung Case 5 Locate 4 , 14 If Pinc.3 = 0 Then Incr Stell5 If Stell5 = 10 Then Stell5 = 0 Call Alarm_berechnung Case 6 If Pinc.3 = 0 Then Incr Stellp If Stellp = 10 Then Portc.3 = 0 Portc.2 = 0 End If Call Alarm_berechnung Case 7 Locate 3 , 1 : Lcd "====ENDE========" Waitms 100 Call Alarm_berechnung Case 8 Locate 3 , 1 : Lcd "=====ENDE=======" Waitms 100 Call Alarm_berechnung Case 9 Locate 3 , 1 : Lcd "======ENDE======" Waitms 100 Call Alarm_berechnung Case 10 Locate 3 , 1 : Lcd "========ENDE====" Waitms 100 Call Alarm_berechnung Case 11 Locate 3 , 1 : Lcd "=========ENDE===" Waitms 100 Call Alarm_berechnung Case 12 Locate 3 , 1 : Lcd "==========ENDE==" Waitms 100 Call Alarm_berechnung Case 13 Locate 3 , 1 : Lcd "===========ENDE=" Waitms 100 Call Alarm_berechnung End Select End Sub '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- Sub Anzeige Locate 1 , 1 'Ab hier beginnt die If Stunde < 10 Then 'formatierung der If Minute < 10 Then 'Anzeige im 16x4- If Sekunde < 10 Then 'LCD-Display Lcd "Zeit: 0" ; Stunde ; ":0" ; Minute ; ":0" ; Sekunde 'Dies alles ist Else 'notwendig, damit Lcd "Zeit: 0" ; Stunde ; ":0" ; Minute ; ":" ; Sekunde 'z.b. 08:01 End If 'statt 8: 1 angezeigt Else 'wird. If Sekunde < 10 Then Lcd "Zeit: 0" ; Stunde ; ":" ; Minute ; ":0" ; Sekunde Else Lcd "Zeit: 0" ; Stunde ; ":" ; Minute ; ":" ; Sekunde End If End If Else If Minute < 10 Then If Sekunde < 10 Then Lcd "Zeit: " ; Stunde ; ":0" ; Minute ; ":0" ; Sekunde Else Lcd "Zeit: " ; Stunde ; ":0" ; Minute ; ":" ; Sekunde End If Else If Sekunde < 10 Then Lcd "Zeit: " ; Stunde ; ":" ; Minute ; ":0" ; Sekunde Else Lcd "Zeit: " ; Stunde ; ":" ; Minute ; ":" ; Sekunde End If End If End If Locate 1 , 15 : Lcd " " Locate 2 , 1 'Anzeige der zweiten Spalte If Tag < 10 Then 'Hier werden wie If Monat < 10 Then 'oben beschrieben Lcd Wotag ; " 0" ; Tag ; ".0" ; Monat ; "." ; Jahr 'das Datum format- Else 'iert Lcd Wotag ; " 0" ; Tag ; "." ; Monat ; "." ; Jahr End If Else If Monat < 10 Then Lcd Wotag ; " " ; Tag ; ".0" ; Monat ; "." ; Jahr Else Lcd Wotag ; " " ; Tag ; "." ; Monat ; "." ; Jahr End If End If Locate 3 , 1 : Lcd "================" 'Anzeige der trennSpalte Locate 4 , 1 'Anzeige der vierten Spalte If A_stunde < 10 Then 'Hier wird die If A_minute < 10 Then 'Alarmzeit Lcd "Alarm:" ; A_wotag ; "0" ; A_stunde ; ":0" ; A_minute 'ausgegeben Else Lcd "Alarm:" ; A_wotag ; "0" ; A_stunde ; ":" ; A_minute End If Else If A_minute < 10 Then Lcd "Alarm:" ; A_wotag ; A_stunde ; ":0" ; A_minute Else Lcd "Alarm:" ; A_wotag ; A_stunde ; ":" ; A_minute End If End If End Sub '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- Sub Kurze B = 1 'Unterprogramm für End Sub 'kurzen Puls '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- Sub Lange B = 0 'Unterprogramm für End Sub 'langen Puls '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- Sub Minute B = 0 'In diesem Unter- C = 0 'programm werden aus Minute = S_minute 'den Zwischen- Stunde = S_stunde 'speichervariablen Tag = S_tag 'die werte an die Wota = S_wota 'Anzeigevariablen Wotag = S_wotag 'übergeben Monat = S_monat Jahr = S_jahr End Sub '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- Sub Zurueck If C = 2 Then 'Hier werden die S_minute = 0 'Zwischenspeicher- S_stunde = 0 'variablen auf null S_tag = 0 'gesetzt S_wota = 0 S_monat = 0 S_jahr = 2000 End If End Sub '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- Sub Alarm_an If Au_wota = Wota Then 'Unterprogramm um If Au_stunde = Stunde Then 'den Alarm zu If Au_minute = Minute Then 'aktivieren Portc.0 = 1 End If End If End If If A_wota = Wota Then If A_stunde = Stunde Then If A_minute = Minute Then Portc.0 = 0 End If End If End If End Sub '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- Sub Menu Select Case Menu Case 0 To 5 Call Anzeige Case 6 To 10 Call Alarmzeit End Select End Sub '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- Sub Alarm_berechnung A_wota = Stell1 Stell2_2 = Stell2 * 10 A_stunde = Stell3 + Stell2_2 If A_stunde > 23 Then A_stunde = 23 Stell4_2 = Stell4 * 10 A_minute = Stell4_2 + Stell4 End Sub '############################################################################### '#### Interrupts ########################################################### '############################################################################### Anmachen: Start Timer1 'Starten der Zählung Return Ausmachen: Stop Timer1 'Stoppt die Zählung Incr C 'Zählt die Zählvariable hoch Sekunde = C 'Secunde wird mit Wert C gefüllt If C = 59 Then Sekunde = 0 '58-01 Fehler in der Zeitranzeige A = 0 'Löscht Pulslängenvariable vom vorherigen Durchlauf A = Timer1 'Schreibt inhalt von Timer1 in A Timer1 = 0 'Setzt Timer1 auf null für nächsten Durchlauf Call Auswertung 'Ruft Unterprogramm für die Auswertung auf Return