In diesem Projekt werden wir einen einfachen Wecker mit ATMEGA32-Timern entwerfen. Der ATmega32A-Mikrocontroller verfügt über einen 16-Bit-Timer. Mit diesem Timer werden die Sekunden gezählt und eine Digitaluhr entwickelt.
In allen Digitaluhren befindet sich ein Kristall, der das Herzstück der Uhr darstellt. Dieser Kristall ist nicht nur in der Uhr vorhanden, sondern in allen Echtzeit-Computersystemen. Dieser Kristall erzeugt Taktimpulse, die für Zeitberechnungen benötigt werden. Es gibt zwar einige andere Möglichkeiten, um Taktimpulse zu erhalten, aber für Genauigkeit und höhere Frequenz bevorzugen die meisten einen kristallbasierten Takt. Wir werden einen Kristall an ATMEGA32 anschließen, um eine genaue Uhr zu erhalten.
Erforderliche Komponenten
Hardware: ATmega32-Mikrocontroller, 11,0592 MHz-Quarz, 22 pF-Kondensator (2 Stück), Netzteil (5 V), AVR-ISP-PROGRAMMER, JHD_162ALCD (16 x 2 LCD), 100 uF-Kondensator (über das Netzteil angeschlossen), Tasten (vier Stück), 10 kΩ-Widerstand (sechs Teile), 100 nF Kapazität (vier Teile), dreipolige Schalter (zwei Teile), 2N2222 Transistor, Summer, 200 Ω Widerstand.
Software: Atmel Studio 6.1, Progisp oder Flash Magic.
Schaltplan und Arbeitserklärung
Für ein genaues Timing haben wir einen 11,0592-MHz-Quarz für die Uhr angeschlossen. Um nun die interne Uhr von ATMEGA zu deaktivieren, müssen wir die LOW FUSE BITS ändern. Denken Sie daran, dass wir die hohen Sicherungsbits nicht berühren, damit die JTAG-Kommunikation weiterhin aktiviert ist.
Um ATMEGA anzuweisen, die interne Uhr zu deaktivieren und an der externen zu arbeiten, müssen wir Folgendes einstellen:
LOW USE BYTE = 0xFF oder 0b11111111.
In der Schaltung ist PORTB von ATMEGA32 mit dem Datenport-LCD verbunden. Hier sollte man daran denken, die JTAG-Kommunikation in PORTC von ATMEGA durch Ändern der hohen Sicherungsbytes zu deaktivieren, wenn man das PORTC als normalen Kommunikationsport verwenden möchte. Im 16x2-LCD gibt es insgesamt 16 Pins, wenn Schwarzlicht vorhanden ist. Wenn kein Hintergrundlicht vorhanden ist, sind 14 Pins vorhanden. Man kann die Gegenlichtstifte mit Strom versorgen oder belassen. Nun in den 14 Stiften sind 8 Datenstifte (7-14 oder D0-D7), 2 Stromversorgungsstifte (1, 2 oder VSS & VDD oder GND & + 5 V), 3 rd Stift für die Kontraststeuerung (VEE-Kontrollen, wie dick sollten die Zeichen gezeigt) und 3 Steuerstifte (RS & RW & E)
In der Schaltung können Sie beobachten, dass ich nur zwei Steuerstifte genommen habe. Dies gibt die Flexibilität eines besseren Verständnisses, das Kontrastbit und READ / WRITE werden nicht oft verwendet, so dass sie gegen Masse kurzgeschlossen werden können. Dies versetzt das LCD in den höchsten Kontrast- und Lesemodus. Wir müssen nur die ENABLE- und RS-Pins steuern, um Zeichen und Daten entsprechend zu senden.
Die Verbindungen, die für LCD hergestellt werden, sind unten angegeben:
PIN1 oder VSS gegen Masse
PIN2 oder VDD oder VCC auf +5V
PIN3 oder VEE gegen Masse (bietet maximalen Kontrast am besten für Anfänger)
PIN4 oder RS (Registerauswahl) an PD6 von uC
PIN5 oder RW (Lesen / Schreiben) nach Masse (versetzt das LCD in den Lesemodus, erleichtert die Kommunikation für den Benutzer)
PIN6 oder E (Aktivieren) zu PD5 von uC
PIN7 oder D0 bis PB0 von uC
PIN8 oder D1 bis PB1 von uC
PIN9 oder D2 bis PB2 von uC
PIN10 oder D3 bis PB3 von uC
PIN11 oder D4 bis PB4 von uC
PIN12 oder D5 bis PB5 von uC
PIN13 oder D6 bis PB6 von uC
PIN14 oder D7 bis PB7 von uC
In der Schaltung können Sie sehen, dass wir 8-Bit-Kommunikation (D0-D7) verwendet haben, dies ist jedoch nicht obligatorisch, wir können 4-Bit-Kommunikation (D4-D7) verwenden, aber mit 4-Bit-Kommunikationsprogramm wird ein Bit komplex. Wie in der obigen Tabelle gezeigt, verbinden wir 10 Pins des LCD mit dem Controller, wobei 8 Pins Datenpins und 2 Pins zur Steuerung sind.
Schalter eins dient zum Aktivieren der Einstellfunktion zwischen Alarm und Zeit. Wenn der Pin niedrig ist, können wir die Alarmzeit durch Drücken der Tasten einstellen. Wenn die hohen Tasten nur zum Einstellen der ZEIT dienen. Hier sind VIER Tasten vorhanden. Die erste dient zum Erhöhen der Minuten in Alarm oder Zeit. Zweitens ist für die Dekrementierung von Minuten in Alarm oder Zeit. Drittens ist für die Erhöhung der Stunde in Alarm oder Zeit. VIERTE ist für die Verringerung von Stunden in Alarm oder Zeit.
Die hier vorhandenen Kondensatoren dienen dazu, den Bouncing-Effekt von Tasten aufzuheben. Wenn sie entfernt werden, zählt der Controller bei jedem Drücken der Taste möglicherweise mehr als eine. Die für Stifte angeschlossenen Widerstände dienen zur Begrenzung des Stroms, wenn die Taste gedrückt wird, um den Stift auf Masse zu ziehen.
Immer wenn eine Taste gedrückt wird, wird der entsprechende Pin des Controllers auf Masse gezogen und somit erkennt der Controller, dass eine bestimmte Taste gedrückt wurde und entsprechende Maßnahmen ergriffen werden.
Zuallererst ist der Takt, den wir hier wählen, 11059200 Hz, dividiert durch 1024 ergibt 10800. Für jede Sekunde erhalten wir also 10800 Impulse. Wir werden also einen Zähler mit 1024 Prescaler starten, um den Zählertakt als 10800 Hz zu erhalten. Zweitens werden wir den CTC-Modus (Clear Timer Counter) von ATMEGA verwenden. Es wird ein 16-Bit-Register geben, in dem wir einen Wert (Vergleichswert) speichern können, wenn der Zähler bis zu dem Vergleichswert zählt, den ein Interrupt erzeugen soll.
Wir werden den Vergleichswert auf 10800 setzen, also haben wir im Grunde genommen für jede Sekunde eine ISR (Interrupt Service Routine bei jedem Vergleich). Also werden wir diese rechtzeitige Routine nutzen, um die Uhr zu bekommen, die wir brauchten.
BRAUN (WGM10-WGM13): Diese Bits dienen zur Auswahl des Betriebsmodus für den Timer.
Da wir nun den CTC-Modus mit dem Vergleichswert im OCR1A-Byte verwenden möchten, müssen wir nur WGM12 auf Eins setzen. Die verbleibenden Werte bleiben standardmäßig Null.
ROT (CS10, CS11, CS12): Diese drei Bits dienen zur Auswahl des Prescalars und damit zur Erzielung eines geeigneten Zählertakts.
Da wir einen 1024 als Vorskalierung wollen, müssen wir sowohl CS12 als auch CS10 einstellen.
Jetzt gibt es ein anderes Register, das wir berücksichtigen sollten:
GRÜN (OCIE1A): Dieses Bit muss gesetzt sein, um beim Vergleichen der Übereinstimmung zwischen dem Zählerwert und dem von uns gesetzten OCR1A-Wert (10800) einen Interrupt zu erhalten.
Der OCR1A-Wert (Zählervergleichswert) wird in das obige Register geschrieben.
Programmiererklärung
Die Funktionsweise des Weckers wird im folgenden Code Schritt für Schritt erklärt:
#include // Header zum Aktivieren der Datenflusssteuerung über Pins #define F_CPU 1000000 // Angabe der angehängten Controller-Kristallfrequenz #include