Online serial interface device

From uCtrl.net

Jump to: navigation, search
Symbols-Delete-256x256.png
Rack fullsize plan.png
The Rack box project is being discontinued!
I am moving to a new location, and therefor terminating the Rack box project, my plan is to build an even bigger system based on slot-in cards in a full size rack. I'll keep you posted. Feel tree to leave a comment if you have any question.
Installed in Rack box

OSID, driven by AVR ATMega8.

Contents

Information

OSID provides 9 digital inputs and outputs for the computer serial port. The outputs give GND when activated, max load pr. channel: 100mA. The inputs are triggered when they are connected to GND. By sending commands to the module one can change the status of the outputs, the module will confirm when the action is carried out.

It's also possible to ask for the current status of any in- or output, this is done by not sending a set value:

002:o:01:1 will set output 1 active.
002:o:01   will return the output 1 value.

The same can be done with the inputs:

002:i:01   will return the input 1 value.

All commands from the module is sent with a checksum.

I/O

Input

Outputs

D-Sub 25-pin

  1. 5V +
  2. 5V -
  3. Input 1
  4. Input 2
  5. Input 3
  6. Input 4
  7. Input 5
  8. Input 6
  9. Input 7
  10. Input 8
  11. Input 9
  12. Output 1
  13. Output 2
  14. Output 3
  15. Output 4
  16. Output 5
  17. Output 6
  18. Output 7
  19. Output 8
  20. Output 9
  21. Lifesignal

Communication

Interfacing is done with RS-232, using MAX232 or MAX202.

13:53:08 => 002:i:06:1:122
13:53:08 <= 002:i:06:0
13:53:05 => 002:o:01:0:122
13:53:05 <= 002:o:01:0
13:53:03 => 002:o:01:1:123
13:53:03 <= 002:o:01:1
13:52:58 => 002:s:01:1:127
13:52:35 => 002:s:00:1:126

Serial settings

Baud
9600
Data bits
8
Parity
None
Stop bits
1
Start command
0
Module ID
002

Parts list

Quantity Supplier Part number Description
1 Elfa 73-672-04 AVR-RISC, ATmega8-16PI
1 Elfa 50-197-40 Plastic Enclosure (1591 FL), 150x80x50mm fixed install.
1 Elfa 44-055-77 D-Sub soldering cups, 25 pin male
1 Elfa 44-055-28 D-Sub soldering cups, 25 pin female
1 Elfa 44-055-02 D-Sub soldering cups, 9 pin female
1 Elfa 48-161-38 DIL socket, 16-pin, 7,62mm
1 Elfa 48-161-87 DIL socket, 28-pin, 7,62mm
1 Komplett 100316 D-sub cable, pin-to-pin 5m, 9-pin male-female
1 Elfa 67-008-01 Aluminium electrolytic capacitor, 10uF 25V
5 Elfa 67-013-12 Aluminium electrolytic capacitor, 1uF 50V
1 Elfa 65-851-94 Ceramic Disc Capacitor, 1 nF 100V
2 Elfa 65-550-64 Foil capacitor, 0,01uF
2 Elfa 48-396-76 Laboratory card, 100x160mm (1/5)
1 Elfa 75-016-79 LED 5mm clear, Green, 2.1V, 20mA, 385mcd, 6°
1 Elfa 75-016-95 LED 5mm clear, Yellow, 2.0V, 20mA, 250mcd, 6°
1 Elfa 75-056-62 LED lense 5mm, CLB 300 low, green
1 Elfa 75-056-88 LED lense 5mm, CLB 300 low, yellow
1 Elfa 73-023-26 MAX232, CPE RSR232double
9 Elfa 60-106-15 Carbon film resistor 5% 1/4W, 10 K
11 Elfa 60-104-33 Carbon film resistor 5% 1/4W, 330 Ohm
11 Elfa 60-105-73 Carbon film resistor 5% 1/4W, 4,7 K
58 Elfa 43-708-05 Socket connector 2,54, 1×36, female
48 Elfa 43-702-19 Straight pin header 2,54, 1×36, PCB
11 Elfa 43-712-09 Straight pin header 2,54 (Y), 1×15, PCB
1 Elfa 33-167-42 Fuse 5x20 mm, 800 mA, quick-acting
1 Elfa 33-160-49 Fuse Holder, panel, 5x20mm, PTF30
10 Elfa 71-027-59 Transistor BC547B, NPN, 45V 0.1A 0.625W

