Forum: Mikrocontroller und Digitale Elektronik frage


von Stephan H. (herold)


Lesenswert?

hallo
ich wollte gerad den timer2 2 programmieren um jede 20ms eine led 
blinken lassen aber anscheind habe ich was falsch gemacht.kann mir mal 
jemand da eine hilfe geben? da ist meine datei
#include <reg515.h> //   Einbinden der 80535-Definitionen

/*   Definitionen  */

#define W_Zeit 10    //  W_Zeit = 10 bedeutet eine Zeit von 10 *

//66ms = 0,66sec

/*   Definitionen Globaler Variablen  */
char data Zeit;

/*   Leuchtdioden  */
sbit P3_2 = 0xB2;
void main (void)
{

T2I0=0; //Timer-2-Anhalten
T2I1=0;
CCEN=0x08;

T2CM=0; //   gibt Modus "0", also High an P3.2 bei Gleichstand
     //von CC1 und Timer 2.
     //Low kommt wieder bei Timer 2 - Überlauf

I2FR=0;
I3FR=0;

T2PS= 0; //1 MHz - Takt für Timer 2 ( empfohlen  für korrekte 
Arbeitsweise des Timers)=Inkrementiertgeschwindigkeit
TH2= 0xB4;// 250-15=( insgesamt 15 Hz wiederholt Frequenz)
TL2=0x3C;
CRCH=0x46;//( insgesamt 120  von 240 in TH2_TL2
CRCL=0x32;
T2I0=1;     //Modus "01" bedeutet "Timer 2 ein" und
T2I1=0;    //"Taktsignal = Oszillatortakt
T2R0=1;  //    Timer 2 - Reload einschalten, beim Timer-Überlauf
T2R1=0;
ET2=1;
EAL=1;
while(1);  //    wiederhole immer
  }
void TimerInt2(void) interrupt 5//  Timer2-Interruptroutine im 
Pseudo-Code !!!!!!!!!!!!!
  {

T2I0=0; //Timer-2-Anhalten
T2I1=0;

TH2=0xB4;// 250-15= Zählregister (insgesamt 15 Hz wiederholt Frequenz)
TL2=0x3C;
CRCH=0x46;//Compare Register ( insgesamt 120  von 240 in TH2_TL2
CRCL=0x32;
T2I0=1;     //Modus "01" bedeutet "Timer 2 ein" und
T2I1=0;     //"Taktsignal = Oszillatortakt
T2R0=1;    //    Timer 2 - Reload einschalten, beim Timer-Überlauf
T2R1=0;
 Zeit--;                    //    (Zeit)--
  if(Zeit == 0)             //    Wenn (Zeit) == 0
    {
    Zeit = W_Zeit;          //        (Zeit) = W_Zeit
    P3_2 = ~P3_2;             //        LED-Zustand invertieren
    }// end if
  }


von Timey (Gast)


Lesenswert?

66ms != 0.66s
66ms = 0.066s
0.66s = 660ms

von Stephan H. (herold)


Lesenswert?

ist die initialisierung okay?die zahlen spiellen keine rolle mir geht 
mehr um die gesamt initialisierung
danke

von Peter D. (peda)


Lesenswert?

Schmeiß mal den ganzen T2-Quatsch ausm Interrupt raus, der hat da nichts 
zu suchen.
Einmal initialisieren reicht völlig.


Peter

von Peter D. (peda)


Lesenswert?

Stephan Herold wrote:

> T2PS= 0; //1 MHz - Takt für Timer 2 ( empfohlen  für korrekte
> Arbeitsweise des Timers)=Inkrementiertgeschwindigkeit

Dem T2 isses wurscht, der arbeitet immer korrekt, egal welcher Takt.

Is nur für die Leute, die Reloadwerte unbedingt im Kopf ausrechnen 
müssen, statt einfach dem Präprozessor das Rechnen zu überlassen.


Peter

von Matthias (Gast)


Lesenswert?

Hallo

ich habe da was aus einem alten Projekt. Vielleicht hilft das weiter.
// aus einem alten Projekt mit 16MHz Quartz


#define TIMER_2_MODUS 0x10 /*Timer 2 im Modus 0 (16 Bit Reload)*/
#define TIMER_2_OVERFLOW_LOW 0x8D /*Ueberlauf alle 278us*/
#define TIMER_2_OVERFLOW_HIGH 0xFE /*Ueberlauf alle 278us*/


void HardwareInit(void)
{
  T2CON = TIMER_2_MODUS;       // Modus Timer2 festlegen
  TL2 = TIMER_2_OVERFLOW_LOW;  // Timer2 voreinstellen
  TH2 = TIMER_2_OVERFLOW_HIGH; // Timer2 voreinstellen
  CRCL = TIMER_2_OVERFLOW_LOW; // Nachladeregister voreinstellen
  CRCH = TIMER_2_OVERFLOW_HIGH;// Nachladeregister voreinstellen
  ET2=1;                       // Interrupt Timer2 freigeben
  EAL=1;                   // alle Interrupts erlauben
}

Gruss Matthias

von Stephan H. (herold)


Lesenswert?

void HardwareInit(void)
{
  T2CON = TIMER_2_MODUS;       // Modus Timer2 festlegen
  TL2 = TIMER_2_OVERFLOW_LOW;  // Timer2 voreinstellen
  TH2 = TIMER_2_OVERFLOW_HIGH; // Timer2 voreinstellen
  CRCL = TIMER_2_OVERFLOW_LOW; // Nachladeregister voreinstellen
  CRCH = TIMER_2_OVERFLOW_HIGH;// Nachladeregister voreinstellen
  ET2=1;                       // Interrupt Timer2 freigeben
  EAL=1;                   // alle Interrupts erlauben
}

wenn man so schreibt wird dann automatisch denn modus festgelegt?
und und die ganze register werden die dann in der main funktion mit 
werte geladet oder?

von Matthias (Gast)


Lesenswert?

Tschuldigung,

ich habe vergessen zu schreiben:

void main(void)
{
   HardwareInit();
   while(1)
   {
   }
}

Frohes Basteln!

Matthias

von Stephan H. (herold)


Lesenswert?

wenn so gemacht wird dann brauche ich also keine nachlade wert eingeben?

von Matthias (Gast)


Lesenswert?

Der Modus 0 von Timer2 müsste autoreload sein (siehe Kommentar beim 
define). Es ist allerdings schon ein paar Tage her, dass ich mich mit 
dem 8051 beschäftigt habe.

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.