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
> mißt die Spannung vor dem Spannungsregler
Bei welcher Spannung vor dem Regler soll gespeichert werden und
welchen Regler benutzt du?
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.
Du wirst ein Timing-Problem mit dem I²C-Bus haben (liegt demnach an deiner Software).
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.
>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.
Zur Not könntest du eine Globales Flag definieren, welches du nutzt um eine (vom Controller initiierte) IIC-Aktivität zu kennzeichnen. Gruß, Magnetus
>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.
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
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
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 !
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
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.
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
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 ;-) ).
@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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.