Hallo Forum Freunde, ich programmiere gerade meinen ersten Timer in C. Kann mir jemand vielleicht sagen was an den Funktionen falsch ist? Also wenn ich die Funktion v_Timer0_wait(50000) zwanzig mal nach einander aufrufe müsste ich doch eigendlich eine Wartezeit von 1Sekunde haben. Leider Togelt der PORT sehr viel schneller. Wo könnte der Halken liegen? Mit freudlichen Grüßen Christan Hölscher -------------------------------------------------------------- v_Timer0_wait(50000); //20 mal Aufrufen müste doch eigendlich 1s sein? oder nicht.. FUNKTION: #include <at898252.h> // Headerdatei Controller einbinden #define EXT_QUARZ 11.059 //Ausgabe Quarz Angabe MHz #define VORTEILER 12 #define LATENTZEIT 9 //Zeit bis TL0 in ISR gesetzt ist #define REL_VAL 65536 + LATENTZEIT void v_Timer0_init(void) { TMOD = 0x01; //Initialisierung Timer 0 als Timer0 16Bit-Zeitgeber TR0 = 1; //Timer = starten } void v_Timer0_wait(unsigned int time) //Maximale Größe 50ms { unsigned int uiReloadval = REL_VAL (time*EXT_QUARZ)/VORTEILER; TL0 = (unsigned char) uiReloadval; TH0 = uiReloadval / 256; while(TF0 == 0); }
50000 * 11.059 passt nicht mehr in einen unsigned int, oder?
Hallo Werner, Die Formel ist doch 65536-9-(50000 * 11.059) / 12 = 19447 müste doch in Ordnung sein. Oder verstehe ich das nicht richtig! Das MINUS was oben fehlt habe ich in meinem Quellcode.. Mit freundlichen Grüßen Christian
Der Controller muß aber jeden Schritt der Rechnung einzeln ausführen und die Ergebnissse müssen auch noch in die angegebenen Variablen passen. Und das tut (50000 * 11.059) wohl nicht mehr. Also gibt es einen überlauf und er rechnet mit dem "neuen" Wert weiter. Hier hilft nur Formel umstellen, das so etwas micht auftreten kann oder ein expliziter Typecast in eine Variable mit einem größeren Zahlenbereich.
Hallo, schon mal vielen Dank für eure Antworten. Wie müsste den mein Quellcode am besten für 50ms aussehen? Kann mir da jemand weiter helfen. Mit freundlichen Grüßen Christian
Hallo habe meinen Quellcode noch mal verändert. Leider immer noch ohne Erfolg. Wenn ich 20 mal v_Timer0_konstant(); aufruf müste ich doch auf 1Sekund kommen. Einmal druchlaufen ist docj 50ms oder vertue ich mich da. Habe leider kein Oszilloskop. Mit freundlichen Grüßen Christian #include <at898252.h> // Headerdatei Controller einbinden unsigned int uiReloadval = 65536 - 50000; //12MHZ void v_Timer0_konstant(void) //Timer 50 Milisekunden { TR0 = 0; TMOD = 0x01; TL0 = (unsigned char) uiReloadval; TH0 = uiReloadval / 256; TR0 = 1; //Timer = starten while(TF0 == 0); }
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.