PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : TWI Multimaster Übertragung von Singlewerte auch allgemein



mat-sche
11.05.2009, 17:44
Hallo!

Man(n) kann sich ja nun zu jedem Bussystem ein eigenes Busprotokoll ausdenken.
Ich speziell nehme den I2C Bus. Nun möchte ich 2-3 Singlewerte übertragen.
Das heißt, der Slave hat als Bsp. 3 Temperaturwerte die ich mit dem Master abrufen will. Bis jetzt mache ich das das ganz für einen Wert gut über dem overlay Befehl:


Dim Temp3 As Single
Dim Tempbuff(2) As Byte At Temp3 Overlay

' jetzt lade ich den Singlewert in den Slavebuffer

For Temp = 1 To 4

Twi_slv_buff(temp) = Tempbuff(temp)
Next Twi1


WIe kann ich nun mehrer Singelwerte so übertragen, dass ich sie beim Empfänger wieder zusammen setzen kann und wieder nen Single daraus machen kann?

Danke & Gruß

MAT

PicNick
11.05.2009, 19:49
So, wie du es begonnen hast, nur, für die TWI Slave Library brauchst du die Overlaygeschichte nicht
Beispiel, 3 single-Werte


Dim Temp1 As Single
Dim Temp2 As Single
Dim Temp3 As Single

Senden:
Twi-mst-addr = &Hxx ' Slave i2c addr.
Twi-Mt-Data = VARPTR(Temp1) ' addresse 1.single
Twi-Mt-cntr = 12 '( 3 singles -> 3*4 -> 12 Byte)
gosub twi-run-master
'--------------------------------------------

Empfangen-define:
Twi-slv-addr = &Hxx ' Slave i2c addr.
Twi-sr-Data = VARPTR(Temp1) ' addresse 1.single


# wenn dann irgendwann im twi-slv-flag "&H60" steht, befinden sich die 3 singles schon dort, wo sie hingehören.
twi-sr-cntr = 12 , das ist die Anzahl, die der Master geschickt hat.

mat-sche
12.05.2009, 15:10
Hallo PicNick,

gut, das habe ich soweit verstanden. Nur wie bekomme ich jetzt die einzelnen Singelwerte aus dem "Twi-sr-Data" wieder heraus?
Muss ich jetzt die 4 Byts eines Singles in eine neue Variable schreiben und diese als Single deklarieren?
Aber wie?

PicNick
12.05.2009, 15:22
Wenn der Slave definiert:

Twi-sr-Data = VARPTR(Temp1) ' addresse 1.single

dann werden die Empfangsdaten direkt in die 3 singles reingeschrieben.
Da muss man garnix mehr machen.

TWI-SR-DATA beinhaltet die Adresse der Empfangsdaten. Das kann ein buffer sein, aber eben auch irgendwelche Variablen, Hauptsache, sie stehen in der richtigen reihenfolge und hintereinander im SRAM
das ist dann gegeben, wenn die DIM's auch hintereinander stehen.

mat-sche
12.05.2009, 17:44
...
das heißt, dass wenn ich:
Dim Temp1 As Single
Dim Temp2 As Single
Dim Temp3 As Single
angebe und es werden Daten empfangen, stehen nur die Adressen in Twi-sr-Data = VARPTR(Temp1)?
Kann ich jetzt ohne weiteres mit den Temp1/2/3 weiterarbeiten oder muss ich diese vorher noch in eine andere Variable übertragen?

PicNick
13.05.2009, 10:34
Bei Empfang schreibt die Library das Byte auf die Adresse, die in twi-sr-data steht. Das nächste dann auf twi-sr-data + 1 usw.
d.h nach 3*4 bytes haben die 3 singles denselben Inhalt wie die 3 singles des Masters.
Die kann man direkt verwenden, ohne irgendeine Umwandlung

mat-sche
13.05.2009, 11:49
Hi,

sehr gut! Habe gestern dann noch mitbekommen das ich es so schon in meinem Code nutze, die Empfängerseite ist nun geklärt.
Danke!

mat-sche
16.05.2009, 10:05
Hi Picnick,

jetzt bin ich doch noch über ein Rätsel gefallen:

* wenn ich von einem Slave einige Byte abholen möchte müssen diese ja dann im Slave irgendwie bereit gestellt werden.


Twi_mst_addr = Mn2_adr 'I2C adresse ZIEL
Twi_mt_cntr = 8 ' 8 Byte senden
Twi_mt_data = Varptr(twi_mst_buff(1)) ' Daten



