ATmega8 Zeit messen mit Timer und senden mit UART - Assembler

Gast #2451097
Lesenswert?

Hallo!

Ich brauche dringend Hilfe. Ich möchte mit einem ATmega8 die zeit 
zwischen zwei Pulsen messen. Ich habe eine rotierende geschlitzte 
Scheibe mit einem Schlitz. Jetzt möchte ich irgendwie messen, wie lange 
die Scheibe für eine Umdrehung benötigt. Anschließend will ich das 
Messergebnis per UART versenden. Das ganze muss ich in Assembler 
umsetzen.

Ich habe keine Idee wie ich das realisieren soll. Das versenden ist kein 
Problem, allerdings kann ich die Zeit nicht messen... bzw. habe keine 
idee wie ich die Zeit messen soll. ich hatte erst gedacht ein Register 
immer weiter hoch zu zählen, was aber nicht sehr genau ist. Ich bräuchte 
eine Lösung, mit der ich:

1. Bei einem Startsignal einen Timer starte
2. Bei einem Stopsignal den Timer stoppe und zurücksetze
3. Die gemessene Zeit über den UART ausgebe

Ich verwende einen 4MhZ Quartz und die Umdrehung der scheibe kann bis zu 
5 Sekunden dauern.

Gibt es da ein gutes Modell was ich verwenden könnte? Oder habt ihr 
hilfreiche tipps und tricks? Ich habe schon eine Menge gelesen, 
allerdings treffen die ganzen Googlefunde nicht auf mein Problem zu :(

MfG

KPMan
Gast #2451102
Lesenswert?

Den Timer einfach durchlaufen lassen.

Bei Start den Timer auslesen.

Bei Stop den Timer auslesen.

Differenz bilden.

Wenn Differenz < 0 dann Maximalwert des Timers addieren.

Dann den Differenzwert in Sekunden umrechnen.


joe
Gast #2451131
Lesenswert?

Joe schrieb:
> Differenz bilden.
>
> Wenn Differenz < 0 dann Maximalwert des Timers addieren.
>
> Dann den Differenzwert in Sekunden umrechnen.

Bei 5 Sekunden wird es mit Sicherheit ein paar Timer-Überläufe geben.
Die kann man aber problemlos mitzählen.
Mache sprechen dabei von der Uhrenfunktion:
Die Uhr läuft konstant durch. Sobald das entsprechende Ereignis eintritt 
liest man die Uhrzeit ab und wartet auf das nächste relevante Ereignis 
(in deinem Fall die zweite Flanke).
Dann liest man wieder die Uhr ab ud bildet die Differenz aus den beiden 
Zeiten.
Wenn dein Timer mit 4 MHz läuft, dann gibt es bei einem 16Bit-Timer ca. 
alle 16 MIllisekunden einen Überlauf.
Wenn du dann noch die Überläufe in zwei Bytes speicherst, bist du auf 
der sicheren Seite.
Wenn man den Timer nicht anderweitig benötigt, kann man ihn auch 
(ähnlich wie bei einer Stoppuhr) bei der ersten Flanke zurücksetzen 
(oder vorher zurücksetzen und bei der Flanke dann starten).
Bei der zweiten Flanke kann man ihn dann anhalten und auslesen.
Wenn man die InputCapture-Funktion benutzt, dann lässt man den Timer 
durchlaufen...
Gast #2451170
Lesenswert?

STK500-Besitzer schrieb:
> Wenn dein Timer mit 4 MHz läuft, dann gibt es bei einem 16Bit-Timer ca.
> alle 16 MIllisekunden einen Überlauf.

Dazu wird niemand gezwungen. Wozu gibt es einen Prescaler. Die 
Erweiterung durch einen Softwarezähler ist sinnvoll, wenn die 
Zeitauflösung sonst nicht reicht. Für eine entsprechende Genauigkeit 
kommt man dann allerdings nicht um einen Abgleich des Quarzes drumrum.
Gast #2451483
Lesenswert?

Hi
Hannes Lux schrieb:
> Es geht nicht um Genauigkeit, sondern um eine Hausaufgabe...
Genau der Satz mit
> Das ganze muss ich in Assembler
> umsetzen
ist mir auch aufgefallen. Mittlerweile sind scheinbar einige 
nachwachsende "Ingenieure" selbst zum "Verpacken" ihrer Hilfesuche zu 
dumm.
Entschuldigt, aber mir geht dabei auch der Hut hoch.
>Gibt es da ein gutes Modell was ich verwenden könnte? Oder habt ihr
>hilfreiche tipps und tricks? Ich habe schon eine Menge gelesen,
>allerdings treffen die ganzen Googlefunde nicht auf mein Problem zu :(
Nun, viel gelesen zu haben scheinst du nicht. Da gibt es hier Tutorials, 
auch über die Verwendung von Timern. Und auch in Assembler und... sogar 
für Atmega8. Aber das findet man nicht, wenn man in der Suche sich auf 
fertige Lösungen stürzt.... Aber auch da hättest du fündig werden 
können, wenn dun nach "Drehzahlmesser" geschaut hättest. Da gibt es 
schon ein paar Veröffentlichungen und: Drehzahl (Frequenz) und Zeit 
(Periode) sind da
sehr anhänglich. Na ja, du bist ja noch Schüler und woher soll man sowas 
auch wissen. Daher jetzt ein wirklich nützlicher Tip: Im Unterricht 
aufpassen und geistig mitarbeiten. Wenn etwas nicht verstanden wird, 
keine Frage, werden wir helfen, aber sowas
>Hast du eventuell ein Code Beispiel parat,
>dass mir das auslesen des Timers zeigt?
geht nicht....
Daher schau ins Tutorial. Dort hab ich auch die Basis gelernt, mit Timer 
umzugehen.
Gruß oldmax
#2451935
Lesenswert?

Hannes Lux schrieb:
> oldmax schrieb:
>> Daher schau ins Tutorial. Dort hab ich auch die Basis gelernt, mit Timer
>> umzugehen.
>
> Ich nicht, ich hatte zu der Zeit keinen Zugang zum Netz und daher auch
> nicht zu Tutorials und Suchmaschinen, ich nutzte die Infos der
> Datasheets der Atmel-CD, die mir mal Jemand kopierte.
>
> ...

Gaaanz früher gab es auch mal sowas wie Bücher.....
#2451950
Lesenswert?

Andreas B. schrieb:
> Gaaanz früher gab es auch mal sowas wie Bücher.....

Und als die noch bezahlbar waren, habe ich mir etliche gekauft und auch 
gelesen.

Ich habe mir sogar vor ein paar Jahren ein AVR-Buch gekauft, aber das 
war rausgeschmissenes Geld (voller sachlicher Fehler und recht lieblos 
gemacht).

Aber die Generation Google will ja nicht mehr lernen, sondern sucht nur 
noch nach (fertigen) Lösungen. Weiter so, das ist super kreativ, das 
sind die In-Chin-Öre von morgen...

...

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