-
        

Ergebnis 1 bis 7 von 7

Thema: count72kHz

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    09.01.2006
    Ort
    Nbg
    Alter
    28
    Beiträge
    17

    count72kHz

    Anzeige

    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 .

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

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    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:

    Code:
    unsigned long timebase;
    
    SIGNAL (SIG_OUTPUT_COMPARE2)
    {
    	count72kHz ++;
    	if (!count72kHz) timebase ++;
    
    }
    Oder du guckst dir die erweiterte Asuro Bibliothek an. Dort gibt es das schon alles.

    Gruß Peter

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    09.01.2006
    Ort
    Nbg
    Alter
    28
    Beiträge
    17
    Wird die Funktion Signal 72000 i.d Sekunde (oder öfter) aufgerufen ??
    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?

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    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

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    09.01.2006
    Ort
    Nbg
    Alter
    28
    Beiträge
    17
    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 ??

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    09.01.2006
    Ort
    Nbg
    Alter
    28
    Beiträge
    17
    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 ??

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    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

    Gruß Peter

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •