PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Slave-Master-Slave übertragung geht nicht



Dämmi
28.10.2008, 18:51
Hallo

Ich möchte einfach nur Daten von Mikrokontroller 1 (Slave) zu yC 2 (Master) senden dieser soll dies erkennen und dann neue Daten zu yC 3 (slave) senden.
Leider Funktioniert dies bei meinem angehängten Programm nicht die Daten kommen von yC 1 zwar bei yC 2 an aber danach geht nichts mehr warum?

yC 1:

'-----------------------------Registrierung-------------------------------------
$regfile = "m32def.dat" 'Konfiguration auf ATmega 32
$include "MyTWI.bas"

$crystal = 16000000 'Quarztakt 16MHz
$baud = 9600
Config Twi = 400000

$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40

$eeprom

I2cinit
Declare Sub Twi_slave_sendet_byte(byval Variable As Byte)

'-----------------------------Configuration-------------------------------------

Config Porta = Input
Config Portb = Input
Config Portd = Output
'-----------------------------Dimensionierung-----------------------------------

Dim Slaveadress As Byte
Dim Neuesbyte As Bit
Dim Status As Bit
Dim Twi_control As Byte
Dim Twi_status As Byte
Dim Var As Byte
Dim Varsend As Byte
Dim Twi_slv_data(1) As Byte
Dim Slave_mode As Byte
Dim Tmp As Byte
Dim Flanke1 As Bit
Dim Impuls1 As Bit
Dim Senden1 As Byte

'-----------------------------Vorkonfiguration----------------------------------
Slaveadress = &H42
Twi_slv_data(1) = Slaveadress
Twi_slv_addr = Slaveadress
Twi_sr_data = Varptr(slave_mode) 'datenbuffer empfang
Twi_st_data = Varptr(twi_slv_data(1)) 'datenbuffer senden

Twar = Twi_slv_addr 'I2C Adress Mega32 + GCA
Config Twi = 400000 'I2C Speed
On Twi Twi_mst_slv_isr , Nosave

Gosub Twi_sense 'Aktivieren Slave-Funktion
Enable Interrupts

Led1 Alias Portd.2
Tast1 Alias Pinb.0

Led1 = 1


Senden1 = &H11

'-----------------------------Hauptprogramm--------------------------------------
Do

If Tast1 = 1 And Flanke1 = 0 And Impuls1 = 0 Then

Led1 = 0
Flanke1 = 1

Do
Call Twi_slave_sendet_byte(senden1)
Loop Until Status = 1
Waitms 200
End If

If Tast1 = 1 And Flanke1 = 1 And Impuls1 = 0 Then

Led1 = 1
Flanke1 = 0

Do
Call Twi_slave_sendet_byte(senden1)
Loop Until Status = 1
Waitms 200
End If

If Tast1 = 0 Then Impuls1 = 0

Loop
End

'unterprogramme

Slave_empfaengt_byte:

If Twi_slv_flag <> 0 Then
Select Case Twi_slv_flag
Case &H60 :
Var = Slave_mode 'es ist was empfangen worden

Case &HA8 : 'daten sind abgeholt worden
For Tmp = 1 To 1
Twi_slv_data(tmp) = 0 ' also löschen ?
Next
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

Sub Twi_slave_sendet_byte(variable As Byte)

Status = 0

' schauen ob TWINT gesetzt ist
Twi_control = Twcr And &H80 ' Bit7 von Controlregister

If Twi_control = &H80 Then
Twi_status = Twsr And &HF8 ' Status

' will der Master ein Byte haben
If Twi_status = &HA8 Or Twi_status = &HB8 Then
Twdr = Variable
Status = 1 ' neue Daten ausgeben
End If

' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
Twcr = &B11000100 ' TWINT löschen, mit ACK
End If

End Sub
End If

yC 2:

'-----------------------------Registrierung-------------------------------------

$regfile = "m32def.dat" 'Konfiguration auf ATmega 32
$lib "i2c_twi.lbx"

$crystal = 16000000 'Quarztakt 16MHz
$baud = 9600
Config Twi = 400000

$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40

$eeprom

I2cinit
Declare Function Twi_read_byte(byval Slave As Byte) As Byte ' default use 40 for the frame space

'-----------------------------Configuration-------------------------------------

Config Porta = Output
Config Portb = Output
Config Portc = Input
'-----------------------------Dimensionierung-----------------------------------

Dim Slave As Byte
Dim Twi_status As Byte
Dim Twi_read_byte As Byte
Dim Twi_control As Byte
Dim Error As Bit
Dim Flanke1 As Bit
Dim Impuls1 As Bit
Dim Progmodus As Bit
Dim Emfaengt As Byte

