Hilfe - Küchentimer

Hi Dino,

wie schon geschrieben habe ich die Hardware fertig. Sie funktioniert mit diesem geänderten Code:

Code:
'*** Küchentimer ***************************************************************
'*** mit Atmega8 und 6 x LED 7 Segment-Anzeigen ********************************
'*** Andreas Hickmann
'*** Anregung und Grundlagen von http://www.elektronik-radio.de ****************

'*** Hardware *****************************************************************
$regfile = "m8def.dat"
$crystal = 3686400                                          '3,6864 Mhz

'*** Ports konfigurieren********************************************************
Ddrb = &B00110000                                           'PB => 1=Ausgang / 0=Eingang
Portb = &B00000011                                          '1=PullUp eingeschaltet
Ddrc = &B11111111                                           'PC => Multiplexen der Anzeige
Ddrd = &B11111111                                           'PD => 7-Segmente

'Sekundentakt erzeugen
On Timer1 Ontimer1
Config Timer1 = Timer , Prescale = 64                       '16Mhz/1024/(15625 siehe unten!)=1Hz
Enable Timer1

'Multiplexfrequenz erzeugen
On Timer0 Ontimer0
Config Timer0 = Timer , Prescale = 256                      '16Mhz/256/(156 siehe unten!)=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

Declare Sub Minute
Declare Sub Stunde

Multiplex = 1                                               'Startwert
Timer1 = 7936                                               'Für den Start der Uhr nach 1 Sekunde

'*** Main (Zeit einstellen) ****************************************************
Do
   Debounce Pinb.0 , 0 , Minute , Sub                       'Minuten einstellen
   Debounce Pinb.1 , 0 , Stunde , Sub                       'Stunden einstellen
Loop

'*** Sub-Routinen **************************************************************
Sub Minute
    Decr Min_einer                                          'Minute um 1 weniger
    Sek_einer = 0                                           'Nullen der Sekunde (Einer)
    Sek_zehner = 0                                          'Nullen der Sekunde (Zehner)
End Sub

Sub Stunde                                                  'Stunde um 1 weniger
    Decr Std_einer
End Sub

'*** Interrupt-Routinen ********************************************************
Ontimer1:                                                   'Aufruf im Sekundentakt
   Timer1 = 7936                                            '65536-15625=49911 => 1Hz
   Portb.5 = Not Portb.5                                    'Doppelpunkte blinken im Sekundentakt
   Portb.4 = Portb.5
   Decr Sek_einer                                           'Sekunde Einer-Stelle runterzählen
   'Die Sekunden-Einer runterzählen => 0,9,8,7,6,5,4,3,2,1
   If Sek_einer > 10 Then                                    'Wenn Sekunde-Einer größer 10
      Sek_einer = 9                                         'dann Sekunde Einer-Stelle auf 9  setzen
      Decr Sek_zehner                                       'und Sekunde Zehner-Stelle runterzählen
   End If
  'Die Sekunden-Zehner runterzählen => 5, 4, 3, 2, 1, 0
   If Sek_zehner > 6 Then                                   'Wenn Sekunde-Zehner größer 6               '
      Sek_zehner = 5                                        'dann Sekunde Zehner-Stelle auf 5
      Decr Min_einer                                        'und Minute Einer-Stelle runterzählen
   End If
   'Die Minuten-Einer runterzählen => 0,9,8,7,6,5,4,3,2,1
   If Min_einer > 10 Then                                   'usw.
      Min_einer = 9
      Decr Min_zehner
   End If

   If Min_zehner > 6 Then
      Min_zehner = 5
      Decr Std_einer
   End If

   If Std_einer > 10 Then
      Std_einer = 9
      Decr Std_zehner
   End If

   If Std_zehner >= 2 And Std_einer >= 4 Then               'Wenn 24 Uhr alles 00:00:00 setzen
         Min_zehner = 9
         Min_zehner = 5
         Std_zehner = 2
         Std_einer = 3
   End If
Return

