La scheda di espansione IN/OUT SX16, prodotta da AreaSX S.r.l., la cui documentazione completa è reperibile all 'url:
http://www.areasx.com/index.php?D=1&id=8091
permette, grazie ad un sistema di pilotaggio a shift register, di utilizzare soltanto otto linee del microprocessore a
cui è collegata e di avere ben 24 ingressi di cui:
8 ingressi optiosolati a cui è possibile collegare tensioni fino a 24V CC, configurabili anche come ingressi TTL (0V-5V)
6 uscite a relè che consentono di operare tensioni fino a 48V (2A di carico) e un sensore di temperatura digitale DS1621.
La scheda SX16 è la soluzione ideale per implementare un completo stadio d'input/output in tutti que progetti in cui si dispone di un numero limitato di linee di I/O.
In quest'articolo vediamo come interfacciare tutti gli stadi che compongono la SX 16 con il microprocessore della netmedia (http://www.netmedia.com/) Basicx 24
Gestione dello stadio relè
Per pilotare i sei relè (2) presenti sulla SX16, è necessario collegare il connettore a vaschetta denominato JP2 (1) visibile nella foto riportata di seguito
alle linee del basicx secondo lo schema che segue:
e caricare il programma basic nella memoria del micro attraverso il tool sviluppo NetMedia scaricabile gratuitamente dal sito web http://www.basicx.com.
Sorgente in basic:
Option Explicit
'Linee per comandare i Relè
Const ODA As Byte = 13
Const OCL As Byte = 14
Const STR AS Byte = 15
'Setta lo stato dei Relè
Sub Put2Rele (ByVal bByte As Byte)
Dim bMask As Byte
Dim bCount As Byte
bMask = bx00100000
Call PutPin(ODA, 0)
Call PutPin(OCL, 0)
Call PutPin(STR, 0)
For bCount = 0 to 5
Call PutPin(OCL, 0)
Call PutPin(ODA, ((bByte And bMask) \ bMask))
Call PutPin(OCL, 1)
bMask = bMask \ 2
Next
Call PutPin(STR, 1)
Call PutPin(STR, 0)
Call PutPin(ODA, 0)
Call PutPin(OCL, 0)
End Sub
Public Sub Main()
Debug.Print "COMANDA I RELE' SX16"
Call Put2Rele(0)
Debug.Print "TUTTI I RELE' SPENTI"
Call Delay(3.0)
Call Put2Rele(1)
Debug.Print "RELE' 1 ACCESO"
Call Delay(3.0)
Call Put2Rele(3)
Debug.Print "RELE' 1 E 2 ACCESI"
Call Delay(3.0)
Call Put2Rele(63)
Debug.Print "TUTTI I RELE' ACCESI"
End Sub
Le linee del BX24 usate per comandare la SX16 (pin 13,14 e 15) possono essere modificate cambiando il valore delle tre costanti
Const ODA As Byte = 13
Const OCL As Byte = 14
Const STR AS Byte = 15
Gestione dello stadio input
La SX16, come precedentemente detto, è dotata di ben 24 linee d'ingresso separate a blocchi di otto come visibile in foto
otto ingressi optiosolati (2) a cui è possibile collegare tensioni fino a 24V CC
otto ingressi diretti (3) a livelli TTL (0V-5V)
e otto ingressi filtrati (4) (filtro CLC) a livelli TTL (0V-5V) .
Le linee di controllo del basicx vanno collegate secondo lo schema che segue:
Il sorgente da caricare nel BX24 per leggere lo stato dei 24 ingressi uno ad uno, è il seguente:
Option Explicit
'Linee per la lettura ingressi
Const ICL As Byte = 10
Const IDA As Byte = 11
Const IPL AS Byte = 12
Public Sub Main()
Dim i as byte
Do
Debug.Print "LETTURA LINEE INPUT"
Call PutPin(IPL, 1)
Call PutPin(IPL, 0) 'Abilito il latch
Call PutPin(IPL, 1) 'Blocco il latch
For i=0 to 23
Call PutPin(ICL, 0) 'Fronte clock basso
if (i>=0) and (i<=7) then 'Primi 8 bit stato ingressi optoisolai
Debug.Print "OPTO: " & cstr(i+1) & " stato: " & cstr(GetPin(IDA))
End if
If (i>=8) and (i<=15) then
Debug.Print "TTL: " & cstr(i-7) & " stato: " & cstr(GetPin(IDA))
End if
If (i>=16) and (i<=23) then
Debug.Print "RC: " & cstr(i -15) & " stato: " & cstr(GetPin(IDA))
End if
If (i=7) or (i=15) or (i=23) then
Debug.Print "----------------"
End if
Call PutPin(ICL, 1)
Next
Call Delay(3.0)
loop
End Sub
Anche per questo esempio vale la stessa regola del precedete e cioè la possibilità di modificare le linee che collegano il BX24 alla SX16, modificando il valore delle costani:
Const ICL As Byte = 10
Const IDA As Byte = 11
Const IPL AS Byte = 12
Lettura della temperatura:
Su ogni SX16 è montato un sensore digitale di tempetatura DS1621(2) (datasheet) con range di lettura compreso tra -55°C e +125°C.
Il tipo di comunicazione usato dal DS1621 è di tipo I2C bus.
I collegamenti da effettuare tra micro Basicx 24 e il connettore JP2 sull SX16 devomo rispettare il seguente schema elettrico:
Il sorgente per Basicx 24 che segue può essere usato, oltre che per leggere il sensore montato sulla SX16, anche per comunicare con un DS1621 montato su un proprio circuito.
Option Explicit
Const SCL As Byte = 5
Const SDA As Byte = 6
'////////////////////////////////////////////////////
' I2C BUS FUNCTION
'////////////////////////////////////////////////////
Public Sub I2C_in_byte(ByRef I_byte As Byte)
DIM N as Byte, Y as Byte
I_byte = 0
For N = 1 to 8 Step 1
Call I2C_high_SCL() ' bring clock high
Y = GetPin(SDA) ' read 6
Call I2C_low_SCL()
I_byte = I_byte * 2 + Y ' shift left and insert Y
Next
call SendAck()
End Sub
'///////////////////////////////////////////////////////////////////////
Public Sub I2C_out_byte(ByVal O_byte As Byte)
DIM N as Byte
For N = 1 TO 8 Step 1
If (O_byte >= 128) then ' most sig bit is a one
Call I2C_high_SDA()
Else
Call I2C_low_SDA() ' set 6
End If
Call I2C_high_SCL() 'Clock Pulse
Call I2C_low_SCL() 'Clock Pulse
O_byte = O_byte * 2 ' shift left
Next
call ReadAck()'Reads the acknowledge from the slave device.
End Sub
'/////////////////////////////////////////////////////////////////////////////
Public Sub ReadAck() ' allows slave to acknowledge
Call I2C_high_SDA()
Call I2C_high_SCL()
Call delay(0.0)
Call I2C_low_SCL()
End Sub
'///////////////////////////////////////////////////////////////////////////////
Public Sub I2cReport()
Dim ackack as Byte
ackack=GetPin(SDA)
If ackack=0 Then
'debug.print "Acknowledge Received"
Exit Sub
End If
End Sub
'///////////////////////////////////////////////////////////////////////////
Public Sub SendAck()
Call I2C_low_SDA()
Call I2C_high_SCL()
Call delay(0.0)
Call I2C_low_SCL()
Call I2C_high_SDA()
End Sub
'///////////////////////////////////////////////////////////////////////////
Public Sub I2C_start()
Call I2C_high_SDA()
Call I2C_high_SCL()
Call I2C_low_SDA()
Call I2C_low_SCL()
End Sub
'////////////////////////////////////////////////////////////////////////////
Public Sub I2C_stop()
Call I2C_low_SCL()
Call I2C_low_SDA()
Call I2C_high_SCL()
Call I2C_high_SDA()
End Sub
'///////////////////////////////////////////////////////////////////////////
Public Sub I2C_high_SDA()
Call PutPin(SDA, 2) ' tristate
End Sub
'//////////////////////////////////////////////////////////////////////////
Public Sub I2C_high_SCL()
Call PutPin(SCL, 2) ' tristate
End Su b
'///////////////////////////////////////////////////////////////////////////
Public Sub I2C_low_SDA()
Call PutPin(SDA, 0) ' hard logic zero
End Sub
'/////////////////////////////////////////////////////////////////////////////
Public Sub I2C_low_SCL()
Call PutPin(SCL, 0) ' hard logic zero
End Sub
'////////////////////////////////////////////////////
' END I2C BUS FUNCTION
'////////////////////////////////////////////////////
'///////////////////////////////////////////////////
'DS1621 FUNCTION
'///////////////////////////////////////////////////
Public Sub DS1621_init(ByVal address As Byte)
call I2C_stop()
call I2C_start()
call I2C_out_byte(144 or (address*2))
call I2C_out_byte(172)
call I2C_out_byte(172)
call I2C_start()
call I2C_out_byte(144 or (address*2))
call I2C_out_byte(238)
call I2C_stop()
End Sub
/////////////////////////////////////////////////////
Public Function DS1621_readtmp(ByVal address As Byte) as single
dim Temp as single
dim tmp(1) as byte
tmp(0)=0
tmp(1)=0
Call I2C_stop()
Call I2C_start()
Call I2C_out_byte(144 or (address*2))
Call I2C_out_byte(170)
Call I2C_start()
Call I2C_out_byte(145 or (address*2))
Call I2C_in_byte(tmp(0))
If(tmp(0)>127) then
Temp = csng((not(tmp(0))) + 1)
Temp = Temp * (-1.0)
Else
Temp = csng(tmp(0))
End if
Call I2C_in_byte(tmp(1))
If(tmp(1)=128) then
Temp = Temp + 0.5
End if
Call Delay(0.0)
Call I2C_stop()
DS1621_readtmp = Temp
End Function
'///////////////////////////////////////////////////
' END DS1621 FUNCTION
'///////////////////////////////////////////////////
Public Sub Main()
Dim Temperatura as single
'Inizializzazioni
Call DS1621_init(0)
'Lettura
Do
Temperatura = DS1621_readtmp(0)
Debug.print "Temperatura: " & cstr(Temperatura) & " °C"
Call Delay(2.0)
Loop
End Sub
Per cambiare le linee del BX24, le costanti da modificare sono:
Const SCL As Byte = 5
Const SDA As Byte = 6
Sorgenti d'esempio SX16_BASICX24.zip
Schema elettrico della SX16 SX16.pdf
Segnala questo articolo:
Parole chiave: - BX24 - Domotica - How-To - Schede Area SX -