Led1 Alias Portb.0
Led2 Alias Porta.0
Led3 Alias Porta.1
Tast1 Alias Pinc.3

'-----------------------------Vorkonfiguration----------------------------------

Led1 = 1
Led2 = 1
Led3 = 1

'-----------------------------Hauptprogramm--------------------------------------
Do

Emfaengt = Twi_read_byte(&H42)

If Emfaengt = &H11 Then

Led2 = 0
I2cstart
I2cwbyte &H40
I2cwbyte &H20
I2cstop
Waitms 1

End If

Loop
End

'Unterprogramme



' TWI read_byte
' holt ein Byte und schliesst die Übertragung ab
Function Twi_read_byte(slave As Byte) As Byte
Error = 0 ' Fehler zurücksetzen

Twi_read_byte = 0 ' Wert vorbelegen

' Startbedingung
Twcr = &B10100100 ' TWINT

' warten bis TWINT gesetzt ist
Gosub Twi_wait_int

' wenn Zugriff auf den Bus erlaubt, Slaveadresse ausgeben
If Twi_status = &H08 Or Twi_status = &H10 Then
Twdr = Slave Or &H01 ' slave adresse + Read
Twcr = &B10000100 ' TWINT löschen, Byte senden

' warten bis TWINT gesetzt ist
Gosub Twi_wait_int

' Slave hat sich gemeldet
If Twi_status = &H40 Then
Twcr = &B10000100 ' TWINT löschen, Byte senden
' kein ACK (TWEA = 0) senden, weil wir nur ein Byte lesen wollen

' warten bis TWINT gesetzt ist
Gosub Twi_wait_int

' ein Byte wurde empfangen
If Twi_status = &H58 Or Twi_status = &H50 Then
Twi_read_byte = Twdr ' Daten lesen
Error = 0 ' kein Fehler
Else
Error = Twi_status ' Fehler
End If

Else
' kein slave
Error = Twi_status ' Fehler
End If

' STOPbedingung kommt hier immer im Ablauf, egal welcher Status
Twcr = &B10010100 ' TWINT löschen, STOP senden
' nach einem STOP wird TWINT nicht mehr gesetzt,
' man darf/kann also nicht darauf warten !

Else
' Bus belegt, wird er wieder freigegeben
Twcr = &B10000100 ' TWINT löschen, Bus freigeben
Error = Twi_status ' Fehler
End If

End Function

' warten bis TWINT gesetzt ist, status auslesen
Twi_wait_int:
Do
Twi_control = Twcr And &H80
Loop Until Twi_control = &H80

Twi_status = Twsr And &HF8 ' status
' status nur zu Debugzwecken ausgeben, weil Bus sehr langsam wird !
' Print "Err " ; Hex(twi_status)
Return

yC 3:

'-----------------------------Registrierung-------------------------------------
$regfile = "m32def.dat" 'Konfiguration auf ATmega 32
$include "MyTWI.bas"

$crystal = 16000000 'Quarztakt 16MHz
'$baud = 9600
Config Twi = 400000

$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40

$eeprom

I2cinit
Declare Sub Twi_slave_sendet_byte(byval Variable As Byte)

'-----------------------------Configuration-------------------------------------

Config Portb = Input
Config Portd = Output
Config Porta = Input

'-----------------------------Dimensionierung-----------------------------------


Dim Slaveadress As Byte
Dim Neuesbyte As Bit
Dim Status As Bit
Dim Twi_control As Byte
Dim Twi_status As Byte
Dim Var As Byte
Dim Varsend As Byte
Dim Twi_slv_data(1) As Byte
Dim Slave_mode As Byte
Dim Tmp As Byte

'-----------------------------Vorkonfiguration----------------------------------
Slaveadress = &H40
Twi_slv_addr = Slaveadress
Twi_sr_data = Varptr(slave_mode) 'datenbuffer empfang
Twi_st_data = Varptr(twi_slv_data(1)) 'datenbuffer senden

Twar = Twi_slv_addr '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 Interrupts
Twi_slv_data(1) = Slaveadress

Led1 Alias Portd.0

Led1 = 1

'----------------------------Hauptprogramm--------------------------------------
Do

Gosub Slave_empfaengt_byte

If Var = &H20 Then Led1 = 0

Loop
End


'unterprogramme

Slave_empfaengt_byte:

If Twi_slv_flag <> 0 Then
Select Case Twi_slv_flag
Case &H60 :
Var = Slave_mode 'es ist was empfangen worden

Case &HA8 : 'daten sind abgeholt worden
For Tmp = 1 To 1
Twi_slv_data(tmp) = 0 ' also löschen ?
Next
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

