Forum: Mikrocontroller und Digitale Elektronik Probleme mit dem Initialisieren meines Timers


von Hölscher (Gast)


Lesenswert?

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);
}

von Werner B. (Gast)


Lesenswert?

50000 * 11.059 passt nicht mehr in einen unsigned int, oder?

von Hölscher (Gast)


Lesenswert?

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

von Mike R. (thesealion)


Lesenswert?

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.

von Hölscher (Gast)


Lesenswert?

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

von Hölscher (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.