Ontimer0:                                                   'Der Multiplexer!
   Timer0 = 1000                                            '16Mhz/256/(256-100)= 400Hz

   'Hier wird die Umschaltsequenz (Multiplexen) der 6 Segmente erzeugt!
   Multiplex = Multiplex * 2                                '1,2,4,8,16,32,(64)
   If Multiplex = 64 Then Multiplex = 1

   '400Hz/6Segmente=> 66Hz. Die kpl. Anzeige wird also mit 66Hz gemultiplext!

   Portd = &B11111111                                       '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 = 2 Then Wert = Sek_zehner
   If Multiplex = 4 Then Wert = Min_einer
   If Multiplex = 8 Then Wert = Min_zehner
   If Multiplex = 16 Then Wert = Std_einer
   If Multiplex = 32 Then
      If Std_zehner = 0 Then                                'Wenn 0 soll die Anzeige dunkel bleiben
         Wert = 10                                          '10 bedeutet => kein Segment ist an.
      Else
         Wert = Std_zehner
      End If
   End If

   '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

Ich mußte nur die Anzeigebits invertieren. Ansonsten zeigt die Anzeige wie sie es soll und der Countdown läuft auch rückwärts. Es fehlt ja nun noch einiges im Code(Drehimpulsregler(Zeit einstellen), Taster(Start/Stop-Countdown), Buzer).

Nun fangen wir von vorne an.

Code:
 '*** Küchentimer ***************************************************************
 '*** mit Atmega8 und 6 x LED 7 Segment-Anzeigen ********************************
 '*** Andreas Hickmann
 '
 '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

Gruß Andreas
 
Hi Andreas,

wie schon geschrieben habe ich die Hardware fertig. Sie funktioniert mit diesem geänderten Code:

...

Ich mußte nur die Anzeigebits invertieren. Ansonsten zeigt die Anzeige wie sie es soll und der Countdown läuft auch rückwärts. Es fehlt ja nun noch einiges im Code(Drehimpulsregler(Zeit einstellen), Taster(Start/Stop-Countdown), Buzer).

Nun fangen wir von vorne an.

das hört sich für mich an wie ...

"Die Kirschtorte ist fertig. Es fehlen nur noch die Schokoflocken oben drauf. Also fangen wir nochmal neu an." :p

Warum baust du den fertigen Code nicht so um das es paßt?

Gruß
Dino
 
Hi Dino,

ich habe den Code mit großer Hilfe von Daniel(molleonair) fertiggestellt. Ich wusst nämlich nicht, dass er aus dem Nachbarort stammt. Nochmals danke Daniel.
Hier der fertige und funktionierende Code:

Code:
 '*** Küchentimer **************************************************************
 '*** mit Atmega8 und 6 x LED 7 Segment-Anzeigen *******************************
 '*** Anregung und Grundlagen von http://www.elektronik-radio.de ***************
 '*** Andreas Hickmann
 '*** 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********************************************************
Ddrb = &B00111000                                           'PB => 1=Ausgang / 0=Eingang
Portb = &B00001111                                          '1=PullUp eingeschaltet
Ddrc = &B11111111                                           'PC => Multiplexen der Anzeige
Ddrd = &B11111111                                           'PD => 7-Segmente

'Sekundentakt erzeugen
On Timer1 Ontimer1
Config Timer1 = Timer , Prescale = 64                       ' siehe unten!)=1Hz
Enable Timer1
Stop 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 Uhr_lauft 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
Set 2hz_zaehler
Digit_active = 4
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
Loop

'*** Sub-Routinen (Zeit einstellen) ********************************************
Sub Start_stopp                                             'starten und stoppen des Timers1
   If Uhr_lauft = 0 Then
      Start Timer1
      Uhr_lauft = 1
      Stop Timer2
      Set 2hz_zaehler
   Else
      Stop Timer1
      Uhr_lauft = 0
      Digit_active = 4
      Start Timer2
   End If
End Sub

Sub Count_up                                                'Drehimpulsgeber - Zeit stellen(hochzählen)
    If Enc_zaehler = 4 Then
      Stop Timer1
      Start Timer2
      Uhr_lauft = 0
      If Digit_active = 1 And Std_zehner < 2 Then
         Incr Std_zehner
      Elseif Digit_active = 2 And Std_einer < 9 Then
         Incr Std_einer
      Elseif Digit_active = 3 And Min_zehner < 5 Then
         Incr Min_zehner
      Elseif Digit_active = 4 And Min_einer < 9 Then
         Incr Min_einer
      End If
      Enc_zaehler = 0
   Else
      Incr Enc_zaehler
   End If
Waitms 5
End Sub

