www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Daten via I²C vom Master zum Slave und zurück


Autor: Michael Junge (michael-junge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich möchte gerne via I²C zwei Bytes vom Master (AtMega8) zum Slave 
(ebenfalls Mega8) übertragen, sowie ein Byte vom Slave zurück zum 
Master.
Die Kommunikation zwischen den beiden scheint auch zu funktionieren. Der 
Master findet den Slave, und das Senden eines einzelnen Bytes in je eine 
Richtung geht ebenfalls. Nur beim Versuch 2Bytes Master->Slave, 1Byte 
Slave <- Master geht es schief. Beim Slave kommen meist für das zweite 
Byte nur noch komische Werte an. Beispiel Byte1=50, Byte2=88, dann kommt 
beim Slave 50 und 67 an, oder 50 und 43.

Die Daten sollen nach Möglichkeit recht häufig übertragen werden, also 
am besten alle 10 msec, und ein Wait währe auch sehr unpassend.

Ich Programmiere mit BASCOM, die Codes für Master und Slave habe ich 
angehängt.

Würde mich sehr feuen, wenn mir jemand weiter helfen könnte.

Vielen Dank und schöne Grüße
Mike





Code im MASTER:



$regfile = "m8def.dat"                                      'ATmega8
$crystal = 3686411                                          '3690000  Angepasst für Zeitmessung      'für STK500
$baud = 19200








' #############################
' ### Variablen Deklaration ###
' #############################



Dim Byte1 As Byte
Dim Byte2 As Byte
Dim Return_byte As Byte

Dim I2c_address As Byte



' #########################
' ### I²C Konfiguration ###
' #########################
Config Scl = Portc.5                                        'Konfiguration der I²C Verbindung
Config Sda = Portc.4


I2cinit
Config Twi = 100000


' #########################
' ### LCD Konfiguration ###
' #########################
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2




' ########################################
' ### Scan I²C Bus nach Busteilnehmern ###
' ########################################

For I2c_address = 2 To 254 Step 2

  I2cstart
  I2cwbyte I2c_address

  If Err = 0 Then
    Exit For
  End If
Next
I2cstop





Byte1 = 50
Byte2 = 88


I2csend I2c_address , Byte1

I2csend I2c_address , Byte2

I2creceive I2c_address , Return_byte


Cls
Upperline
Lcd "send data"
Lowerline
Lcd "adr:"
Lcd I2c_address
Lcd "Err:"
Lcd Return_byte




Do
nop
Loop 






Code im SLAVE:

$regfile = "m8def.dat"                                      'ATmega8
$crystal = 4000000                                          '3690000  Angepasst für Zeitmessung      'für STK500
$baud = 19200


Dim Abfragebyte As Byte

Dim Byte1 As Byte
Dim Byte2 As Byte
Dim Return_byte As Byte
Dim Index As Byte




Config Twislave = &H70 , Btr = 1 , Bitrate = 100000
Config Scl = Portc.5                                        'Konfiguration der I²C Verbindung
Config Sda = Portc.4



' #########################
' ### LCD Konfiguration ###
' #########################
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2



Enable Interrupts


  Return_byte = 145
  Index = 1



Do


Cls
  Upperline
  Lcd Abfragebyte
  Lcd ":"
  Lcd Index
  Lowerline
  Lcd "By1:"
  Lcd Byte1
  Lcd "By2:"
  Lcd Byte2

Loop

End




















'A master can send or receive bytes.

'A master protocol can also send some bytes, then receive some bytes

'The master and slave must match.




'the following labels are called from the library

Twi_stop_rstart_received:


Return







Twi_addressed_goread:


Return







Twi_addressed_gowrite:


Return







'this label is called when the master sends data and the slave has received the byte

'the variable TWI holds the received value

Twi_gotdata:

   If Index = 1 Then
     Byte1 = Twi
     Incr Index
   Else
     Byte2 = Twi
     Index = 1
   End If


Return




'this label is called when the master receives data and needs a byte

'the variable twi_btr is a byte variable that holds the index of the needed byte

'so when sending multiple bytes from an array, twi_btr can be used for the index

Twi_master_needs_byte:


 Abfragebyte = Twi_btr

  Twi = Return_byte

                                                    ' twi must be filled with a value

Return







'when the mast has all bytes received this label will be called

Twi_master_need_nomore_byte:


Return 

  

Autor: xXx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du hast config=slave vergessen

Autor: Michael Junge (michael-junge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm, meinst Du das
Config Twislave = &H70 , Btr = 1 , Bitrate = 100000
 vielleicht?! ...steht beim Slave mit drin. Die Kommunikation 
funktioniert soweit ja auch, nur die Werte die beim Slave ankommen 
stimmen nicht immer.

Gruß Mike

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.