Computer Controlled Outputs Via RS232?

Tasp

Member
PIC = 40X2

I would like to be able to send characters into a PIC from a PC (RS232) to switch outputs on and off.

3 PIC's A, B, C
1st letter: Chip ID
2nd & 3rd letter: output number (AA = A.0, AB = A.1, AC = A.2, BA = B.0, CD = C.3)

Send "AAA" turns output A.0 high on chip A
Send "aaa" turns output A.0 low on chip A
Send "BBA" turns output B.1 high on chip B
Send "bba" turns output B.1 low on chip B
Send "CCB" turns output C.2 high on chip C
and so on.

I assume I'd need to connect the PIC's by daisy chaining the PIC's together using a single wire and a simple checking of: if a the text contains C at the beginning, A doesn't need it so A will send to B, B checks and sends to C?

Questions!

1, Is it possible?
2, Has anyone tried this?
3, Do I need to use a Max232, there seems to be conflicting opinions on the forum to the manuals. I assume not "When using simple resistor interface, use N inverted) signals. When using a MAX232 type interface use T (true) signals. The protocol is fixed at N,8,1 (no parity, 8 data bits, 1 stop bit). Manual 2 pg.173"
4, What hitches could I run into?
5, I assume Serrxd for input and Sertxd to the following PIC's
 
Last edited:

Tasp

Member
Pic = 40X2

Right so I've written my program and designed the strip board, could you guys have a look and see if you can spot any probs.

The concept is to receive data via the RS232, the packet will contain "Data A A A", 1st letter signify's which chip shoud "listen", the 2nd corresponds to an output, capital letter go high, lower case, go low. If the packet is not for the chip it will send it to the next chip and so on.

The schematic doesn't show the serial connections but they will be on the 18 & 19 rows. There will also be a connection between pin 32 on the Pic to the next 40X2 pic which will have the same strip board layout, only the chip will only respond to commands starting with B. There is also a bi coloured LED to go onto d.1 & d.0 but forgot the resistor (330r) and LED on the schematic.

The other chips to the right of the Pic is ULN2803A (Darlington Driver) which will trigger 12 volt relays.


The final strip board will have the resistors spaced apart better.

Code:
'THIS PROGRAM IS FOR CHIP "A"

'b0 = Chip ID Letter
'b1 = Letter to output trigger
'b2 = Future Use
'	A = A.0
'	B = A.1
'	C = A.2
'	D = A.3
'	E = B.7
'	F = B.6
'	G = B.5
'	H = B.4
'	I = B.3
'	J = B.1
'	K = B.0
'	L = D.7
'	M = D.6
'	N = D.5
'	O = D.4
'	P = C.7
'	Q = C.6
'	R = C.5
'	S = C.4
'	T = D.3
'	U = D.2
'	V = A.4
'	W = A.5
'	X = A.6
'	Y = A.7
'	Z = C.0
'	[ = C.1
'	] = C.2
'	; = C.3
' D.0 = RED LED (Bi Colour)
' D.1 = GRN LED (Bi Colour)

'Format
'SEND Data THEN chip letter THEN output letter THEN spare character.

'Init outputs
dirsB = %11111111
dirsC = %11111111
dirsD = %11111111

Main:

HIGH D.1
LOW D.0

SERIN 2,N4800,("Data"),b0,b1,b2

'If data starts with B forward to next chip via pin 32
IF b0 = "B" THEN 
	SEROUT B.2,N4800,("Data",b0,b1,b2)
	GOTO Main	
ENDIF

'Change LED to intimate data checking.
HIGH D.0
LOW D.1

