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
}
ist die initialisierung okay?die zahlen spiellen keine rolle mir geht mehr um die gesamt initialisierung danke
Schmeiß mal den ganzen T2-Quatsch ausm Interrupt raus, der hat da nichts zu suchen. Einmal initialisieren reicht völlig. Peter
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
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
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?
Tschuldigung,
ich habe vergessen zu schreiben:
void main(void)
{
HardwareInit();
while(1)
{
}
}
Frohes Basteln!
Matthias
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.