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


von Philipp G. (flashmaster)


Lesenswert?

Schönen guten Tag,
Ich kann mir ein Ereignis nicht erklären. Und zwar funktioniert das 
Empfangen über Uart1 im Interrupt einwandfrei mit:
1
void uart1_irq_init(void)
2
{
3
  UART1_LCR = 0x03;             //8bit lenght
4
    UART1_FCR = 0x07;             //Enable and reset TX and RX FIFO.
5
  UART1_IER |= 0x7;             //Enable RBR/THRE/RX Line Interrupt
6
  VICVectAddr0 = (unsigned)uart1isr;    //ISR deklarieren
7
  VICVectCntl0 = (1<<5)|7;          //Interrupt Priority
8
  VICIntEnable |= (1<<7);        //Uart1 Interrupt enable
9
}
10
11
void uart1isr(void)
12
{
13
  uartdata=UART1_RBR;            //glob.Var zuordnen
14
  VICVectAddr = 0;            //"Submit" Interrupt
15
16
}

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

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.

von (prx) A. K. (prx)


Lesenswert?

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

von Philipp G. (flashmaster)


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?

von (prx) A. K. (prx)


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.

von Philipp G. (flashmaster)


Lesenswert?

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

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