IF b1 = "A" THEN HIGH A.0 :GOTO Main : ENDIF
IF b1 = "a" THEN LOW A.0 : GOTO Main : ENDIF
IF b1 = "B" THEN HIGH A.1 :GOTO Main : ENDIF
IF b1 = "b" THEN LOW A.1 : GOTO Main : ENDIF
IF b1 = "C" THEN HIGH A.2 :GOTO Main : ENDIF
IF b1 = "c" THEN LOW A.2 : GOTO Main : ENDIF
IF b1 = "D" THEN HIGH A.3 :GOTO Main : ENDIF
IF b1 = "d" THEN LOW A.3 : GOTO Main : ENDIF
IF b1 = "E" THEN HIGH B.7 :GOTO Main : ENDIF
IF b1 = "e" THEN LOW B.7 : GOTO Main : ENDIF
IF b1 = "F" THEN HIGH B.6 :GOTO Main : ENDIF
IF b1 = "f" THEN LOW B.6 : GOTO Main : ENDIF
IF b1 = "G" THEN HIGH B.5 :GOTO Main : ENDIF
IF b1 = "g" THEN LOW B.5 : GOTO Main : ENDIF
IF b1 = "H" THEN HIGH B.4 :GOTO Main : ENDIF
IF b1 = "h" THEN LOW B.4 : GOTO Main : ENDIF
IF b1 = "I" THEN HIGH B.3 :GOTO Main : ENDIF
IF b1 = "i" THEN LOW B.3 : GOTO Main : ENDIF
IF b1 = "J" THEN HIGH B.1 :GOTO Main : ENDIF
IF b1 = "j" THEN LOW B.1 : GOTO Main : ENDIF
IF b1 = "K" THEN HIGH B.0 :GOTO Main : ENDIF
IF b1 = "k" THEN LOW B.0 : GOTO Main : ENDIF
IF b1 = "L" THEN HIGH D.7 :GOTO Main : ENDIF
IF b1 = "l" THEN LOW D.7 : GOTO Main : ENDIF
IF b1 = "M" THEN HIGH D.6 :GOTO Main : ENDIF
IF b1 = "m" THEN LOW D.6 : GOTO Main : ENDIF
IF b1 = "N" THEN HIGH D.5 :GOTO Main : ENDIF
IF b1 = "n" THEN LOW D.5 : GOTO Main : ENDIF
IF b1 = "O" THEN HIGH D.4 :GOTO Main : ENDIF
IF b1 = "o" THEN LOW D.4 : GOTO Main : ENDIF
IF b1 = "P" THEN HIGH C.7 :GOTO Main : ENDIF
IF b1 = "p" THEN LOW C.7 : GOTO Main : ENDIF
IF b1 = "Q" THEN HIGH C.6 :GOTO Main : ENDIF
IF b1 = "q" THEN LOW C.6 : GOTO Main : ENDIF
IF b1 = "R" THEN HIGH C.5 :GOTO Main : ENDIF
IF b1 = "r" THEN LOW C.5 : GOTO Main : ENDIF
IF b1 = "S" THEN HIGH C.4 :GOTO Main : ENDIF
IF b1 = "s" THEN LOW C.4 : GOTO Main : ENDIF
IF b1 = "T" THEN HIGH D.3 :GOTO Main : ENDIF
IF b1 = "t" THEN LOW D.3 : GOTO Main : ENDIF
IF b1 = "U" THEN HIGH D.2 :GOTO Main : ENDIF
IF b1 = "u" THEN LOW D.2 : GOTO Main : ENDIF
IF b1 = "V" THEN HIGH A.4 :GOTO Main : ENDIF
IF b1 = "v" THEN LOW A.4 : GOTO Main : ENDIF
IF b1 = "W" THEN HIGH A.5 :GOTO Main : ENDIF
IF b1 = "w" THEN LOW A.5 : GOTO Main : ENDIF
IF b1 = "X" THEN HIGH A.6 :GOTO Main : ENDIF
IF b1 = "x" THEN LOW A.6 : GOTO Main : ENDIF
IF b1 = "Y" THEN HIGH A.7 :GOTO Main : ENDIF
IF b1 = "y" THEN LOW A.7 : GOTO Main : ENDIF
IF b1 = "Z" THEN HIGH C.0 :GOTO Main : ENDIF
IF b1 = "z" THEN LOW C.0 : GOTO Main : ENDIF
IF b1 = "[" THEN HIGH C.1 :GOTO Main : ENDIF
IF b1 = "{" THEN LOW C.1 : GOTO Main : ENDIF
IF b1 = "]" THEN HIGH C.2 :GOTO Main : ENDIF
IF b1 = "}" THEN LOW C.2 : GOTO Main : ENDIF
IF b1 = ";" THEN HIGH C.3 :GOTO Main : ENDIF
IF b1 = ":" THEN LOW C.3 : GOTO Main : ENDIF

