Interruptproblem bei AT89C51RC2

OP #1464162
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.