=> hier schicke ich dem Slave 8 byte... verstanden



Twi_mr_cntr = 3 ' dann 3 Byte empfangen
Twi_mr_data = Varptr(twi_mst_buff(1)) ' empfangsbuffer
Gosub Run_wait_master ' noch eine SUB


=> hier hole ich mir 3 byte, wie muss nun im Slave der Code aussehen, um 3 bestimmte Bytes zu holen?
Bzw. ich habe 3 Singles hintereinander und dann noch mal 3 Bytes die abgeholt werden sollen, wie und wo im Slave muss ich diese anordnen/bereitstellen?

Vielleicht hab ich es schon gefunden?!

=> Twi_st_data = Varptr(twi_slv_buff(1)) 'datenbuffer senden

die Daten, welche abgeholt werden sollen, stehen im twi_slv_buff(1)?

Wenn ja, müsste ich es so machen?



Dim Temp1 As Single
Dim Temp2 As Single
Dim Temp3 As Single
Dim Byte1 As Byte
Dim Byte2 As Byte
Dim Byte3 As Byte

Twi_slv_addr = Mn1_adr 'lokale I2C-Adresse
Twi_sr_data = Varptr(twi_slv_buff(1)) 'datenbuffer empfang
Twi_st_data = Varptr(Temp1) 'datenbuffer senden


Danke und Gruß
MAT

PicNick
16.05.2009, 15:20
Wenn dich dein Master die 3 Singles vom Slave HOLEN wollte:


MASTER:------------------------------------------------------
TWI-MR-CNTR = 12
TWI-MR-DATA = VARPTR(Temp1)
Gosub Run_wait_master

SLAVE:------------------------------------------------------
TWI-ST-DATA = VARPTR(Temp1)
----- wenn jetzt ein Master LIEST, kriegt er die Singles (direkt)

mat-sche
16.05.2009, 17:25
ok, das hatte ich schon so in meinen Code eingebaut, jedoch noch nicht getestet. Dann habe ich jetzt alles geschnallt!

Aber noch eine Frage:

mit Dim Twi_mst_buff(24) As Byte lege ich doch den puffer mit 24 Byte an. Wie kann ich jetzt z.Bsp. jetzt das 19. Byte in eine andere Variable stecken?

Etwa so:

Dim Twi_mst_buff(24)
dim byte1 as byte

do
byte1 = Twi_mst_buff(19)
loop

Wenn ja, ist dies auch so einfach mit einem Single/ Word?

PicNick
16.05.2009, 17:47
Solange es um Bytes geht, kein Problem. Wenn es aber um word, integer oder singles geht, muss man den Bascom so oder so oder anders irgendwie austricksen.
Einen Bytearray (tabelle) als soz. neutralen Buffer zu verwenden macht Sinn, wenn a priori nicht weiss, was da aktuell so reinkommt.
Aber meistens weiss man ja, was kommt, und dann ist es besser, gleich die richtigen Variablen als Empfangsbereich zu verwenden.
Also, z.B :
Du holst dir vom Slave ein Byte, 3 Singles und ein Word in dieser Reihenfolge
Dann Definierst du
DIM s_byte AS BYTE
DIM s_sing1 AS SINGLE
DIM s_sing2 AS SINGLE
DIM s_sing3 AS SINGLE
DIM s_word AS WORD

Und dann
TWI-MR-CNTR = 15
TWI-MR-DATA = VARPTR(s_byte)

dann brauchst du nachher nix mehr rumzuschippern.

Das gleiche macht der slave
TWI-ST-DATA = VARPTR(s_byte)

dann kann der Slave direkt in die Variablen reinschreiben
der Master nach dem Lesen kann die Variablen direkt 1:1 verwenden.


Btw:
Um aus einem Byte-Array von beliebiger stelle ein Single rauszuholen, kann man


DIM s_single AS SINGLE ' da soll's rein
DIM s_byte(4) AS BYTE AT s_single OVERLAY
s_Byte(1) = twi_mst_buff(19)
s_Byte(2) = twi_mst_buff(20)
s_Byte(3) = twi_mst_buff(21)
s_Byte(4) = twi_mst_buff(22)

mat-sche
16.05.2009, 19:40
momentan läuft in meinem Code gar nichts mehr was TWI betrifft. werde morgen nochmal in Ruhe alles durchschauen.
Danke bis dahin!
Schöne Sonnabend noch!
MAT