GOTO Main
Guys I know the code could probably be reduced and far simpler, but I'm still learning!!
 
Last edited:

MPep

Senior Member
Hi Tasp,

Haven't fully checked your Stripboard layout, but your code is simple AND effective. If it works then great. :D

I have made a minor change to your code. In your version, if you wanted to send to Board "C", board "A" would also respond. In my version, you can see that you are setting the Board to "A". If it is, then act upon the info. If it isn't, then Pass On the info to the next board.
Code:
'THIS PROGRAM IS FOR CHIP "A"

'b0 = Chip ID Letter
'b1 = Letter to output trigger
'b2 = Future Use
'    A = A.0
'    B = A.1
'    C = A.2
'    D = A.3
'    E = B.7
'    F = B.6
'    G = B.5
'    H = B.4
'    I = B.3
'    J = B.1
'    K = B.0
'    L = D.7
'    M = D.6
'    N = D.5
'    O = D.4
'    P = C.7
'    Q = C.6
'    R = C.5
'    S = C.4
'    T = D.3
'    U = D.2
'    V = A.4
'    W = A.5
'    X = A.6
'    Y = A.7
'    Z = C.0
'    [ = C.1
'    ] = C.2
'    ; = C.3
' D.0 = RED LED (Bi Colour)
' D.1 = GRN LED (Bi Colour)

'Format
'SEND Data THEN chip letter THEN output letter THEN spare character.

#picaxe 40x2

'Init outputs
dirsB = %11111111
dirsC = %11111111
dirsD = %11111111

Main: 

HIGH D.1
LOW D.0

SERIN 2,N4800,("Data"),b0,b1,b2


IF b0 = "A" THEN         ;Check if this board is requested
    goto Change        ;If it is, then change the output state
    else     goto PassOn    ;If not, send to the next board
ENDIF


Change:

'Change LED to indicate data checking.

HIGH D.0
LOW D.1 

