PDA

View Full Version : Serout2/serin2 Pbp Problem



SOMRU
- 7th December 2006, 19:59
GREETINGS ALL!!
AS USUAL I'M IN SEARCH OF THE OBVIOUS.
I'M USING 2 PIC16F870'S AND PBP.
IT CAN NOT BE THIS DIFFICULT TO TRANSFER A FOUR DIGIT NO. ie 1234
FROM ONE PIC TO ANOTHER WITH ALL THE MAGIC PBP HAS.
I SEEM TO BE MISSING THE INCANTATION, AND AM ASKING IF SOMEONE
COULD RECITE IT FOR ME. FOLLOWING IS THE CODE.

'PIC7 SENDING

DEFINE OSC 20 'DEFINE OSCILLATOR
DEFINE SER2_BITS 8

AMP VAR WORD 'DEFINE VARIABLES
AMPS VAR WORD
ARX VAR BYTE[4]
TDIR VAR BYTE
CDIR VAR BYTE
SDIR VAR BYTE
STR1 VAR BYTE
TIME VAR WORD
TIMES VAR WORD
ATEST VAR WORD
TTEST VAR WORD
TRX VAR BYTE[4]
C VAR BYTE

'EQUATES SECTION
TRISA = %00110001 'SET PORTS I/O
TRISB = %10011101
TRISC = %00001111
ADCON0 = %00000000
ADCON1 = %00000011 'PORTA ALL DIGITAL
TIME = 1234 'SET FOR TEST
AMP=5678

'MISC CODE xxxx OMITTED FOR BREVITY

GOSUB SND6


SND6: 'SEND DIGITS TO PIC6
HIGH PORTB.2
PAUSEUS 40
Serout2 PORTB.5 \PORTB.6,84,[TIME,AMP]
LOW PORTB.2
RETURN

'PIC6 RECIEVE

DEFINE OSC 20 'DEFINE OSCILLATOR
DEFINE SER2_BITS 8

AS VAR WORD 'DEFINE VARIABLES
A VAR WORD
B VAR BYTE
C VAR BYTE
F VAR BYTE
T VAR WORD
TRC VAR BYTE[4]
ARC VAR BYTE[4]

'EQUATES SECTION
TRISA = %00111110 'SET PORTS I/O
TRISB = %00000000
TRISC = %00000000
ADCON0 = %00000000
ADCON1 = %00000011 'PORTA ALL DIGITAL

EEPROM 0,[129,243,73,97,51,37,5,241,1,49] 'STORE CONSTANTS

LOOP: 'GET T & A FROM PIC 7
IF PORTA.4 = 1 THEN
SERIN2 PORTA.0 \PORTA.1,813,[T,A]
AS = A * 10
ENDIF

LOOP1: 'DISPLAY T & A
FOR C = 0 TO 3
READ T DIG C, PORTB SET SEGMENT
LOOKUP C,[$7F,$BF,$DF,$EF],PORTC 'SET DIGIT
PAUSE f
PORTC = $FF
NEXT C
FOR B = 0 TO 3
READ AS DIG B, PORTB
LOOKUP B,[$FE,$FD,$FB,$F7],PORTC
PAUSE f
PORTC = $FF
NEXT B
GOTO LOOP


THANKS ALL!

Archangel
- 7th December 2006, 22:20
GREETINGS ALL!!
AS USUAL I'M IN SEARCH OF THE OBVIOUS.
I'M USING 2 PIC16F870'S AND PBP.
IT CAN NOT BE THIS DIFFICULT TO TRANSFER A FOUR DIGIT NO. ie 1234
FROM ONE PIC TO ANOTHER WITH ALL THE MAGIC PBP HAS.
I SEEM TO BE MISSING THE INCANTATION, AND AM ASKING IF SOMEONE
COULD RECITE IT FOR ME. FOLLOWING IS THE CODE.

'PIC7 SENDING

DEFINE OSC 20 'DEFINE OSCILLATOR
DEFINE SER2_BITS 8

AMP VAR WORD 'DEFINE VARIABLES
AMPS VAR WORD
ARX VAR BYTE[4]
TDIR VAR BYTE
CDIR VAR BYTE
SDIR VAR BYTE
STR1 VAR BYTE
TIME VAR WORD
TIMES VAR WORD
ATEST VAR WORD
TTEST VAR WORD
TRX VAR BYTE[4]
C VAR BYTE

'EQUATES SECTION
TRISA = %00110001 'SET PORTS I/O
TRISB = %10011101
TRISC = %00001111
ADCON0 = %00000000
ADCON1 = %00000011 'PORTA ALL DIGITAL
TIME = 1234 'SET FOR TEST
AMP=5678

'MISC CODE xxxx OMITTED FOR BREVITY

GOSUB SND6


SND6: 'SEND DIGITS TO PIC6
HIGH PORTB.2
PAUSEUS 40
Serout2 PORTB.5 \PORTB.6,<font color=red>84</font color>,[TIME,AMP]
LOW PORTB.2
RETURN

