Forum: Mikrocontroller und Digitale Elektronik Sprung zu ISR klappt nicht


von Sergey S. (Firma: ARM LPC2134, uVision3, in C) (serik00)


Lesenswert?

Guten Morgen,

bei UART1 Initialisierung habe ich Interrupt für UART1 eingeschaltet und 
als IRQ0 definiert.
Wenn jetzt ein Zeichen an UART1 verschicke, dann soll doch zu uart_isr 
-Routine gesprucngen werden. Dies passiert aber nicht. Was muss man noch 
berücksichtigen???
(Programmiert wird mit UVision von Keil)

1
/* UART1 Interrupt Initialization*********************************************/  
2
  U1IER = 0x00;               // Disable UART1 Interrupts  (U1 Interrupt Enable Register)
3
  U1IER = 0x03;         // Enable UART1Receive Data Available Interrupt and THRE Interrupts 
4
        
5
/* Initialize VIC (Vectored Interrrupt Controller) UART1 */
6
7
  VICVectAddr7= (unsigned long)uart_isr;   // Funktion uart_isr wird ausgeführt, wenn der Interrupt auslöst wird.
8
  VICIntEnable = 0x00000080;        //enable UART1 interrupt  
9
  VICVectCntl0 = 0x00000027;        // 1<<5(IRQ Slot_en | 7(UART1-interrupt)

Diese befindet sich in einem anderem c.File
1
void uart_isr(void) __irq 
2
{
3
  char IIR;  
4
5
  while (((IIR = U1IIR) & 0x01) == 0) 
6
  {
7
     switch (IIR & 0x0E) 
8
   {
9
10
   }
11
12
  }
13
14
  VICVectAddr = 0; /* Acknowledge Interrupt */
15
}

In der void uart_isr(void) __irq  steht noch nichts drin, ich will 
erstmal den Sprung hinbekommen. Später soll das Zeichen in Buffer 
eingelesen werden.

Vielen dank im Voraus.

von Micha (Gast)


Lesenswert?

Meine Glaskugel liegt leider daheim:
- welcher Controller?
- welcher Compiler?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Schön, dass wenigstens DU weißt, um welchen Prozessor/Compiler... es 
sich handelt.

