Benutzer-Werkzeuge

Webseiten-Werkzeuge


elektronik:cooktimer

Cooktimer - Küchenuhr

cimg3127.jpg

Seit längerer Zeit interessierte ich mich für das Thema Mikrocontroller. Jedoch hatte ich noch nach einem passenden und sinnvollem Projekt gesucht. Nachdem die Küchenuhr meiner Mutter kaputt ging war es gefunden und cooktimer wurde geboren. Der Schaltplan wurde relativ schnell gezeichnet, jedoch ließ die funktionsfähige Programmierung lange auf sich warten. Als ich jedoch letzte Woche Bascom entdeckte, beschloss ich mir diesen Basicdialekt mal genauer anzuschauen. Ich wurde nicht enttäuscht und es entsprach einfach mehr meiner Art Programme zu entwickeln als unter Assembler Bits und Bytes umher zuschieben :) Somit wurde der cooktimer rehabilitiert und hier nun das Ergebnis. Im folgenden eine Funktionsbeschreibung, der Schaltplan, sowie das Bascom-Programm.

Die oben eingebundenen Fotos zeigen zwei Versionen der Hardware. Links eine noch mit fehlerbehaftete Version (einige Dioden zu viel zur Spannungssenkung, kein Quarz). Nachdem ich mich lange mit dem Internen Oszillator rumgeschlagen habe, musste einfach ein Quarz her. Die Genauigkeit ist um ein vielfaches genauer.

Funktionsbeschriebung

Cooktimer wurde mit einem Atmel AVR Mega8L entworfen, besitzt zwei Sieben-Segment-Anzeigen diese durch Multiplexing (zwei Transistoren schalten die gemeinsamen Kathoden) umgeschaltet werden, sowie drei Tastern zur Bedienung (zwei zur Zeiteinstellung, einer zum Start des Timers und zum Reset). Die Schaltung wird mit vier 1,5 V Batterien / Akkus betrieben, wobei eine Diode die Spannung auf ca. 5,2 V reduziert. Zur Einfachen Programmierung wurde eine ISP-Schnittstelle (10-Polig) implentiert, womit der Controller direkt in der Schaltung geflasht werden kann. Es wird ein 4 Mhz Quarz zur Takterzeugung genutzt. Da wie ich festgestellt habe die Spannung eine wichtige Rolle für die genaue Zeitmessung darstellt habe ich die Brown-Out-Detection (Unterspannungserkennung und ein damit verbundener Reset des Mikrocontrollers) aktiviert. Die Spannung ist dabei auf 4 V begrenzt. Wird diese Unterschritten führt der Mikrocontroller einen Reset durch.

Bedienung

Nach Betätigung des Hauptschalters verbleiben die Sieben-Segment-Anzeigen im ausgeschalteten Zustand. Erst nach Betätigung einer der zwei Stelltaster werden die Sieben-Segment-Anzeigen aktiv geschaltet. Mit jeweils einem Stelltaster kann die dazu gehörige Sieben-Segment-Anzeige von 0 - 9 eingestellt werden. Nach erreichen der Ziffer 9 wird automatisch zur 0 gesprungen. Wurde die gewünschte Zeit eingestellt, wird der Timer mit der dritten Taste gestartet. Ab diesem Zeitpunkt wird jede Minute die angezeigte Zahl verringert. Bei Null angekommen ertönt für einige Sekunden ein Summer. Nachdem der Summer ertönt ist, bleibt die 7-Segment-Anzeige auf 00 stehen. Somit ist auch visuell ersichtlich, dass der Timer abgelaufen ist. Während des Countdowns kann jederzeit durch die Stelltaster die angezeigte Ziffer verändert werden, anschließend muss jedoch der Timer wieder mit der Starttaste betätigt werden. Ebenfalls ist es möglich durch erneutes Drücken des Starttasters (wenn der Timer läuft) die Anzeige auf 00 zu setzen (Reset).

Schaltplan

Der Schaltplan wurde mit Eagle entworfen.

Hier noch die Eagle-Datei cooktimer.sch

Vollständigkeitshalber noch die exportierte Teileliste aus Eagle. Angaben für die verwendeten Bauteile müssen nicht stimmen. Da ich nur den Schaltplan erstellt habe, wurde auf das Symbol (Device, Package) an sich nicht unbedingt geachtet. Die Werte für Widerstände und Transistoren (Part, Value), etc. sind jedoch richtig. ausgewählt.

