Over het maken van een (al dan niet gemoduleerde) 38 kHz blokgolf m.b.v. Arduino is e.e.a te vinden op het web. Ik besloot het zelf maar even van scratch op te zetten in Bascom. Simpel dingetje, zonder te hoeven leunen op Arduino libs waarvan je nooit weet wat die precies doen...
Mijn aanpak: Configureer de 16 bits timer (Timer1) als counter die zonder prescaler klokpulsen telt. De cpu klok is 16 MHz, dus moet die door 421 gedeeld worden om op 38 kHz uit te komen. Ik gebruik voor de deling de compare registers.
OCR1A stel ik in op 421/2=210 (halve periodetijd) en OCR1B op 421 (einde van hele periode). Wanneer de 'count' van de timer/counter gelijk is aan een van beide compare registers komt er een interrupt.
In de eerste interrupt routine (count=210) toggle ik een pin. In de tweede interrupt routine reset ik eerst de counter (TCOUNT=0) en toggle daarna de pin. Het weer op nul zetten van de counter kost natuurlijk een paar klok-cycli, dus dat moet eerst gebeuren.
Vreemd genoeg meet ik op de output pin geen 38 kHz maar een lagere frequentie (~36 kHz).
Een tweede Pro-Mini deed hetzelfde. De klokfrequenties van beide exemplaren zijn 15,99 MHz of daaromtrent
Ik weet dat je moet 'delen' door n-1 (gewenste pulstijd/klokperiode) als je een bepaalde pulsduur wil maken omdat het resetten van de timer/counter ook een klokperiode kost, maar in dit geval kom ik (empirisch bepaald) ergens uit op 354/177 i.p.v 421/210. Kennelijk mis ik ongeveer 65/ klokpulsen....
Dit was al zo toen ik de SW de eerste keer 'kaal' zonder andere functies en interrupts (seriele communicatie bijv.) ging testen.
Heb ik misschien te maken met een chinese kloon AVR of snap ik niet hoe de timer/counters werken. Bij vorige projectjes klopten de sommetjes wel....