Zähler zählt falsch

Gast #2223730
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
Angehängte Dateien:
Gast #2223759
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.
Gast #2223770
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.
Gast #2223777
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?
#2223791
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
Gast #2223801
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?
#2223809
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
Gast #2223831
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?
Gast #2223975
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren