Forum: Mikrocontroller und Digitale Elektronik I2C-Bus-Problem


von Martin Schenk (Gast)


Lesenswert?

Hallo,

habe eine Rolladensteuerung gebaut mit einem ATMEGA128, am I2C Bus
hängen mehrere ICs (Eeprom, RTC, Temperatursensor,Porterweiterungen
AD-Wandler). Bis dahin funktioniert alles. Dann habe ich eine
Stromausfallerkennung implementiert indem ich den AD-Wandler
(mißt die Spannung vor dem Spannungsregler) mit ca. 60Hz abfrage.
Bei Unterspannung soll die Konfiguration abgespeichert werden.

Das führt jedoch zu Problemen, z.B. wird die Uhrzeit und andere Kanäle
des AD-Wandlers jetzt fehlerhaft ausgelesen.

Wahrscheinlich greift das Programm auf den I2C-Bus zu wenn dieser
gerade belegt ist und es kommt deswegen zu Anzeigefehlern.

Wie kann ich erkennen, ob der Bus frei oder belegt ist bzw. wie
kann ich vorgehen um dieses Problem zu vermeiden ?

Gruß
Martin

von Aufreger deluxe (Gast)


Lesenswert?

> mißt die Spannung vor dem Spannungsregler

Bei welcher Spannung vor dem Regler soll gespeichert werden und
welchen Regler benutzt du?

von Martin Schenk (Gast)


Lesenswert?

Das Netzteil hat nach dem Gleichrichter einen 22000µF-Kondensator.
Die Spannung vor dem Regler liegt bei ca. 10V. Diese Spannung wird dann
über ein LC-Filter dem Spannungregler LT1129CST-5 zugeführt.
Abgespeichert wird sobald die Spannung kleiner 8V ist.
Danach wird die Steuerung gesperrt.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Du wirst ein Timing-Problem mit dem I²C-Bus haben (liegt demnach an
deiner Software).

von Martin Schenk (Gast)


Lesenswert?

Ja, das glaube ich auch. Durch die laufende Abfrage des AD-Wandlers hat
sich die Anzahl der Zugriffe auf den I2C-Bus stark erhöht.
Alle I2C-Devices lassen sich jedoch einzeln problemlos und fehlerfrei
ansteuern. Ich programmiere in C mit Codevision und benutze die vom
Compiler angebotenen Routinen. Mir ist bloß nicht klar wie ich dieses
Problem abstellen kann.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Ich programmiere in C mit Codevision und benutze die vom
>Compiler angebotenen Routinen.

>Mir ist bloß nicht klar wie ich dieses Problem abstellen kann.

Guck dir die von Codevision gelieferten Routinen an und guck nach wie
die Fehler auf dem Bus behandeln.

von Magnus Müller (Gast)


Lesenswert?

Zur Not könntest du eine Globales Flag definieren, welches du nutzt um
eine (vom Controller initiierte) IIC-Aktivität zu kennzeichnen.

Gruß,
Magnetus

von Wolfram (Gast)


Lesenswert?

>Wie kann ich erkennen, ob der Bus frei oder belegt ist bzw. wie
>kann ich vorgehen um dieses Problem zu vermeiden ?
setze ein Flag vor dem Zugriff auf den I2C Bus und lösche es nach dem
Zugriff. Solange dieses Flag gesetzt ist, darf kein anderer zugreifen.
Das musst du vor einem Zugriff prüfen.


Deine Beschreibung läßt vermuten, daß du aus dem Timerinterrupt auf den
I2C Bus zugreifst. Natürlich kann man sowas machen, allerdings führt es
gewöhnlich zu unsauberen Code, in dem sich eine ganze Menge Probleme
verstecken.

von Martin Schenk (Gast)


Lesenswert?

Die Codevision-Routinen lassen sich leider nicht einsehen.
Das Flag-Setzen vor jedem I2C-Zugriff und anschließendes Löschen ist
eine gute Idee. Die Abfrage der vor dem Spannungsregler anliegenden
Spannung habe ich in der Timerinterruptroutine stehen, da der Interrupt
ca. alle 16ms ausgelöst wird und ich den Spannungsabfall möglichst früh
erkennen möchte. Darin liegt wohl auch das Problem,
denn der I2C-Bus wird laufend aus der Interruptroutine aus angesteuert
ohne zu prüfen, ob der Bus frei war.
Ich werde das Programm überarbeiten, daß bei jedem I2C-Zugriff ein Flag
gesetzt und abgefragt wird und nicht mehr vom Interrupt aus auf den
I2C-Bus zugreifen. Vielen Dank für die Antworten !

Gruß
Martin

von Michael Wilhelm (Gast)


Lesenswert?

Wenn du die Möglichkeit hast in das Netzteil einzugreifen, versuche
folgendes:

nach dem Gleichrichter setze eine Diode zum Elko.Nun hast du zwischen
Gleichrichter und Diode eine pulsierende Gleichspannung, die du über
einen Widerstand und Z-Diode auf ein verträgliches Maß reduzieren
musst. Diese Spannung an einen externen Interrupt, der einen Timer
zurücksetzt. Bei einen Timerüberlauf (Timerüberlauf auf 12ms oder so
setzen) ist die Sekundärspannung weg. Also Parameter abspeichern. Das
entlastet dann den Traffic auf der I2C Leitung.

MW

von Martin Schenk (Gast)


Lesenswert?

Das wäre natürlich die beste Lösung, die laufende Abfrage des Wandlers
würde entfallen. Nur leider habe ich keinen einzigen Pin mehr übrig !