'PIC6 RECIEVE

DEFINE OSC 20 'DEFINE OSCILLATOR
DEFINE SER2_BITS 8

AS VAR WORD 'DEFINE VARIABLES
A VAR WORD
B VAR BYTE
C VAR BYTE
F VAR BYTE
T VAR WORD
TRC VAR BYTE[4]
ARC VAR BYTE[4]

'EQUATES SECTION
TRISA = %00111110 'SET PORTS I/O
TRISB = %00000000
TRISC = %00000000
ADCON0 = %00000000
ADCON1 = %00000011 'PORTA ALL DIGITAL

EEPROM 0,[129,243,73,97,51,37,5,241,1,49] 'STORE CONSTANTS

LOOP: 'GET T & A FROM PIC 7
IF PORTA.4 = 1 THEN
SERIN2 PORTA.0 \PORTA.1,<font color=red>813</font color>,[T,A]
AS = A * 10
ENDIF

LOOP1: 'DISPLAY T & A
FOR C = 0 TO 3
READ T DIG C, PORTB SET SEGMENT
LOOKUP C,[$7F,$BF,$DF,$EF],PORTC 'SET DIGIT
PAUSE f
PORTC = $FF
NEXT C
FOR B = 0 TO 3
READ AS DIG B, PORTB
LOOKUP B,[$FE,$FD,$FB,$F7],PORTC
PAUSE f
PORTC = $FF
NEXT B
GOTO LOOP


THANKS ALL!
Hi, now calm down and please stop shouting :)
look at the red highlights, I cannot find 84 as valid for serout2 - serin2 yes. if you are trying to send at 9600 baud then why receive at 1200 baud?

skimask
- 8th December 2006, 13:22
GREETINGS ALL!!

GOSUB SND6


SND6: 'SEND DIGITS TO PIC6
HIGH PORTB.2
PAUSEUS 40
Serout2 PORTB.5 \PORTB.6,84,[TIME,AMP]
LOW PORTB.2
RETURN

THANKS ALL!


In the above chunk, you Gosub SND6, the subroutine returns from it, and then you enter SND6, AND it RETURNS...to...nothing. Unless you've got some other code in there somewhere that you took out for brevity, it looks like you've got one of those deals where you're returning without GoSub'ing. That tends to send the PIC into la'la land. Check it out...
JDG

SOMRU
- 11th December 2006, 19:55
GREETINGS AGAIN,
HERE IS THE ENTIRE CODE FOR PIC7

DEFINE OSC 20 'DEFINE OSCILLATOR
DEFINE SER2_BITS 8

AMP VAR WORD 'DEFINE VARIABLES
AMPS VAR WORD
ARX VAR BYTE[4]
TDIR VAR BYTE
CDIR VAR BYTE
SDIR VAR BYTE
STR1 VAR BYTE
TIME VAR WORD
TIMES VAR WORD
ATEST VAR WORD
TTEST VAR WORD
TRX VAR BYTE[4]
C VAR BYTE

'EQUATES SECTION
TRISA = %00110001 'SET PORTS I/O
TRISB = %10011101
TRISC = %00001111
ADCON0 = %00000000
ADCON1 = %00000011 'PORTA ALL DIGITAL

AMP = 50 'INITIATE VARIABLES
AMPS = 50
CDIR = 0
STR1 = 0
TDIR = 0
TIME = 1000
TIMES = 1000

'IT ALL STARTS HERE

PAUSE 200 'RESTORE PREVIOUS VALUES
READ 0,TIMES
READ 1,AMPS
READ 2,TIME
READ 3,AMP
PAUSE 100
GOSUB SND6 'SEND TO PIC6
LOP1: 'MAIN LOOP
'IF PORTA.4 = 1 AND PORTA.5 = 0 THEN SND5 'SEND T&C TO PIC5
IF PORTC.1 = 1 AND PORTC.2 = 0 THEN TADJ 'TIME ADJUST
IF STR1 = 1 AND PORTC.1 = 0 THEN TADW 'SAVE TIME WHEN DONE
IF PORTC.2 = 1 AND PORTC.1 = 0 THEN CADJ 'AMPS ADJUSTMENT
IF STR1 = 2 AND PORTC.2 =0 THEN CADW 'SAVE AMPS WHEN DONE
GOTO LOP1