IF b1 = "A" THEN HIGH A.0 :GOTO Main : ENDIF
IF b1 = "a" THEN LOW A.0 : GOTO Main : ENDIF
IF b1 = "B" THEN HIGH A.1 :GOTO Main : ENDIF
IF b1 = "b" THEN LOW A.1 : GOTO Main : ENDIF
IF b1 = "C" THEN HIGH A.2 :GOTO Main : ENDIF
IF b1 = "c" THEN LOW A.2 : GOTO Main : ENDIF
IF b1 = "D" THEN HIGH A.3 :GOTO Main : ENDIF
IF b1 = "d" THEN LOW A.3 : GOTO Main : ENDIF
IF b1 = "E" THEN HIGH B.7 :GOTO Main : ENDIF
IF b1 = "e" THEN LOW B.7 : GOTO Main : ENDIF
IF b1 = "F" THEN HIGH B.6 :GOTO Main : ENDIF
IF b1 = "f" THEN LOW B.6 : GOTO Main : ENDIF
IF b1 = "G" THEN HIGH B.5 :GOTO Main : ENDIF
IF b1 = "g" THEN LOW B.5 : GOTO Main : ENDIF
IF b1 = "H" THEN HIGH B.4 :GOTO Main : ENDIF
IF b1 = "h" THEN LOW B.4 : GOTO Main : ENDIF
IF b1 = "I" THEN HIGH B.3 :GOTO Main : ENDIF
IF b1 = "i" THEN LOW B.3 : GOTO Main : ENDIF
IF b1 = "J" THEN HIGH B.1 :GOTO Main : ENDIF
IF b1 = "j" THEN LOW B.1 : GOTO Main : ENDIF
IF b1 = "K" THEN HIGH B.0 :GOTO Main : ENDIF
IF b1 = "k" THEN LOW B.0 : GOTO Main : ENDIF
IF b1 = "L" THEN HIGH D.7 :GOTO Main : ENDIF
IF b1 = "l" THEN LOW D.7 : GOTO Main : ENDIF
IF b1 = "M" THEN HIGH D.6 :GOTO Main : ENDIF
IF b1 = "m" THEN LOW D.6 : GOTO Main : ENDIF
IF b1 = "N" THEN HIGH D.5 :GOTO Main : ENDIF
IF b1 = "n" THEN LOW D.5 : GOTO Main : ENDIF
IF b1 = "O" THEN HIGH D.4 :GOTO Main : ENDIF
IF b1 = "o" THEN LOW D.4 : GOTO Main : ENDIF
IF b1 = "P" THEN HIGH C.7 :GOTO Main : ENDIF
IF b1 = "p" THEN LOW C.7 : GOTO Main : ENDIF
IF b1 = "Q" THEN HIGH C.6 :GOTO Main : ENDIF
IF b1 = "q" THEN LOW C.6 : GOTO Main : ENDIF
IF b1 = "R" THEN HIGH C.5 :GOTO Main : ENDIF
IF b1 = "r" THEN LOW C.5 : GOTO Main : ENDIF
IF b1 = "S" THEN HIGH C.4 :GOTO Main : ENDIF
IF b1 = "s" THEN LOW C.4 : GOTO Main : ENDIF
IF b1 = "T" THEN HIGH D.3 :GOTO Main : ENDIF
IF b1 = "t" THEN LOW D.3 : GOTO Main : ENDIF
IF b1 = "U" THEN HIGH D.2 :GOTO Main : ENDIF
IF b1 = "u" THEN LOW D.2 : GOTO Main : ENDIF
IF b1 = "V" THEN HIGH A.4 :GOTO Main : ENDIF
IF b1 = "v" THEN LOW A.4 : GOTO Main : ENDIF
IF b1 = "W" THEN HIGH A.5 :GOTO Main : ENDIF
IF b1 = "w" THEN LOW A.5 : GOTO Main : ENDIF
IF b1 = "X" THEN HIGH A.6 :GOTO Main : ENDIF
IF b1 = "x" THEN LOW A.6 : GOTO Main : ENDIF
IF b1 = "Y" THEN HIGH A.7 :GOTO Main : ENDIF
IF b1 = "y" THEN LOW A.7 : GOTO Main : ENDIF
IF b1 = "Z" THEN HIGH C.0 :GOTO Main : ENDIF
IF b1 = "z" THEN LOW C.0 : GOTO Main : ENDIF
IF b1 = "[" THEN HIGH C.1 :GOTO Main : ENDIF
IF b1 = "{" THEN LOW C.1 : GOTO Main : ENDIF
IF b1 = "]" THEN HIGH C.2 :GOTO Main : ENDIF
IF b1 = "}" THEN LOW C.2 : GOTO Main : ENDIF
IF b1 = ";" THEN HIGH C.3 :GOTO Main : ENDIF
IF b1 = ":" THEN LOW C.3 : GOTO Main : ENDIF

GOTO Main

PassOn:
SEROUT B.2,N4800,("Data",b0,b1,b2)
    GOTO Main
 

MPep

Senior Member
That's why you posted your code :).
No problems. Hope all works exactly as you had planned.

MPep.
 

MPep

Senior Member
Actually, had another thought.
The PassOn routine in my code is only valid if you decide to daisy chain the boards. Your code indicates that this is the route you intend to take.
If you decide to have multiple listeners, on 1 wire (in parallel), then you'd have to change the code somewhat, in order to direct the program flow back to Main. :)
 
Last edited:
Top