Partlist

Exported from cooktimer.sch at 12.03.2009 21:44:59 

EAGLE Version 4.16r2 Copyright (c) 1988-2006 CadSoft

Part     Value          Device             Package      Library        Sheet

C1       100 nF         C2,5-3             C2.5-3       capacitor-wima 1
C2       22 pF          C2,5-3             C2.5-3       capacitor-wima 1
C3       22 pF          C2,5-3             C2.5-3       capacitor-wima 1
D1       1N4001         1N4004             DO41-10      diode          1
D2                      7SEG-CK            7SEG-13      special_7seg   1
D3                      7SEG-CK            7SEG-13      special_7seg   1
G1       1,5 V          CR-AA              CRAA         battery        1
G2       1,5 V          CR-AA              CRAA         battery        1
G3       1,5 V          CR-AA              CRAA         battery        1
G4       1,5 V          CR-AA              CRAA         battery        1
IC1      ATMEGA8L       ATMEGA8_REAL       ATMEGA8_REAL atmega8_real   1
Q1       4 Mhz          CRYSTALHC18U-V     HC18U-V      crystal        1
R1       10 k           R-0402             R0402        quantum-sensor 1
R2       180            R-0402             R0402        quantum-sensor 1
R3       180            R-0402             R0402        quantum-sensor 1
R4       180            R-0402             R0402        quantum-sensor 1
R5       180            R-0402             R0402        quantum-sensor 1
R6       180            R-0402             R0402        quantum-sensor 1
R7       180            R-0402             R0402        quantum-sensor 1
R8       180            R-0402             R0402        quantum-sensor 1
R9       180            R-0402             R0402        quantum-sensor 1
R10      1,3 K          R-0402             R0402        quantum-sensor 1
R11      1,3 K          R-0402             R0402        quantum-sensor 1
R12      2,7 K          R-0402             R0402        quantum-sensor 1
S0                      MS243              MS243        switch         1
S1                      31-XX              B3F-31XX     switch-omron   1
S2                      31-XX              B3F-31XX     switch-omron   1
S3                      31-XX              B3F-31XX     switch-omron   1
SG1      Summer         F/SMX              F/SMX        buzzer         1
SV1      ISP            ML10               ML10         con-harting-ml 1
T1                      BC635-NPN-TO92-BCE TO92-BCE     transistor     1
T2                      BC635-NPN-TO92-BCE TO92-BCE     transistor     1
T3       BC547          BC547              TO92         transistor     1
X1       Anreihklemme   W237-102           W237-102     con-wago-500   1
X2       Anreihklemme   W237-102           W237-102     con-wago-500   1

Bascom-Programm

'Cooktimer Version 1.5 by Patrick Beck
'-------------------------------------
'Cooktimer is a cook clock on the base
'of a ATMEL AVR Mega8 microcontroller.
'Programming language is Bascom basic.
'-------------------------------------

$regfile = "m8def.dat"
$framesize = 60
$hwstack = 40
$swstack = 32

$crystal = 4000000                                          ' external crystal oscillator on 4 Mhz

Config Timer0 = Timer , Prescale = 64                       ' multiplex timer
On Timer0 Timer0_isr
Const Timer0load = 178

Config Timer1 = Timer , Prescale = 64                       ' one second timer
On Timer1 Timer1_isr
Stop Timer1
Const Timer1load = 3036
Timer1 = Timer1load

Ddrb = &B11111111                                           ' PORTB as output
Ddrd = &B11111111                                           ' PORTD (7-segment) as output
Ddrc = &B00000000                                           ' PINC (pushbutton) as input
Portc = &B11111111                                          ' activate the pullup resistors of PINC

Dim Onedigit As Byte
Dim Twodigit As Byte
Dim Timer1_active As Byte
Dim Second As Byte

Onedigit = 0
Twodigit = 0
Timer1_active = 0
Second = 0

