PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem: Zwei MEGA8 via I2C-Bus koppeln (mit I2C-slave-Lib)



Ulfens
09.01.2006, 23: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

uwegw
10.01.2006, 16:38
Die Reihenfolge im Master müsste eingentlich so sein:
1. noch vor der Hauptschleife, nach den ganzen config... -Befehlen
I2INIT
In der Hauptschleife
2. I2CSTART
3. I2csend
4. I2CSTOP

Das wär die normale Abfolge: einmal initialisieren, und dann immer Übertragung starten, Daten senden und Übertragung beenden.


Hast du irgendeinen fertigen Slave zur Verfügung (Portexpander, EEPROM,...), um mal zu testen, ob der Master korrekt arbeitet? Ansosnten ist halt schwer zu sehen, wo der Fehler liegen könnte...

Zeroeightfifteen
10.01.2006, 18:17
schau doch mal da https://www.roboternetz.de/phpBB2/viewtopic.php?p=147038#147038
bei mir läufts nun schon ein bisschen.

uwegw
10.01.2006, 18:24
Irgendwie scheints ja grad groß in Mode zu sein, sich nen i2c-Slave zu proggen... Ich machs auch, aber schon seit mindestens nem halben Jahr... und seit ein paar Tagen sogar sprachübergreifend: Der Master läuft unter C, der Slave mit Pascal... läuft schon ganz gut, obwohls mein ersten Versuche mit C sind.

Ulfens
11.01.2006, 15:25
Vielen Dank für die Hinweise.

Demnach scheint meine Programmierung in der dargestellten Variante mit I2Csend korrekt zu sein, oder?
Die Variante mit I2Cinit und I2CSTART, I2CWBYTE, I2CSTOP funktioniert leider auch nicht.
Beispiel:
...
I2CSTART
I2CWBYTE &H40 ' Adresse Slave
I2CWBYTE &H01 ' Daten
I2CSTOP
...

Was könnte denn noch eine Ursache sein? Hardware (slaveseitig ?) Leitungsverlegung?
Die Frage, ob ich an dem Master bereits andere I2C-Komponenten erfolgreich getestet habe kann ich nur bejahen.
Sowohl einen PCF8574, als auch einen DS1621 konnte ich erfolgreich via I2C-Bus ansprechen.
Muss die I2C-Slave-Library nicht im Code des Slaves explizip eingebunden werden? Das Beispiel (in der Doku)
zeigt ja, dass es nicht erforderlich ist.
Wie sieht es denn mit den TWI-Befehlen aus? Könnte man das Gleiche alternativ damit realisieren?