Sub Twi_slave_sendet_byte(variable As Byte)

Status = 0

' schauen ob TWINT gesetzt ist
Twi_control = Twcr And &H80 ' Bit7 von Controlregister

If Twi_control = &H80 Then
Twi_status = Twsr And &HF8 ' Status

' will der Master ein Byte haben
If Twi_status = &HA8 Or Twi_status = &HB8 Then
Twdr = Variable
Status = 1 ' neue Daten ausgeben
End If

' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
Twcr = &B11000100 ' TWINT löschen, mit ACK
End If

End Sub
End If

Danke für Hilfe
mfg dämmi

PicNick
29.10.2008, 10:26
Problem bei yC3:
die subroutine "Slave_empfaengt_byte:" hat kein "return" , er läuft sofort direkt in "Twi_slave_sendet_byte" rein.

Dämmi
29.10.2008, 18:18
Hm... das ist leider nicht der Fehler ich versuche nun erst einmal nur den yC 3 anzusprechen .....

Dämmi
29.10.2008, 18:31
Also nun hab ich einfach beim yc2 die if abfrage und das lesen rausgenommen und nur senden lassen mit einer kleinen verzögerung dann funktioniert das auch.

Aber wenn er erst vom yc1 lesen soll und dann an yc3 senden soll sendet er zwar weil die led aufleuchtet aber es kommt bei yc3 nicht an bzw dieser reagiert nicht drauf warum?......

Danke
mfg dämmi

PicNick
29.10.2008, 19:11
Das solltest du entfernen

Dim Slave As Byte

Das könnte den Bascom verwirren, weil du eine gleichnamige Variable in der Function verwendest

Dämmi
29.10.2008, 19:40
also wenn ich das netferne gehts so einiger maßen ......
ich muss bevor der y2 wieder zu yc3 sendet eine waitms von 500 einbauen und selbst dann klappt es erst beim 3 versuch und wenn ich da keine waitms drin habe kommt es wieder nicht bei yc3 an .......

sehr vielen dank für die hilfe
mfg dämmi

Dämmi
03.11.2008, 18:54
kann mir keiner nen kleines beispiel prog schreiben oder mir sagen was ich falsch mache? Danke mfg dämmi

PicNick
03.11.2008, 19:14
http://www.oldformation.at/electronic/download/down.htm
==> MyTWI 0.1

das ist ein komplettes beispiel. Empfängt I2C Nachrichten, und sendet jede sekunde selber was weg.
Wenn du die I2c-Adressen anpasst, kannst du das Programm in zwei AVR schreiben, die senden sich dann gegenseitig was

oberallgeier
03.11.2008, 22:22
Hi PicNick,


... das ist ein komplettes beispiel ...DAS wäre ja direkt ein Grund Bascom zu lernen. Schicke Seite (-n). Leider kann ich blos C - und da bin ich mit TWI nie klargekommen. Macht nix - irgendwann stehts (wieder) oben auf meiner Liste.

PicNick
04.11.2008, 07:35
Sorry, ich hab' mir eh' vorgenommen, von meinem Zeugs auch eine C-Version zu machen.

Dämmi
11.11.2008, 20:16
Hi

Also erst ma Danke für das Programm.

Aber ich bin so langsam am verzweifeln bin ich zu doof für so was hier?!

Habe das Prog genommen und einmal denn empfangenem Buffer in eine Variable schreiben lassen. Dann nach dieser Variablen gefragt und wenn dies gleich is soll eine LED eingeschaltet werden.

Hier der Code

µC 1


$crystal = 16000000

$include "MyTWI.bas"

$baud = 9600

$hwstack = 64
$swstack = 64
$framesize = 64

Const Tmr_c_prescale = 64
Const Tmr_c_preload = 131
Const Tmr_c_divis = 250

Declare Sub Twi_show_state(byref State As Byte)

Config Porta = Input
Config Portb = Input
Config Portd = Output

Waitms 30
'-------------------------------------------------
' lokale I2C Adresse (als Slave)
'-------------------------------------------------
Const Mn1_adr = &H40

'-------------------------------------------------
' fremde I2C Adresse (als Master)
'-------------------------------------------------
Const Mn2_adr = &H50


Dim Slv_byte As Byte 'sende Byte (irgendwas)

Dim Twi_mst_buff(24) As Byte 'Buffer für Masterfunktionen
Dim Twi_slv_buff(24) As Byte 'Buffer für Slavefunktionen

'-------------------------------------------------
Config Timer0 = Timer , Prescale = Tmr_c_prescale 'Timer 1mS
On Timer0 Interrupt_ticker ' Timer for Timer Queue

