Forum: Mikrocontroller und Digitale Elektronik ATmega8 Zeit messen mit Timer und senden mit UART - Assembler


von kpman (Gast)


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
von Joe (Gast)


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
von kpman (Gast)


Lesenswert?

Danke für die fixe antwort! Hast du eventuell ein Code Beispiel parat, 
dass mir das auslesen des Timers zeigt?

Bzw. in welchem register wird der Timer count gespeichert?
von spess53 (Gast)


Lesenswert?

Hi

>Bzw. in welchem register wird der Timer count gespeichert?

Schon mal etwas von einem Datenblatt gehört?

http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf

MfG Spess
von STK500-Besitzer (Gast)


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...
von spess53 (Gast)


Lesenswert?

Hi

>Bei 5 Sekunden wird es mit Sicherheit ein paar Timer-Überläufe geben.

Nö. Ein 16Bit-Timer läuft bei 4MHz und Prescaler 1024 alle 16,xxx s 
über.

MfG Spess
von Timer (Gast)


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.
von Hannes L. (hannes)


Lesenswert?

Timer schrieb:
> Für eine entsprechende Genauigkeit
> kommt man dann allerdings nicht um einen Abgleich des Quarzes drumrum.

Es geht nicht um Genauigkeit, sondern um eine Hausaufgabe...

kpman schrieb:
> Das ganze muss ich in Assembler
> umsetzen.

...
von oldmax (Gast)


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
von Hannes L. (hannes)


Lesenswert?

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.

...
von Andreas B. (bitverdreher)


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.....
von Hannes L. (hannes)


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...

...
von wb1 (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab Dir mal ein Beispiel gemacht.
Bewußt hab ich diese nicht kommentiert, damit Du dich damit 
beschäftigst.
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.