von Frank (Gast)


Lesenswert?

Hallo
WIe hast DU denn die Nenüstruktur realisiert? Benutzt Du ein Grafik LCD
und läßt Du die Werte (AD Rolladen unten u.s.w. ) ständig anzeigen?
Ich bin gerade auch an eine Rolladensteuerung dabei, und bin für Tips
und Anregung, immer dankbar.Welchen Bus nimmst Du für die Steuerung?
Gruss
Frank

von Martin Schenk (Gast)


Lesenswert?

Ich benutze das Grafikdisplay EA EDIP240 mit ca. 12 Menüebenen welche
über einen optischen Encoder auswählbar sind. Unterhalb des Displays
befinden sich vier Taster, die Beschriftung und Belegung der Taster
wechselt entsprechend den Menüs. Jeder der Zentraltaster ist über eine
Menüebene beliebig programmierbar (Eingabe der Sollpositionen der
Rolläden in Prozent bzw. welche Rolläden überhaupt angesteuert werden
sollen). Die Positionen aller Rolläden können ebenfalls in Prozent
angezeigt werden. Sowie einige Konfigurations- und Testmenüs und
Anzeigen für Datum, Uhrzeit, Ströme, Spannungen, Temperaturen.
Für die Ansteuerung aller ICs verwende ich den I2C-Bus, das Display
wird über RS232 angesteuert.

von Frank (Gast)


Lesenswert?

Das ist ja echt ein Hammer Projekt. Das Grafik Display wird vom
Prozessor über die R232 angesteuert? Wie machst Du das mit den
Leitungslängen zu den Rolläden über i2c? Bei mir ist schon trotz
Bustreiber nach 10 M schluss. Wie wechselt denn die Beschriftung der
vier Tasten?? Ist ja echt super. Ein Bild hast Du davon nicht, oder?
Ist das in C geschrieben? Wenn ja bekommst Du das noch alles in den
AVR?
Und eine Frage noch: Wie machst Du das, dass dir die Stellung der
Rolläden in Prozent angezeigt wird? Errechnen oder mit einem Sensor?
Tschuldige die vielen Fragen, aber da kann man ja noch was für sein
eigenes Projekt lernen.
Gruss
Frank

von Toni (Gast)


Lesenswert?

Zum Fehler vom Anfang:

Zur Kollisionserkennug: Jeder Aktor prüft jedes BIT beim senden! BIT
nicht Byte!!!
Fals 2 od. mehrere schreiben, und einer HIGH auf dem Bus legt und ein
anderer LOW, dann ist SDA LOW somit erkennt der Aktor dass jemand
anderer auch schreibt und ÜBERLÄSST dem anderen den Buss.

Vor dem Start sollte man auch nachsehen, dass der Bus HI ist und den
Takt anlegen.
Die genauen Timings hab ich gerade nicht. Aber ungefähr so läufts (auch
mit dem Nachbar ;-)  ).

von Wolfram (Gast)


Lesenswert?

@Frank:
>Bei mir ist schon trotz Bustreiber nach 10 M schluss
Wenn bei dir trotz Bustreiber schon nach 10m Schluss ist, machst du was
falsch. Schau mal nach P82b96 von Phillips.

von Martin Schenk (Gast)


Lesenswert?

Gestern habe ich die Abfrage des AD-Wandlers zur Stromausfallerkennung
von der Interruptroutine in die main-Schleife verschoben. Seither sind
die Probleme mit dem I2C-Bus nicht mehr aufgetreten !

Die Rolladensteuerung befindet sich in einem Alugehäuse
innerhalb des Sicherungskastens in dem die komplette Elektronik
untergebracht ist. Dort befindet sich auch das Display, d.h. der
RS232-Bus und der I2C-Bus werden nicht nach außen geführt.
Von der Steuerung aus geht zu jedem Rolladen lediglich eine 7-adrige
Leitung(Phase Hoch, Phase Runter, Null, Erde, Taster Hoch, Taster
Runter, Taster Common). Weitere externe Komponenten gibt es nicht.
Bei einem Tastendruck liegt eine 230V-Spannung am entsprechenden
Eingang an. Der Prozessor steuert die Rolläden über Relais, welche sich
ebenfalls in der Steuerung befinden.
Es gibt viele Möglichkeiten ein solches Projekt zu realisieren, mir war
es wichtig alle Komponenten zentral an einem Ort zu haben. Alle
Leiterplatten sind steckbar, eine Reparatur oder Fehlersuche demnach
einfach durchzuführen.

Bild habe ich keins, könnte aber am Wochenende eins reinstellen.

Programmiert habe ich in C, der Programmspeicher des ATMEGA128 ist
jedoch schon zu 80 Prozent belegt. Übers Display lassen sich ca. 250
Variablen eingeben und anzeigen, das alleine belegt ca. ein drittel des
Speichers.

Die Position der Rolläden wird errechnet. Die unterschiedlichen
Geschwindigkeiten beim Hoch- und Runterfahren der Rolläden werden dabei
berücksichtigt. Allerdings darf nicht vergessen werden, daß es sich um
eine Zeitsteuerung ohne Sensoren handelt, d.h die Steuerung merkt nicht
ob der Rolladen aufgrund von Spannungsschwankungen oder
unterschiedlicher Last unterschiedlich schnell fährt oder sich
überhaupt nicht bewegt weil er im Winter festgefroren ist.

Gruß
Martin

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.