Ši schemutė buvo sudėta, siekiant greitai pagaminti stačiakampių impulsų generatorių, kai generuojamo dažnio tikslumas nėra labai aktualus. Tokį generatorių konstravau, nes po ranka nebuvo kitų elektronikos komponentų. Schemoje naudojamas 12 MHz kvarcinis rezonatorius (bet galite naudoti ir kitokio dažnio, savaime aišku, kad generavimo dažnio diapazonas bus kitoks), du nefiksuojantys jungikliai skirti didinti ir mažinti generavimo dažnį. Varžos mažo galingumo, patogiausia naudoti planarinius. Patartina paskaityti AT90S2313 mikrovaldiklio aprašymą. Dažnis reguliuojasi spaudinėjant mygtukus. Norint žinot generuojama dažnį, galima naudotis oscilografu, arba dažniamačiu.
Stačiakampių impulsų generavimo skaitines vertes galima pateikti tokiu grafiku:
OCR1 yra vienas iš mikrovaldiklio laikmačio valdymo registrų, nuo kurio reikšmės priklauso generavimo dažnis. Kaip matyti iš grafiko, keičiant OCR1 registro reikšmę, pradžioje dažnis keičiasi dideliu žingsniu. Didesnis tikslumas gaunamas žemesniuose dažniuose (esant mažiau nei 20 kHz). Dabar pasiaiškinkime kaip veikia šis generatorius. Apačioje pateiktas programos kodas, parašytas C kalba su „IAR Embedded Workbench programa“.
#include "io2313.h"
void main()
{
// Nustatome 3 kojelę porto B kaip išėjimą
DDRB=(1<<DDB3);
// prijungiame išėjimą
TCCR1A=(1<<COM1A0);
// Nustatomas dalinimo koeficientas
TCCR1B=(1<<CS10)|(1<<CTC1);
// Generavimo dažnis tik įjungus maitinimą
OCR1=1000;
// Nustatome pertraukčių reagavimo režimus
// pagal krintantį įėjimo signalo frontą
MCUCR=(1<<ISC11)|(1<<ISC01);
// Įjungiamos int1 ir int0 pertrauktys
GIMSK=(1<<INT1)|(1<<INT0);
// Įjungiamos globalios pertrauktys
SREG =128;
// Amžinas ciklas
while(1)
{}
}
// Aprašoma INT0 pertrauktis
#pragma vector = INT0_vect
__interrupt void INTer0()
{
// Mažiname dažnį (Dažnio didinimo mygtukas)
OCR1+=10;
}
// Aprašoma INT1 pertrauktis
#pragma vector = INT1_vect
__interrupt void INTer1()
{
// Didiname dažnį (Dažnio mažinimo mygtukas)
OCR1-=10;
}
Pradžioje reikia nustatyti PORTB (15 kojelė) portą kaip išėjimą, tam į DDRB krypties registro DDB3 skiltį įrašome 1. TCCRA1A registras naudojamas laikmačio/skaitiklio valdymui. Įrašę 1 reikšmę į COM1A0 skiltį, prijungiame mikrovaldiklio laikmačio /skaitiklio išėjimą prie 15 kojelės. Registras TCCR1B taip pat skirtas laikmačio /skaitiklio valdymui. Įrašę į skiltį CTC1 nustatome laikmačio /skaitiklio registro TCNT, nusimetimo į nulį režimą. Į CS10 skiltį įrašytas 1, apibrėžia „preskalerio“ dalinimo koeficientą, lygų pačiam kvarcinio rezonatoriaus dažniui. GIMSK registre nustatome pagal kurį įėjimo signalo frontą turi įvykti pertrauktis. Įėjimo signalai paduodami į 6 ir 7 mikrovaldiklio kojelę. SREG registre įjungiame globalias pertrauktis.
Pats generavimas vykdomas lyginant OCR registro turinį su TCNT ir tuo pačiu metu didinant TCNT registro reikšmę vienetu. 15 kojelėje būna 1 tol, kol OCR ir TCNT reikšmės nesutampa. Kai reikšmės tampa vienodos, mikrovaldiklis TCNT registrą numeta į 0 ir skaičiavimai prasideda iš naujo. Tada 15 kojelėje būna loginis 0. Procesui kartojantis, 15 kojelėje keičiasi tai 0, tai 1. Tai sąlygoja stačiakampių impulsų atsiradimą. Manipuliuojant OCR registro reikšme, galima keisti generavimo dažnį.