Sub Count_down                                              'Drehimpulsgeber - Zeit stellen(runterzählen)
    If Enc_zaehler = 4 Then
      Stop Timer1
      Start Timer2
      Uhr_lauft = 0
      If Digit_active = 1 And Std_zehner > 0 Then
         Decr Std_zehner
      Elseif Digit_active = 2 And Std_einer > 0 Then
         Decr Std_einer
      Elseif Digit_active = 3 And Min_zehner > 0 Then
         Decr Min_zehner
      Elseif Digit_active = 4 And Min_einer > 0 Then
         Decr Min_einer
      End If
      Enc_zaehler = 0
   Else
      Incr Enc_zaehler
   End If
Waitms 5
End Sub

Sub Drehtaster
   Incr Digit_active                                        'Drehimpulsgeber schaltet die Zahlenstellen Min_einer bis Std_zehner durch
   If Digit_active = 5 Then Digit_active = 1
End Sub

'*** Interrupt-Routinen ********************************************************
Ontimer1:                                                   'Aufruf im Sekundentakt
   Timer1 = 7936                                            '65536-7936=57600 => 1Hz
   Portb.5 = Not Portb.5                                    'Doppelpunkte blinken im Sekundentakt - ist aber nicht angeschlossen
   Portb.4 = Portb.5
   Decr Sek_einer                                           'Sekunde Einer-Stelle runterzählen
   'Die Sekunden-Einer runterzählen => 0,9,8,7,6,5,4,3,2,1
   If Sek_einer > 10 Then                                   'Wenn Sekunde-Einer größer 10
      Sek_einer = 9                                         'dann Sekunde Einer-Stelle auf 9  setzen
      Decr Sek_zehner                                       'und Sekunde Zehner-Stelle runterzählen
   End If
  'Die Sekunden-Zehner runterzählen => 5, 4, 3, 2, 1, 0
   If Sek_zehner > 6 Then                                   'Wenn Sekunde-Zehner größer 6               '
      Sek_zehner = 5                                        'dann Sekunde Zehner-Stelle auf 5
      Decr Min_einer                                        'und Minute Einer-Stelle runterzählen
   End If
   'Die Minuten-Einer runterzählen => 0,9,8,7,6,5,4,3,2,1
   If Min_einer > 10 Then                                   'usw.
      Min_einer = 9
      Decr Min_zehner
   End If

   If Min_zehner > 6 Then
      Min_zehner = 5
      Decr Std_einer
   End If

   If Std_einer > 10 Then
      Std_einer = 9
      Decr Std_zehner
   End If
   If Std_zehner >= 2 And Std_einer >= 4 Then               'Wenn 24 Uhr alles 00:00:00 setzen
         Min_zehner = 9
         Min_zehner = 5
         Std_zehner = 2
         Std_einer = 3
   End If
Return

Ontimer0:                                                   'Der Multiplexer!
   Timer0 = 1000                                            '= 400Hz

   'Hier wird die Umschaltsequenz (Multiplexen) der 6 Segmente erzeugt!
   Multiplex = Multiplex * 2                                '1,2,4,8,16,32,(64)
   If Multiplex = 64 Then Multiplex = 1

   '400Hz/6Segmente=> 66Hz. Die kpl. Anzeige wird also mit 66Hz gemultiplext!

   Portd = &B11111111                                       '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 = 2 Then Wert = Sek_zehner
   If Multiplex = 4 Then Wert = Min_einer
   If Multiplex = 4 And 2hz_zaehler = 0 And Digit_active = 4 Then Wert = 10       'Zahlenstelle beim stellen blinken
   If Multiplex = 8 Then Wert = Min_zehner
   If Multiplex = 8 And 2hz_zaehler = 0 And Digit_active = 3 Then Wert = 10       'Zahlenstelle beim stellen blinken
   If Multiplex = 16 Then Wert = Std_einer
   If Multiplex = 16 And 2hz_zaehler = 0 And Digit_active = 2 Then Wert = 10       'Zahlenstelle beim stellen blinken
   If Multiplex = 32 Then
      If Std_zehner = 0 And Uhr_lauft = 1 Then              'Wenn 0 soll die Anzeige dunkel bleiben
         Wert = 10                                          '10 bedeutet => kein Segment ist an.
      Else
         Wert = Std_zehner
      End If
   End If
   If Multiplex = 32 And 2hz_zaehler = 0 And Digit_active = 1 Then Wert = 10

   '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 erreicht
   End If
Return

Gruß Andreas