Images

Schematic drawing

Osid circuit.png

Source code

The program is written in basic, using Bascom-AVR.

'--------------------------------------------------------------
'                         Thomas Jensen
'--------------------------------------------------------------
'  file: AVR_OSID_v.1.0
'  date: 06/05/2007
'--------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600
Config Portb = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Portc = Input
Config Portd.5 = Input
Config Portd.6 = Input
Config Portd.7 = Input
 
Dim Lifesignal As Integer , Life As Integer , Send As String * 15
Dim Inn(9) As Byte , A As Byte , A2 As String * 1
Dim Serialcharwaiting As Byte , Serialchar As Byte
Dim Comminput As String * 15 , Input_nr As String * 3
Dim Input_com As String * 1 , Input_ut As String * 2
Dim Input_stat As String * 1 , B As Byte , Led As Byte
 
Const Id = "002"
Life = 2000
 
'Waitms 4000
 
Send = Id + ":s:00:1:"
Print Send ; Checksum(send)
 
'Waitms 1000
 
Top:
 
Serialcharwaiting = Ischarwaiting()
 
If Serialcharwaiting = 1 Then
   Serialchar = Inkey()
      Goto Myroutine
   End If
 
Goto Main
 
Myroutine:
Select Case Serialchar
Case 48                                                     '0
Goto Set_value
End Select
 
Main:
'input send off signal
For A = 1 To 9
   If Inn(a) = 1 Then
      Led = 103
      A2 = Str(a)
      If Len(a2) < 2 Then A2 = "0" + A2
      Send = Id + ":i:" + A2 + ":0:"
      Print Send ; Checksum(send)
      End If
Next A
 
'input send on signal
If Pinc.0 = 0 Then                                          'input 1
   If Inn(1) = 0 Then
   Led = 103
   Send = Id + ":i:01:1:"
   Print Send ; Checksum(send)
   End If
   Inn(1) = 250
End If
 
If Pinc.1 = 0 Then                                          'input 2
   If Inn(2) = 0 Then
   Led = 103
   Send = Id + ":i:02:1:"
   Print Send ; Checksum(send)
   End If
   Inn(2) = 250
End If
 
If Pinc.2 = 0 Then                                          'input 3
   If Inn(3) = 0 Then
   Led = 103
   Send = Id + ":i:03:1:"
   Print Send ; Checksum(send)
   End If
   Inn(3) = 250
End If
 
If Pinc.3 = 0 Then                                          'input 4
   If Inn(4) = 0 Then
   Led = 103
   Send = Id + ":i:04:1:"
   Print Send ; Checksum(send)
   End If
   Inn(4) = 250
End If
 
If Pinc.4 = 0 Then                                          'input 5
   If Inn(5) = 0 Then
   Led = 103
   Send = Id + ":i:05:1:"
   Print Send ; Checksum(send)
   End If
   Inn(5) = 250
End If
 
If Pinc.5 = 0 Then                                          'input 6
   If Inn(6) = 0 Then
   Led = 103
   Send = Id + ":i:06:1:"
   Print Send ; Checksum(send)
   End If
   Inn(6) = 250
End If
 
If Pind.5 = 0 Then                                          'input 7
   If Inn(7) = 0 Then
   Led = 103
   Send = Id + ":i:07:1:"
   Print Send ; Checksum(send)
   End If
   Inn(7) = 250
End If
 
If Pind.6 = 0 Then                                          'input 8
   If Inn(8) = 0 Then
   Led = 103
   Send = Id + ":i:08:1:"
   Print Send ; Checksum(send)
   End If
   Inn(8) = 250
End If
 
If Pind.7 = 0 Then                                          'input 9
   If Inn(9) = 0 Then
   Led = 103
   Send = Id + ":i:09:1:"
   Print Send ; Checksum(send)
   End If
   Inn(9) = 250
End If
 
'set input counters
For A = 1 To 9
   If Inn(a) > 0 And B = 0 Then Decr Inn(a)
Next A
 
'led timer
If Led > 0 Then Decr Led
If Led = 100 Then Portd.4 = 1
If Led = 0 Then Portd.4 = 0
 
'lifestring
If Life > 0 Then Decr Life
If Life = 0 Then
   Led = 103
   Send = Id + ":s:01:1:"
   Print Send ; Checksum(send)
   Life = 20000
   End If
 
