Inhaltsverzeichnis
Cooktimer - Küchenuhr
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