Ps.: was noch fehlt ist die Steuerung des Buzzers(kommt aber noch)
 
Hi Andreas,

ich habe den Code mit großer Hilfe von Daniel(molleonair) fertiggestellt. Ich wusst nämlich nicht, dass er aus dem Nachbarort stammt. Nochmals danke Daniel.

na wer sagts denn :cool: Dann könnt ihr da ja auch nen AVR-Stammtisch anfangen :victory:

Schön das es (beinahe) fertig ist.

Gruß
Dino
 
Hi Dino,

das Projekt Küchentimer ist erfolgreich abgeschlossen.
Hier der Code:

Code:
 '*** Küchentimer **************************************************************
 '*** mit Atmega8 und 6 x LED 7 Segment-Anzeigen *******************************
 '*** Anregung und Grundlagen von http://www.elektronik-radio.de ***************
 '*** Andreas Hickmann
 '*** 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
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 Alarmzeit_einer As Byte
Dim Alarmzeit_zehner As Byte
Alarmzeit = 60                                                        'Vorgabe - Alarmzeit
Dim Uhr_lauft 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 Alarmtimer As Byte
Dim Drehtaster_drueck_zeit As Byte
Alarmtimer = Alarmzeit + 1
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 Timers1
   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 Then
         Reset Buzzer
         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 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 Alarmzeit < 99 Then                 'Buzzerzeit stellen(hochzählen)
         Incr Alarmzeit
      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 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 Alarmzeit > 0 Then                  'Buzzerzeit stellen(runterzählen)
         Decr Alarmzeit
      End If
      Enc_zaehler = 0
   Else
      Incr Enc_zaehler
   End If
End Sub

Sub Drehtaster
   Drehtaster_drueck_zeit = 0
   Do
   Loop Until Drehtaster_pin = 1
   If Drehtaster_drueck_zeit < 3 Then
      Decr Digit_active                                               'Drehimpulsgeber schaltet die Zahlenstellen Min_einer bis Std_zehner durch
      If Digit_active = 0 Then Digit_active = 2
   Else
       Digit_active = 3
       Start Timer2
   End If
End Sub

'*** Interrupt-Routinen ********************************************************
Ontimer1:                                                             'Aufruf im Sekundentakt
   Set Beepton
   Timer1 = 7936                                                      '65536-7936=57600 => 1Hz
   If Drehtaster_drueck_zeit < 255 Then Incr Drehtaster_drueck_zeit
   If Alarmtimer <= Alarmzeit Then Incr Alarmtimer
   Toggle Doppelpunkt                                                 'Doppelpunkte blinken im Sekundentakt - LED´s sind aber 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 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 = 2 Then Wert = Sek_zehner
   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 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 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 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 => kein Segment ist an.
      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 beim stellen(Stunden/Minuten) 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 = 3 Then                                           'Stellenanzeigeroutine für Alarmanzeige(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 = 3 Then Wert = 10       'Zahlenstelle beim stellen blinken
      Elseif Multiplex = 2 Then
         Wert = Alarmzeit_zehner
         If Multiplex = 2 And 2hz_zaehler = 0 And Digit_active = 3 Then Wert = 10       'Zahlenstelle beim stellen blinken
      End If
   End If

   '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 erreicht
   End If
Return


Gruß Andreas
 
Hi Andreas,

das Projekt Küchentimer ist erfolgreich abgeschlossen.
na denn mal herzlichen Glückwunsch :tee:
Schön wenn am Ende alles wie gewünscht funktioniert :cool:

Hier der Code:
Code:
 '*** Küchentimer **************************************************************
 '*** mit Atmega8 und 6 x LED 7 Segment-Anzeigen *******************************
 '*** Anregung und Grundlagen von http://www.elektronik-radio.de ***************
 '*** Andreas Hickmann
 '*** 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
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 Alarmzeit_einer As Byte
Dim Alarmzeit_zehner As Byte
Alarmzeit = 60                                                        'Vorgabe - Alarmzeit
Dim Uhr_lauft 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 Alarmtimer As Byte
Dim Drehtaster_drueck_zeit As Byte
Alarmtimer = Alarmzeit + 1
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 Timers1
   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 Then
         Reset Buzzer
         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 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 Alarmzeit < 99 Then                 'Buzzerzeit stellen(hochzählen)
         Incr Alarmzeit
      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 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 Alarmzeit > 0 Then                  'Buzzerzeit stellen(runterzählen)
         Decr Alarmzeit
      End If
      Enc_zaehler = 0
   Else
      Incr Enc_zaehler
   End If
