Update ...
habe angefangen die BUS-Platine aufzubauen,
auf der Platine gibt es zwei PCF-8574,
einmal adr(64) Input für Ready-Meldungen und adr(66) Output für Power-Abschaltung von jedem Modul.
Bei jeder Modul kann über zwei Kommandos 21=Ready-HIGH / 20=Ready-LOW die Ready-Leitung direkt gesteuert werde,
so kann das Master-Modul erkennen, auf welchem Steckplatz welches Modul(adr) sich befindet.
Auf der Bus-Platine gibt es noch zwei Spannungs_Regler (LM317) einer für 5V (Dauer) und einer für 8,5V(Vin-Nano)
Zum testen der TWI (I2C) verbindung habe ich erst mal ein Master mit einem einfach Programm gesteckt,
dieser Master setzt RS232-Kommandos als I2C-Master um und sendet eingelesenen I2C-Daten über RS232 zurück.
Code:
$regfile = "m328pdef.dat"$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 19200
' ------------ DIM ------------------------
Dim X As Byte
Dim T1x As Byte ' Zähler 1/1000
Dim T2x As Byte ' Zähler 1/100
Dim T3x As Byte ' Zähler 1/10
' ------------ I2C-Master ------------------------
$lib "i2c_twi.lbx"
Config Scl = Portc.5
Config Sda = Portc.4
I2cinit
Config Twi = 100000
Dim Tw_buf(20)as Byte
Dim Tw_x As Byte
Dim Tw_s As Byte
Dim Tw_n As Byte
Dim Xout As String * 250
' ------------ RS232 - Input ------------------------
Dim Na As String * 30
Dim Nax As String * 30
Dim Si As Byte
Config Serialin = Buffered , Size = 40
' ------ Split -------
Dim Sb As Byte ' Split_Zähler
Dim Sbx(20) As String * 10 ' Split_Array
' ------------ Timer_0 Zeitvorgabe ------------------------------
Config Timer0 = Timer , Prescale = 256
On Ovf0 Timer0_ovf
Enable Timer0
Enable Interrupts
Print "Start_Main"
Do
If Ischarwaiting() <> 0 Then
Si = Inkey()
If Si <> 13 And Si <> 10 And Len(na) < 30 Then
Na = Na + Chr(si)
Else
Nax = Ucase(na)
Sb = Split(nax , Sbx(1) , "|")
If Sbx(1) = "STATUS" Then
Print "ACK|STATUS"
Print "Status|"
Elseif Sbx(1) = "TW_W" Then
' ------------ TW zum slave senden ----
Print "ACK|" ; Nax
If Sb > 2 Then
Tw_s = Val(sbx(2) )
Tw_n = Sb - 2
For X = 3 To Sb
Tw_buf(x -2) = Val(sbx(x) )
Next X
I2csend Tw_s , Tw_buf(1) , Tw_n
Else
Print "ERROR"
End If
Elseif Sbx(1) = "TW_R" Then
' ------------ TW vom slave lesen ----
Print "ACK|" ; Nax
If Sb = 3 Then
Tw_s = Val(sbx(2) )
Tw_n = Val(sbx(3) )
I2creceive Tw_s , Tw_buf(1) , 0 , Tw_n
Xout = "TW_R|DATA"
For X = 1 To Tw_n
Xout = Xout + "|" + Str(tw_buf(x))
Next X
Print Xout
Else
Print "ERROR"
End If
Else
Print "NACK"
End If
Na = ""
End If
End If
Loop
Timer0_ovf:
' ---- Timer_0 ----- Interrupt alle 1 mS ----------------
Timer0 = 194 ' Resrwert = 61
Incr T1x
If T1x > 9 Then
' -------- Zeitbasis 10 mS ------------------
Incr T2x
T1x = 0
If T2x = 8 Then Portb.5 = 0 ' Herzschlag-LED (ein)
If T2x > 9 Then
' -------- Zeitbasis 100 mS ------------------
Incr T3x
T2x = 0
If T3x > 9 Then
T3x = 0
' ------------- Zeitbasis 1 Sec -------------------
' Print "Status "
Portb.5 = 1 ' Herzschlag-LED (aus)
End If
End If
End If
Return
Return
Hier kann man die Kommandos am PC-Programm(RS232) und die eingelesenen Daten sehen
Lesezeichen