Forum: Mikrocontroller und Digitale Elektronik Zähler zählt falsch


von Franz (Gast)


Angehängte Dateien:

Lesenswert?

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

von Franz (Gast)


Lesenswert?

Es handelt sich hier übrigens um so einen Zähler:
http://www.emh-meter.de/de/produkte/eiz/

Viele Grüße

von Tom (Gast)


Lesenswert?

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?

von Franz (Gast)


Lesenswert?

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

von Michael A. (Gast)


Lesenswert?

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

von Franz (Gast)


Lesenswert?

Oder hat der Atmega wohl ne Macke?
LG

von Tom (Gast)


Lesenswert?

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?

von Tom (Gast)


Lesenswert?

Franz schrieb:
> Oder hat der Atmega wohl ne Macke?
> LG

eher das Programm ;-)

von Franz (Gast)


Lesenswert?

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.

von Tom (Gast)


Lesenswert?

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.

von Michael A. (Gast)


Lesenswert?

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.

von Franz (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@  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

von Falk B. (falk)


Lesenswert?

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

von Franz (Gast)


Lesenswert?

Okay, das habe ich mir gedacht. Kann jemand wohl nochmal über meinen 
Code schauen?

von Tom (Gast)


Lesenswert?

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)?

von Franz (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@  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

von Franz (Gast)


Lesenswert?

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.

von Tom (Gast)


Lesenswert?

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?

von Franz (Gast)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.