PDA

View Full Version : Serial Pic to Pic using HSER



Chadhammer
- 10th March 2005, 19:33
I have a simple project going to get a toe hold on Pic to Pic serial comm. Trying to keep it simple and going one way com for now.

by pushing button 1 or 2, PIC #1 sends a Binary number (1 or 2) to = "Hello" or "Goodbye" on the PIC #2.

PIC #1's LCD indicates that the messages have been sent to PIC #2.

I believe I have PIC #1 working but PIC #2 is not.

Further, With PIC# 2 running, the LCD on PIC #1 will display then scramble itself up.

<div style="margin:20px; margin-top:5px">
<div class="smallfont" style="margin-bottom:2px">PIC #1 Code:</div>
<pre class="alt2" style="margin:0px; padding:6px; border:1px inset; width:640px; height:300px; overflow:auto"><div dir="ltr" style="text-align:left;">
'_______________Setup PIC 16F870___________________

ADCON0.0=0 'disable analog comparator
TRISA = %00000011 'Setup Port A
define LCD_DREG PORTB ' Set data pin of LCD to
define LCD_DBIT 0 ' PORTB.0-PORTB.3
define LCD_RSREG PORTB ' Set RS bit of LCD to
define LCD_RSBIT 4 ' PORTB.4
define LCD_EREG PORTB ' Set E bit of LCD to
define LCD_EBIT 5 ' PORTB.5
DEFINE HSER_RCSTA 90h

ADCON1=6 'disable analog comparator
SW1 VAR PORTA.0
SW2 VAR PORTA.1
Chkswitch VAR BYTE
'------------Main-----------------------------------
Readpins:
Chkswitch=PORTA & $03
Select case Chkswitch
case 1
Goto Mess1
case 2
goto Mess2
end select
goto readpins
'------------Subroutines----------------------------
Mess1:
Pause 500
Lcdout $fe, 1, "Hello" ' Clear LCD screen
Pause 500
LCDOUT $fe, $c0, "message sent"
Hserout [%00000001]
return
Mess2:
Pause 500
Lcdout $fe, 1, "Goodbye" ' Clear LCD screen
Pause 500
Lcdout $fe, $c0, "message sent"
Hserout [%00000010]
return
End
</div></pre>
</div></div>

I am using 1 pair of Cat 5 cable (10 feet) with no connectors

<div style="margin:20px; margin-top:5px">
<div class="smallfont" style="margin-bottom:2px">PIC #2 Code:</div>
<pre class="alt2" style="margin:0px; padding:6px; border:1px inset; width:640px; height:300px; overflow:auto"><div dir="ltr" style="text-align:left;">
'_______________PIC Setup__________________________

intcon = %11000000 ' enable global and Peripheral interrupt
ADCON1=6 'disable analog comparator
TRISA = %11111111 'Set Port A to inputs
pie1.5 = 1 ' enable interrupt on usart receive
pir1.5 = 0 ' clearing interrupt flags
define LCD_DREG PORTB ' Set data pin of LCD to
define LCD_DBIT 0 ' PORTB.0-PORTB.3
define LCD_RSREG PORTB ' Set RS bit of LCD to
define LCD_RSBIT 4 ' PORTB.4
define LCD_EREG PORTB ' Set E bit of LCD to
define LCD_EBIT 5 ' PORTB.5
Mess VAR PORTA
'____________________Main_________________________ ___
Start:
PicRecieve:
If PIR1.5 = 1 then Pic_serin
Goto PicRecieve
Pic_serin:
Hserin [Mess]
Goto PicRecieve
IncomingM:
Select case Mess
case %00000001
Goto Mess1
case %00000010
goto Mess2
end select
goto incomingM
'___________________Subroutines___________________ ____
Mess1:
Pause 500
LCDOUT $fe, 1, "Hello"
return
Mess2:
Pause 500
LCDOUT $fe, 1, "Goodbye"
return
end

</div></pre>
</div></div>

Pretty new to PICs and programming. I appreciate greatly what I am learning from here.

Thanks for all the help and any you can give.
ChadMan

NavMicroSystems
- 10th March 2005, 22:19
Have you searched the Forum?

this has been discussed many, many... times.

Chadhammer
- 11th March 2005, 01:38
In answer to your question: Yes I read every post I could find for about 3 days now.

I found the problem was in the interupt I believe and some variable handling.

My LCDs on both PICs seem to scramble after a little while. They come up mostly blacked out Characters with some garbage characters showing up randomly. I put .1 caps across the power in at the LCD and it seemed to slow it down some. Any ideas?

Darrel Taylor
- 11th March 2005, 03:02
Hi ChadMan,

More than likely, the problem is related to the "Context Saving" in your interrupt routine.

Most often it's caused by saving the registers "Again".

If the PIC has more than 2K of program space then PBP automatically inserts the Context Save routine, then it's up to you to restore them at the end of the interrupt.

So, if you're saving them again with something like this.
myint
movwf wsave
swapf STATUS, W
clrf STATUS
movwf ssave
movf PCLATH, W
movwf psaveThen you are overwriting the values that have already been saved. And, when they get restored, PBP get's very confused.

