Hello mbox,
are you sure your PIC has portC interrupts? Which PIC are you using? I guess my question is what is the source of the interrupt? The timer ? I do not see anything to trigger the interrupt.
Hello mbox,
are you sure your PIC has portC interrupts? Which PIC are you using? I guess my question is what is the source of the interrupt? The timer ? I do not see anything to trigger the interrupt.
Last edited by Archangel; - 28th April 2009 at 08:38.
If you do not believe in MAGIC, Consider how currency has value simply by printing it, and is then traded for real assets.
.
Gold is the money of kings, silver is the money of gentlemen, barter is the money of peasants - but debt is the money of slaves
.
There simply is no "Happy Spam" If you do it you will disappear from this forum.
Hi joe,
I'm using Pic16F877A, to be honest I'm trying to learn how to use Interrupt command and got stuck...
regards,
mbox
With a prescaler of 64 at 20MHz, Timer0 will overflow in about 3.2mS. With your loop from 0 to 200, you're going to have to send a LOT of serial data before it can make it through your loop and toggle PORTB.2 off.
Every 3.2mS it jumps to your SERIN interrupt routine. It's going to sit there until it receives a byte of data. So it's going to take a good while before making it through your first loop.
And, you really don't know what the count in Timer0 is when you exit your interrupt routine, so you might want to clear Timer0 before exiting just in case.
You can check to make sure your Timer0 interrupt is happening by commenting out the SERIN line, and toggling another LED in your interrupt routine.
Something like this;
Code:DISABLE INTERUPTROUTINE: 'serin PortB.3, T2400, RX 'Receive menu 'Cnt = Rx TOGGLE PORTB.3 TMR0=0 ;clear Timer0 before exit INTCON.2 = 0 ;clears the interrupt flag. RESUME ;resume the main program ENABLE ;DISABLE and ENABLE must bracket the int routine
Hi Bruce,
Thanks for the reply, I realized that when I used the code PortB.3, T2400, RX PortB.2 starts to blink. Is this mean that Portc.7 can not be used as my rx?
thanks in advance,
mbox
No. I was just pointing out why your original code didn't work as you expected.Is this mean that Portc.7 can not be used as my rx?
It doesn't matter which pin you use for receiving serial data. You just need to understand why your original code isn't working as expected.
Every 3.2mS or so your program jumps to the SERIN interrupt routine. And it just sits there until it receives a byte of data.
This means it will take a very long time before your first loop can finish because it gets interrupted too often for your first loop to complete.
Bruce I adjust the code, but it doesnt blink the led on PortB.1(only high output) When I use the serial communicator and entering 1 (5x) it turns off the led PortB.1. I was expecting that it will trigger PortB.0.
Do I need to change some settings to have my target output?Code:CLEAR include "modedefs.bas" 'include serout defines DEFINE OSC 20 ;using a 4 MHz oscillator here TRISC = %10000000 OPTION_REG=%10000101 ;Page 48 or data sheet ;Bit 7=1 disable pull ups on PORTB ;Bit 5=0 selects timer mode ;Bit 2=1 } ;Bit 1=0 } sets Timer0 pre-scaler to 64 ;Bit 0=1 } INTCON=%10100000 ;Bit 7=1 Enables all unmasked interrupts ;Bit 5=1 Enables Timer0 overflow interrupt ;Bit 2 flag will be set on interrupt and has to be cleared ;in the interrupt routine. It is set clear to start with. RX var byte ' Receive byte X VAR BYTE ;Declare x as a variable i var byte TEMP var BYTE 52 Cnt VAR BYTE 49 symbol led1=PORTB.0 x=20 ALPHA VAR WORD ;this variable counts in the PauseUS loop BETA VAR BYTE ;this variable counts the 61 interrupt ticks TRISB = %11110000 ;sets the 3 output pins in the D port PORTB = %00000000 ;sets all pins low in the D port ON INTERRUPT GOTO INTERUPTROUTINE ;This line needs to be early in the program, before ;the routine is called in any case. MAINLOOP: High PORTB.1 For i = 0 to 10 Pause 1 Next i Low PORTB.1 For i = 0 to 10 Pause 1 Next i '''''''''''''''''''''''''''''''''''''''''''''''' IF Cnt=49 then led1=1-led1 pause 100 cnt=0 endif '''''''''''''''''''''''''''''''''''''''''''''''' GOTO MAINLOOP ;end of loop DISABLE INTERUPTROUTINE: serin PortC.7, T2400, RX 'Receive menu Cnt = Rx 'TOGGLE PORTB.2 'TMR0=0 ;clear Timer0 before exit INTCON.2 = 0 ;clears the interrupt flag. RESUME ;resume the main program ENABLE ;DISABLE and ENABLE must bracket the int routine END
_____________________
mbox
Last edited by mbox; - 28th April 2009 at 23:43.
Try this with Cnt VAR BYTE;
Code:MAINLOOP: High PORTB.1 Pauseus 3000 Low PORTB.1 Pauseus 3000 '''''''''''''''''''''''''''''''''''''''''''''''' PORTB.0 = Cnt.0 ' send a 1 or 0 by serial to toggle portb.0 GOTO MAINLOP
Bookmarks