8051-Timer Interrupt erfolgt nur einmal

Gast #212309
Lesenswert?

Guten Morgen,

ich versuche gerade, mit dem Timer0 beim 8051er (Cypress AN2131)
regelmäßig einen Interrupt auszulösen. Als Initialisierung verwende ich
folgendes:

MOV TMOD,#00010001b  ;TMOD-Register: Timer, 16bit
SETB ET0    ;Timer0-Interrupt freigeben
SETB TR0    ;Timer 0 starten
SETB EA      ;Alle Interrupts freigeben

In der Interrupt-Routine steht folgendes:

CLR TF0
SETB TR0

Der Interrupt wird jedoch nur einmal ausgelöst, dann nicht
mehr. Wo liegt der Fehler?

Gruß, Martin.
Gast #212311
Lesenswert?

Hallo,

@crazy horse

>reti?

das habe ich gemacht. Interessant ist, daß die Funktion mit
dem Cypress FX2 funktioniert, jedoch nicht mit dem AN2131.
Offensichtlich gibts da Unterschiede zwischen den 8051-Kernen.
Gast #212312
Lesenswert?

> In der Interrupt-Routine steht folgendes:
>
> CLR TF0
> SETB TR0


Das ist völlig überflüssig !

TF0 wird beim Eintritt automatisch gelöscht.
Wäre TR0 nicht bereits gesetzt, gäbe es erst gar keinen Interrupt.

Wo steht denn das RETI ?


Peter
Gast #212313
Lesenswert?

Hallo,

ist sichergestellt das wichtige Register wie z.B. das TMOD, TCON und IE
nicht an anderer Stelle im Programm überschrieben werden!? ... auch
nicht die relevanten Bits davon/darin. Gruß Frank
Gast #212314
Lesenswert?

So wie ich das sehe, sollte Dein Programm laufen. Denkst Du daran, daß
der Timer0 im 16bit-Modus keine Auto-Reload-Funktion hat? Sprich, Du
mußt den Startwert jedesmal selbst reinschreiben, sonst fängt er halt
bei null an zu zählen.

Poste mal den vollständigen Source-Code. Wie Frank schon geschrieben
hat, evtl. wird irgendwo an anderer Stelle etwas Böses mit den
Timerbits angestellt.

Gruß,
Markus_8051

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren