Forum: Mikrocontroller und Digitale Elektronik 50ms Timer für AT89S8252


von Andreas W. (wurzi1000)


Lesenswert?

Hi, ich weis nicht wie ich einen 50ms-Timer in C schreiben kann.

Bitte um Hilfe, wenn möglich auch Quellcode

von Karl heinz B. (kbucheg)


Lesenswert?

Welche Zeit kriegst du den hin?

Das Prinzip eines Timers ist es doch, dass in regelmässigen
Zeitabständen eine Interrupt Funktion aufgerufen wird.
Kriegst du die gewünschte Zeit nicht direkt hin, dann
musst du halt in der ISR die Anzahl der Aufrufe mitzählen.
Wenn die ISR zb alle 1 ms passiert, dann sind nach dem
50-ten Aufruf 50ms vergangen.
1
unsigned char NrCalls;
2
3
ISR( ... )
4
{
5
  NrCalls++;
6
  if( NrCalls == 50 ) {  // das war der 50 te Aufruf, also
7
                         // sind 50 ms vergangen
8
    NrCalls = 0;
9
10
    // was auch immer du in 50 ms Intervallen tun möchtest
11
  }
12
}

  

von Andreas W. (wurzi1000)


Lesenswert?

Wie wären denn die Timereinstellungen für einen 1ms-Timer?

Welcher Timer-Modus?

TH0, TL0, ...

Schreibe übrigens den Timer für einen AT89S8252, also 8051er-Derivat

von Karl heinz B. (kbucheg)


Lesenswert?

> Wie wären denn die Timereinstellungen für einen 1ms-Timer?

Das wirst du dir wohl oder übel aus dem Datenblatt
raussuchen müssen. Müsste ich auch.

von Karl heinz B. (kbucheg)


Lesenswert?

> Wie wären denn die Timereinstellungen für einen 1ms-Timer?

Versteif dich nicht auf die 1ms. Die waren nur ein Beispiel.
Setze einen Timer auf, der regelmässig einen Interrupt
auslöst und rechne dir aus, in welchen Zeitabständen
das der Fall ist. Danach dividierst du die 50 ms durch
diese Zahl und weist wie weit du zählen musst.

von Andreas W. (wurzi1000)


Lesenswert?

Das mit dem Interrupt bzw. einem Software-Timer ist ja nicht das 
Problem.

Ich bekomm nur für den Timer nie die richtigen Einstellungen zusammen.

von Karl heinz B. (kbucheg)


Lesenswert?

> Das mit dem Interrupt bzw. einem Software-Timer ist ja nicht das
> Problem.
>
> Ich bekomm nur für den Timer nie die richtigen Einstellungen zusammen.

Das versteh ich jetzt nicht.
Schaffst du es einen Interrupt auslösen zu lassen oder schaffst
du es nicht?

Das kann doch nicht so schwer sein, einen Timer so zu
initialisieren, dass er zb. bei einem Overflow auslöst.
Wenn ich bei Google "8051 timer interrupt" eingebe
kriege ich massenhaft Beispiele dafür. Die Details
sind vielleicht Compiler-spezifisch, aber die grundsätzliche
Vorgangsweise ist ja nicht vom Compiler abhängig. Man schreibt
Werte in Konfigurationsregister des µC und dann zählt der
Timer schon munter vor sich hin. Die Interrupts noch freigeben
und das wars dann auch schon.

Und um das auch klar zu sagen:
Ich werd dir das Ding nicht schreiben.
Die 5 Initialisierungen wirst du ja wohl noch alleine
hinkriegen.

von Andreas W. (wurzi1000)


Lesenswert?

Ich bring nur keinen Timer zusammen, die Initialisierung ist eh kein 
Problem.

trotzdem thx für deine Bemühungen

von Ronny (Gast)


Lesenswert?

Du weisst schon,das der Timer nach korrekter initialisierung nahezu 
selbsttätig im Hintergrund arbeitet?

von Andre S. (dg2mmt)


Lesenswert?

Hmm.. wo liegen denn deine Probleme? Was bekommst du hin, wo klemmt es 
dann? Werd mal konkret, dann kann man auch helfen.
Zeig mal wie du den Timer initialisierst, wie deine ISR aussieht.

von Andreas W. (wurzi1000)


Lesenswert?

@ronny: ja, weis ich, wenn ich ohne interrupt arbeite funktioniert er 
auch(halbwegs).

von Andreas W. (wurzi1000)


Lesenswert?

@Andre: Hatte bis jetzt keine ISR, schreib sie aber gerade

von Andreas W. (wurzi1000)


Lesenswert?

So, hab das Problem jetzt gelöst, der Timer funktioniert wunderbar, das 
Problem lag wo anders.

Danke für eure Hilfe

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.