Forum: Mikrocontroller und Digitale Elektronik Timer 1 Interrupt


von Rainman Huhu (Gast)


Lesenswert?

Hallo

habe ein kleines Problem mit einem Interrupt.

Aufgabenstellung:
Timer1 invertiert durch Nutzung seines Interrupts und Reload Modus im 
Abstand von 200us den Port 4.1. Rest ist klar!

wie muss ich diesen Timer1 einstellen, das er nach 200us den Interrupt 
auslöst?

ich verwende den A51!

heißt dieser Timer1 "Timer1 Overflow", sonst habe ich keinen gefunden, 
wo man einen Interrupt bei diesem Timer auslösen kann?

von Christian Bischoff (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich fürchte Du hast ein paar Informationen vergessen. Welcher 
Prozessor/Controller wird verwendet? Programmierst Du in Assembler oder 
C?

Wenn ich die wenigen Infos richtig interpretiere programmierst Du ein 
8051-Controller in Assembler. Wenn diese Annahme richtig ist hilft Dir 
vielleicht das Assembler-Beispiel im Anhang weiter. Es läuft auf einem 
AT89C2051 mit recht guter Genauigkeit. Evtl. sind einige Anpassungen an 
den verwendeten Assembler notwendig da Deiner vielleicht die Eine oder 
Andere Direktive ($XREF, $DEVICE, $DATE, $PAGELENGTH, $SYMBOLS, ORG, 
etc.) nicht versteht.

von Rainman Huhu (Gast)


Lesenswert?

uC: 80535
Programmieren in Assembler

hoffe, das es so besser geht!

von Christian Bischoff (Gast)


Lesenswert?

Moin,

perfekt! Dann sollte das Beispiel für Dich funktionieren. Du kannst die 
Werte für die Timerinitialisierung daraus entnehmen. Wenn ich mich recht 
entsinne laufen beide Timer im Auto-Reload.

Ups! Dabei fällt mir ein das der 80535 eine kleine Inkompatibilität bei 
den Interrupts hat. Da er mehr Interruptquellen kennt hat er zwei 
Control-Register die etwas anders heißen als das Original. Wenn Du 
Deinem Assembler dies den Zielprozessor nicht als 80535 bekannt machst 
(vielleicht geht es auch nicht?) dann merkt er den Fehler auch nicht. Da 
ich lange nichts mehr damit gemacht habe muß ich im Datenbuch 
nachschauen [oder Du ;-)].

Tschau

Christian

von hoschi (Gast)


Lesenswert?

Aufgabenstellung:
Timer1 invertiert durch Nutzung seines Interrupts und Reload Modus im 
Abstand von 200us den Port 4.1. Rest ist klar!


ganz einfach:

org  001Bh             ; Interrupt-Vektor Timer1
cpl  p4.1
RETI

; Initialisierung
anl  tmod,#00001111b      ; Timer 0 retten
orl  tmod,#00100000b      ; Timer 1 Auto-Reload (8 Bit)
mov  TL1,#55d         ; 255-55 = 200 us Überlauf
mov  TL1,#55d      ; Startwert (damit es bei 1.Mal auch passt)
setb  ET1                ; Timer 1-Interrupt freigeben
setb  EAL                ; globale Interruptfreigabe
setb  TR1                ; Timer 1 starten
.
.     (Hauptprogramm, etc.)
.

Damit lässt du Timer0 unberührt.
Eventuell musst du den Interrupt-Vektor von Timer1 anpassen, d.h. wenn 
du z.B. so ein Entwicklungssystem 80c535 mit Monitorprogramm hast ist 
der Vektor sicher im RAM bei 801Bh.
Achso: Das ganze gilt für Quarz 12Mhz!

gruß,
hoschi

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.