Dim Timeout As Byte
Dim Timediv As Word
'-------------------------------------------------


Dim Temp 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 Timer0 'Timer
Enable Interrupts 'Generell
'---------------------------------------------
' initialiesierung
'---------------------------------------------
Dim Speicher(24) As Byte
Led1 Alias Portd.2

'------------------Konfigurierung-------------
Portd = &HFF
Led1 = 1
Slv_byte = &H02

Do
If Twi_slv_flag <> 0 Then
'-----------------------------------------------------------------
' Ergebnis als SLave auswerten
' Vorsicht, der Bus ist solange blockiert
'-----------------------------------------------------------------
Select Case Twi_slv_flag
Case &H60 : 'Print Spc(30) ; "SLAVE recv:" ; 'es ist was empfangen worden
'Print Hex(twi_slv_addr) ; " ";
For Temp = 1 To Twi_sr_cntr
'Print Hex(twi_slv_buff(temp)); 'print der Daten
Next
Case &HA8 : 'Print Spc(30) ; "SLAVE tran:" ; 'es ist was abgeholt worden
'Print Hex(twi_slv_addr) ; " ";
For Temp = 1 To Twi_st_cntr
' Print 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
Call Twi_show_state(twi_slv_flag) 'Print status-text
End Select
'Print
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
'-----------------------------------------------------------------
' Jede Sekunde was senden & empfangen
'-----------------------------------------------------------------
If Timeout = 1 Then
Gosub Master_transmit
If Twi_mst_flag = 0 Then 'Hats geklappt ?
Timeout = 0 'ja
' else (sonst probieren wir's gleich nochmal)
End If
End If
'-----------------------------------------------------------------
If Speicher(1) = &H03 Then Led1 = 0


Loop
End

'----------------------------------------
' 1 mS Ticker
'----------------------------------------
Interrupt_ticker: ' Timer for Timer Queue
Timer0 = Tmr_c_preload
Incr Timediv
If Timediv >= Tmr_c_divis Then
Timeout = 1 'eine Sekunde ist rum
Timediv = 0
End If
Return


'----------------------------------------
$include "Twi_show_state.bas"
'----------------------------------------

Run_wait_master:
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(temp));
Next
'Print
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 Hex(twi_mst_buff(temp));
Speicher(temp) = Twi_mst_buff(temp)
Next
'Print
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
'----------------------------------------
' Beispiel 8 byte senden,
' dann mit Rep.Start von gleicher adresse 3 Byte empfangen
'----------------------------------------
Master_transmit:
' sende buffer (mit testdaten) füllen
For Temp = 1 To 24
Twi_mst_buff(temp) = Slv_byte
Next

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

Twi_mr_cntr = 3 ' dann 3 Byte empfangen
Twi_mr_data = Varptr(twi_mst_buff(1)) ' empfangsbuffer

Gosub Run_wait_master ' auf gehts

Return

µC 2


'------------------------interface-------------------

$regfile = "m32def.dat"
$crystal = 16000000

$include "MyTWI.bas"

$baud = 9600

$hwstack = 64
$swstack = 64
$framesize = 64

Const Tmr_c_prescale = 64
Const Tmr_c_preload = 131
Const Tmr_c_divis = 250

Declare Sub Twi_show_state(byref State As Byte)

Config Porta = Output
Config Portb = Output
Config Portc = Input

'-------------------------------------------------
' lokale I2C Adresse (als Slave)
'-------------------------------------------------
Const Mn1_adr = &H50

'-------------------------------------------------
' fremde I2C Adresse (als Master)
'-------------------------------------------------
Const Mn2_adr = &H40


Dim Slv_byte As Byte 'sende Byte (irgendwas)

Dim Twi_mst_buff(24) As Byte 'Buffer für Masterfunktionen
Dim Twi_slv_buff(24) As Byte 'Buffer für Slavefunktionen

'-------------------------------------------------
Config Timer0 = Timer , Prescale = Tmr_c_prescale 'Timer 1mS
On Timer0 Interrupt_ticker ' Timer for Timer Queue

Dim Timeout As Byte
Dim Timediv As Word
'-------------------------------------------------


Dim Temp 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 Timer0 'Timer
Enable Interrupts 'Generell
'---------------------------------------------
' initialiesierung
'---------------------------------------------
Dim Speicher(24) As Byte
Led1 Alias Portb.0

'------------------Konfigurierung-------------
Porta = &HFF
Portb = &HFF
Slv_byte = &H03
Led1 = 1

