www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interruptproblem bei AT89C51RC2


Autor: Florian W. (duensch)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Route_66 (Gast)
Datum:

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

Autor: Florian W. (duensch)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.