Hi Leute,
gibt ein kleines Update der Software. Auf Wunsch einiger Angestellten von mir, habe ich die Sekunden zum Voreinstellen mit einbezogen(z.B. Eier kochen 4,5Min).
Gruß Andreas
CodeBox BascomAVR
'******************************************************************************
'*** Küchentimer - mit Alarm- und Standbyzeiteinstellung **********************
'*** mit Atmega8 und 6 x LED 7 Segment-Anzeigen SA 23-12 RT *******************
'*** Andreas Hickmann - www.harzererlebnishof.de ******************************
'*** Anregung und Grundlagen von http://www.elektronik-radio.de ***************
'*** besonderer Dank gilt Daniel(molleonair) vom Roboternetz.de-Forum *********
'******************************************************************************
'
'***Konfiguration der Ports****************************************************
'
'******************************************************************************
'
' Port B:
' PB0 = Encoder A (Zeiteinstellung)
' PB1 = Encoder B (Zeiteinstellung)
' PB2 = Encoder D (Taste-Digitwechsel Stunden/Minuten)
' PB3 = Taster(Start/Stop Countdown)
' PB5 = Summer
' PB6 = XTAL1 Quarz
' PB7 = XTAL2 3,6864 Mhz
'
' Port C:
' Treiber = UDN2981A
' PC0 = Ziffer 1 gem.Anode
' PC1 = Ziffer 2 gem.Anode
' PC2 = Ziffer 3 gem.Anode
' PC3 = Ziffer 4 gem.Anode
' PC4 = Ziffer 5 gem.Anode
' PC5 = Ziffer 6 gem.Anode
' PC6 = Reset
'
' Port D:
' Treiber = ULN2803A
' PD0 = Segment "a" Kathode
' PD1 = Segment "b" Kathode
' PD2 = Segment "c" Kathode
' PD3 = Segment "d" Kathode
' PD4 = Segment "e" Kathode
' PD5 = Segment "f" Kathode
' PD6 = Segment "g" Kathode
' PD7 = frei
'
'******************************************************************************
'*** Hardware ******************************************************************
$regfile = "m8def.dat"
$crystal = 3686400 '3,6864 Mhz
'*** Ports konfigurieren********************************************************
Config Portb.5 = Output 'Buzzer
Buzzer Alias Portb.5
Config Portb.4 = Output '7Seg Doppelpunkt nicht belegt
Doppelpunkt Alias Portb.4
Portb = &B00001111 '1=PullUp eingeschaltet
Ddrc = &B11111111 'PC => Multiplexen der Anzeige
Ddrd = &B11111111 'PD => 7-Segmente
Drehtaster_pin Alias Pinb.2
'Sekundentakt erzeugen
On Timer1 Ontimer1
Config Timer1 = Timer , Prescale = 64 ' siehe unten!)=1Hz
Enable Timer1
Start Timer1
'Blinktakt erzeugen für die Zahlenstellen Minuten-Einer bis Stunden-Zehner
On Timer2 Ontimer2
Config Timer2 = Timer , Prescale = 1024 ' siehe unten!)=2Hz
Enable Timer2
Stop Timer2
'Multiplexfrequenz erzeugen
On Timer0 Ontimer0
Config Timer0 = Timer , Prescale = 256 '3,6864 Mhz = 400Hz
Enable Timer0
Enable Interrupts
'*** Variablen *****************************************************************
Dim Wert As Byte 'Ziffer die ausgegeben wird
Dim Multiplex As Byte 'Stellenwert (1,2,4,8,16,32)
Dim Sek_einer As Byte
Dim Sek_zehner As Byte
Dim Min_einer As Byte
Dim Min_zehner As Byte
Dim Std_einer As Byte
Dim Std_zehner As Byte
Dim Sekunden As Byte
Dim Minuten As Byte
Dim Stunden As Byte
Dim Alarmzeit As Byte
Dim Alarmtimer As Byte
Dim Alarmzeit_einer As Byte
Dim Alarmzeit_zehner As Byte
Alarmzeit = 60 'Vorgabe - Alarmzeit
Alarmtimer = Alarmzeit + 1
Dim Standbyzeit As Byte
Standbyzeit = 5 'Vorgabe - Standbyzeit
Dim Standbytimer As Byte
Dim Standby_sek As Byte
Dim Standbyzeit_einer As Byte
Dim Standbyzeit_zehner As Byte
Dim Uhr_lauft As Bit
Dim Standby As Bit
Dim Enc As Byte
Dim Enc_zaehler As Byte
Dim Digit_active As Byte
Dim Timer2_zaehler As Byte
Dim 2hz_zaehler As Bit
Dim Uhr_stellen As Bit
Dim Anzeigeblinken As Bit
Dim Beepton As Bit
Dim Drehtaster_drueck_zeit As Byte
Set 2hz_zaehler
Digit_active = 2
Declare Sub Start_stopp
Declare Sub Count_up
Declare Sub Count_down
Declare Sub Drehtaster
Multiplex = 1 'Startwert
Timer1 = 7936 'Für den Start der Uhr nach 1 Sekunde
'*** Main (Zeit einstellen) ****************************************************
Do
Enc = Encoder(pinb.0 , Pinb.1 , Count_up , Count_down , 0) 'Drehimpulsgeber
Debounce Pinb.3 , 0 , Start_stopp , Sub 'Taste Starten und Stoppen Timer1
Debounce Pinb.2 , 0 , Drehtaster , Sub 'Taste vom Drehimpulsgeber
If Alarmtimer < Alarmzeit Then
Buzzer = 2hz_zaehler
Else
Reset Buzzer
End If
If Beepton = 1 And Stunden = 0 And Minuten = 0 And Sekunden < 11 And Sekunden > 0 And Uhr_lauft = 1 Then 'Auswertung Alarm-Buzzer-Beepton;Beepton die letzten 10 Sekunden
Set Buzzer
Waitms 20
Reset Buzzer
Reset Beepton
End If
Loop
'*** Sub-Routinen (Zeit einstellen) ********************************************
Sub Start_stopp 'Starten und Stoppen des Küchentimers/Ausschalten Buzzer '
Reset Standby
Standbytimer = 0
If Digit_active = 3 Or Digit_active = 4 Then Digit_active = 2 'zurückspringen aus dem Alarm- und Standbystellen-Modus in den Stunden- Minutenstellen-Modus mit der Start/Stopptaste
If Uhr_lauft = 0 Then
If Stunden > 0 Or Minuten > 0 Or Sekunden > 0 Then 'Auswertung des Timers
Uhr_lauft = 1
Reset Uhr_stellen
Stop Timer2
Set 2hz_zaehler
Digit_active = 2
End If
If Alarmtimer < Alarmzeit And Anzeigeblinken = 1 Then
Reset Buzzer 'Buzzer abschalten
Alarmtimer = Alarmzeit + 1
End If
Else
Uhr_lauft = 0
End If
End Sub
Sub Count_up 'Drehimpulsgeber - Zeit stellen(hochzählen)
If Enc_zaehler = 4 Then
Reset Standby
Standbytimer = 0
Reset Buzzer
Alarmtimer = Alarmzeit + 1
Start Timer2
Reset Uhr_lauft
Set Uhr_stellen
Reset Anzeigeblinken
If Digit_active = 1 And Stunden < 23 Then
Incr Stunden
Elseif Digit_active = 2 And Minuten < 59 Then
Incr Minuten
Elseif Digit_active = 3 And Sekunden < 59 Then 'neu - Sekunden stellen
Incr Sekunden
Elseif Digit_active = 4 And Alarmzeit < 99 Then 'Buzzerzeit stellen(hochzählen)
Incr Alarmzeit
Elseif Digit_active = 5 And Standbyzeit < 99 Then 'Standbyzeit stellen(hochzählen)
Incr Standbyzeit
End If
Enc_zaehler = 0
Else
Incr Enc_zaehler
End If
End Sub
Sub Count_down 'Drehimpulsgeber - Zeit stellen(runterzählen)
If Enc_zaehler = 4 Then
Reset Standby
Standbytimer = 0
Reset Buzzer
Alarmtimer = Alarmzeit + 1
Start Timer2
Reset Uhr_lauft
Set Uhr_stellen
Reset Anzeigeblinken
If Digit_active = 1 And Stunden > 0 Then
Decr Stunden
Elseif Digit_active = 2 And Minuten > 0 Then
Decr Minuten
Elseif Digit_active = 3 And Sekunden > 0 Then 'neu - Sekunden stellen
Decr Sekunden
Elseif Digit_active = 4 And Alarmzeit > 0 Then 'Buzzerzeit stellen(runterzählen)
Decr Alarmzeit
Elseif Digit_active = 5 And Standbyzeit > 1 Then 'Standbyzeit stellen(runterzählen)
Decr Standbyzeit
End If
Enc_zaehler = 0
Else
Incr Enc_zaehler
End If
End Sub
Sub Drehtaster 'digit 1=stunden stellen , digit 2=minuten stellen , digit 3=sekunden stellen , digit 4=Alarmzeit stellen . digit 5=Standbyzeit
Drehtaster_drueck_zeit = 0
Reset Standby
Standbytimer = 0
Do
Loop Until Drehtaster_pin = 1
If Drehtaster_drueck_zeit > 5 And Uhr_lauft = 0 Then 'drücke Drehimpulsgeber länger als 5s - aktiviert Alarm- und Standbyzeiteinstellung
Digit_active = 4
Start Timer2
Elseif Drehtaster_drueck_zeit < 3 Then 'drücke Drehimpulsgeber kürzer als 3s - schaltet die Zahlenstellen Minuten bis Stunden oder Alarm- und Standbyzeit durch
If Digit_active = 1 Then
Digit_active = 2
Elseif Digit_active = 2 Then
Digit_active = 3
Elseif Digit_active = 3 Then
Digit_active = 1
Elseif Digit_active = 4 Then
Digit_active = 5
Elseif Digit_active = 5 Then
Digit_active = 4
End If
Elseif Drehtaster_drueck_zeit >= 3 And Uhr_lauft = 0 Then 'drücke Drehimpulsgeber länger als 3s und max.5s - setze Anzeige zurück auf 00:00:00
Stunden = 0
Minuten = 0
Sekunden = 0
End If
End Sub
'*** Interrupt-Routinen ********************************************************
Ontimer1: 'Aufruf im Sekundentakt
Set Beepton
Timer1 = 7936 '65536-7936=57600 => 1Hz
If Standby_sek <= 60 Then 'Umwandeln der Sekunden für die Standbyzeit in Minuten
Standby_sek = Standby_sek + 1
Else
Standby_sek = 1
If Standbytimer < Standbyzeit Then
Incr Standbytimer
End If
End If
If Drehtaster_drueck_zeit < 255 Then Incr Drehtaster_drueck_zeit 'Drehtasterdrückzeit begint mit hochzählen
If Alarmtimer <= Alarmzeit Then Incr Alarmtimer 'Alarmtimer beginnt mit hochzählen
If Uhr_lauft = 1 Or Alarmtimer < Alarmzeit Then Standbytimer = 0
If Standbytimer >= Standbyzeit Then
Set Standby
End If
Toggle Doppelpunkt 'Doppelpunkte blinken im Sekundentakt - LED´s sind nicht angeschlossen
If Stunden = 0 And Minuten = 0 And Sekunden = 1 Then 'Auswertung Countdown 00:00:00
Reset Uhr_lauft
Alarmtimer = 0
Sekunden = 0
Set Anzeigeblinken
Start Timer2
End If
If Stunden = 0 And Minuten = 0 And Sekunden = 0 And Alarmtimer = Alarmzeit Then 'bei erreichen der Alarmzeit Standbytimer auf Null setzen
Standbytimer = 0
End If
If Sekunden < 60 And Uhr_lauft = 1 Then Decr Sekunden 'Uhrenroutine
If Sekunden > 60 Then
Sekunden = 59
If Minuten < 60 Then Decr Minuten
If Minuten > 60 Then
Minuten = 59
If Stunden < 23 Then Decr Stunden
End If
End If
Return
Ontimer0: 'Der Multiplexer!
Timer0 = 1000 '= 400Hz
'Hier wird die Umschaltsequenz (Multiplexen) der 6 Segmente erzeugt!
Multiplex = Multiplex * 2
If Multiplex = 64 Then Multiplex = 1
'400Hz/6Segmente=> 66Hz. Die kpl. Anzeige wird also mit 66Hz gemultiplext!
Sek_zehner = Sekunden / 10 'Stellenanzeigeroutine für Sekunden(00), Minuten(00) und Stunden(00)
Sek_einer = Sek_zehner * 10
Sek_einer = Sekunden - Sek_einer
Min_zehner = Minuten / 10
Min_einer = Min_zehner * 10
Min_einer = Minuten - Min_einer
Std_zehner = Stunden / 10
Std_einer = Std_zehner * 10
Std_einer = Stunden - Std_einer
Portd = &B00000000 'Alle Segmente vor dem Umschalten ausschalten
Portc = Multiplex 'Das anzusteuernde Segment auswählen
If Multiplex = 1 Then Wert = Sek_einer 'Ab hier erfolgt die Zuordnung von Anzeige und Wert
If Multiplex = 1 And 2hz_zaehler = 0 And Digit_active = 3 And Anzeigeblinken = 0 Then Wert = 10 'Zahlenstelle(Sekunden-Einer) beim stellen blinken
If Multiplex = 2 Then Wert = Sek_zehner
If Multiplex = 2 And 2hz_zaehler = 0 And Digit_active = 3 And Anzeigeblinken = 0 Then Wert = 10 'Zahlenstelle(Sekunden-Zehner) beim stellen blinken
If Multiplex = 4 Then Wert = Min_einer
If Multiplex = 4 And 2hz_zaehler = 0 And Digit_active = 2 And Anzeigeblinken = 0 Then Wert = 10 'Zahlenstelle(Minuten-Einer) beim stellen blinken
If Multiplex = 8 Then Wert = Min_zehner
If Multiplex = 8 And 2hz_zaehler = 0 And Digit_active = 2 And Anzeigeblinken = 0 Then Wert = 10 'Zahlenstelle(Minuten-Zehner) beim stellen blinken
If Multiplex = 16 Then Wert = Std_einer
If Multiplex = 16 And 2hz_zaehler = 0 And Digit_active = 1 And Anzeigeblinken = 0 Then Wert = 10 'Zahlenstelle(Stunden-Einer) beim stellen blinken
If Multiplex = 32 Then
If Std_zehner = 0 And Uhr_stellen = 0 And Anzeigeblinken = 0 And Uhr_lauft = 1 Then 'Wenn Std.zehner 0 soll die Anzeige dunkel bleiben
Wert = 10 '10 bedeutet => Segment aus
Else
Wert = Std_zehner
End If
End If
If Multiplex = 32 And 2hz_zaehler = 0 And Digit_active = 1 And Anzeigeblinken = 0 Then Wert = 10 'Zahlenstelle(Stunden-Zehner) beim stellen blinken
If Anzeigeblinken = 1 And 2hz_zaehler = 0 And Alarmtimer < Alarmzeit Then Wert = 10 'alle Anzeigen blinken 00:00:00 solange wie Buzzer aktiv
If Digit_active = 4 Then 'Stellenanzeigeroutine für Alarmzeitanzeige(00)
Alarmzeit_zehner = Alarmzeit / 10
Alarmzeit_einer = Alarmzeit_zehner * 10
Alarmzeit_einer = Alarmzeit - Alarmzeit_einer
If Multiplex > 2 Then
Wert = 10
Elseif Multiplex = 1 Then
Wert = Alarmzeit_einer
If Multiplex = 1 And 2hz_zaehler = 0 And Digit_active = 4 Then Wert = 10 'Zahlenstelle(Alarmzeit-Einer) beim stellen blinken
Elseif Multiplex = 2 Then
Wert = Alarmzeit_zehner
If Multiplex = 2 And 2hz_zaehler = 0 And Digit_active = 4 Then Wert = 10 'Zahlenstelle(Alarmzeit-Zehner) beim stellen blinken
End If
End If
If Digit_active = 5 Then 'Stellenanzeigeroutine für Standbyzeitanzeige(00)
Standbyzeit_zehner = Standbyzeit / 10
Standbyzeit_einer = Standbyzeit_zehner * 10
Standbyzeit_einer = Standbyzeit - Standbyzeit_einer
If Multiplex > 8 Or Multiplex < 4 Then
Wert = 10
Elseif Multiplex = 4 Then
Wert = Standbyzeit_einer
If Multiplex = 4 And 2hz_zaehler = 0 And Digit_active = 5 Then Wert = 10 'Zahlenstelle(Standbyzeit-Einer) beim stellen blinken
Elseif Multiplex = 8 Then
Wert = Standbyzeit_zehner
If Multiplex = 8 And 2hz_zaehler = 0 And Digit_active = 5 Then Wert = 10 'Zahlenstelle(Standbyzeit-Zehner) beim stellen blinken
End If
End If
If Standby = 1 Then Wert = 10 'wenn Standby aktiviert - alle Anzeigen aus
'Hier erfolgt die die Auswahl (Dekodierung) welche Segmente leuchten sollen
Select Case Wert
Case 0
Portd = &B00111111 '0
Case 1
Portd = &B00000110 '1
Case 2
Portd = &B01011011 '2
Case 3
Portd = &B01001111 '3
Case 4
Portd = &B01100110 '4
Case 5
Portd = &B01101101 '5
Case 6
Portd = &B01111101 '6
Case 7
Portd = &B00000111 '7
Case 8
Portd = &B01111111 '8
Case 9
Portd = &B01101111 '9
Case Else
Portd = &B00000000 'Anzeige dunkel schalten
End Select
Return
Ontimer2: 'Timer2(14Hz) für Zahlenblinker(2Hz) beim stellen
Incr Timer2_zaehler 'Zähler zählt bis 7 dann wieder 0
If Timer2_zaehler = 7 Then
Timer2_zaehler = 0
Toggle 2hz_zaehler 'durch toggle werden 2Hz Blinkfrequenz erreicht
End If
Return