Nun das war`d nur mal eine Frage. Muss mich irgend wann mal damit beschäftigen, habe einige GLCD`s aus unserem Industrie Schrott gefischt.
Oki, einen schönen Sonntag noch!
MAT
Druckbare Version
Nun das war`d nur mal eine Frage. Muss mich irgend wann mal damit beschäftigen, habe einige GLCD`s aus unserem Industrie Schrott gefischt.
Oki, einen schönen Sonntag noch!
MAT
Hallo PicNick
jetzt hab ich noch eine Frage.
Das Vorhergehende war nur zum probieren. Im grunde genommen will ich folgendes machen:
1. Byte ist ein Befehl für ein anderen Slave(Master) =>nur lesen oder in eine Sub springen
2. Byte ist ein Infobyte das besagt was es für Daten sind
3. Byte soll dann die Daten beinhalten => und hier ist das Problem: die Daten sind kein Byte sondern ein Single!
Kann ich dieses genauso senden oder muss ich es erst mit overlay in einzelne Byte zerlegen?
MAT
Du mußt deine Messag z.B so aufbauen, wenn du als Daten Bytes, Words, singles oder doubles senden willst. Die genau sende-Länge mußt du allerdings selbst ausrechnen
Beispiel:
Dabei ist WORD und INTEGER ggf. natürlich das GleicheCode:DIM Befehl AS BYTE
DIM Info AS BYTE
DIM Datenbyte AS BYTE
DIM Datenword AS BYTE AT Datenbyte OVERLAY
DIM Datenlong AS BYTE AT Datenbyte OVERLAY
DIM Datensingle AS BYTE AT Datenbyte OVERLAY
DIM Datendouble AS BYTE AT Datenbyte OVERLAY
Twi_mt_data = Varptr(Befehl) ' ist immer gleich
Befehl = nnn ' was du magst
Info = 1
'-------------------------------------------
Datenbyte = 255 ' z.b
Info = 1
Twi_mt_cntr = 3 ' Befehl + Info + 1 Byte
gosub Run_wait_master
'-------------------------------------------
Datenword = 32768 ' z.b
Info = 2
Twi_mt_cntr = 4 ' Befehl + Info + word
gosub Run_wait_master
'-------------------------------------------
Datenlong = 41000000 ' z.b
Info = 3
Twi_mt_cntr = 6 ' Befehl + Info + long
gosub Run_wait_master
'-------------------------------------------
Datensingle = 3.14 ' z.b
Info = 4
Twi_mt_cntr = 6 ' Befehl + Info + single
gosub Run_wait_master
'-------------------------------------------
Datendouble = 3.1487967499 ' z.b
Info = 5
Twi_mt_cntr = 10 ' Befehl + Info + double
gosub Run_wait_master
Beim Slave das Gegenstück
Bei Dir könnte der Empfänger den Datentype eigentlich auch aus der Länge der Message entnehmen, die gibt ja weitgehend Aufschluss, was es istCode:twi_sr_data = VARPTR(Befehl)
---etc-etc----
If Twi_slv_flag = &H60 Then
select case Info
case 1: print Datenbyte
case 2: print Datenword
case 3: print Datenlong
case 4: print Datensingle
case 5: print Datendouble
Hallo Robert,
nun habe ich mir eine weiter Platine mit einer TWI Funktion gebaut und habe versucht diese beiden mit unterschiedlicher Adresse anzusprechen. Leider meldet sich nur einer auf einen Befehl.
Ich seh langsam nicht mehr durch.... ](*,)
Wie erkennt der Controller das die Information für ihn bestimmt ist? Ausgehend ddavon ist doch so, dass alle Controller am bus mithören und wenn ihre Adresse kommt auch er dann antwortet.
Nun ich sehe in dem Code aber nicht die Funktion, nur die Case &H60 Funktion. Dem nach würde ich darauf schließen das alle Controller oder der erste an dem die Info geschickt wird dem Master zurückschickt, dass sie eine Info bekommen haben, auch wenn sie nicht für sich bestimmt war? Oder schickt nur der jenige ein Ack zu dem die Adresse gehört?
Vom Code her hatte ich zwei Slave mit der gleichen Software beschrieben (siehe oben) nur mit unterschiedlichen Adressen, dabei konnte ich aber nur einen Controller ansprechen...
Kannst Du dies einwenig näher beschreiben oder was mache ich falsch?
Danke und Gruß MAT
Die Adress-Erkennung und das ACK, wenn es passt, macht schon die TWI-Hardware
nur der kriegt twi-slv-flag &H60. diese Zahl kommt auch von der Hardware und ist eindeutig, da können wir beide nix falsch machen.
Dein Effekt ist seltsam. Du mußt feststellen, ob das auch oder nur dann auftritt, wenn mehrere angeschlossen sind.
Dann werd ich mich noch einmal hinsetzen müssen und meinen Code überprüfen sowie die Hardware.
Ist die Variable "Twi_mst_addr" das TWI Register vom Controller? Oder durch welche Variable wird wo in Deinem Programm die TWI Adresse festgelegt?
Parallel werd ich mir noch mal das Datenblatt zum M8 zur Hand nehmen.
Werde mich jetzt in den Zug setzen....Die Arbeit ruft :-s
Schönen Sontag Dir noch!
https://www.roboternetz.de/wissen/in...etup_als_Slave
Das eigentliche Hardware-Adress-Register heisst "TWAR"
"Twi_mst_addr" ist die Ziel-Adresse, wenn man als Master was wegschickt.
Ich habe gelesen das 128 mögliche Slaves adressiert werden kann. Von wo bis wohin, oder besser wie kann ich Adressen für einen Slave vergeben?
alle geraden Zahlen von &H02 - &HFE
Meist muss man aber den anderen Geräten ausweichen, die man sonst noch dranhängen hat.
Kommt also darauf an, was du alles verwenden willst.
https://www.roboternetz.de/wissen/in...iger_I2C_Chips
Hallo Robert,
nun sitze ich schon wieder den halben Tag... Inzwischen kann ich beide Slaves ansprechen und sie senden auch. Besser einer schickt seine Info an den Slave, der zweite schickt auch seine Info (lt. rs232 Ausgabe sagt er mir: Master sent: 6C 1F) aber leider kommt immer nur eine 0!?
Ich habe den identischen Code für die 2 Slaves, woran kann das liegen?
Slave Nr.2 bei dem es nicht funst:
und Slave1:Code:$regfile = "m8def.dat"
$crystal = 16000000
$include "MyTWI.bas" 'dafür wird noch die MyTWI.lib benötigt
$baud = 19200
$hwstack = 80
$swstack = 80
$framesize = 80
'------------------------------------------------------------------------------- Configuration DS1820
Config 1wire = Portd.4
Dim Ar1(2) As Byte
Dim Temp1 As Byte
'------------------------------------------------------------------------------- Timer0 aktivieren
'------------------------------------------------------------------------------- lokale I2C Adresse (als Slave)
Const Mn1_adr = &H6C
'------------------------------------------------------------------------------- fremde I2C Adresse (als Master)
Const Mn2_adr = &H6A
Dim Twi_mst_buff(24) As Byte 'Buffer für Masterfunktionen
Dim Twi_slv_buff(24) As Byte 'Buffer für Slavefunktionen
'------------------------------------------------------------------------------- TWI Variablen
Dim Temp As Byte , Temp3 As Byte
Dim Temp2 As Byte
Twi_slv_addr = Mn1_adr 'lokale I2C-Adresse
Twi_sr_data = Varptr(twi_slv_buff(1)) 'datenbuffer empfang
Twi_st_data = Varptr(twi_slv_buff(1)) 'datenbuffer senden
Twar = Twi_slv_addr + 1 'I2C Adress Mega32 + GCA
Config Twi = 100000 'I2C Speed
On Twi Twi_mst_slv_isr , Nosave 'ISR f. TWI
Gosub Twi_sense 'Aktivieren Slave-Funktion
Enable Timer2 'Timer
Enable Interrupts 'Generell
'******************************************************************************* Hauptprogramm
Do
'******************************************************************************* Sensor 1
1wreset 'reset
1wwrite &HCC ' read internal RAM
1wwrite &HBE ' read 9 data bytest '300 'warten bis convert T fertig ist
Ar1(1) = 1wread(2)
1wreset
Temp1 = Makeint(ar1(1) , Ar1(2))
Temp1 = Temp1 / 2 'Ar(1)
Temp2 = Temp1
'******************************************************************************* TWI Betrieb
'praktisches Beispiel zu Anzeige der Daten, werden im Prog nicht benötigt bis auf die Flagabfrage
'Twi_slv_flag =
' * 0 Keine Slave Aktion hat stattgefunden
' * &H60 Daten wurden empfangen. Sie stehen im Buffer mit der Länge Twi_sr_cntr
' * &HA8 Daten wurden gesendet. Sie stehen im Buffer mit der Länge Twi_st_cntr
' * &H70 Gca -daten Wurden Empfangen.
If Twi_slv_flag <> 0 Then
Select Case Twi_slv_flag
Case &H60 : Print Spc(30) ; "als SLAVE receivd:" ; 'es ist was empfangen worden
Print Hex(twi_slv_addr) ; " ";
For Temp = 1 To Twi_sr_cntr
Print Twi_slv_buff(temp)
Temp3 = Twi_slv_buff(temp) ' Hex(twi_slv_buff(temp)); 'print der Daten
Print "temp1" ; Temp1
Next
Case &HA8 : Print Spc(30) ; "als SLAVE transmit:" ; 'es ist was abgeholt worden
Print Hex(twi_slv_addr) ; " ";
For Temp = 1 To Twi_st_cntr
Print Twi_slv_buff(temp) 'Hex(twi_slv_buff(temp)); 'print der Daten
Next
Case &H70 : Print Spc(30) ; "SLAVE GCA :" ; 'ein General Call ist gekommen
Print Hex(twi_slv_addr) ; " ";
For Temp = 1 To Twi_sr_cntr
Print Hex(twi_slv_buff(temp)); 'print der Daten
Next
Case Else:
Print Chr(7) ; 'Irgendein Fehler
End Select
Twi_slv_flag = 0 'löschen marker
Twi_slv_stat = 0 'löschen marker
Gosub Twi_sense 'alles wieder enablen
'und Bus freigeben
End If
' Print "DatenM" ; Twi_slv_buff(temp)
'Print Spc(30) ; Temp3
'******************************************************************************* nach Datenempfang als Slave umschalten auf Master und Daten senden
If Temp3 = 26 Then
Print "empfange komando" 'ist Masteranforderung 25 dann schicke Temperatur1
Gosub Master_transmit 'Senden in einer SUB
Temp3 = 0
Twi_sr_cntr = 0 'ja
'
End If
1wwrite &HCC : 1wwrite &H44 ' start measure
Loop
End
'############################################################################### 1 mS Ticker =>Timerroutine wird in der .Lib benötigt
'###############################################################################
Run_wait_master:
Print "versuche zu senden"
Gosub Mst_start 'aufruf
Select Case Twi_mst_flag 'ergebnis ?
Case Twi_m_sent: 'gesendet
Print "<<<<<<MASTER sent:" ;
Print Hex(twi_mst_addr) ; " ";
For Temp = 1 To Twi_mt_cntr
Print Hex(twi_mst_buff(temp1));
Next
Twi_mst_flag = 0
Case Twi_m_recv: 'geholt
Print ">>>>>>MASTER read:" ;
Print Hex(twi_mst_addr) ; " ";
For Temp = 1 To Twi_mr_cntr
Print Twi_mst_buff(temp1); 'Hex(twi_mst_buff(temp));
Next
Twi_mst_flag = 0
Case Else: 'irgendein Problem
Print Chr(7) ; Hex(twi_mst_addr) ; " ";
End Select
Return
'############################################################################### Sendesub
' Beispiel 8 byte senden,
' dann mit Rep.Start von gleicher adresse 3 Byte empfangen
'Nur senden
'Twi_mst_addr = Mn2_adr 'I2C adresse ZIEL
'Twi_mt_cntr = 8 ' 8 Byte senden
'Twi_mt_data = Varptr(twi_mst_buff(1)) ' Daten
'Twi_mr_cntr = 0
'Nur abholen
'Twi_mst_addr = Mn2_adr + 1 'I2C adresse ZIEL (+R)
'Twi_mr_cntr = nn ' wieviele Byte
'Twi_mr_data = Varptr(twi_mst_buff(1)) ' empfangsbuffer
Master_transmit:
' sende buffer (mit testdaten) füllen
'For Temp = 1 To 1
Twi_mst_buff(temp1) = Temp1 'Temperatur Sensor1
' Next
Twi_mst_addr = Mn2_adr 'I2C adresse
Twi_mt_cntr = 1 '8 ' erstmal 8 Byte senden
Twi_mt_data = Varptr(twi_mst_buff(1)) ' adresse Daten
Twi_mr_cntr = 0
'Twi_mr_cntr = 1 ' dann 3 Byte empfangen
'Twi_mr_data = Varptr(twi_mst_buff(1)) ' empfangsbuffer
Gosub Run_wait_master ' auf gehts
Return
Code:
$regfile = "m8def.dat"
$crystal = 14318181
$include "MyTWI.bas" 'dafür wird noch die MyTWI.lib benötigt
$baud = 9600
$hwstack = 80
$swstack = 80
$framesize = 80
'-----------------2x20 LCD Display an Port c =>Conector -------------------------------------------------------------------------------------------------
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portb.2 , Rs = Portb.0 ' Pinbelegung "LCD-Port)"
' SV2 1 2 3 4 6 8 ' Pinbelegung SV9 Board
Config Lcd = 20 * 4
Config Lcdbus = 4
Initlcd
Cursor Off
Cls
'------------------------------------------------------------------------------- Configuration DS1820
Config 1wire = Portb.1
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(2) As Byte
Dim Ar2(2) As Byte
Dim Temp1 As Byte
Dim Temp2 As Byte
Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()
'------------------------------------------------------------------------------- Timer0 aktivieren
'------------------------------------------------------------------------------- lokale I2C Adresse (als Slave)
Const Mn1_adr = &H6E
'------------------------------------------------------------------------------- fremde I2C Adresse (als Master)
Const Mn2_adr = &H6A
Dim Twi_mst_buff(24) As Byte 'Buffer für Masterfunktionen
Dim Twi_slv_buff(24) As Byte 'Buffer für Slavefunktionen
'------------------------------------------------------------------------------- TWI Variablen
Dim Temp As Byte , Temp3 As Byte
Twi_slv_addr = Mn1_adr 'lokale I2C-Adresse
Twi_sr_data = Varptr(twi_slv_buff(1)) 'datenbuffer empfang
Twi_st_data = Varptr(twi_slv_buff(1)) 'datenbuffer senden
Twar = Twi_slv_addr + 1 'I2C Adress Mega32 + GCA
Config Twi = 400000 'I2C Speed
On Twi Twi_mst_slv_isr , Nosave 'ISR f. TWI
Gosub Twi_sense 'Aktivieren Slave-Funktion
Enable Timer2 'Timer
Enable Interrupts 'Generell
'******************************************************************************* Hauptprogramm
Do
'******************************************************************************* Sensor 1
1wreset 'reset
1wwrite &H55 'Match Rom command
1wwrite Id1(1) , 8 'Id von Sensor 1
1wwrite &H44 'Convert T
'300 'warten bis convert T fertig ist
1wreset 'reset
1wwrite &H55 'match rom command
1wwrite Id1(1) , 8 'id von sensor 1
1wwrite &HBE
Locate 1 , 14
Ar1(1) = 1wread(2)
Temp1 = Makeint(ar1(1) , Ar1(2))
Temp1 = Temp1 / 2 'Ar(1)
Lcd "Out1:" ; Temp1
'******************************************************************************* Sensor2
1wreset 'reset
1wwrite &H55 'Match Rom command
1wwrite Id2(1) , 8 'Id von Sensor 2
1wwrite &H44 'Convert T
' 300 'warten bis convert T fertig ist
1wreset 'reset
1wwrite &H55 'match rom command
1wwrite Id2(1) , 8 'id von sensor 2
1wwrite &HBE 'scratchpad lesen
Locate 2 , 14
Ar2(1) = 1wread(2)
Temp2 = Makeint(ar2(1) , Ar2(2))
Temp2 = Temp2 / 2
Lcd "Out2:" ; Temp2
'******************************************************************************* TWI Betrieb
'praktisches Beispiel zu Anzeige der Daten, werden im Prog nicht benötigt bis auf die Flagabfrage
'Twi_slv_flag =
' * 0 Keine Slave Aktion hat stattgefunden
' * &H60 Daten wurden empfangen. Sie stehen im Buffer mit der Länge Twi_sr_cntr
' * &HA8 Daten wurden gesendet. Sie stehen im Buffer mit der Länge Twi_st_cntr
' * &H70 Gca -daten Wurden Empfangen.
If Twi_slv_flag <> 0 Then 'ständige Abfrage ob als Slave Daten anliegen =>Vorsicht, der Bus ist solange blockiert
Select Case Twi_slv_flag
Case &H60 :
Locate 1 , 1
Lcd ; "SLVrecv" ; 'es ist was empfangen worden
Locate 1 , 9
Lcd Hex(twi_slv_addr) ; " "; 'von Adresse in Hex
For Temp = 1 To Twi_sr_cntr 'Daten aus Twi_sr_cntr in den puffer schreiben
Locate 1 , 11
Lcd Hex(twi_slv_buff(temp)); 'print der Daten
Temp3 = Twi_slv_buff(temp)
Next
Case &HA8 :
Locate 2 , 1
Lcd ; "SLVtran" ; 'es ist was abgeholt worden Spc(30)
Locate 2 , 9
Lcd Hex(twi_slv_addr) ; " ";
For Temp = 1 To Twi_st_cntr
Locate 2 , 11
Lcd Twi_slv_buff(temp); 'print der Daten Hex(twi_slv_buff(temp));
Next
End Select
Locate 4 , 1
Lcd Twi_mst_flag
Twi_slv_flag = 0 'löschen marker
Twi_slv_stat = 0 'löschen marker
Gosub Twi_sense 'alles wieder enablen
'und Bus freigeben
End If
Locate 4 , 6
Lcd "DatenM" ; Twi_slv_buff(temp)
'******************************************************************************* nach Datenempfang als Slave umschalten auf Master und Daten senden
Locate 4 , 19
Lcd Temp3
If Temp3 = 25 Then 'ist Masteranforderung 25 dann schicke Temperatur1
Gosub Master_transmit 'Senden in einer SUB
Temp3 = 0
Twi_sr_cntr = 0 'ja
'
End If
Loop
End
'############################################################################### 1 mS Ticker =>Timerroutine wird in der .Lib benötigt
'###############################################################################
Run_wait_master:
Gosub Mst_start 'aufruf
'( Select Case Twi_mst_flag 'ergebnis ?
Case Twi_m_sent:
Locate 3 , 1 'gesendet
Lcd "<<MASTsent:" ; Hex(twi_mst_addr) ; " ";
For Temp = 1 To Twi_mt_cntr
Locate 3 , 14
Lcd Twi_mst_buff(temp);
Next
Twi_mst_flag = 0
Case Twi_m_recv:
Locate 4 , 1 'geholt
Lcd ">>MASTread:" ; Hex(twi_mst_addr) ; " ";
For Temp = 1 To Twi_mr_cntr
Locate 4 , 14
Lcd Twi_mst_buff(temp); 'Hex(twi_mst_buff(temp))
Next
Twi_mst_flag = 0
'Case Else: 'irgendein Problem
'Print Chr(7) ; Hex(twi_mst_addr) ; " ";
'Call Twi_show_state(twi_mst_flag)
End Select
')
Return
'############################################################################### Sendesub
' Beispiel 8 byte senden,
' dann mit Rep.Start von gleicher adresse 3 Byte empfangen
'Nur senden
'Twi_mst_addr = Mn2_adr 'I2C adresse ZIEL
'Twi_mt_cntr = 8 ' 8 Byte senden
'Twi_mt_data = Varptr(twi_mst_buff(1)) ' Daten
'Twi_mr_cntr = 0
'Nur abholen
'Twi_mst_addr = Mn2_adr + 1 'I2C adresse ZIEL (+R)
'Twi_mr_cntr = nn ' wieviele Byte
'Twi_mr_data = Varptr(twi_mst_buff(1)) ' empfangsbuffer
Master_transmit:
' sende buffer (mit testdaten) füllen
For Temp = 1 To 1
Twi_mst_buff(temp1) = Temp1 'Temperatur Sensor1
Next
Twi_mst_addr = Mn2_adr 'I2C adresse
Twi_mt_cntr = 1 '8 ' erstmal 8 Byte senden
Twi_mt_data = Varptr(twi_mst_buff(1)) ' adresse Daten
Twi_mr_cntr = 0
'Twi_mr_cntr = 1 ' dann 3 Byte empfangen
'Twi_mr_data = Varptr(twi_mst_buff(1)) ' empfangsbuffer
Gosub Run_wait_master ' auf gehts
Return