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ß
Wo setzt du TCNT1 wieder auf 0 zurück? (Zum Pulsmessen nimmt man den Input Cpature. Dazu ist er da.)
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.
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.
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ß
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?
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.
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.
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.
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!
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.