Yeap..
I always erase pic after programming and MCLR is tied like this:
VCC-10K-1N4148-MCLR-VPP(ICSP)
Thanks!!
Yeap..
I always erase pic after programming and MCLR is tied like this:
VCC-10K-1N4148-MCLR-VPP(ICSP)
Thanks!!
Sylvio,
Does it always work the first time?
Try adding capacitors between VDD and VSS. As close as you can to the PIC on both sides. I had a similar problem once with the PICSTART and an 18F'r. ???
Dave
Always wear safety glasses while programming.
Well, I've tried that too... same thing..
Sometimes it works on the second try... i do not know..
Well, got another problem, could you help again???
I'm trying to make TMR1 interrupt at 36kHz.
It uses a 20Mhz crystal... The code is below:
The oscilloscope do not shows 35.9kHz, but 30~33kHz...Code:@ DEVICE pic16F877, HS_OSC ; System Clock Options @ DEVICE pic16F877, WDT_OFF ; Watchdog Timer @ DEVICE pic16F877, PWRT_ON ; Power-On Timer @ DEVICE pic16F877, BOD_OFF ; Brown-Out Detect @ DEVICE pic16F877, CPD_OFF ; Data Memory Code Protect @ DEVICE pic16F877, PROTECT_OFF define OSC 20 INT VAR PIR1.0 ' OVERFLOW flag START VAR T1CON.0 ' START TMR1 LOAD VAR word '------- Configurações iniciais -------------------- TRISA = %00000000 ' PORTA TRISB = %00000000 ' PORTB TRISC = %00000000 ' PORTC TRISD = %00000000 ' PORTD TRISE = %00000000 ' PORTE INTCON = %11000000 ' enable global interrupt OPTION_REG = %00000000 ADCON1 = %10001111 ' all digital T1CON = %00000000 ' TMR1 1:1 prescaler PIE1 = %00000001 ' Henable TMR1 INT START = 0 INT = 0 LOAD = 65404 ' INT. 36KHz '--------------------------------------------------- ON INTERRUPT GOTO SINUS TMR1L = LOAD.lowbyte TMR1H = LOAD.highbyte START = 1 PORTB.0 = 1 MAIN: GOTO MAIN DISABLE SINUS: INT = 0 TMR1L = LOAD.lowbyte TMR1H = LOAD.highbyte PORTB.0 = 1 ' JUST TO MEASURE THE FREQ. ON OSCILLOSCOPE PORTB.0 = 0 RESUME ENABLE end
Anything I can do?
Thanks again!
Sylvio,
make sure you also disable the LVP mode. This pin have to be loaded to GND when progaming.
And then... when you reload a 16Bit timer you want to add the reload value instead of just dumping the values in. Finally you want to stop it, then add the reload value, the restart the timer.
Depending how accurate you want it, not a bad idea to switch to Darrel's instant INTs (PBP or ASM... where asm is always handy .. )
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
Try this and see what happens, should give you a 50% duty cycle ~36khz square wave on your o'scope:
And take note of Mr_E's note about adding values.Code:@ DEVICE pic16F877, HS_OSC ; System Clock Options @ DEVICE pic16F877, WDT_OFF ; Watchdog Timer @ DEVICE pic16F877, PWRT_ON ; Power-On Timer @ DEVICE pic16F877, BOD_OFF ; Brown-Out Detect @ DEVICE pic16F877, CPD_OFF ; Data Memory Code Protect @ DEVICE pic16F877, PROTECT_OFF DEFINE OSC 20 load con 65468:intcon=$c0:option_reg=0:adcon1=$87:t1con=1:pie1=1:c var byte goto main ON INTERRUPT GOTO SINUS TMR1L=LOAD.lowbyte:TMR1H=LOAD.highbyte MAIN: GOTO MAIN DISABLE SINUS: if pir1.0=1 then pir1.0=0:tmr1l=load.lowbyte:tmr1h=load.highbyte:c=c+1:portb.0=c.0 endif RESUME ENABLE END
Thanks for answering..
I've trie instant interrupts but it stays the same..
I've also tried the code you wrote Skimask... the oscil. shows ~50kHz... The load you typed is too large...
Don't know what is wrong.. The oscilloscope is a Tektronix TDS2014.. it is working ok!
Anything else I can do?
Let me tell you something.. I'm using 22p capacitor at the @20Mhz... is that ok?
Sylvio,
Well then change it!
Or perhaps you wish for me to change the LOAD value myself and re-post the exact same code with that one change so you can cut and paste it over and try it again?
I never said my code would be perfect, but your code had a few faults that needed to be corrected.
Last edited by skimask; - 11th June 2008 at 19:48.
How accurate you want it?
Skimask changed the reload value... hence why you have higher value.
try...
you should have something like 18KHz signal.. so yeah, your interrupt is still 36Khz... i just toggle the pin..Code:@ __CONFIG _HS_OSC & _WDT_OFF & _LVP_OFF & _PWRTE_ON & _BODEN_ON define OSC 20 INT VAR PIR1.0 ' OVERFLOW flag START VAR T1CON.0 ' START TMR1 LOAD VAR word '------- Configurações iniciais -------------------- TRISA = %00000000 ' PORTA TRISB = %00000000 ' PORTB TRISC = %00000000 ' PORTC TRISD = %00000000 ' PORTD TRISE = %00000000 ' PORTE OPTION_REG = %00000000 ADCON1 = %10001111 ' all digital T1CON = %00000000 ' TMR1 1:1 prescaler PIE1 = %00000001 ' Henable TMR1 INT START = 0 INT = 0 LOAD = 65404 ' INT. 36KHz @TIMER1=TMR1L TIMER1 var word EXT '--------------------------------------------------- ON INTERRUPT GOTO SINUS TIMER1=LOAD INTCON = %11000000 ' enable global interrupt START = 1 PORTB.0 = 1 MAIN: GOTO MAIN DISABLE SINUS: @ MOVE?CT 0, T1CON, TMR1ON TIMER1=TIMER1+LOAD @ MOVE?CT 1, T1CON, TMR1ON toggle PORTB.0 INT = 0 RESUME ENABLE end
I tend to stay away of ON INTERRUPT when i need accuracy. ASM is the best while DT INST with PBP is still good enough for many purpose.
Last edited by mister_e; - 11th June 2008 at 19:57.
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
Bookmarks