TADJ: TDIR = 1 'ADJUST TIME SETTING
IF PORTB.3 = 0 AND PORTB.4 = 0 THEN TDIR = 2 'ZERO NOTCH
IF TDIR = 2 THEN
IF PORTB.3 = 1 AND PORTB.4 = 0 AND PORTC.3 = 0 THEN TDIR = 3
IF PORTB.3 = 0 AND PORTB.4 = 1 AND PORTC.3 = 0 THEN TDIR = 4
IF PORTB.3 = 1 AND PORTB.4 = 0 AND PORTC.3 = 1 THEN TDIR = 5
IF PORTB.3 = 0 AND PORTB.4 = 1 AND PORTC.3 = 1 THEN TDIR = 6
ENDIF
SELECT CASE TDIR
CASE 1
GOTO LOP1
CASE 2
GOTO LOP1
CASE 3
IF TIME < 2790 THEN TIME = TIME + 10
CASE 4
IF TIME > 19 THEN TIME = TIME - 10
CASE 5
IF TIME < 2799 THEN TIME = TIME + 1
CASE 6
IF TIME > 9 THEN TIME = TIME - 1
END SELECT
STR1 = 1
GOSUB SND6 'T OR C CHANGED
GOTO LOP1

TADW: READ 0, TIMES 'STORE TIME
IF TIMES <> TIME THEN WRITE 0, TIME
READ 0, TTEST
IF TTEST <> TIME THEN WRITE 2, TIME
STR1 = 0
GOTO LOP1

CADJ: CDIR = 0
IF PORTB.3 = 0 AND PORTB.4 = 0 THEN CDIR = 2 'ZERO NOTCH
IF CDIR = 2 THEN
IF PORTB.3 = 1 AND PORTB.4 = 0 AND PORTC.3 = 0 THEN CDIR = 3
IF PORTB.3 = 0 AND PORTB.4 = 1 AND PORTC.3 = 0 THEN CDIR = 4
IF PORTB.3 = 1 AND PORTB.4 = 0 AND PORTC.3 = 1 THEN CDIR = 5
IF PORTB.3 = 0 AND PORTB.4 = 1 AND PORTC.3 = 1 THEN CDIR = 6
ENDIF
SELECT CASE CDIR
CASE 1
GOTO LOP1
CASE 2
GOTO LOP1
CASE 3
IF AMP < 2550 THEN AMP = AMP + 10
CASE 4
IF AMP > 50 THEN AMP = AMP - 10
CASE 5
IF AMP < 2549 THEN AMP = AMP + 1
CASE 6
IF AMP > 50 THEN AMP = AMP - 1
END SELECT
STR1 = 2
GOSUB SND6
GOTO LOP1

CADW: READ 1, AMPS 'STORE AMPS
IF AMPS <> AMP THEN WRITE 1, AMP
READ 1, ATEST
IF ATEST <> AMP THEN WRITE 3, AMP
STR1 = 0
GOTO LOP1

SND5: IF TIMES <> TIME THEN TIMES = TIME 'SEND TO PIC5
WRITE 0, TIME
IF AMPS <> AMP THEN AMPS = AMP
WRITE 2, AMP
SEROUT2 PORTC.5\PORTC.6,84,[TIME,AMP]
GOTO LOP1

'SUBPROGRAM SECTION

SND6: 'SEND DIGITS TO PIC6
HIGH PORTB.2
PAUSEUS 40
Serout2 PORTB.5 \PORTB.6,84,[TIME,AMP]
LOW PORTB.2
RETURN

AND HERE IS THE ENTIRE CODE FOR PIC6

DEFINE OSC 20 'DEFINE OSCILLATOR
DEFINE SER2_BITS 8

AS VAR WORD 'DEFINE VARIABLES
A VAR WORD
B VAR BYTE
C VAR BYTE
F VAR BYTE
T VAR WORD
TRC VAR BYTE[4]
ARC VAR BYTE[4]

'EQUATES SECTION
TRISA = %00111110 'SET PORTS I/O
TRISB = %00000000
TRISC = %00000000
ADCON0 = %00000000
ADCON1 = %00000011 'PORTA ALL DIGITAL

A = 0 'INITIATE VARIABLES
AS = 0
B = 0
C = 0
F = 2
T = 0

'IT ALL STARTS HERE
PAUSE 200
EEPROM 0,[129,243,73,97,51,37,5,241,1,49] 'STORE CONSTANTS

LOOP: 'GET T & A FROM PIC 7
IF PORTA.4 = 1 THEN
SERIN2 PORTA.0 \PORTA.1,84,[T,A]
ENDIF

LOOP1: 'DISPLAY T & A
FOR C = 0 TO 3
READ T DIG C, PORTB
LOOKUP C,[$7F,$BF,$DF,$EF],PORTC 'SET DIGIT
PAUSE f
PORTC = $FF
NEXT C
FOR B = 0 TO 3
READ AS DIG B, PORTB
LOOKUP B,[$FE,$FD,$FB,$F7],PORTC
PAUSE f
PORTC = $FF
NEXT B
GOTO LOOP

PIC7 IS TO STORE AND ADJUST THE TWO VARIABLES FOR TIME AND CURRENT,
SEND IT TO PIC5 AND PIC6 UPON DEMAND
TRYING TO PULL RABBITS FROM HAT AT THIS POINT,

APPOLOGIES FOR SHOUTING

THANKS ALL!!