End Sub

Sub Drehtaster
   Drehtaster_drueck_zeit = 0
   Do
   Loop Until Drehtaster_pin = 1
   If Drehtaster_drueck_zeit < 3 Then
      Decr Digit_active                                               'Drehimpulsgeber schaltet die Zahlenstellen Min_einer bis Std_zehner durch
      If Digit_active = 0 Then Digit_active = 2
   Else
       Digit_active = 3
       Start Timer2
   End If
End Sub

'*** Interrupt-Routinen ********************************************************
Ontimer1:                                                             'Aufruf im Sekundentakt
   Set Beepton
   Timer1 = 7936                                                      '65536-7936=57600 => 1Hz
   If Drehtaster_drueck_zeit < 255 Then Incr Drehtaster_drueck_zeit
   If Alarmtimer <= Alarmzeit Then Incr Alarmtimer
   Toggle Doppelpunkt                                                 'Doppelpunkte blinken im Sekundentakt - LED´s sind aber 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 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 = 2 Then Wert = Sek_zehner
   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 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 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 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 => kein Segment ist an.
      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 beim stellen(Stunden/Minuten) 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 = 3 Then                                           'Stellenanzeigeroutine für Alarmanzeige(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 = 3 Then Wert = 10       'Zahlenstelle beim stellen blinken
      Elseif Multiplex = 2 Then
         Wert = Alarmzeit_zehner
         If Multiplex = 2 And 2hz_zaehler = 0 And Digit_active = 3 Then Wert = 10       'Zahlenstelle beim stellen blinken
      End If
   End If

   '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 erreicht
   End If
Return
sieht gut strukturiert und aufgeräumt aus. Die Bemerkungen erklären auch alles notwendige und die sprechenden Variablennamen geben auch einen guten Überblick.

:party:

Gruß
Dino
 
Hallo Andreas ...

..hab dir gern geholfen
Das nötige Wissen war ja vorhanden und so ging die Überarbeitung deines Codes ja zügig über die Bühne.
Jetzt fehlen nur noch die Bilder wenn deine Schaltung vom Steckbrett in ein Gehäuse umgezogen ist.

Also viel Erfolg noch bei der Fertigstellung deines Projektes und ich freu mich auf das Bierchen und n Hexa-Rundflug
wenn Ich wieder mal im Lande bin.

Gruß Daniel
 
Hallo Andreas ...

..hab dir gern geholfen
Das nötige Wissen war ja vorhanden und so ging die Überarbeitung deines Codes ja zügig über die Bühne.
Jetzt fehlen nur noch die Bilder wenn deine Schaltung vom Steckbrett in ein Gehäuse umgezogen ist.

Also viel Erfolg noch bei der Fertigstellung deines Projektes und ich freu mich auf das Bierchen und n Hexa-Rundflug
wenn Ich wieder mal im Lande bin.

Gruß Daniel

Hi Daniel,

nochmals danke für Deine Hilfe. Bilder werden natürlich kommen und das Bier steht auch schon kalt...

Gruß Andreas

Ps.: wo ich noch Probleme habe, ist der Standby oder Sleep-Modus
 
Hi,

der Standby-Modus wurde hinzugefügt. Man kann auch variabel die Standby- und Alarmzeit einstellen. Ein paar kleine Bugs wurden auch behoben.

Code:
 '******************************************************************************
 '*** 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 Alarmzeit < 99 Then       'Buzzerzeit stellen(hochzählen)
         Incr Alarmzeit
    Elseif Digit_active = 4 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 Alarmzeit > 0 Then        'Buzzerzeit stellen(runterzählen)
         Decr Alarmzeit
      Elseif Digit_active = 4 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=Alarmzeit stellen . digit 4=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 = 3
      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 = 1
      Elseif Digit_active = 3 Then
             Digit_active = 4
      Elseif Digit_active = 4 Then
             Digit_active = 3
      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 = 2 Then Wert = Sek_zehner
   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 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 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 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 beim stellen(Stunden/Minuten) 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 = 3 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 = 3 Then Wert = 10       'Zahlenstelle beim stellen blinken
      Elseif Multiplex = 2 Then
         Wert = Alarmzeit_zehner
         If Multiplex = 2 And 2hz_zaehler = 0 And Digit_active = 3 Then Wert = 10       'Zahlenstelle beim stellen blinken
      End If
   End If

   If Digit_active = 4 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 = 4 Then Wert = 10       'Zahlenstelle beim stellen blinken
      Elseif Multiplex = 8 Then
         Wert = Standbyzeit_zehner
         If Multiplex = 8 And 2hz_zaehler = 0 And Digit_active = 4 Then Wert = 10       'Zahlenstelle 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


