frage

OP #568883
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
  }

#568901
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
Gast #568903
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
OP #568914
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?

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