Forum: Mikrocontroller und Digitale Elektronik I²C Bus nach Teilnehmern absuchen


von Michael Junge (Gast)


Lesenswert?

Hallo

Ich habe einen Mega8 als Master, und ebenfalls einige Mega8 als Slave 
mit dem I²C Bus verbunden. Mein Problem/Aufgabenstellung ist, dass die 
Slaves (bis maximal 10 Stück) vom Master getrennt werden können. Da Die 
Slaves auch an anderen Systemen laufen sollen, sind die Adressen über 
Jumper einstellbar.
Ich möchte daher den I2C Bus, beim Start des Masters nach vorhandenen 
Teilnehmern absuchen.

Ich dachte nun, ich könnte lösen, indem ich in einer Schleife an jede 
Adresse etwas versuche zu senden, und dann die Variable ERR abfrage. 
Also etwa so:
(Programmiere mit BASCOM)
1
'Scan im Bus nach Slaves
2
For I = 1 To 10                                             'Initialisiere Variable
3
  Slaveadress(i) = 0
4
Next
5
Slaves = 0
6
For I = &H40 To &HFF                                        'Suche nach Slaves
7
  I2csend I , 0
8
  If Err = 0 Then
9
    Incr Slaves
10
    Slaveadress(slaves) = I
11
  End If
12
  If Slaves = 10 Then Exit For
13
Next
14
15
If Slaves = 0 Then
16
  Cls
17
  Upperline
18
  Lcd "No Slaves found"
19
End If

Das Problem ist nun, dass die Abarbeitung schon an der Zeile
1
I2csend I , 0
 hängenbleibt, da die Adresse &H40 nicht auffindbar ist.

Hat vielleicht jemand eine Idee, wie ich das lösen kann?

Vielen Dank und viele Grüße
Mike

von Markus L. (lucky79)


Lesenswert?

Hallo!

Frag einfach mal nach "Wer ist alles da??" und warte auf die Antwort...

Es gibt beim I²C Bus eine GC (General Call) Adresse (0000 000x)

Schick darauf einen Request, schalt deinen "Master" für eine gewisse 
Zeit auf Empfang (Slave) und warte einfach was zurückkommt. Da I²C ja 
ein MultiMaster Bus ist, wartet ein Master sowieso, wenn gerade ein 
anderer sendet (Arbitration).

Schau dir am Besten mal die I²C spec an.

Grüße

Markus

von Peter D. (peda)


Lesenswert?

Markus Lackner wrote:
> Hallo!
>
> Frag einfach mal nach "Wer ist alles da??" und warte auf die Antwort...

Da kannste aber lange warten, bis ein Slave antwortet.

Du mußt sie schon nacheinander adressieren (Start nicht vergessen) und 
testen, ob ein ACK zurückkommt.

Wenns mit I2csend nicht geht, dann ist das wohl die falsche Funktion 
(einfach mal in der Bascom Hilfe nachsehen).

Hängenbleiben sollte aber ein Bibliotheksfunktion grundsätzlich nicht.


Peter

von Andreas Kramer (Gast)


Lesenswert?

I2C bleibt bei mir auch immer hängen wenn ein fehler da ist weil der µC 
meißtens darauf warten soll das eine Antwort / Änderung kommt und wenn 
dem nicht so ist dann wartet er auch weiter ^^

Gruß Andreas

von ecslowhand (Gast)


Lesenswert?

Mann sollte, wenn man den I2C-Statuscode auswerten will und auf das 
TWINT-Flag wartet (polling), zusätzlich einen Zähler mitlaufen lassen. 
In einen Hardwarefehlerfall, wenn das TWINT-Flag nicht gesetzt wird, 
hängen sich die meisten Routinen auf.

LG EC

von Michael J. (michael-junge)


Lesenswert?

Hallo zusammen

vielen Dank für Eure Antworten.
Ich habe nun I²C Spec. und auch die Bascom Hilfe durchgesucht - bin 
nicht wirklich weiter.
Hab auch mal verschiedene Befehle versucht (I2CSend und I2CWByte) bei 
beiden bleibt das Programm hängen. Der Timer funktioniert jedoch. Ein 
Zählen für einen Timeout währe also kein Problem - nur wie bringe ich 
dem Programm bei, dass es jetzt aufhören soll, den Befehl 
abzuarbeiten???
Der Watchdog währe ne Möglichkeit, der startet aber wiederum das ganze 
Programm neu, was mich auch nicht wirklich weiter bringt.

Hat noch jemand eine Idee?!
Wäre für Hilfe sehr dankbar.

Viele Grüße
Mike

von PM (Gast)


Lesenswert?

Benutz nicht die fertigen Sachen, sonder schreib den Teil selber. Dann 
bekommst Du das NACK des angesprochenen Slave über das Statusregister, 
oder eben ein ACK wenn er da ist. Das dann speichern, und ab da kannst 
dann ja wieder die fertigen Bibs verwenden wenns sein muss ;)

von Michael J. (michael-junge)


Lesenswert?

...ich hätte vielleicht erwähnen sollen, dass ich mich erst seit ein 
paar Tagen mit der Programmierung von µC beschäftige. - Wie schreib ich 
sowas selbst?

Gruß Mike

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.