und hier noch ein paar Bilder vom Küchentimer -


Nochmals großen Dank an Daniel, für seine Hilfe.

Gruß Andreas
 

Anhänge

  • P1020987.jpg
    P1020987.jpg
    235,3 KB · Aufrufe: 45
  • P1020981.jpg
    P1020981.jpg
    241,8 KB · Aufrufe: 51
  • P1020983.jpg
    P1020983.jpg
    249,5 KB · Aufrufe: 46
  • P1020986.jpg
    P1020986.jpg
    241,2 KB · Aufrufe: 48
  • Küchentimer_fertig_12.02.2013.bas
    16,1 KB · Aufrufe: 16
Hallo Andreas,

dein Kuechentimer gefällt mir ebenfalls! Ich würde wahrscheinlich mehr auf den Timer achten, als auf das Essen ;)

Dirk :ciao:
 
Hi Hicki
Wow, beeindruckend....:cool: Sag mal, das ist doch nicht etwa eine Großküche von 30x30m ...:confused:?
Ach ja, Sangerhausen, das ist ja fast um die Ecke...
Gruß oldmax
 
Hallo Andreas,

dass ist eine gute Idee. Müssen wir nur einen Termin festlegen. Übernachtung ist natürlich auch kein Problem.

Harz ist schon recht weit südlich kurz vor Göttingen. A7 runterknallen und Seesen ab ... oder so. Wär ne Überlegung wert :rolleyes:

EDIT: Seh grade ... andere Seite vom Harz ... 06526 Sangershausen.
AVR-Wanderung auf den Brocken? :p Wär auch ne Idee :cool:

EDIT2: Mal auf Mäppchen gesehen ... südöstliche Ecke. Genau diagonal von mir weg. Hm ...
Laut Routenplanung etwa 250km und 3h Fahrt von mir weg. Hört sich nicht so extrem an wenn man bedenkt das bei unseren Treffen auch 4h-Fahrten von Usern dabei waren.

Gruß
Dino
 
Hi Andreas,

sehr schön geworden , Glückwunsch...
Sollte es wirklich nen Forum-Treffen bei dir geben bin ich dabei.
Kanns nur empfehlen war dort selbst schon essen und Bowling spielen.

Gruß Daniel
 
...Mal auf Mäppchen gesehen ... südöstliche Ecke. Genau diagonal von mir weg. Hm ...
Laut Routenplanung etwa 250km und 3h Fahrt von mir weg...
dito bei mir - nur mit Kurs: SW
bei ca 3 Stunden würde ich auch schon drüber nachdenken (Wenn Arbeit und Familie es zulassen sollten...;))
 
dito bei mir - nur mit Kurs: SW
bei ca 3 Stunden würde ich auch schon drüber nachdenken (Wenn Arbeit und Familie es zulassen sollten...;))

Usertreffen - da war doch was:confused::confused:
Wäre auf jeden Fall dabei - und näher als beim letzten Mal ist es ja auch noch:D:D

Wir könnten es auch in der Nähe von Frankfurt am Main abhalten - natürlich nicht ohne Hintergedanken...
Dann könnten vielleicht noch einige User aus dem Süden einfacher dazukommen.

Würde auch mithelfen es zu organisieren. Wollte da Dirk nicht etwas planen, oder ist er immer noch dabei umzuziehen:rolleyes:
Das Problem dabei ist halt die Location - wieviele Personen, wo kann man sich treffen, usw....

So ein Hotel ist natürlich optimal!


MfG
FreeVee
 
Hallo zusammen!

Die Idee mit dem Hotel im Harz finde ich auch richtig Klasse.

Dann würde ein Treffen sogar mit Übernachtung stattfinden können und nicht nur für ein paar Stunden.
Damit würde sich der Weg für die weiter entfernten User dann auch richtig lohnen! :)


Sollten wir also unbedingt festhalten!


Grüße,
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)