Forum: Mikrocontroller und Digitale Elektronik Interruptproblem bei AT89C51RC2


von Florian W. (duensch)


Lesenswert?

Hallo zusammen,

ich hoffe Ihr könnt mir mal wieder helfen. Ich bin im Moment dabei eine 
Firmware zu schreiben. Timer 1 soll zyklisch eine Blink LED ansteuern, 
Timer 2 soll mir die Baudrate generieren, ist also für seriellei 
Kommunikation zuständig. Bei Programmstart wird ein INIT Funktion 
geladen:
void init(void)
{
  EX0 = 0;  // disable external interrupt0
  EA = 0;      // disable interrupts
  baudrate = 2;
  time_counter=0;

  init_communication();

  ET1 = 0;    // disable timer1 interrupt
  TR1 = 0;    // disable timer1
  TF1 = 0;    // reset timer 1 interrupt-flag
  TL1 = 0;    //  reset timer value
  TH1 = 0;    //
  TMOD = 0x10;  // clear timer1 mode bits
  ET1  = 1;    // enable timer1 overflow interrupt
  TR1 = 1;    // enable timer1 again
  EX0 = 0;  // disable external interrupt0


  EA = 1;    // enable interrupts
}

void init_communication(void)
{
  SCON = 0x52;    // Set to 8-Bit UART
  T2CON  = 0x30;    // set timer 2 control register for use as baudrate 
generator
  RCAP2H = 0xFF;    // preset the timer 2 register for correct rollover
  switch(baudrate)
  {
    case 0:
        {
          RCAP2L = 0xB8;
          break;
        }
    case 1:
        {
          RCAP2L = 0xDC;
          break;
        }
    case 2:
        {
          RCAP2L = 0xEE;
          break;
        }
    case 3:
        {
          RCAP2L = 0xF7;
          break;
        }
    default:
        {
          RCAP2L = 0xEE;  //19200
          break;
        }
  }
  TR2 = 1;      // start timer 2
//  IPL0 = 0x10;//&=0xEF
//  IPH0 |= 0x18;//|=0x10    // Serieller Interrupt hat hohe priority
//  RI = 0;
//  TI = 0;
  ES = 1;   // !!! PROBLEMZEILE !!!
}

Die Interrupt Funktion der LED sieht folgendermaßen aus:

void timer1_interrupt(void)  interrupt 3 using 2
{
  TF1 = 0;        // reset timer 1 interrupt-flag
  time_counter++;      // Zähler für Timeout und OP-Signal
  if (time_counter>=7)  // 500ms sind verstrichen ?
  {
    time_counter=0;    // Timeout Zähler rücksetzen
    LED5 = ~LED5;  // OP-Signal umschalten
  }
}

So nun zum Problem. Wird in der Problemzeile ES = 1 gesetzt, also der 
serielle Interrupt wieder aktiviert blinkt meine LED nicht mehr. 
Irgendwie scheint des meinen Interrupt von TImer 1 zu beeinflussen.
Hat jemand ne Idee oder sieht jemand des offensichtliche, was ich wohl 
übersehen habe?

Vielen Dank für alle Ideen und Anregeungen

von Route_66 (Gast)


Lesenswert?

> // Serieller Interrupt hat hohe priority
Vielleicht wird ständig nur immer der SerINT angesprungen ?

von Florian W. (duensch)


Lesenswert?

Tja manchmal ist die Antwort so einfach ;-)
Ich hab den anstehenden seriellen Interrupt nicht zurückgesetzt und das 
wars dann....
VIelen Dank :-)

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.