BTW:
1
void uart_isr(void) __irq 
2
{
3
  char IIR;  
4
  while (((IIR = U1IIR) & 0x01) == 0) 
5
  {
6
  }
Eine while-Schleife hat in einer ISR nichts zu suchen.

von Sergey S. (Firma: ARM LPC2134, uVision3, in C) (serik00)


Lesenswert?

Sorry

C-Comiler: ARMCC.EXE V3.0.0.951
Controller: LPC2134 (ARM)

Danke

von Sergey S. (Firma: ARM LPC2134, uVision3, in C) (serik00)


Lesenswert?

muss ich was im startup File eintragen?

von Sergey S. (Firma: ARM LPC2134, uVision3, in C) (serik00)


Lesenswert?

in startup steht folgendes:
1
Vectors         LDR     PC, Reset_Addr         
2
                LDR     PC, Undef_Addr
3
                LDR     PC, SWI_Addr
4
                LDR     PC, PAbt_Addr
5
                LDR     PC, DAbt_Addr
6
                NOP                            ; Reserved Vector 
7
                LDR     PC, IRQ_Addr
8
                LDR     PC, [PC, #-0x0FF0]     ; Vector from VicVectAddr
9
                LDR     PC, FIQ_Addr
10
        ldr   pc,[pc,#-0xFF0]           ;// IRQ - read the VIC
hab ihr einen Tipp???
Vielen Dank im Voraus.

von Kai F. (k-ozz)


Lesenswert?

Hast du die Pins als RXD und TXD definiert (PINSEL-Register)?
1
PINSEL0 &= 0xFFF0FFFF;
2
PINSEL0 |= 0x00050000;      // enable RxD1 and TxD1

Hast du die Baudrate und den UART-Mode eingestellt (U1LCR, U1DLM, U1DLL, 
U1FDR)?
1
U1LCR = 0x03;
U1DLM, U1DLL und U1FDR (nur bei LPC213xFBD64/01 vorhanden) sind abhängig 
vom Takt und der gewünschten Baudrate.

von Sergey S. (Firma: ARM LPC2134, uVision3, in C) (serik00)


Lesenswert?

Ja das habe ich.
Also ich schicke ein Zeichen von UART0 zu UART1. Beim empfang eines 
Zeichens im UART1 soll ein Interrupt ausgelöst wetden.
1
void Initialize (void)  
2
{           
3
   PINSEL0  =  0x00050005;      /*Enable TxD1,TxD0,RxD1,RxD0*/
4
  IODIR0  =  0x10400410;      /*OUT: RTS0_P0.4, RTS1_P0.14, COM1_P0.22,  COM0_P0.28*/
5
  IOCLR0  =  0x10400010;      /*LOW auf 0 COM1,0 = 0(RS485), RTS0=0(Sender)*/
6
  IOSET0  =  0x00000400;      /*HIGH auf 1 RTS1=1(Empfänger),P0.10*/
7
8
}
9
10
/*UART1 Initialization*/
11
 void uart1_init()
12
{ 
13
  U1LCR    =  0x83;    /*8 bits, 1 stopbit, no Parity, enable DLAB*/
14
  U1DLM    =  0x01;    /*9600 Baud Rate, 55.296.000 PCLK*/
15
  U1DLL    =  0x68;    /*360dez=0x0168*/
16
  U1LCR    =  0x03;    /*disable DLAB*/
17
  U1FCR    =  0x01;    /*enable UART1-FIFO*/
18
19
/* UART1 Interrupt Initialization*********************************************/  
20
  U1IER = 0x00;               // Disable UART1 Interrupts  (U1 Interrupt Enable Register)
21
  U1IER = 0x03;         // Enable UART1Receive Data Available Interrupt and THRE Interrupts 
22
        
23
/* Initialize VIC (Vectored Interrrupt Controller) UART1 */
24
25
  VICVectAddr7= (unsigned long)uart_isr;   // Funktion uart_isr wird ausgeführt, wenn der Interrupt auslöst wird.
26
  VICIntEnable = 0x00000080;        //enable UART1 interrupt  
27
  VICVectCntl0 = 0x00000027;        // 1<<5(IRQ Slot_en | 7(UART1-interrupt) 
28
}


Zuerst will ich nur den Sprung hinbekomen:
1
void uart_isr(void) __irq 
2
{
3
 
4
  VICVectAddr = 0; /* Acknowledge Interrupt */
5
}

von Kai F. (k-ozz)


Lesenswert?

Ändere mal die Zeile
1
VICVectCntl0 = 0x00000027;
um in
1
VICVectCntl7 = 0x00000027;

Du hast im Prinzip die ISR-Funktion dem Slot7 zugewiesen (VICVectAddr7), 
aber den Slot0 aktiviert (VICVectCntl0).

von Sergey S. (Firma: ARM LPC2134, uVision3, in C) (serik00)


Lesenswert?

Danke für den Hinweis.
Ich habs abgeändert, trotzdem funktioniert es nicht.
1
VICVectAddr7= (unsigned long)uart_isr;   // Funktion uart_isr wird ausgeführt, wenn der Interrupt auslöst wird.
2
  VICIntEnable = 0x00000080;        //enable UART1 interrupt  
3
  //VICVectCntl0 = 0x00000027;        // 1<<5(IRQ Slot_en | 7(UART1-interrupt)
4
  VICVectCntl7 = 0x00000027;

Bin hier am verzweifeln.


VICVectCntIch dachte das man mit VICIntCNTL0 die Priorität vergeben 
kann:

Vector control 0 register. Vector Control Registers 0-15 each
control one of the 16 vectored IRQ slots. Slot 0 has the
highest priority and slot 15 the lowest.

von Kai F. (k-ozz)


Lesenswert?

Ja, damit kannst du die Priorität vergeben, aber dann mußt du auch die 
Funktionsadresse auf VICVectAddr0 zuweisen.

von Kai F. (k-ozz)


Lesenswert?

Wie hast du denn den UART0 initialisiert?

von Sergey S. (Firma: ARM LPC2134, uVision3, in C) (serik00)


Lesenswert?

UARTo
1
  U0LCR    =  0x83;    /*8 bits, 1 stopbit, no Parity, enable DLAB*/
2
  U0DLM    =  0x01;    /*9600 Baud Rate, 55.296.000 PCLK*/
3
  U0DLL    =  0x68;    /*360dez=0x0168*/
4
  U0LCR    =  0x03;    /*disable DLAB*/
5
  U0FCR    =  0x01;    /*enable UART1-FIFO*/
6
  U0FCR    =  0x01;

FIFo habe ich bei beiden UARTS aktiviert.

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.