Do

   Debounce Pinc.1 , 0 , Firstbutton , Sub                  ' if one digit button pressed, jump to firstbutton (detect only on push)
   Debounce Pinc.0 , 0 , Secondbutton , Sub                 ' the same for twodigit button
   Debounce Pinc.2 , 0 , Startbutton , Sub                  ' the same for start / reset button

   If Second = 60 Then                                      ' When variable second = 60 then jump to the programmcode minuteover
      Second = 0
      Gosub Minuteover
   End If

   If Onedigit = 10 Then                                    ' when the onedigit variable reach 10 (9 on the segment) then set it to 0
      Onedigit = 0
   End If

   If Twodigit = 10 Then
      Twodigit = 0                                          ' when the twodigit variable reach 10 (9 on the segment) then set it to 0
   End If

Loop
End


Firstbutton:

   If Timer1_active = 0 Then
      Enable Timer0                                         ' if the button pressed activate multiplexing and light up the segments
      Enable Interrupts                                     ' enable timer and interrupts for segment multiplexing
      Incr Onedigit
      Portb.1 = 1
   End If

   If Timer1_active = 1 Then
      Timer1_active = 0
      Disable Timer1
      Stop Timer1
      Incr Onedigit
   End If

Return

Secondbutton:

   If Timer1_active = 0 Then
      Enable Timer0                                         ' if the button pressed activate multiplexing and light up the segments
      Enable Interrupts                                     ' enable timer and interrupts for segment multiplexing
      Incr Twodigit
      Portb.2 = 1
   End If

   If Timer1_active = 1 Then                                ' you can change the digits when the timer is running, timer will be stopped after a push
      Timer1_active = 0                                     ' you can start the timer with the Button PINC.2
      Disable Timer1                                        ' timer will be disabled
      Stop Timer1                                           ' timer will be stopped
      Incr Twodigit                                         'the digit will be increased in the same time (only one push essential)
   End If

Return

Startbutton:

   If Timer1_active = 0 Then                                ' starts the timer if not started yet
      Disable Interrupts                                    ' switch the segments off (PORTB complete) and one - for a visual acception after the timer start
      Portb = 0
      Waitms 200
      Enable Interrupts
      Enable Timer1
      Start Timer1
      Timer1_active = 1
   Else

      Timer1_active = 0                                     ' when the timer is started you can reset the variables with the start timer button
      Disable Timer1                                        ' timer will be disabled
      Stop Timer1                                           ' timer will be stopped

      Onedigit = 0                                          ' reset all variables
      Twodigit = 0
      Timer1_active = 0
      Second = 0
   End If

Return


Segmente:                                                   ' 7-Segment table to control the digit output
'---------abc.degf--------
  Data &B10110111                                           ' 0
  Data &B00000110                                           ' 1
  Data &B01110011                                           ' 2
  Data &B01010111                                           ' 3
  Data &B11000110                                           ' 4
  Data &B11010101                                           ' 5
  Data &B11110101                                           ' 6
  Data &B00000111                                           ' 7
  Data &B11110111                                           ' 8
  Data &B11010111                                           ' 9

Timer0_isr:
   Timer0 = Timer0load

   If Portb.1 = 1 Then
      Portd = Lookup(onedigit , Segmente)                   ' lookup in table with onedigit variable
      Portb.1 = 0
      Portb.2 = 1                                           ' onedigit active

   Else
      Portd = Lookup(twodigit , Segmente)                   ' lookup in table with twodigit variable
      Portb.2 = 0
      Portb.1 = 1                                           ' twodigit active
   End If
Return

Timer1_isr:
   Timer1 = Timer1load                                      ' preload of the timer
   Incr Second                                              ' increase the variable second
Return


Minuteover:
   If Twodigit = 0 And Onedigit = 1 Then                    ' if all digits zero, then activate the buzzer for 1600 ms
      Disable Timer1
      Stop Timer1
      Timer1_active = 0
      Portb.0 = 1
      Waitms 1600
      Portb.0 = 0
   End If
                                                             ' if onedigit greater zero then decrease the onedigit variable
   If Onedigit > 0 Then
      Decr Onedigit

   Elseif Onedigit = 0 And Twodigit > 0 Then                ' if onedigit zero and twodigit greater then zero decrease twodigit
      Decr Twodigit                                         ' and set the ondigit variable to nine
      Onedigit = 9
   End If
Return

Hex-File zum direkten flashen cooktimer.hex

elektronik/cooktimer.txt · Zuletzt geändert: 2014/03/16 19:44 von patrickbeck