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.