elektronik:cooktimer
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende ÜberarbeitungLetzte ÜberarbeitungBeide Seiten der Revision | ||
elektronik:cooktimer [2012/04/22 16:00] – patrickbeck | elektronik:cooktimer [2014/03/16 18:08] – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | <texit info> | ||
+ | author=Patrick Beck | ||
+ | title=Cooktimer | ||
+ | </ | ||
+ | ====== 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, | ||
+ | |||
+ | Die oben eingebundenen Fotos zeigen zwei Versionen der Hardware. Links eine noch mit fehlerbehaftete Version (einige Dioden zu viel zur Spannungssenkung, | ||
+ | |||
+ | ===== 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, | ||
+ | |||
+ | ==== 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, | ||
+ | |||
+ | |||
+ | ===== Schaltplan ===== | ||
+ | |||
+ | Der Schaltplan wurde mit Eagle entworfen. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Hier noch die Eagle-Datei | ||
+ | {{: | ||
+ | |||
+ | |||
+ | 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: | ||
+ | |||
+ | EAGLE Version 4.16r2 Copyright (c) 1988-2006 CadSoft | ||
+ | |||
+ | Part | ||
+ | |||
+ | C1 100 nF | ||
+ | C2 22 pF C2, | ||
+ | C3 22 pF C2, | ||
+ | D1 | ||
+ | D2 7SEG-CK | ||
+ | D3 7SEG-CK | ||
+ | G1 1,5 V CR-AA CRAA | ||
+ | G2 1,5 V CR-AA CRAA | ||
+ | G3 1,5 V CR-AA CRAA | ||
+ | G4 1,5 V CR-AA CRAA | ||
+ | IC1 ATMEGA8L | ||
+ | Q1 4 Mhz CRYSTALHC18U-V | ||
+ | R1 10 k | ||
+ | R2 | ||
+ | R3 | ||
+ | R4 | ||
+ | R5 | ||
+ | R6 | ||
+ | R7 | ||
+ | R8 | ||
+ | R9 | ||
+ | R10 1,3 K R-0402 | ||
+ | R11 1,3 K R-0402 | ||
+ | R12 2,7 K R-0402 | ||
+ | S0 MS243 MS243 switch | ||
+ | S1 31-XX B3F-31XX | ||
+ | S2 31-XX B3F-31XX | ||
+ | S3 31-XX B3F-31XX | ||
+ | SG1 Summer | ||
+ | SV1 ISP ML10 | ||
+ | T1 BC635-NPN-TO92-BCE TO92-BCE | ||
+ | T2 BC635-NPN-TO92-BCE TO92-BCE | ||
+ | T3 | ||
+ | X1 | ||
+ | X2 | ||
+ | </ | ||
+ | ===== Bascom-Programm ===== | ||
+ | |||
+ | < | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | 'of a ATMEL AVR Mega8 microcontroller. | ||
+ | ' | ||
+ | ' | ||
+ | |||
+ | $regfile = " | ||
+ | $framesize = 60 | ||
+ | $hwstack = 40 | ||
+ | $swstack = 32 | ||
+ | |||
+ | $crystal = 4000000 | ||
+ | |||
+ | Config Timer0 = Timer , Prescale = 64 ' | ||
+ | On Timer0 Timer0_isr | ||
+ | Const Timer0load = 178 | ||
+ | |||
+ | Config Timer1 = Timer , Prescale = 64 ' | ||
+ | On Timer1 Timer1_isr | ||
+ | Stop Timer1 | ||
+ | Const Timer1load = 3036 | ||
+ | Timer1 = Timer1load | ||
+ | |||
+ | Ddrb = & | ||
+ | Ddrd = & | ||
+ | Ddrc = & | ||
+ | Portc = & | ||
+ | |||
+ | 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 | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | 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 | ||
+ | Enable Interrupts | ||
+ | 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 | ||
+ | Enable Interrupts | ||
+ | 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 ' | ||
+ | Disable Timer1 | ||
+ | Stop Timer1 | ||
+ | Incr Twodigit | ||
+ | End If | ||
+ | |||
+ | Return | ||
+ | |||
+ | Startbutton: | ||
+ | |||
+ | If Timer1_active = 0 Then ' starts the timer if not started yet | ||
+ | Disable Interrupts | ||
+ | Portb = 0 | ||
+ | Waitms 200 | ||
+ | Enable Interrupts | ||
+ | Enable Timer1 | ||
+ | Start Timer1 | ||
+ | Timer1_active = 1 | ||
+ | Else | ||
+ | |||
+ | Timer1_active = 0 ' | ||
+ | Disable Timer1 | ||
+ | Stop Timer1 | ||
+ | |||
+ | Onedigit = 0 ' reset all variables | ||
+ | Twodigit = 0 | ||
+ | Timer1_active = 0 | ||
+ | Second = 0 | ||
+ | End If | ||
+ | |||
+ | Return | ||
+ | |||
+ | |||
+ | Segmente: | ||
+ | ' | ||
+ | Data & | ||
+ | Data & | ||
+ | Data & | ||
+ | Data & | ||
+ | Data & | ||
+ | Data & | ||
+ | Data & | ||
+ | Data & | ||
+ | Data & | ||
+ | Data & | ||
+ | |||
+ | Timer0_isr: | ||
+ | | ||
+ | |||
+ | If Portb.1 = 1 Then | ||
+ | Portd = Lookup(onedigit , Segmente) | ||
+ | Portb.1 = 0 | ||
+ | Portb.2 = 1 ' | ||
+ | |||
+ | Else | ||
+ | Portd = Lookup(twodigit , Segmente) | ||
+ | Portb.2 = 0 | ||
+ | Portb.1 = 1 ' | ||
+ | End If | ||
+ | Return | ||
+ | |||
+ | Timer1_isr: | ||
+ | | ||
+ | Incr 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 > 0 Then | ||
+ | Decr Onedigit | ||
+ | |||
+ | | ||
+ | Decr Twodigit | ||
+ | Onedigit = 9 | ||
+ | End If | ||
+ | Return | ||
+ | </ | ||
+ | |||
+ | Hex-File zum direkten flashen {{: |
elektronik/cooktimer.txt · Zuletzt geändert: 2014/03/16 19:44 von patrickbeck