www.mikrocontroller.net

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


Autor: Michael Junge (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)
'Scan im Bus nach Slaves
For I = 1 To 10                                             'Initialisiere Variable
  Slaveadress(i) = 0
Next
Slaves = 0
For I = &H40 To &HFF                                        'Suche nach Slaves
  I2csend I , 0
  If Err = 0 Then
    Incr Slaves
    Slaveadress(slaves) = I
  End If
  If Slaves = 10 Then Exit For
Next

If Slaves = 0 Then
  Cls
  Upperline
  Lcd "No Slaves found"
End If


Das Problem ist nun, dass die Abarbeitung schon an der Zeile
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

Autor: Markus L. (lucky79)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Kramer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ecslowhand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Junge (michael-junge)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: PM (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Michael Junge (michael-junge)
Datum:

Bewertung
0 lesenswert
nicht 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

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.