Probleme mit dem Initialisieren meines Timers

Gast #235937
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);
}
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
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.
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);
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.