www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RX-TX-Problem ARM7 LPC2136


Autor: Philipp G. (flashmaster)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schönen guten Tag,
Ich kann mir ein Ereignis nicht erklären. Und zwar funktioniert das 
Empfangen über Uart1 im Interrupt einwandfrei mit:
void uart1_irq_init(void)
{
  UART1_LCR = 0x03;             //8bit lenght
    UART1_FCR = 0x07;             //Enable and reset TX and RX FIFO.
  UART1_IER |= 0x7;             //Enable RBR/THRE/RX Line Interrupt
  VICVectAddr0 = (unsigned)uart1isr;    //ISR deklarieren
  VICVectCntl0 = (1<<5)|7;          //Interrupt Priority
  VICIntEnable |= (1<<7);        //Uart1 Interrupt enable
}

void uart1isr(void)
{
  uartdata=UART1_RBR;            //glob.Var zuordnen
  VICVectAddr = 0;            //"Submit" Interrupt

}

Jedoch wenn ich etwas senden möchte bleibt er hängen nachdem er das Byte 
gesendet hat. Mit der Funktion sende ich ein Byte:
int uart1Putch(int ch)
{
  while (!(UART1_LSR & ULSR_THRE))          // wait for TX buffer to empty
    continue;                           // also either WDOG() or swap()
  UART1_THR = (uint8_t)ch;  // put char to Transmit Holding Register
  return (uint8_t)ch;      // return char ("stdio-compatible"?)
}

Das Senden funktioniert wunderbar nur das Hängenbleiben kann ich mir 
nicht erklären.
Kann es daran liegen, dass ich zyklisch (alle 90ms) etwas empfange und 
dann irgendwo ein Speicher vollläuft, oder behindert meine ISR das 
Senden?

Schonmal Vielen Dank im Vorraus.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wirst dich entscheiden müssen, ob du per Interrupt senden willst 
(THRE=1) oder nicht (uart1Putch).

Autor: Philipp G. (flashmaster)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gibt es denn eine möglichkeit per interrupt zusenden? wenn ja wie?
muss ich einfach in das U1_THR reinschreiben und wenn Daten drin sind 
werden sie per IRQ rausgesendet?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Freilich kann man per Interrupt senden. Aber bei dir wär's vorerst damit 
getan, nur diejenige Interrupt-Quelle einzuschalten, die du in der ISR 
auch wirklich behandelst. Immerhin schaltest du 3 Interrupt-Quellen ein 
(RBR/THRE/RX), behandelst davon aber nur eine. Blindflug?

Sowieso wäre anzuraten, in der ISR mal nachzufragen, was für ein 
Interrupt überhaupt ansteht - und insbesondere auch ob überhaupt einer 
ansteht, weil letzteres bei dieser UART nicht ganz so selbstverständlich 
ist wie es scheint.

Autor: Philipp G. (flashmaster)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void uart1_irq_init(void)
{
  UART1_LCR = 0x03;             //8bit lenght
    UART1_FCR = 0x07;             //Enable and reset TX and RX FIFO.
  UART1_IER |= (1<<0);           //Enable "NUR" RBR !!!!!!!!!!!!!!!!!
  VICVectAddr0 = (unsigned)uart1isr;    //ISR deklarieren
  VICVectCntl0 = (1<<5)|7;          //Interrupt Priority
  VICIntEnable |= (1<<7);        //Uart1 Interrupt enable
}

Und es funktioniert EINWANDFREI!!!!
Du hast mir den Tag gerettet.
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.