Hi,
This is what my circuit looks like:
- The 18F4550 sends 1 byte to the slaves on Master TX line.
- Both slaves receive the byte properly.
- 1st slave replies successfully with same byte on Master RX line.
Problem: communication is blocked if 2nd slave is added on Master RX line.
Note: 2nd slave does not reply to master yet, extra address byte will be added later so each slave will reply only when spoken to.
Master:
Code:
' 184550 external oscillator 20MHz
' 4K7 pull-up on RX
@ __CONFIG _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
@ __CONFIG _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
@ __CONFIG _CONFIG2L, _PWRT_OFF_2L & _BOR_ON_2L & _BORV_1_2L & _VREGEN_ON_2L
@ __CONFIG _CONFIG2H, _WDT_OFF_2H
@ __CONFIG _CONFIG3H, _CCP2MX_OFF_3H & _PBADEN_OFF_3H & _LPT1OSC_OFF_3H & _MCLRE_ON_3H
@ __CONFIG _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _ICPRT_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
DEFINE OSC 48
ADCON1 = %00001111
INTCON2 = %10000000
TRISA = %00000000
TRISB = %00000000
TRISC = %11000000
TRISD = %00000000
TRISE = %00000000
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 25 ' 115200 Baud @ 48MHz, 0,16%
SPBRGH = 0
BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
DEFINE LCD_DREG PORTD ' Set LCD data port
DEFINE LCD_DBIT 0 ' Set starting data bit
DEFINE LCD_BITS 8 ' Set LCD bus size
DEFINE LCD_LINES 2 ' Set number of lines on LCD
DEFINE LCD_RSREG PORTC ' Set LCD register select port
DEFINE LCD_RSBIT 1 ' Set LCD register select bit
DEFINE LCD_EREG PORTC ' Set LCD enable port
DEFINE LCD_EBIT 0 ' Set LCD enable bit
define LCD_COMMANDUS 1500 ' Set command delay time in microseconds
DEFINE LCD_DATAUS 50 ' Set data delay time in microseconds
DataIn VAR byte
DataOut VAR byte
low PORTC.2
Start:
Pause 2000
Main:
DataOut = PortC.2
LCDOUT $FE,$80,"This is the data out: ", dec1 DataOut
hserout [dec1 DataOut]
hSERIN [dec1 DataIn]
LCDOUT $FE,$C0,"This is the data in: ", dec1 DataIn
pause 1000
toggle PortC.2
GOTO Main
end
1st slave:
Code:
' 18F44K22 internal oscillator 64MHz
' 4K7 pull-up on RX
@ __CONFIG _CONFIG1H, _FOSC_INTIO67_1H & _PLLCFG_ON_1H & _PRICLKEN_OFF_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
@ __CONFIG _CONFIG2L, _PWRTEN_ON_2L & _BOREN_SBORDIS_2L & _BORV_285_2L
@ __CONFIG _CONFIG2H, _WDTEN_OFF_2H
@ __CONFIG _CONFIG3H, _PBADEN_OFF_3H & _HFOFST_OFF_3H & _MCLRE_EXTMCLR_3H
@ __CONFIG _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
DEFINE OSC 64
OSCCON = %01110000
OSCCON2 = %10000000
OSCTUNE = %11000000
INTCON2 = %10000000
ANSELA = 0
ANSELB = 0
ANSELC = 0
ANSELD = 0
ANSELE = 0
TRISA = %00001111 ' Set port A pins 0-3 to input, others output
TRISB = %00000000 ' Set port B pins to output
TRISC = %11111111 ' Set port C pins to input
TRISD = %00111111 ' Set port D pins 0-5 to input, others output
TRISE = %00000000 ' Set port E pins to output
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 138 ' 115200 Baud @ 64MHz, -0,08%
SPBRGH = 0
BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
INCLUDE "DT_INTS-18.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP-18.bas" ; PBP Re-entry for external interrupt
INCLUDE "Elapsed_INT-18.bas" ; Elapsed Timer Routines
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler RX1_INT, _ReceiveInterrupt, PBP, no
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
DataIn VAR byte
DataOut VAR byte
RS232Flag VAR byte
goto Start
ReceiveInterrupt:
hSERIN [dec1 DataIn]
RS232Flag = 1
@ INT_RETURN
Start:
Pause 1500
@ INT_ENABLE RX1_INT
mainloop:
if RS232Flag = 1 then
RS232Flag = 0
PortA.4 = DataIn
DataOut = DataIn
hserout [dec1 DataOut]
endif
Goto mainloop
end
2nd slave:
Code:
' 18F26K22 internal oscillator 64MHz
' 4K7 pull-up on RX
@ __CONFIG _CONFIG1H, _FOSC_INTIO67_1H & _PLLCFG_ON_1H & _PRICLKEN_OFF_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
@ __CONFIG _CONFIG2L, _PWRTEN_ON_2L & _BOREN_SBORDIS_2L & _BORV_285_2L
@ __CONFIG _CONFIG2H, _WDTEN_OFF_2H
@ __CONFIG _CONFIG3H, _PBADEN_OFF_3H & _HFOFST_OFF_3H & _MCLRE_EXTMCLR_3H
@ __CONFIG _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
DEFINE OSC 64
OSCCON = %01110000
OSCCON2 = %10000000
OSCTUNE = %11000000
INTCON2 = %10000000
ANSELA = 0 ' Digital I/O
ANSELB = 0
ANSELC = 0
TRISA = %00111111 ' Set port A pins 0-5 to input
TRISB = %00000000 ' Set port B pins to output
TRISC = %11000000 ' Set port C pins 6-7 to input, others output
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 138 ' 115200 Baud @ 64MHz, -0,08%
SPBRGH = 0
BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
INCLUDE "DT_INTS-18.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP-18.bas" ; PBP Re-entry for external interrupt
INCLUDE "Elapsed_INT-18.bas" ; Elapsed Timer Routines
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler RX1_INT, _ReceiveInterrupt, PBP, no
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
DataIn VAR byte
RS232Flag VAR byte
RS232Flag = 0
goto Start ' Jump over sub-routines
ReceiveInterrupt: ' [USART RX - interrupt handler]
hSERIN 50,No232,[dec1 DataIn]
RS232Flag = 1
No232:
@ INT_RETURN
Start:
Pause 1500
@ INT_ENABLE RX1_INT ; Enable USART Receive interrupts
mainloop:
if RS232Flag = 1 then
RS232Flag = 0
PortA.7 = DataIn
endif
Goto mainloop
end
This has been driving me nuts for several days. I've trimmed my programs down to this bare essential and I still can't see what I'm doing wrong.
Everything works beautifully as long as I don't add that 2nd slave on the reply line.
Robert
Bookmarks