Hallo, ich habe folgendes Problem und hoffe ihr könnt mir weiterhelfen: Ich habe mit einem Atmega48 einen Zähler aufgebaut. Dazu habe ich einfach den INT0-Eingang an die S0 Schnittstelle von unserem vorhandenen Zähler angeschlossen und beobachte auf einem LCD die Zählimpulse. Das Problem an der Sache ist jetzt nur, dass der Zähler viel zu viele Impulse zählt (ca. 200 und mehr). Nun liegt ja nahe, dass der Kontakt einfach nur prellt. Aber eine S0-Schnittstelle ist doch eher mit einem Transistor aufgebaut oder nicht? Ich hoffe ihr könnt mir weiter helfen. Viele Grüße
Es handelt sich hier übrigens um so einen Zähler: http://www.emh-meter.de/de/produkte/eiz/ Viele Grüße
Franz schrieb: > Das Problem an der Sache ist jetzt nur, dass der Zähler viel zu viele > Impulse zählt (ca. 200 und mehr). In welchem Zeitraum? Du hast Schon gesehen, das es 100 bzw. 1000 Impulse pro KW/h sind, die ausgegeben werden?
Also der Zähler hat eine LED auf der die Impulse dargestellt werden. Sobald die Led erlischt, wurden mindestens 200 Impulse dabei gezählt. Das Ganze dauert dann nicht einmal eine Sekunde. Viele Grüße
Ein Impuls incl. Pause dauert nach Spezifikation mindestens 60 ms, d.h. mehr als 17 Impulse/s darf nicht sein. Ein Oszi könnte da zur Klärung beitragen ;-) http://www.glock-ek.de/Die_S0-Schnittstelle.pdf
OK, was passiert, wenn Du die Impulse von Hand eingibst? (taster, am besten mit FlipFlop o.ä. entprellt: http://www.mikrocontroller.net/articles/Entprellung ) Oder gleich mit einem Impulsgenerator? Ein Osziloskop hast Du vermutlich nicht?
Ein Oszi habe ich schon, jedoch ein relativ altes. Außerdem ist es auch kein Speicheroszi. Ich weiß nicht, ob man so etwas erkennt. Das mit dem Impulsgenerator werde ich mal ausprobieren.
Franz schrieb: > Ein Oszi habe ich schon, jedoch ein relativ altes. Außerdem ist es auch > kein Speicheroszi. Ich weiß nicht, ob man so etwas erkennt. An digitalen Impulsen hat sich in den letzten Jahren nicht so viel geändert, da reicht ein altes Oszi auch. Ob einer oder 200 Impulse in einer Sekunde kommen wirst Du schon sehen können.
Wieviel Strom läßt du denn fließen? Es reicht nicht, einfach den S0 an den Int0-Eingang zu legen. Der S0 zieht nach Spec auch im Aus-Zustand bis zu 2 mA, d.h. du brauchst einen relativ kleinen Pull-up Widerstand, damit der Auszustand vom µC richtig erkannt wird.
Ich habe einen 10kOhm Pull-Up Widerstand verbaut. Müsste eigentlich funktionieren. Ich habe gerade einen Impulsgenerator aus einem anderen Atmega8 gebaut. Der Ausgang schaltet eine Frequenz von 0,5Hz. Mir ist aufgefallen, dass der Zähler hier die ganze ON-Sekunde durchzählt. Komisch oder?
@ Franz (Gast) >aufgefallen, dass der Zähler hier die ganze ON-Sekunde durchzählt. >Komisch oder? Dann ist es ein Softwarefehler, kein Prellen. MFG Falk
Und in deinem Programm sind mehreren Unstimmigkeinten und schlechte Lösungen drin. Erstens deine Zeitbasis mit dem tierischen Struct und viel volatil. Nicht sinnvoll. Nimm EINEN volatile 32 Bit Variable und zähl die Einfach hoch. Der Tag hat 86400 Sekunden. Wenn dann im Programm eine "normale" Zeitangabe benötigt wird, kann man die umrechnen, die paar µs stören nicht. Dein Entprellen ist Murks. Sowas gehört in einen Timer. Das Zählen der Pulse ebenfalls, hat erstens den Vorteil, dass man auch dort Entprellen kann und b, dass man nicht wie der INT0 auf ultrakurze Störungen reagiert. MfG Falk
Okay, das habe ich mir gedacht. Kann jemand wohl nochmal über meinen Code schauen?
Franz schrieb: > dass der Zähler hier die ganze ON-Sekunde durchzählt. Wie viele Impulse gibt das dann? Entweder zählst Du die Timerüberläufe oder der INT0 wird dauernd ausgelöst (Pegel statt Flanke)?
Es sind zumindest so viele Impulse, das man die nicht mehr zählen kann, weil das LCD die Ziffern so schnell ändert. Ich habe in der Initialisierung die Register doch eigentlich so gesetzt, dass diese auf die negative Flanke reagieren. @Falk Wie wird das Zählen mit Timerüberläufen konkret realisiert?
@ Franz (Gast)
>Wie wird das Zählen mit Timerüberläufen konkret realisiert?
Ganz einfach so wie man auch Tasten ausliest und entprellt. Port
einlesen, verarbeiten (entprellen), zählen. Bei den sehr niedrigen
Pulsraten kein Problem, ein 1-10ms Timer ist alles was man braucht.
MfG
Falk
Okay, also im Prinzip wie bei der Tasterentprellung (http://www.mikrocontroller.net/articles/Entprellung). Aber wieso funktioniert der Interrupt bei mir nun nicht sauber? Der µC bekommt eine saubere Flanke und sollte doch nur einmal zählen.
Franz schrieb: > Aber wieso funktioniert der Interrupt bei mir nun nicht sauber? und vorher >aufgefallen, dass der Zähler hier die ganze ON-Sekunde durchzählt. >Komisch oder? Er zählt also bei ON (High)? Sollte aber bei einer Flanke auf low zählen? Die Initialisierung im Programm sieht OK aus, ist das auch das aktuelle Programm im Chip?
Ja es kann auch die OFF-Zeit gewesen sein, das weiß Ich nicht mehr ganz genau. Aber selbst wenn es so wär, dürfte er Nur bei der Flanke zählen oder nicht? VG
Ja, so war ja der Plan... Klemm halt Dein Oszi an einen freien Pin und toggle den in der Interruptschleife. dann kannst Du feststellen ob es ein Problem im Interrupt (oder der Initialisierung) ist, oder eher beim Anzeigen der Werte. Pullup am Portpin nicht vergessen.
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.