Do
If Twi_slv_flag <> 0 Then
'-----------------------------------------------------------------
' Ergebnis als SLave auswerten
' Vorsicht, der Bus ist solange blockiert
'-----------------------------------------------------------------
Select Case Twi_slv_flag
Case &H60 : 'Print Spc(30) ; "SLAVE recv:" ; 'es ist was empfangen worden
'Print Hex(twi_slv_addr) ; " ";
For Temp = 1 To Twi_sr_cntr
'Print Hex(twi_slv_buff(temp)); 'print der Daten
Next
Case &HA8 : 'Print Spc(30) ; "SLAVE tran:" ; 'es ist was abgeholt worden
'Print Hex(twi_slv_addr) ; " ";
For Temp = 1 To Twi_st_cntr
'Print 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
Call Twi_show_state(twi_slv_flag) 'Print status-text
End Select
'Print
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
'-----------------------------------------------------------------
' Jede Sekunde was senden & empfangen
'-----------------------------------------------------------------
If Timeout = 1 Then
Gosub Master_transmit
If Twi_mst_flag = 0 Then 'Hats geklappt ?
Timeout = 0 'ja
' else (sonst probieren wir's gleich nochmal)
End If
End If
'-----------------------------------------------------------------
If Speicher(1) = &H03 Then Led1 = 0


Loop
End

'----------------------------------------
' 1 mS Ticker
'----------------------------------------
Interrupt_ticker: ' Timer for Timer Queue
Timer0 = Tmr_c_preload
Incr Timediv
If Timediv >= Tmr_c_divis Then
Timeout = 1 'eine Sekunde ist rum
Timediv = 0
End If
Return


'----------------------------------------
$include "Twi_show_state.bas"
'----------------------------------------

Run_wait_master:
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(temp));
Next
'Print
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 Hex(twi_mst_buff(temp));
Speicher(temp) = Twi_mst_buff(temp)
Next
'Print
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
'----------------------------------------
' Beispiel 8 byte senden,
' dann mit Rep.Start von gleicher adresse 3 Byte empfangen
'----------------------------------------
Master_transmit:
' sende buffer (mit testdaten) füllen
For Temp = 1 To 24
Twi_mst_buff(temp) = Slv_byte
Next

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

Twi_mr_cntr = 3 ' dann 3 Byte empfangen
Twi_mr_data = Varptr(twi_mst_buff(1)) ' empfangsbuffer

Gosub Run_wait_master ' auf gehts

Return

Mein Problem ist wenn ich beim µC1

Mn1_adr = &H40
Mn2_adr = &H50

und bei µC2

Mn1_adr = &H50
Mn2_adr = &H40

nehme dann geht nichts....

wenn ich aber beim µC1

Mn1_adr = &H50
Mn2_adr = &H40

und bei µC2

Mn1_adr = &H40
Mn2_adr = &H50

nehme dann leuchtet nur bei µC2 die LED?!

Wieso...........

Danke für jede Unterstützung.

mfg dämmi

Dämmi
18.11.2008, 17:48
Kann keiner Helfen?

stefan_Z
18.11.2008, 18:02
Das solltest du entfernen:
Dim Slave As Byte
Das könnte den Bascom verwirren, weil du eine gleichnamige Variable in der Function verwendest

Ist das wirklich so?
Die Namen sind Bascom doch eigenlich wurst, die wer die eh in Registernamen/Stackpointer verwandelt, oder?

peterfido
18.11.2008, 21:49
Jo, ist so. Am besten jede Variable nur 1x nutzen

Dämmi
19.11.2008, 13:34
das hab ich doch aber schon geändert hab nu eine nen ganz anderes Programm....

Dämmi
25.11.2008, 17:34
kann denn keiner helfen?

mare_crisium
26.11.2008, 01:08
Dämmi,

gibt die Variable "Twi_slv_flag " das Zustandsbyte so zurück, wie es der ATmega erzeugt?

Wenn ja, dann zeigt &60 nur den Empfang der eigenen Adresse an - Daten sind da noch keine empfangen worden. Deshalb kann die nachfolgende Druckschleife an dieser Stelle keine empfangenen Daten finden. Der abgeschlossene Empfang eines Datenbytes wird jedesmal mit Statusbyte &80 angezeigt.

Die TWI-Zustandsbytes des ATmega sind eigentlich sehr übersichtlich und leicht auszuwerten. Die besten Erläuterungen dazu gibt es z.B. auf den Seiten 181ff des ausführlichen Datenblattes des ATmega8. Dort sind auch gut ausgearbeitete und kommentierte Beispielprogramme abgedruckt. Die helfen Dir bestimmt weiter :-) .

Ciao,

mare_crisium