You are on page 1of 4

Draagolf configureren voor IR Communicatie

Belangrijk is te weten op welke kloksnelheid je microcontroller werkt. Degene die aan de pc hangt werkt hier op 16MHz, de controller op de robot zelf ook op 16MHz Het creren van een draaggolf maken we gebruik van timers waarbij er 3 belangrijke zaken dienen worden ingesteld Toggle on compare match Clear timer on compare match Prescaler instellen En de waarde tot waar hij moet tellen

Deze zaken zijn per timer afhankelijk, belangrijk dus te controleren in de datasheet welke timer je gebruikt en daarbij dan de nodige instellingen uit te voeren. Het basisprogramma, voor het creren van een draaggolf hebben we van deze link : http://tthheessiiss.wordpress.com/2009/08/05/dirtcheap-wireless/

Draaggolf 38KHz
//dirt cheap wireless TX //generates 38kHz carrier wave on pin 9 and 10 //sends data via TX every 500ms void setup() { pinMode(9, OUTPUT); pinMode(10, OUTPUT); // Clear Timer on Compare Match (CTC) Mode bitWrite(TCCR1A, WGM10, 0); bitWrite(TCCR1A, WGM11, 0); bitWrite(TCCR1B, WGM12, 1); bitWrite(TCCR1B, WGM13, 0); // Toggle OC1A and OC1B on Compare Match. bitWrite(TCCR1A, COM1A0, 1); bitWrite(TCCR1A, COM1A1, 0); bitWrite(TCCR1A, COM1B0, 1); bitWrite(TCCR1A, COM1B1, 0); // No prescaling bitWrite(TCCR1B, CS10, 1); bitWrite(TCCR1B, CS11, 0); bitWrite(TCCR1B, CS12, 0); OCR1A = 210; OCR1B = 210;

Hier wordt gebruik gemaakt van timer 1 en een microcontroller met een clock van 16 MHz Let op timer 1 is een 16 bit timer en timer 0 en 2 zijn 8 bit timers

Instelling dat de timer gecleard wordt wanneer de ingestelde waarde bereikt is

Er zal zowel op toggle op OC1A als OC1B gebeuren bij een match instelwaarde bereikt

Geen gebruik van prescaler

Het TCCR1A en TCCR1B register zijn degene waarin de instellingen zullen gebeuren. De inhoud van deze registers is als volgt.

In de WGMs ( wave generation mode bit) zal de clear timer on compare match worden ingesteld.

Enkel WGm12 moet op 1 , de rest 0


bitWrite(TCCR1A, bitWrite(TCCR1A, bitWrite(TCCR1B, bitWrite(TCCR1B, WGM10, WGM11, WGM12, WGM13, 0); 0); 1); 0);

In com1A0, com1A1, com1B0, com1B1 worden de instellingen gemaakt voor een toggle on compare match.

De COM1A1/COM1B1 op 0 en de COM1A0/COM1B0 op 1. Nu wordt er een toggle op OC1A en OC1B gegenereerd, dus poort 9 en 10. Bij ons is 1 poort voldoende dus wij nemen ofwel toggle op OC1A of OC1B. Ik heb nu gekozen voor toggle op OC1B
bitWrite(TCCR1A, bitWrite(TCCR1A, bitWrite(TCCR1A, bitWrite(TCCR1A, COM1A0, COM1A1, COM1B0, COM1B1, 0); 0); 1); 0);

OCR1B, we willen enkel een toggle op OC1B dus moeten we enkel de instelwaarde in OCR1B instellen. Daarvoor gebruiken we volgende formule.

16MHz/38kHz = 2*prescaler*(1+instelwaarde) 421,05=2*1*(1+instelwaarde) 210= 1+ instelwaarde 209= instelwaarde Na test bleek 210 beter.
OCR1B = 210;

We hebben een prescaler van 1 gekozen. Ook dit moet ingesteld worden.

bitWrite(TCCR1B, CS10, 1); bitWrite(TCCR1B, CS11, 0); bitWrite(TCCR1B, CS12, 0);

opmerking
Het volledige programma is nu verklaard. We zetten echter veel bits op nul . Eigenlijk is dit niet nodig want zoals u bovenstaand kunt terugvinden is de default waarde gelijk aan 0 . Wat ons programma aanzienlijk verkort.
void setup() { pinMode(10, OUTPUT); // Clear Timer on Compare Match (CTC) Mode bitWrite(TCCR1B, WGM12, 1); // Toggle OC1A and OC1B on Compare Match. bitWrite(TCCR1A, COM1B0, 1); // No prescaling bitWrite(TCCR1B, CS10, 1); OCR1B = 210;

Deze code is enkel voor de draaggolf van 38KHz te genereren en de communicatie wordt nog eens apart geprogrammeerd. Merk op dat de instelling van Timer tot Timer wijzigen maar met behulp van de datasheet en dit voorbeeld moet het normaal wel lukken.

You might also like