In dit project gaan we een eenvoudige wekker ontwerpen met ATMEGA32-timers. ATmega32A-microcontroller heeft een 16-bits timer en we zullen die timer gebruiken om de seconden te tellen en een digitale klok te ontwikkelen.
Alle digitale klokken hebben een kristal erin dat het hart van de klok is. Dit kristal is niet alleen aanwezig in de klok, maar is ook aanwezig in alle real-time computersystemen. Dit kristal genereert klokpulsen, die nodig zijn voor timingberekeningen. Hoewel er enkele andere manieren zijn om klokpulsen te krijgen, geven de meeste de voorkeur aan een op kristallen gebaseerde klok voor nauwkeurigheid en hogere frequentie. We gaan een kristal verbinden met ATMEGA32 om een nauwkeurige klok te krijgen.
Componenten vereist
Hardware: ATmega32 microcontroller, 11.0592MHz kristal, 22pF condensator (2 stuks), voeding (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2 LCD), 100uF condensator (aangesloten over voeding), knoppen (vier stuks), 10KΩ weerstand (zes stuks), 100nF capaciteit (vier stuks), drie-pins schakelaars (2 stuks), 2N2222 transistor, zoemer, 200Ω weerstand.
Software: Atmel studio 6.1, progisp of flash magie.
Schakelschema en werkuitleg
Voor nauwkeurige timing hebben we een 11,0592 MHz-kristal voor de klok aangesloten. Om de interne klok van ATMEGA uit te schakelen, moeten we de LOW FUSE BITS wijzigen. Onthoud dat we de hoge fuse-bits niet aanraken, zodat de JTAG-communicatie nog steeds ingeschakeld zou zijn.
Om ATMEGA te vertellen om de interne klok uit te schakelen en extern te werken, moeten we het volgende instellen:
LAAG GEBRUIK BYTE = 0xFF of 0b11111111.
In circuit is PORTB van ATMEGA32 verbonden met datapoort LCD. Hier moet men onthouden om de JTAG-communicatie in PORTC van ATMEGA uit te schakelen door de hoge zekeringsbytes te wijzigen, als men de PORTC als een normale communicatiepoort wil gebruiken. In 16x2 LCD zijn er in totaal 16 pinnen als er een zwart licht is, als er geen achtergrondlicht is, zijn er 14 pinnen. Men kan de achterlichtpinnen van stroom voorzien of laten. Nu in de 14 pennen zijn er 8 datapennen (7-14 of D0-D7), 2 voedingspennen (1 & 2 of VSS en VDD en GND en + 5 V), 3 rd pin voor contrastregeling (VEE-bepaalt hoe dik de tekens moet afgebeeld), en 3 controlepennen (RS & RW & E)
In het circuit kun je zien dat ik maar twee controlepennen heb genomen. Dit geeft de flexibiliteit van een beter begrip, het contrastbit en READ / WRITE worden niet vaak gebruikt, zodat ze kunnen worden kortgesloten naar aarde. Dit plaatst LCD in het hoogste contrast en leesmodus. We hoeven alleen de ENABLE- en RS-pinnen te bedienen om tekens en gegevens dienovereenkomstig te verzenden.
De aansluitingen die zijn gemaakt voor LCD worden hieronder gegeven:
PIN1 of VSS naar aarde
PIN2 of VDD of VCC tot + 5v vermogen
PIN3 of VEE naar aarde (geeft maximaal contrast het beste voor een beginner)
PIN4 of RS (registerselectie) naar PD6 van uC
PIN5 of RW (lezen / schrijven) naar aarde (zet LCD in leesmodus vereenvoudigt de communicatie voor de gebruiker)
PIN6 of E (inschakelen) naar PD5 van uC
PIN7 of D0 tot PB0 van uC
PIN8 of D1 tot PB1 van uC
PIN9 of D2 naar PB2 van uC
PIN10 of D3 naar PB3 van uC
PIN11 of D4 naar PB4 van uC
PIN12 of D5 naar PB5 van uC
PIN13 of D6 naar PB6 van uC
PIN14 of D7 naar PB7 van uC
In het circuit kun je zien dat we 8bit-communicatie (D0-D7) hebben gebruikt, maar dit is niet verplicht, we kunnen 4bit-communicatie gebruiken (D4-D7) maar met 4-bits communicatie wordt het programma een beetje ingewikkeld. Zoals te zien is in de bovenstaande tabel, verbinden we 10 pinnen van het LCD-scherm met de controller, waarbij 8 pinnen datapinnen zijn en 2 pinnen voor controle.
Schakelaar één is om de instelfunctie tussen alarm en tijd in te schakelen. Als de pin laag is, kunnen we de alarmtijd aanpassen door op de knoppen te drukken. Als de hoge knoppen zijn om alleen de TIJD aan te passen. Er zijn hier VIER knoppen aanwezig, de eerste is voor het verhogen van MINUTEN in alarm of tijd. De tweede is voor het verlagen van MINUTEN in alarm of tijd. De derde is voor het verhogen van het UUR in alarm of tijd. VIERDE is voor het verlagen van UREN in alarm of tijd.
De condensatoren die hier aanwezig zijn, dienen om het stuiterende effect van knoppen teniet te doen. Als ze worden verwijderd, telt de controller mogelijk meer dan één keer elke keer dat de knop wordt ingedrukt. De weerstanden die voor pinnen zijn aangesloten, zijn bedoeld om de stroom te beperken, wanneer de knop wordt ingedrukt om de pin naar de grond te trekken.
Telkens wanneer een knop wordt ingedrukt, wordt de bijbehorende pin van de controller naar beneden getrokken en herkent de controller dat een bepaalde knop wordt ingedrukt en wordt de bijbehorende actie ondernomen.
Allereerst is de klok die we hier kiezen 11059200 Hz, delen door 1024 geeft 10800. Dus voor elke seconde krijgen we 10800 pulsen. Dus we gaan een teller starten met een voorschrijver van 1024 om de tellerklok op 10800 Hz te krijgen. Ten tweede gaan we de CTC-modus (Clear Timer Counter) van ATMEGA gebruiken. Er zal een 16-bits register zijn waarin we een waarde kunnen opslaan (vergelijkingswaarde), wanneer de teller telt tot de vergelijkingswaarde die een interrupt moet genereren.
We gaan de vergelijkingswaarde instellen op 10800, dus in feite hebben we voor elke seconde een ISR (Interrupt Service Routine bij elke vergelijking). Dus we gaan deze tijdige routine gebruiken om de klok te krijgen die we nodig hadden.
BRUIN (WGM10-WGM13): Deze bits zijn voor het selecteren van de werkingsmodus voor de timer.
Omdat we de CTC-modus willen met de vergelijkingswaarde in OCR1A-byte, hoeven we WGM12 alleen in te stellen op één, de resterende blijven staan omdat ze standaard nul zijn.
ROOD (CS10, CS11, CS12): Deze drie bits zijn voor het kiezen van de prescalar en dus voor het verkrijgen van de juiste tellerklok.
Aangezien we een 1024 als voorschaling willen, moeten we zowel CS12 als CS10 instellen.
Nu is er een ander register dat we zouden moeten overwegen:
GROEN (OCIE1A): Deze bit moet worden ingesteld om een interrupt te krijgen bij vergelijkingsovereenkomst tussen tellerwaarde en OCR1A-waarde (10800) die we hebben ingesteld.
OCR1A-waarde (tellervergelijkingswaarde), wordt in het bovenstaande register geschreven.
Uitleg over programmeren
De werking van wekker wordt stap voor stap uitgelegd in de onderstaande code:
#include // header om datastroomcontrole over pinnen in te schakelen #define F_CPU 1000000 // vertellen kristalfrequentie van controller bijgevoegd #include