Forum: Mikrocontroller und Digitale Elektronik Mit Timer1 Impulszeit messen


von J. S. (harry_2)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe hier mal wieder ein Problemchen. Also, ich möchte die
High-Zeit eines Rechtecksignales mit Hilfe des Timer1 messen.
Als Eingang benutze ich PORT D2 (Mega88 Int0, natürlich in
Assembler).
Bei ansteigender Flanke möchte ich Timer1 starten, den Interrupt
auf fallende Flanke umschalten, wenn diese dann kommt den Timer
anhalten, auslesen Flanke nochmal auf ansteigende umstellen.
Irgendwo ist da der Wurm drin, das hat mit der Impulszeit wenig zu
tun eher mit Lottozahlengenerator.
Kann da mal einer, der mehr Ahnung hat als ich, nachsehen.


Gruß

von Karl H. (kbuchegg)


Lesenswert?

Wo setzt du TCNT1 wieder auf 0 zurück?


(Zum Pulsmessen nimmt man den Input Cpature. Dazu ist er da.)

von J. S. (harry_2)


Lesenswert?

Hallo Karl Heinz,
das hat vor dem Rücksichern von sreg gestanden, hat aber keine
Veränderung gebracht da hab ich es wieder raus geschmissen.

von Karl H. (kbuchegg)


Lesenswert?

J. S. schrieb:
> Hallo Karl Heinz,
> das hat vor dem Rücksichern von sreg gestanden, hat aber keine
> Veränderung gebracht da hab ich es wieder raus geschmissen.

Ach? Wird das Programmieren durch Versuch und Irrtum? Wir verändern das 
Programm wahllos und zufällig ohne zu wissen was wir tun und ohne Plan 
wie es eigentlich funktionieren sollte.

Dann lass dir gesagt sein: Das funktioniert nicht.

von J. S. (harry_2)


Lesenswert?

Mir ist schon klar, das du da weiter bist als ich. Ich Versuche
da im Selbststudium mit Literatur die mehr schlecht als recht
ist weiter zu kommen, da probiert man halt so manches. Ob das
bei genauerer Betrachtung durch einen wissenden dann noch Sinn
macht, oft nicht. Aber habe etwas Geduld mit einem Hardwaremenschen,
der kann es noch nicht besser. Aber ist gewillt zu lernen.

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Na ja überleg doch einfach.

Wenn du die zeitlichen Abstände zwischen Autos messen sollst, dann hast 
du 2 Möglichkeiten
* entweder du lässt deien Uhr durchlaufen und ziehst von jeder 
gemessenen Zeit immer die Zeit der letzten Messung unmittelbar davor ab 
um so auf die Differenz zwischen 2 Autos zu kommen
* oder aber du stellst nach jeder Messung deine Stoppuhr wieder auf 0 
zurück


In dem Fall ist es dir doch auch sonnenklar, dass die Stoppuhr auf 0 
zurückgestellt werden muss oder zumindest eine spezielle Behandlung 
braucht (Differenzbildung). Warum soll das in einem µC anders sein? Dein 
µC macht und kann genau dasselbe wie du auch. Nur eben scheller.

Welche Pulse misst du denn überhaupt? Welches ist dein Erwarungswert, 
was bei der Messung rauskommen müsste?

von J. S. (harry_2)


Lesenswert?

Das sind schon recht lange Impulse, zwischen 300 - 800 µS.
Das mit dem zurücksetzen habe ich zurück gesetzt. Also
wieder da eingebaut wo es war.

von Karl H. (kbuchegg)


Lesenswert?

J. S. schrieb:
> Das sind schon recht lange Impulse, zwischen 300 - 800 µS.

OK. Und wo ist deine Berechnung für den Zählerstand, den du erwartest?
Wie gibst du die Werte aus?

> Das mit dem zurücksetzen habe ich zurück gesetzt. Also
> wieder da eingebaut wo es war.

von J. S. (harry_2)


Lesenswert?

Du da rechne ich noch nicht groß um ich sage hier einfach
im TCNT1 ein Wert 0xFF = 255 µS. Es geht mir in erster Linie um
die Funktion und das Verständnis. Der Timer ist 1/8 eingestellt
und der Mega88 läuft mit 8Mhz.

von Karl H. (kbuchegg)


Lesenswert?

OK.
Dann im Klartext:
zeig alles!

von Karl H. (kbuchegg)


Lesenswert?

J. S. schrieb:
> Du da rechne ich noch nicht groß um ich sage hier einfach
> im TCNT1 ein Wert 0xFF = 255 µS.

Mir gehts nicht um die Zeit an sich.
Ich will eigentlich nur wissen, ob du dir Gedanken darüber gemacht hast, 
ob dir der Timer überlaufen kann!

von J. S. (harry_2)


Lesenswert?

Du, genau so kommt mich das vor. Ich habe hier eine Routine
geschrieben mit der ich den Impulswert auf einem Display
angezeigt bekomme. Wenn ich den Wert aus TCNT1 auslese und
so abspeichere wie du das da siehst also in IMP_Lang laufen die
Zahlen halt durch, als ob dem Timer das stoppen und zurücksetzen
egal wäre. Zur Kontrolle habe ich in IMP_Lang einfach mal 800
eingeladen, die werden dann auch so angezeigt. Es liegt hier einzig
und alleine an meiner "Super" Routine für den Timer auszulesen
und dann richtig zurückzusetzen.

von J. S. (harry_2)


Lesenswert?

Für den Mega88 natürlich das Register EICRA und nicht MCUCR. Nach der
Änderung laufen die Zahlen auch nicht mehr durch, da findet nun
überhaupt keine Auslösung des Interrupt mehr statt.

von J. S. (harry_2)


Lesenswert?

J. S. schrieb:
> Für den Mega88 natürlich das Register EICRA und nicht MCUCR. Nach der
> Änderung laufen die Zahlen auch nicht mehr durch, da findet nun
> überhaupt keine Auslösung des Interrupt mehr statt.

Nach dem ändern der Register und dem löschen der zugehörigen Flag
läuft das Ding auch, mit einer Genauigkeit die ich so nicht vermutet
hätte. Also, läuft alles so wie es soll.

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.