Benutzer-Werkzeuge

Webseiten-Werkzeuge


elektronik:cooktimer

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
elektronik:cooktimer [2012/04/22 16:05] patrickbeckelektronik:cooktimer [2014/03/16 19:44] (aktuell) patrickbeck
Zeile 1: Zeile 1:
 +====== Cooktimer - Küchenuhr ======
  
 +{{:elektronik:cimg3127.jpg?398}}
 +{{:elektronik:cooktimer_gehaeuse.png?400}}
 +
 +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.
 +
 +{{:elektronik:cooktimer_bild.png?200|}}
 +
 +Hier noch die Eagle-Datei
 +{{:elektronik: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.
 +
 +<code>
 +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
 +</code>
 +===== Bascom-Programm =====  
 +
 +<code>
 +'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
 +</code>
 +
 +Hex-File zum direkten flashen {{:elektronik:cooktimer.hex|}}
elektronik/cooktimer.txt · Zuletzt geändert: 2014/03/16 19:44 von patrickbeck