mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit TX Interrupt der USART bei einem 16F877A


Autor: Horst Ruecker (jonnyb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

es sieht so aus wie, wenn ich im interrupt kein Byte sende, immer wieder 
die interrupt Funktion ausgelöst wird.
ich komme aus folgenden Gründen darauf:
Ich habe im Main den RE2 blinken -> blinkt nicht, wenn ich das TXREG=ch; 
auskommentieren
Im Timer0 habe ich den RE1 blinken -> blinkt weiter, als kann der PIC 
sich nicht verabschiedet haben

Hat jemand eine Idee?

Code auszugsweise:  // ich verwende den Hitec compiler eingebunden in 
MPLAB IDE


// ------------- UART einstellen und interrupts einhängen

#define RX_PIN TRISC7
#define TX_PIN TRISC6

void COM_Init(unsigned long Baud, unsigned long Fosc, void 
(*SndInt)(void),void (*RcvInt)(void))
{
    RX_PIN = 1;    // als eingang
  TX_PIN = 0;    // als ausgang    ein
  SPBRG  = (int)(Fosc/(16UL * Baud) -1);
  RCSTA  = 0b10010000;   // ein, 8bit, async, dauer,adress aus - - -
  TXSTA  = 0b00100100;     // 8 bit, Ein, async,Hohe Baudrate, voll, 
9.bit 0
    if(SndInt!=0)
    {
      SetIntComSndFunction(SndInt);
      GIE    = 1;   // interrupts freigeben
      PEIE   = 1;   // perepherie interupts
      TXIE   = 1;   // sende interrupt aktiv
    }
    if(RcvInt!=0)
    {
       unsigned char x;
       SetIntComRcvFunction(RcvInt);
       GIE    = 1;   // interrupts freigeben
       PEIE   = 1;   // perepherie interupts
       RCIE   = 1;   // empfangs interrupt aktiv
       if (RCIF) RcvInt(); // falls register voll ist gleich ausführen
    }
}



// ------------- Interrupt functionen einhängen und abarbeiten

void SetIntT0Function(void (*NewInt)(void))    {  __IntT0 =NewInt; }
void SetIntComRcvFunction(void (*NewInt)(void)){  __IntRcv=NewInt; }
void SetIntComSndFunction(void (*NewInt)(void)){  __IntSnd=NewInt; }

// interrupts abarbeiten
void interrupt __Int(void)
{
  if (T0IE && T0IF && __IntT0 !=0) __IntT0();
  if (TXIE && TXIF && __IntSnd!=0) __IntSnd();
  if (RCIE && RCIF && __IntRcv!=0) __IntRcv();
}


//  -------------interrupt functionen //aufs mindeste reduziert
char ch;
void RecInterrupt(void)
{
  ch= RCREG;
  PORTC=ch;
}

void SndInterrupt(void)
{
  // TXREG=ch;   // sobald das auskommentiert wird ist es vorbei

}

Autor: Dieter Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Beobachtung ist richtig.

Solange das TXREG leer ist wird TXIF sofort nach dem Löschen wieder 
gesetzt.
Man ist gezwungen, nach dem letzten gesendeten Zeichen TXIE zu löschen 
um nicht dauernd wieder TX Interrupts zu bekommen.

Autor: Horst Ruecker (jonnyb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Werner,

danke für die Info.
Ich werde, wenn mit dem letzten Zeichen aus der Queue das TXIE auf 0 
setzen und beim eintragen des 1. wieder setzen.

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.