Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: Absturz, weil I2C-Bus Teilnehmer nicht bereit Kategorie: Programmierung ASM (von Paul - 2.03.2004 11:35)
 Als Antwort auf Absturz, weil I2C-Bus Teilnehmer nicht bereit von Reinhard - 1.03.2004 10:41
Hallo Reinhard,

wenn die CC1-OS-internen I2C-Routinen verwendet werden, wird davon ausgegangen, dass das
I2C-EEProm auch tatsächlich zur Verfügung steht. Beim warten auf ein ACK-Signal vom I2C-Device
führt das in eine Endlosschleife, wenn das I2C-Device eben NICHT da ist.

Ich habe das mit eigenen I2C-Routinen gelöst (Nur Low-Level, also Start/Stop, Read/Write, Ack/Nack)
und zu beginn meines Programms ein Unterprogramm gebastelt, das den I2C-Bus nach entsprechenden
Devices scannt (nach dem Motto: "guck mal welche PCF8574 an welcher Adresse am I2C-Bus
hängen"). Das Ergebnis speichere ich in einem Byte (gehen ja nur 8 Devices an den I2C-Bus) und kann
dann gezielt die aktiven Devices ansprechen. Es gibt ja mehrere I2C-Bus Implementierungen über
Digiports. Ich habe eigentlich nur eine "Besonderheit" bei mir eingebaut, nähmlich, daß meine
ACK-Routine mit einem Timeout versehen ist und eine entsprechende Rückmeldung ans BASIC
zurück gibt (in einer Byte[1]).

Das sieht ungefähr so aus...

...
Sys I2C_Start                                 ' Bus starten
Devices = 0                                    ' bisher keine Devices

For i = 0 to 7                                  ' Adressen 0-7 (kompletten I2C-Bus) scannen
  IO = BaseAdr + i                          ' Basis-Adresse des Device-Typen + Sub-Adresse (wird vom I2C_WRITE gelesen)
  Sys I2C_WRITE                           ' Device auf LESEN einstellen
  Sys I2C_GETACK                        ' kommt ein ACK? (wenn JA ->IO=0, sonst IO=255)
  If IO = 255 then goto Notfound       ' kein ACK innerhalb 0,5s -> Bit in Devices auf 0 lassen
  Devices = Devices Or (1 SHL i)     ' passendes Bit in Devices auf 1 setzen
  #Notfound
  Sys I2C_STOP                            ' Bus wieder anhalten
Next i
...

Ich hab das aus dem Kopf getippert, daher könnte es nicht völlig korrekt sein. Bei Bedarf einfach kurzes
Mail an mich und ich sende Dir die "echten" Basic-Sourcen zu.

Grüße,
Paul

> Hallo,
>
> wenn ich einen Teilnehmer am I2C-Bus anspreche, der z.Zt. nicht bereit ist
> (während der Testphase, kein Strom etc.), dann stürzt mein Programm ab,
> bzw. die I2C-Routinen kehren nicht zurück (ist auch irgendwo dokumentiert).
>
> Kann man das irgendwie abfangen? Mit so einer Art I2CReady-Flag oder so?
>
> Ich nutze die CCTools-Routinen (und diese wohl die internen).
>
> Thx: - Reinhard -
>

 Antwort schreiben

Bisherige Antworten:

Re: Absturz, weil I2C-Bus Teilnehmer nicht bereit (von Reinhard - 2.03.2004 13:13)