If that's the case, simply remove that section, and it should work much better.

HTH,
&nbsp;&nbsp;&nbsp;Darrel

Chadhammer
- 11th March 2005, 19:18
If that's the case, simply remove that section, and it should work much better.

HTH,
&nbsp;&nbsp;&nbsp;Darrel

Looking thru the ASM generated by PBP, I could not find anything related to the PCLATH. Here is what I have working with the Help of MELabs of course (Thanks Mr. Leo!):



Adcon1 = 6 'disable analog comparator
TRISA = %11111111 'Set Port A to inputs

pir1.5 = 0 ' clearing interrupt flags
Mess Var Byte
'____________________Main_____________________

Start:

PicRecieve:
If PIR1.5 = 1 then Pic_serin
Goto PicRecieve

Pic_serin:
Hserin [Mess]

IncomingM:
If Mess= %00000001 Then mess1
If mess= %00000010 Then mess2


I am using MPasm to assemble the PBP code. The only thing I see related to the inerupt in the ASM is here:
<div class="smallfont" style="margin-bottom:2px">Code=</div>
<pre class="alt2" style="margin:0px; padding:6px; border:1px inset; width:600px; height:225px; overflow:auto">PicBasic Pro Compiler 2.45a, (c) 1998, 2004 microEngineering Labs, Inc. All Rights Reserved.
_USED EQU 1

INCLUDE "C:\PBP\16F870.INC"


; Define statements.
#define CODE_SIZE 2
#define LCD_DREG PORTB
#define LCD_DBIT 0
#define LCD_RSREG PORTB
#define LCD_RSBIT 4
#define LCD_EREG PORTB
#define LCD_EBIT 5

RAM_START EQU 00020h
RAM_END EQU 000BFh
RAM_BANKS EQU 00002h
BANK0_START EQU 00020h
BANK0_END EQU 0007Fh
BANK1_START EQU 000A0h
BANK1_END EQU 000BFh
EEPROM_START EQU 02100h
EEPROM_END EQU 0213Fh

R0 EQU RAM_START + 000h
R1 EQU RAM_START + 002h
R2 EQU RAM_START + 004h
R3 EQU RAM_START + 006h
R4 EQU RAM_START + 008h
R5 EQU RAM_START + 00Ah
R6 EQU RAM_START + 00Ch
R7 EQU RAM_START + 00Eh
R8 EQU RAM_START + 010h
FLAGS EQU RAM_START + 012h
GOP EQU RAM_START + 013h
RM1 EQU RAM_START + 014h
RM2 EQU RAM_START + 015h
RR1 EQU RAM_START + 016h
RR2 EQU RAM_START + 017h
_Mess EQU RAM_START + 018h
_PORTL EQU PORTB
_PORTH EQU PORTC
_TRISL EQU TRISB
_TRISH EQU TRISC
#define _PIR1_5 PIR1, 005h
INCLUDE "R2_PIC.MAC"
INCLUDE "C:\PBP\PBPPIC14.LIB"

MOVE?CB 006h, ADCON1
MOVE?CB 0FFh, TRISA
MOVE?CT 000h, _PIR1_5

LABEL?L _Start

LABEL?L _PicRecieve
CMPEQ?TCL _PIR1_5, 001h, _Pic_serin
GOTO?L _PicRecieve

LABEL?L _Pic_serin
HSERIN?B _Mess

LABEL?L _IncomingM
CMPEQ?BCL _Mess, 001h, _mess1
CMPEQ?BCL _Mess, 002h, _mess2

LABEL?L _mess1
PAUSE?C 001F4h
LCDOUT?C 0FEh
LCDOUT?C 001h
LCDOUT?C 048h
LCDOUT?C 065h
LCDOUT?C 06Ch
LCDOUT?C 06Ch
LCDOUT?C 06Fh
PAUSE?C 005DCh
LCDOUT?C 0FEh
LCDOUT?C 001h
RETURN?

LABEL?L _mess2
PAUSE?C 001F4h
LCDOUT?C 0FEh
LCDOUT?C 001h
LCDOUT?C 047h
LCDOUT?C 06Fh
LCDOUT?C 06Fh
LCDOUT?C 064h
LCDOUT?C 062h
LCDOUT?C 079h
LCDOUT?C 065h
PAUSE?C 005DCh
LCDOUT?C 0FEh
LCDOUT?C 001h
RETURN?
END?

END</div></pre>

How long a cable do you think I can get away with? I am trying to evolving this into a paging system (functional learning project) and was thinking of using 100' of Telephone wire. Too far? Or would it be better to use a twisted pair like the Cat5 wire?

Thanks Darrel
ChadMan

Darrel Taylor
- 11th March 2005, 23:14
Hmmm,

Your first message stated that you had a problem with the Interrupt routine.

Now I can see that you didn't have any interrupt routines, even though you had enabled Interrupts. So what I said previously, doesn't apply.

As for the Maximum RS232 distance. The spec says 50ft max. But it really depends on the baud rate. I've run it up to 200' with 2400 baud.

If you put an RS485 convertor on both ends, you can go up to 4000'

Darrel