And this tells how to pass data.
https://web.archive.org/web/20120307...B_PIC_TEMP.htm
And this tells how to pass data.
https://web.archive.org/web/20120307...B_PIC_TEMP.htm
Dave
Always wear safety glasses while programming.
Thanks Henrik. Is it possible to do with 4mhz oscillator? I'm testing on breadboard, and with 20mhz oscillator it behaves badly.
Short answer is:
Yes.
Question is:
Have you tried yourself with 4MHz? What did you change and why? What did it do, why do you think it didn't work?
Long answer is:
First, PWM period:
* TMR2 "drives" the CCP module.
* TMR2 starts at 0 and counts upwards.
* When the content of TMR2 equals that of PR2, TMR2 starts over from 0 and on it goes. The time it takes for TMR2 to count from 0 to PR2 is the PWM period.
As before, if you want a PWM perdiod of 26.315us you need to set the PR2 register so that TMR2 resets and starts over after 26.315us. At 4MHz the fastest you increment TMR2 (on that devices) is 1MHz, ie it'll "tick" every 1us. So the closest you're going to get is a flat 26us (38.461Hz) and you do this by setting PR2 to 25, right? Because TMR2 will then Count from 0 to 25 (26us) before it starts over and does it again and again and again......
Second, the dutycycle:
This can be a little trickier to understand but basically the dutycycle value as a whole can be though of the value you put into PR2 times 4. That is, when PR2 is 25 as in this case the dutycycle value can go from 0 to 100 (for 0-100% dutycycle). In the previous example with 20MHz Clock and a PR2 value of 130 the dutycycle value, again for 0-100% would go from 0 to 520.
Now, the dutycycle value since it can theoretically be 10bits wide (0-1023) are spread across two registers, CCPR1L contains the 8 high bits and CCP1CON.5 and 4 (from memory) contains the two low bits,
If you want "roughly" 50% dutycycle with a PR2 value of 25 you simply write either 12 or 13 (half of 25) to CCPR1L and that's it. If you want better resolution I'm sure you can figure out what to do with the two least significant bits.
/Henrik.
Hello. A while back I used this routine to generate 38KHZ with a 12F675 running at 4MHZ.
STARTBIT:
High GPIO.4 'GETTING 38KHZ WITH THIS SUBROUTINE
High GPIO.4
Low GPIO.4
Low GPIO.4
LET X = X + 001
IF X < 125 Then STARTBIT '125 = 3MS PULSE, 83 = 2MS pulse, 33 = 1MS pulse
Maybe you can do something with this.
Knocked this up when the remote for my aircon died , never really finished it . got a clone remote on ebay for $10 (delivered)
why bother.
this can work for any osc >= 8 MHz
Code:'**************************************************************** '* Name : ir38khz.BAS * '* Author : RICHARD * '* Notice : * '* : * '* Date : 6/30/2016 * '* Version : 1.0 * '* Notes : REPL BRA WITH GOTO FOR NASTY OLD CHIPS * '* : OSC MUST BE AT LEAST 8 MHZ * '**************************************************************** DEFINE OSC 16 ; MIN=8 TESTED OK 8,16,32 DEFINE IRPORT LATC DEFINE IRPIN 4 define IR_1 2000 ; 1 TIME IN uS MAX 6500 ISH define IR_0 900 ; 0 TIME IN uS cycnt var byte bank0 ;set to numbr of 38k cycles req then call irout RANGE 1-255 dly var byte bank0 ;system goto overasm asm _irout1 ;entry point FOR 1 pulse movlw (IR_1/26) movwf _cycnt BRA _irout ;GOTO _irout0 movlw (IR_0/26) ;entry point FOR 0 pulse movwf _cycnt _irout ;entry point for cycnt cycles nxbt CHK?RP IRPORT BSF IRPORT ,IRPIN CALL dly13 CHK?RP IRPORT BCF IRPORT ,IRPIN CALL dly13 RST?RP DECFSZ _cycnt,F BRA nxbt ;GOTO RETURN dly13 movlw (OSC-(16/OSC)) RST?RP movwf _dly d13 DECFSZ _dly,F BRA d13 ;GOTO RETURN endasm overasm: OSCCON=$78 ANSELA=0 ANSELC=0 TRISA = %111110 TRISC = %11000011 ' set PORTC I/O main: cycnt = 100 call irout pauseus 250 call irout1 pauseus 250 call irout0 pause 50 goto main
Last edited by richard; - 1st July 2016 at 03:35. Reason: comments
Warning I'm not a teacher
Thanks, will have look.
Bookmarks