mikrocontroller.net

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


Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <stdio.h>
#include <string.h>
#include <reg552.h>

int a = 1;
int Messlaenge = 0;

void Init_Timer2()
{
 EA = 1;
 TM2CON = 0x81; //Timer 2 16 bit overflow interrupt select + Systemtakt : 12 (T2MS0 & T2MS1)
 ET2 = 1; //enable Timer 2 overflow interrupts
 //Mit TMH2 und TML2 wird der Vorsetzwert des Timer 2 festgelegt.
 //Timer 2 soll alle 1ms ueberlaufen und einen Interrupt produzieren,dies geschieht bei einem Vorsetzwert von 64613d
 IEN1 = 0x80;
 TMH2 = 0xFC;
 TML2 = 0x65;

}

void Timer2 (void) interrupt 14 using 3 //nutze Registerbank 3
{
TMH2 = 0xFC;
TML2 = 0x65;
Messlaenge ++ ; //Messlaenge incrementieren


T2OV = 0; //Interrupt Flag zuruecksetzen
}

void main()
{
SP=0x52; //Stack Pointer setzen!
Init_Timer2(); //Initialisierung Timer 2

/* LCD oeffnen */


do{

/* Messlaenge auf LCD ausgeben*/

}while(a=1); //Endlosschleife
}


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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: MC (Gast)
Datum:

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

Autor: Bernhard (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

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.