Forum: Mikrocontroller und Digitale Elektronik Timer 2 Interrupt [8051]


von Bernhard (Gast)


Lesenswert?

Hi,

ich möchte den Timer 2 im µC 80C552 nutzen. Diesen möchte ich mit einem 
Vorsetzwert versehen,damit jede Millisekunde die ISR aufgerufen wird.
Dazu hab ich folgendes in C programmiert:
1
#include <stdio.h>
2
#include <string.h>
3
#include <reg552.h>
4
5
int a = 1;
6
int Messlaenge = 0;
7
8
void Init_Timer2()
9
{
10
 EA = 1;
11
 TM2CON = 0x81; //Timer 2 16 bit overflow interrupt select + Systemtakt : 12 (T2MS0 & T2MS1)
12
 ET2 = 1; //enable Timer 2 overflow interrupts
13
 //Mit TMH2 und TML2 wird der Vorsetzwert des Timer 2 festgelegt.
14
 //Timer 2 soll alle 1ms ueberlaufen und einen Interrupt produzieren,dies geschieht bei einem Vorsetzwert von 64613d
15
 IEN1 = 0x80;
16
 TMH2 = 0xFC;
17
 TML2 = 0x65;
18
19
}
20
21
void Timer2 (void) interrupt 14 using 3 //nutze Registerbank 3
22
{
23
TMH2 = 0xFC;
24
TML2 = 0x65;
25
Messlaenge ++ ; //Messlaenge incrementieren
26
27
28
T2OV = 0; //Interrupt Flag zuruecksetzen
29
}
30
31
void main()
32
{
33
SP=0x52; //Stack Pointer setzen!
34
Init_Timer2(); //Initialisierung Timer 2
35
36
/* LCD oeffnen */
37
38
39
do{
40
41
/* Messlaenge auf LCD ausgeben*/
42
43
}while(a=1); //Endlosschleife
44
}


Das oben stehende Programm soll die Variable "Messlaenge"(die jede 
Millisekunde um 1 erhoeht werden soll) auf dem LCD ausgeben.
Eigentlich müsste ja nach 300ms in der Variable "Messlaenge" 300 drinnen 
stehen,doch das tut es nicht.
Erst nach ca. 23 Sekunden steht in der Variable "Messlaenge" der Wert 
300.

Was mache ich falsch?

Danke!

Bernhard

von Peter D. (peda)


Lesenswert?

Der 80C552 hat einige Abweichungen zum Standard 8052.

Z.B. der T2 ist völlig anders aufgebaut, das Zählerregister ist 
read-only, d.h. Deine Schreibzugriffe sind wirkungslos.

"Timer T2 is not loadable and is reset by the RST signal or by a rising 
edge on the input signal RT2, if enabled."


Ich würde heutzutage eh einen 8051 mit Flash nehmen, ist wesentlich 
einfacher zu programmieren als ein ROMless 80C552.
Und die haben meines Wissens einen voll funktionsfähigen T2.


Peter

von MC (Gast)


Lesenswert?

>Der 80C552 hat einige Abweichungen zum Standard 8052.
Ich weis zwar nicht, wie genau die Abweichungen aussehen, aber T2 beim 
80C552 sollte doch auch einen 16-Bit Autoreload haben. Wie wäre es, wenn 
du den benutzt?!
Was mir noch aufgefallen ist, dass du Registerbank 3 nutzt. Versuch das 
Programm mal ohne ... using 3. Ich hatte öfters mal Probleme damit, da 
der Stack normalerweise in Registerbank1 beginnt.

von Bernhard (Gast)


Lesenswert?

Hi,

leider bin ich gezwungen mit dem 80C552 zu programmieren,ich kann den µC 
leider nicht wechseln. Den Timer 0 hab ich bereits im 16bit Modus in 
Verwendung. Den Timer 1 kann ich auch nicht verwenden,da der für die 
Generierung der Baud Rate zuständig ist. Und den Timer 3 kann man ja 
laut Datenblatt auch nicht dafür verwenden,oder?

Im Datenblatt des 80C552 hab ich zum Auto Reload Modus des Timer 2 
nichts gefunden.

Bernhard

von Peter D. (peda)


Lesenswert?

Bernhard wrote:
> leider bin ich gezwungen mit dem 80C552 zu programmieren

Ja, Totgesagte leben leider ewig.

> Den Timer 1 kann ich auch nicht verwenden,da der für die
> Generierung der Baud Rate zuständig ist.

Hat der 552 nicht nen extra Baudratengenerator?


> Und den Timer 3 kann man ja
> laut Datenblatt auch nicht dafür verwenden,oder?

Warum nicht?


> Im Datenblatt des 80C552 hab ich zum Auto Reload Modus des Timer 2
> nichts gefunden.

Hatter ja nicht.

Für einstellbare Timerintervalle mit T2 muß man die Comparefunktionen 
benutzen.

Wenn man z.B. einen Timerinterrupt alle 1000 Takte haben will, enabled 
man nen Compareinterrupt.
Und im Interrupthandler addiert man dann 1000 zu dem Comparewert.

Da es 4 Compareeinheiten sind, kann man bis zu 4 unabhängige Intervalle 
erzeugen.


Peter

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.