Variable übernimmt den Wert aus dem i2c- Empfangsarray nicht

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Variable übernimmt den Wert aus dem i2c- Empfangsarray nicht

      Hallo
      Meine I2C Übertragung läuft ,
      Im Empfangsarray steht der gesendete Wert.
      Variable übernimmt den Wert nicht

      Was mache ich falsch????
      Das Prog

      $regfile = "M328pdef.dat" ' the used chip
      $crystal = 16000000 ' frequency used
      $baud = 19200

      'Waitms 100



      ' --- Constante
      Const Eigene_slave_adr = &H20 ' Adresse evtl. Anpassen
      Const Maxanzahlbyte = 10 ' Wenn mehr Zeichen kommen werden diese verworfen !

      ' --- DIM
      ' --- I2C
      Dim Messagebuf(maxanzahlbyte) As Byte
      Dim Anzahlbuf As Byte ' Anzahl Zeichen die gesendet wurde
      Dim Neuemsg As Byte ' zeigt an wenn eine neue Message gültig ist
      Dim Twi_control As Byte ' Controlregister lokale kopie
      Dim Twi_status As Byte
      Dim Twi_data As Byte

      ' --- Servo
      Dim S_sol1 As Byte
      Dim S_sol2 As Byte
      Dim S_sol3 As Byte
      Dim S_sol4 As Byte
      Dim S_sol5 As Byte
      Dim S_sol6 As Byte



      ' --- Config
      Config Servos = 6 , Servo1 = Portc.0 , Servo2 = Portc.1 , Servo3 = Portc.2 , Servo4 = Portc.3 , Servo5 = Portc.6 , Servo6 = Portc.7 , Reload = 10
      Config Portc.0 = Output
      Config Portc.1 = Output
      Config Portc.2 = Output
      Config Portc.3 = Output
      Config Portc.6 = Output
      Config Portc.7 = Output

      Enable Interrupts

      ' --- Alias


      ' --- TWI init
      Gosub Twi_init_slave

      '$sim

      Twi_data = 0
      Neuemsg = 0 ' Paket ungültig
      Anzahlbuf = 0 ' Anzahl empfangener Bytes


      ' alle LEDs aus
      Print "{027}[2J{027}[1;1H"; ' ansi clear screen
      Print "I2C-Motorrechner-Test1.bas"

      Servo(1) = 100
      Servo(2) = 100
      Servo(3) = 100
      Servo(4) = 100
      Servo(5) = 100
      Servo(6) = 100

      S_sol1 = 100
      S_sol2 = 100
      S_sol3 = 100
      S_sol4 = 100
      S_sol5 = 100
      S_sol6 = 100




      Do
      Toggle Portd.4
      ' schauen ob TWINT gesetzt ist
      Twi_control = Twcr And &H80 ' Bit7 von Controlregister
      If Twi_control = &H80 Then
      Twi_status = Twsr And &HF8 ' Status
      Portd = Not Twi_status ' test auf die LEDs
      'Print "Status " ; Twi_status
      Select Case Twi_status
      'Slave Adress received, wir sind gemeint !
      Case &H60 :
      'Case &H20 :
      Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
      Anzahlbuf = 0
      Neuemsg = 0 ' Flag für Message ungültig
      ' Byte mit ACK
      Case &H80 :
      If Anzahlbuf < Maxanzahlbyte Then
      Incr Anzahlbuf ' zähler +1
      Messagebuf(anzahlbuf) = Twdr
      End If
      Twcr = &B11000100 ' TWINT löschen, erzeugt ACK

      ' Stop oder restart empfangen
      Case &HA0 :
      Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
      ' es müssen 3 Byte sein, damit das Paket OK ist
      If Anzahlbuf = 3 Then
      Neuemsg = 1 ' Flag für Message gültig
      Else
      Neuemsg = 0 ' Flag für Message ungültig
      End If

      ' letztes Byte mit NACK, brauchen wir nicht
      Case &H88 :
      Case &HF8 :
      ' Fehler, dann reset TWI
      Case &H00 :
      Print "Error=" ; Twcr
      Twcr = &B11010100 ' TWINT löschen, reset TWI
      ' was anderes empfangen, sollte nicht vorkommen
      Case Else :
      Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
      End Select
      End If
      ' ein gültiges Paket angekommen ?
      If Neuemsg = 1 Then
      Neuemsg = 0 ' Flag wieder löschen
      If Messagebuf(1) = "s" Then ' nur wenn das erste Zeichen ein "s" ist für Servo, tun wir was damit !
      If Messagebuf(2) = "1" Then
      S_sol1 = Messagebuf(3)
      Print S_sol1
      Servo(1) = S_sol1
      Elseif Messagebuf(2) = "2" Then
      S_sol2 = Messagebuf(3)
      Servo(2) = S_sol2
      End If
      Print "Servo" ; Messagebuf(2) ; "= " ; Messagebuf(3) ; " ; ist=" ; S_sol1
      End If
      Print S_sol2
      Print S_sol3
      Print S_sol4
      Print S_sol5
      Print S_sol6
      End If
      'Waitms 10
      Servo(1) = S_sol1
      Servo(2) = S_sol2
      Servo(3) = S_sol3
      Servo(4) = S_sol4
      Servo(5) = S_sol5
      Servo(6) = S_sol6




      Loop


      ' --- TWI als slave aktivieren
      Twi_init_slave:
      Twsr = 0 ' status und Prescaler auf 0
      Twdr = &HFF ' default
      Twar = Eigene_slave_adr ' Slaveadresse setzen
      Twcr = &B01000100 ' TWI aktivieren, ACK einschalten
      Return
      End
    • Du solltest aber schon die beiden Pins für I2C/TWI konfigurieren.
      Das fehlt in deinem Code.

      BASCOM-Quellcode

      1. Config Scl = Portc.5 ' we need to provide the SCL pin name
      2. Config Sda = Portc.4 ' we need to provide the SDA pin name
      3. I2cinit ' we need to set the pins in the proper state
      Und noch etwas am Rande, nutze für Quellcode die Schaltfläche </> im Editor-Fenster. Dann sieht der Code auch besser aus :)
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • @hft47 Vergiss den verher gehenden Beitrag (außer das unter den Code :) ).
      Dei Code ist der Slave, wie ich gerade festgestellt habe. Ich habe hier im Forum mal was gepostet für einen Slave ohne Kauf-Lib.

      BASCOM-Quellcode

      1. $regfile = "m8def.dat"
      2. $crystal = 8000000
      3. $hwstack = 64
      4. $swstack = 64
      5. $framesize = 64
      6. Declare Function Twi_wait() As Byte
      7. Config Portb.0 = Output
      8. Config Portb.1 = Output
      9. Config Portb.2 = Output
      10. Led_red Alias Portb.0
      11. Led_yel Alias Portb.1
      12. Led_gre Alias Portb.2
      13. Dim Twi_data As Byte
      14. Twi_data = 0
      15. Gosub Twi_init_slave 'TWI aktivieren
      16. 'Hauptschleife
      17. Do
      18. If Twi_wait() = &H80 Then 'Twi_data
      19. Select Case Twi_data
      20. Case 0 :
      21. Led_red = 1
      22. Led_yel = 0
      23. Led_gre = 0
      24. Case 1 :
      25. Led_red = 0
      26. Led_yel = 1
      27. Led_gre = 0
      28. Case 2 :
      29. Led_red = 0
      30. Led_yel = 0
      31. Led_gre = 1
      32. Case Else :
      33. Led_red = 0
      34. Led_yel = 0
      35. Led_gre = 0
      36. End Select
      37. End If
      38. Loop
      39. End
      40. 'TWI als slave aktivieren
      41. Twi_init_slave:
      42. Twsr = 0 'status und Prescaler auf 0
      43. Twdr = &HFF 'default
      44. Twcr = &B00000100 'erstmal nur TWI aktivieren
      45. Twar = &H80 'Slaveadresse setzen
      46. Twcr = &B01000100 'dann ACK einschalten
      47. Return
      48. 'schauen ob was gekommen ist, Status zurückgeben, Daten in globale variable
      49. Function Twi_wait() As Byte
      50. Local Twcr_local As Byte
      51. Twi_wait = &HF8
      52. Twcr_local = Twcr And &H80 'warten bis TWINT gesetzt ist
      53. If Twcr_local = &H80 Then
      54. Twi_data = Twdr 'Daten sichern
      55. Twi_wait = Twsr And &HF8 'status zurückgeben
      56. Twcr = Twcr Or &B10000000 'TWINT löschen, erzeugt ACK
      57. End If
      58. End Function
      Alles anzeigen
      Da hab ich allerding noch eine Funktion drin, die die Daten "abruft".

      Zwei AVR über TWI verbinden die Zweite
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Nach kurzer Pause Datenauswertung geändert.
      Jetzt läuft alles fast wie gewünscht. Nur leider lassen sich am Arduino-Nano die Ports A& und A7 nicht als Digitale Ausgänge verwenden.
      Muss mir was anderes einfallen Lassen.
      Anbei das laufende Prog.
      Danke an Alle die geholfen haben !!!
      MfG
      Friedhelm
      Dateien