Nu vill jag ju naturligvis leka med de smaskiga funktionerna de lite tuffare PICarna har att erbjuda (tuffare än PIC16F84A, d.v.s. alla

Vad jag är ute efter först och främst är hårdvaru-PWM-funktionen hos PIC16F877A. Jag vill ha den att oscillera IR-LEDs på 38kHz med 50% dutycycle. Ja, det är IR-modulering jag håller på med.
Jag kör med PicBasic. Här finns en färdig funktion, "HPWM", där man lätt kan ställa in duty och frekvens. Men naturligtvis finns en hake; högsta tillåtna frekvens med denna funktion är ca 32767Hz (signerat 16-bitstal?). Och jag vill ju ha 38kHz.
Så då är det bara att öppna databladet för prollen och leta upp PWM-konfigurationen. Har läst igenom den några gånger nu och har fortfarande några frågetecken att räta ut.
Processorn jag använder är som sagt en 877A som tuffar på i 20Mhz.
Jag hittade den här sidan som gör precis det jag vill göra, fast med en 4MHz kristall, så alla registerna är fel inställda för att köras på 20MHz. Hursomhelst vill jag ju ändå lära mig hur det går till att konfigurera PWMen "på riktigt".
Jag kikar i databladet och hittar en flock formler för hur man räknar fram registervärdena. Matte har jag räknat förut. Inga problem:
[besparar er en massa uträkningar och hoppas de är rätt]
PR2 = 131
Resolution = 9bits
Duty = 66
Trevligt. Men vad är det egentligen jag räknar fram? Jag syftar på max resolution. Vad ska man ha det till? Och så var det dutyn: Detta omvandlar jag till ett 10-bitstal: 66 = 0001000010.
Hur ska man nu stoppa in detta i registerna, med tanke på att de är delade?
Saxat från databladet:
The PWM duty cycle is specified by writing to the CCPR1L register and to the CCP1CON<5:4> bits. Up to 10-bit resolution is available. The CCPR1L contains the eight MSbs and the CCP1CON<5:4> contains the two LSbs.
Som jag fattat det ska de två första bitsen (d.v.s. de två bitsen längst till höger) in i CCP1CON bit 5 och 4. Resten i CCPR1L?
Så här tycker jag registerna ska se ut:
Kod: Markera allt
TRISC.2 = 0 'PortC.2 output
CCP1CON = %00001100 'PWM-mode
T2CON = %00000100 'Timer2 ON + 1:1 prescale
CCP1CON = %00100000 '50% duty
CCPR1L = %00010000 '50% duty
PR2 = 131 '38kHz @ 20MHz OSC
Jag bränner in prgrammet i PICen och finner att LEDsen blinkar med modulerat ljus eftersom mina avstämda IR-mottagare mottagarna reagerar på ljuset ibland. Men bara lite. Alltså är det något som inte stämmer helt. Tyvärr strejkar mitt oscilloskop så jag kan inte undersöka vad jag får ut för frekvens/duty


Det finns ju en risk att jag har fattat rätt och att det är hårdvaran som skojar med mig.