'lifesignal
If Lifesignal > 0 Then Decr Lifesignal
If Lifesignal = 500 Then Portd.3 = 1
If Lifesignal = 0 Then
   Portd.3 = 0
   Lifesignal = 2100
   End If
 
Waitms 1
Goto Top                                                    'loop cycle
End
 
Set_value:
Input Comminput Noecho                                      'read serialport
 
Input_nr = Left(comminput , 3)                              'id check
Input_com = Mid(comminput , 5 , 1)                          'command check
Input_ut = Mid(comminput , 7 , 2)                           'output nr check
Input_stat = Mid(comminput , 10 , 1)                        'output stat check
 
'output
If Input_nr = Id Then
 
If Input_com = "o" Then
Led = 103
Select Case Input_ut
 
Case "01"                                                   'output 1
If Input_stat = "1" Then Portb.0 = 1
If Input_stat = "0" Then Portb.0 = 0
Send = Id + ":o:01:" + Str(portb.0) + ":"
Print Send ; Checksum(send)
 
Case "02"                                                   'output 2
If Input_stat = "1" Then Portb.1 = 1
If Input_stat = "0" Then Portb.1 = 0
Send = Id + ":o:02:" + Str(portb.1) + ":"
Print Send ; Checksum(send)
 
Case "03"                                                   'output 3
If Input_stat = "1" Then Portb.2 = 1
If Input_stat = "0" Then Portb.2 = 0
Send = Id + ":o:03:" + Str(portb.2) + ":"
Print Send ; Checksum(send)
 
Case "04"                                                   'output 4
If Input_stat = "1" Then Portb.3 = 1
If Input_stat = "0" Then Portb.3 = 0
Send = Id + ":o:04:" + Str(portb.3) + ":"
Print Send ; Checksum(send)
Case "05"                                                   'output 5
If Input_stat = "1" Then Portb.4 = 1
If Input_stat = "0" Then Portb.4 = 0
Send = Id + ":o:05:" + Str(portb.4) + ":"
Print Send ; Checksum(send)
 
Case "06"                                                   'output 6
If Input_stat = "1" Then Portb.5 = 1
If Input_stat = "0" Then Portb.5 = 0
Send = Id + ":o:06:" + Str(portb.5) + ":"
Print Send ; Checksum(send)
 
Case "07"                                                   'output 7
If Input_stat = "1" Then Portb.6 = 1
If Input_stat = "0" Then Portb.6 = 0
Send = Id + ":o:07:" + Str(portb.6) + ":"
Print Send ; Checksum(send)
 
Case "08"                                                   'output 8
If Input_stat = "1" Then Portb.7 = 1
If Input_stat = "0" Then Portb.7 = 0
Send = Id + ":o:08:" + Str(portb.7) + ":"
Print Send ; Checksum(send)
 
Case "09"                                                   'output 9
If Input_stat = "1" Then Portd.2 = 1
If Input_stat = "0" Then Portd.2 = 0
Send = Id + ":o:09:" + Str(portd.2) + ":"
Print Send ; Checksum(send)
 
End Select
End If
 
If Input_com = "i" Then
Select Case Input_ut
 
Case "01"
If Inn(1) = 0 Then Inn(1) = 2 Else Inn(1) = 0               'status input 1
Case "02"
If Inn(2) = 0 Then Inn(2) = 2 Else Inn(2) = 0               'status input 2
Case "03"
If Inn(3) = 0 Then Inn(3) = 2 Else Inn(3) = 0               'status input 3
Case "04"
If Inn(4) = 0 Then Inn(4) = 2 Else Inn(4) = 0               'status input 4
Case "05"
If Inn(5) = 0 Then Inn(5) = 2 Else Inn(5) = 0               'status input 5
Case "06"
If Inn(6) = 0 Then Inn(6) = 2 Else Inn(6) = 0               'status input 6
Case "07"
If Inn(7) = 0 Then Inn(7) = 2 Else Inn(7) = 0               'status input 7
Case "08"
If Inn(8) = 0 Then Inn(8) = 2 Else Inn(8) = 0               'status input 8
Case "09"
If Inn(9) = 0 Then Inn(9) = 2 Else Inn(9) = 0               'status input 9
 
End Select
End If
 
End If
Goto Main
End
Personal tools
Namespaces
Variants
Actions
Navigation
Categories
projects
Toolbox