PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : count72kHz



schwenk
17.01.2006, 13:36
Ich möchte mit Asuro Zeit messen. Aber ich blick nich wie des geht:

1. in der asuro h ist die Variable count72kHz (die wie ich vermute ein Register ist das 72000 in der sekunde inklementiert wird) nicht defininiert oder deklariert (nur alse "leere" Variable).

2.Ich hab dann ein Programm geschrieben dass diese Variable count72kHz bei knopfdruck ausliest. Aber leider kamen am Terminal nur die Zahlen 39 und 40 (oder so) an :-s .

Jetz blick ich nimmer durch...
und für ne erklährung wär ich dankbar!

m.a.r.v.i.n
17.01.2006, 15:08
Hallo schwenk,

wie du schon richtig erkannt hast, wird dir Variable 72000 mal pro Sekunde erhöht. Das passiert in der Interrupt Routine
SIGNAL (SIG_OUTPUT_COMPARE2)

Da die Variable nur ein character groß ist (1Byte) ist count72kHz nach 256 Erhöhungen (entspricht ca. 3,5ms) wieder bei 0 angelangt.

Um größere Zeiten zu messen mußt du die Überläufe (wenn count72kHz von 255 auf 0 zurückspringt) in einer extra Variablen hochzählen.

Dazu muß die Asuro Lib (asuro.c) folgendermaßen geändert werden:



unsigned long timebase;

SIGNAL (SIG_OUTPUT_COMPARE2)
{
count72kHz ++;
if (!count72kHz) timebase ++;

}


Oder du guckst dir die erweiterte Asuro Bibliothek (http://sourceforge.net/projects/asuro) an. Dort gibt es das schon alles.

Gruß Peter

schwenk
17.01.2006, 15:46
Wird die Funktion Signal 72000 i.d Sekunde (oder öfter) aufgerufen ?? :shock:
Oder wie funtzt des ???

PS: Wird das "Zeitregister unabhängig vom CPU erhöt ?? Ja oder?, aber ich muss dann wohl alle 1/72000sec das Register überprüfen??? Oder hat des was mit den "magischen" Interrupts zu tun?

m.a.r.v.i.n
17.01.2006, 16:27
na klar, die Interrupt Funktion wird 72000 mal pro Sekunde aufgerufen.
Das macht der Prozessor ganz automatisch sobald die Interupts freigegeben sind, unabhängig vom Hauptprogramm (im Hintergrund).

Die Zeit für die Interupt Funktion gehen selbstverständlich dem Hauptprogramm verloren (dieses wird ja angehalten, dann die Interrupt Funktion ausgeführt, danach läuft das Hauptprogramm weiter).

72000 mal pro Sekunde hört sich erst mal recht viel an. Der Atmega8 des Asuro wird mit 8Mhz Takt betrieben. Da es ein RISC Prozessor ist, braucht er für die meisten Befehle nur 1 Prozessor Takt. Macht 8 Befehle pro µs.
Obige Interrupt Funktion braucht ca. 40 Takte (5µs).

In der erweiterten Asuro Bibliothek wurde deshalb (vermutlich) die Zahl auf 36000 reduziert, damit dem Hauptprogramm nicht zuviel Rechenzeit gestohlen wird.

Schau dir dort mal an was die Funktion GetTime macht.

Gruß Peter

schwenk
17.01.2006, 17:15
Juhu ich habs verstanden. Danke.

Nur noch eine Frage ??? Kann ich auch einstellen wie oft pro Tackt (also z.b. alle 2 Befehle oder jeddesmal) des Interrupt ausgeführt wird???

PS: Werden interrupts speziell gespeichert oder wie funtzt des mit dem Adressen Register dann ??

schwenk
17.01.2006, 17:18
Juhu ich habs verstanden. Danke.

Nur noch eine Frage ??? Kann ich auch einstellen wie oft pro Tackt (also z.b. alle 2 Befehle oder jeddesmal) des Interrupt ausgeführt wird???

PS: Werden interrupts speziell gespeichert oder wie funtzt des mit dem Adressen Register dann ??

m.a.r.v.i.n
17.01.2006, 18:44
Hallo schwenk,

ich glaube du hast das nicht richtig verstanden.

Interrupts sind externe Ereignisse, die die Verarbeitung des laufenden Programms unterbrechen und je nach Ereignis eine entsprechende Unterfunktion aufrufen.

Die Interrupt Funktionen liegen wie andere Funktionen im Programmspeicher des Prozessors. Adressiert werden sie über eine Interrupt Sprungtabelle. Dort werden die Startadressen der Interrupt Funktionen eingetragen.

Externe Ereignisse die Interrupts auslösen können z.B. Timer, UART, usw.
sein.

Zum weiteren Verständnis empfehle ich dir das
AVR-Tutorial (http://www.mikrocontroller.net/tutorial/)

Gruß Peter