Ulfens
10.01.2006, 00:14
Hallo,
ich habe folgendes Problem. Ich möchte 2 MEGA8 mit Hilfe des I2C-Busses miteinander koppeln um Daten (z.Z erstmal 1 Byte) vom Master zum Slave zu übertragen. Ich habe mir die Slave-Library (von MCS) gekauft. Bei der Anwendung habe ich mich genau an die Doku gehalten, bzw. habe hier im Forum alle Hinweise dazu gelesen. Trotzdem kann ich den Slave nicht dazu bewegen Daten vom Master zu empfangen und in Abh. vom Empfangswert eine LED einzuschalten.
Hier der Code:
Slave:
' Testprogramm 2 zur Nutzung eines MEGA8 als I2C-Slave
'
' I2C Port am Slave MEGA8: SDA = Portd2 (INT0)
' SCL = Portd4 (T0)
'
$regfile = "m8def.dat" ' MC-Definitionen laden
$crystal = 1000000 ' 1Mhz int. Quarzfrequenz
$baud = 9600
Dim A As Byte
Dim B As Byte
Dim Bfake As Byte
Config I2cslave = &B01000000
Config Portc.3 = Output
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portc.0 = Output
Config Portc.1 = Output
Led0 Alias Portb.0
Led1 Alias Portb.1
Led2 Alias Portb.2
Led3 Alias Portc.0
Led4 Alias Portc.1
Portc.3 = 1 ' LED-Katode aktivieren
Do
Led0 = Not Led0 ' Blinkindikator
If Bfake = &H01 Then
Led1 = 1
Else
Led1 = 0
End If
If Bfake = &H02 Then
Led2 = 1
Else
Led2 = 0
End If
Waitms 500
Loop
I2c_master_has_data:
'when your code is short, you need to put in a waitms statement
'Take in mind that during this routine, a wait state is active and the master will wait
'After the return, the waitstate is ended
Waitms 1
Bfake = _a1 ' this is not needed but it shows how you can store _A1 in a byte
'assign _A1 (R16)
Return
I2c_master_needs_data:
Waitms 1
_a1 = &B11111111 ' Get input from portB and assign it
Return
Master:
' Testprogramm 2 zur Nutzung eines MEGA8 als I2C-Master
' in Zus. mit "M8_I2C_slave_2.bas"
'
' I2C Port am Master MEGA8: SDA = Port.C4 --------> PD4 (T0)
' SCL = Port.C5 --------> PD2 (INT0)
'
$regfile = "m8def.dat" ' MC-Definitionen laden
$crystal = 1000000 ' 1Mhz int. Quarzfrequenz
$baud = 4800
Config Sda = Portc.4
Config Scl = Portc.5
Config I2cdelay = 10
Do
Print "Wert: 01 senden"
I2csend &H40 , &H01
Waitms 500
Print "Wert: 02 senden"
I2csend &H40 , &H02
Waitms 500
Loop
Die beiden Leitungen (SCL &SDA) habe ich am Slave mit je einem PullUp 4k7 abgeschlossen. Wenn ich SCL & SDA nicht anschließe blinkt die Indikator-LED (meine Hauptschleife läuft also). Sind sie jedoch angeschlossen sind und der Master sendet munter seine Daten (Kontrolle via Terminal-Prog.) friert der Slave quasi ein (LED leuchtet dauernd, oder ist aus). Habe seitens des Masters auch schon die I2C-Befehle: I2INIT, I2CSTART, I2CWBYTE, I2CSTOP verwendet - funktionierte aber auch nicht.
Hat jemand eine Idee, woran das liegen kann?
Gruss,
Ulf
ich habe folgendes Problem. Ich möchte 2 MEGA8 mit Hilfe des I2C-Busses miteinander koppeln um Daten (z.Z erstmal 1 Byte) vom Master zum Slave zu übertragen. Ich habe mir die Slave-Library (von MCS) gekauft. Bei der Anwendung habe ich mich genau an die Doku gehalten, bzw. habe hier im Forum alle Hinweise dazu gelesen. Trotzdem kann ich den Slave nicht dazu bewegen Daten vom Master zu empfangen und in Abh. vom Empfangswert eine LED einzuschalten.
Hier der Code:
Slave:
' Testprogramm 2 zur Nutzung eines MEGA8 als I2C-Slave
'
' I2C Port am Slave MEGA8: SDA = Portd2 (INT0)
' SCL = Portd4 (T0)
'
$regfile = "m8def.dat" ' MC-Definitionen laden
$crystal = 1000000 ' 1Mhz int. Quarzfrequenz
$baud = 9600
Dim A As Byte
Dim B As Byte
Dim Bfake As Byte
Config I2cslave = &B01000000
Config Portc.3 = Output
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portc.0 = Output
Config Portc.1 = Output
Led0 Alias Portb.0
Led1 Alias Portb.1
Led2 Alias Portb.2
Led3 Alias Portc.0
Led4 Alias Portc.1
Portc.3 = 1 ' LED-Katode aktivieren
Do
Led0 = Not Led0 ' Blinkindikator
If Bfake = &H01 Then
Led1 = 1
Else
Led1 = 0
End If
If Bfake = &H02 Then
Led2 = 1
Else
Led2 = 0
End If
Waitms 500
Loop
I2c_master_has_data:
'when your code is short, you need to put in a waitms statement
'Take in mind that during this routine, a wait state is active and the master will wait
'After the return, the waitstate is ended
Waitms 1
Bfake = _a1 ' this is not needed but it shows how you can store _A1 in a byte
'assign _A1 (R16)
Return
I2c_master_needs_data:
Waitms 1
_a1 = &B11111111 ' Get input from portB and assign it
Return
Master:
' Testprogramm 2 zur Nutzung eines MEGA8 als I2C-Master
' in Zus. mit "M8_I2C_slave_2.bas"
'
' I2C Port am Master MEGA8: SDA = Port.C4 --------> PD4 (T0)
' SCL = Port.C5 --------> PD2 (INT0)
'
$regfile = "m8def.dat" ' MC-Definitionen laden
$crystal = 1000000 ' 1Mhz int. Quarzfrequenz
$baud = 4800
Config Sda = Portc.4
Config Scl = Portc.5
Config I2cdelay = 10
Do
Print "Wert: 01 senden"
I2csend &H40 , &H01
Waitms 500
Print "Wert: 02 senden"
I2csend &H40 , &H02
Waitms 500
Loop
Die beiden Leitungen (SCL &SDA) habe ich am Slave mit je einem PullUp 4k7 abgeschlossen. Wenn ich SCL & SDA nicht anschließe blinkt die Indikator-LED (meine Hauptschleife läuft also). Sind sie jedoch angeschlossen sind und der Master sendet munter seine Daten (Kontrolle via Terminal-Prog.) friert der Slave quasi ein (LED leuchtet dauernd, oder ist aus). Habe seitens des Masters auch schon die I2C-Befehle: I2INIT, I2CSTART, I2CWBYTE, I2CSTOP verwendet - funktionierte aber auch nicht.
Hat jemand eine Idee, woran das liegen kann?
Gruss,
Ulf