mikrocontroller.net

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


Autor: Hölscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Werner B. (Gast)
Datum:

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

Autor: Hölscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mike R. (thesealion)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hölscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hölscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.