- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: TWI Multimaster Übertragung von Singlewerte auch allgemein

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381

    TWI Multimaster Übertragung von Singlewerte auch allgemein

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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:
    Code:
    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

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    So, wie du es begonnen hast, nur, für die TWI Slave Library brauchst du die Overlaygeschichte nicht
    Beispiel, 3 single-Werte
    Code:
    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.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    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?

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    ...
    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?

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    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!

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    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.
    Code:
       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

    Code:
       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?
    Code:
    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

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Wenn dich dein Master die 3 Singles vom Slave HOLEN wollte:
    Code:
    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)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    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?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test