PDA

View Full Version : How do RCIF works?



koossa
- 8th January 2006, 16:42
This is strange, I'm using Microcode studio plus ICD.
And while the code is running I use the "ICD Serial In" to send a character to the PIC, but my RCIF=0 so it never goes into my label?

Here is the part of my code?

<hr>
DEFINE LOADER_USED 1 ' bootloader
DEFINE HSER_RCSTA 90h ' enable serial port,
define HSER_TXSTA 24h ' enable transmit,
DEFINE HSER_BAUD 9600 ' set baudrate to 9600
DEFINE HSER_CLOERR 1 ' automatic clear overrun error
RCIF VAR PIR1.5 ' Receive interrupt flag (1=full , 0=empty)
TXIF VAR PIR1.4 ' Transmit interrupt flag (1=empty, 0=full)


if RCIF then ' incomming data?
gosub MonitorSerialDataReceived
endif
<hr>

mister_e
- 8th January 2006, 17:11
mmm, could be many things, can you post your whole code?

One pointer, if you don't use any HSERIN/HSEROUT in your code, the compiler will never consider your SPBRG, TXSTA, RCSTA define. In this case you should write directly to them. Same thing with The TRISx. HSERIN/HSEROUT will do the job for you, but if you don't use them... maybe you'll receive character but... maybe you'll never saw them at the output... maybe.

Another Thing...


DEFINE HSER_CLOERR 1 ' automatic clear overrun error

should be


DEFINE HSER_CLROERR 1 ' automatic clear overrun error

The define's spelling is verrrrrrrrrrrrrrrryyy important. In uppercase tooo.

Maybe the following may help you.
http://www.picbasic.co.uk/forum/showpost.php?p=13042&postcount=2
http://www.picbasic.co.uk/forum/showpost.php?p=8601&postcount=11

koossa
- 8th January 2006, 17:49
Hi Steve

Thank you verymuch for your feedback, here is my code?

<pre>
DEFINE OSC 4
DEFINE LOADER_USED 1 ' bootloader
DEFINE HSER_RCSTA 90h ' enable serial port,
' enable continuous receive
define HSER_TXSTA 24h ' enable transmit,
' BRGH=1
define HSER_SPBRG 103 ' set baudrate to 2400
DEFINE HSER_CLOERR 1 ' automatic clear overrun error

RCIF VAR PIR1.5 ' Receive interrupt flag (1=full , 0=empty)
TXIF VAR PIR1.4 ' Transmit interrupt flag (1=empty, 0=full)

SerialData var byte
SWITCHPIN VAR PORTD.1
BUZZER Var PORTC.2

Main:
TRISC = %10000000 ' PORTC.7 is the RX input, PORTC.6 is the TX output
pause 10 'safe start-up delay
high SWITCHPIN
high buzzer
pause 1000
low buzzer

if RCIF then ' incomming data?
hserin [Serialdata] ' take it
hserout ["x=",serialdata] ' send it
endif
goto main
End
</pre>

mister_e
- 8th January 2006, 18:10
mmm, so is it working or not?

Assuming it's not working. Can you just forget the ICD idea and use compile-program button (NOT ICD). Then use the SerialCommunicator of MCS (F4)?

About now?

If not, what about if you change your main label just before the IF RCIF... line?

----------------------------------------------------------------------------------------
Your CLROERR is still wrong, you wrote


DEFINE HSER_CLOERR 1 ' automatic clear overrun error


must be


DEFINE HSER_CLROERR 1 ' automatic clear overrun error


AND OOPS i just saw it's my mistake too on the link i gave.. mmm. BTW it was tested at that time... so i bet on the ICD thing. Keep us inform.

PS are you using the MAX232 circuit provide in the MCS help?

koossa
- 8th January 2006, 18:12
Yes, it looks like it is the ICD.
If I program it, it is working, so that make it a bit difficult if I want to debug a large project which are using HSERIN?

THX

mister_e
- 8th January 2006, 18:18
yeeehaaa! O.K so you can probably put some DISABLE DEBUG and ENABLE DEBUG in few place in your program OR use another structure in.

I mean, send some question or ideas with HSEROUT, then sit for an answer.

Just a thought... i'm not a big fan and user of any ICD. In fact, i can't remind when i used it for the last time... Sorry!

I'm sure somebody else will come up here with a better solution than mine anyways.

Good luck!

koossa
- 8th January 2006, 18:20
Thx Steve!!

mister_e
- 8th January 2006, 18:34
Another thought. You can even use the serial communicator (no ICD) and use an USART interrupt routine that will do something you ask.

Let's make things more clear by using an example.

Let's say i want to change a,b,c parameter while the program is running. With serial communicator i'll send a specific start character, then the parameter i want to change. let's say UUCHANGEA#120

in the interrupt routine i'll write something like


HSERIN [WAIT("CHANGE"),VarToBeChange,ValueToBeChange)
Select case VarToBeChange
CASE "A" : a=ValueToBeChange
CASE "B" : b=ValueToBeChange
CASE "C" : c=ValueToBeChange
END SELECT

By sending UUCHANGEA#120 , the a Variable is suppose to be equal to 120. Read the Serial Communicator help on that (under Transmit windows>> Parse control character) Really handy sometimes.

But be aware of the latency of your whole program... maybe a bigger amount of UU "Header" will be usefull. OR simply send something then wait fow the PIC question... as you wish.

HTH

Ioannis
- 9th January 2006, 08:45
Hi Steve.

The # sign in the sending message isn't it read by the ValueToBeChange variable?

Ioannis


Let's say i want to change a,b,c parameter while the program is running. With serial communicator i'll send a specific start character, then the parameter i want to change. let's say UUCHANGEA#120

in the interrupt routine i'll write something like


HSERIN [WAIT("CHANGE"),VarToBeChange,ValueToBeChange)
Select case VarToBeChange
CASE "A" : a=ValueToBeChange
CASE "B" : b=ValueToBeChange
CASE "C" : c=ValueToBeChange
END SELECT

mister_e
- 9th January 2006, 14:56
NOPE, it's a MCS feature. Look in the help file. The parse control character must be enable in the MCS serial communicator.