Mikrocontroller und Digitale Elektronik
›
Thread
Sprung zu ISR klappt nicht
SS
Sergey S.
(serik00)
OP
(Firma: ARM LPC2134, uVision3, in C)
12.05.2009 09:14
#1259490
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.
M
Micha
Gast
12.05.2009 09:19
#1259497
Meine Glaskugel liegt leider daheim:
- welcher Controller?
- welcher Compiler?
LM
Lothar M.
(lkmiller)
Moderator
(Firma: Titel)
Persönliche Seite
12.05.2009 09:20
#1259500
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.
SS
Sergey S.
(serik00)
OP
(Firma: ARM LPC2134, uVision3, in C)
12.05.2009 09:34
#1259523
Sorry
C-Comiler: ARMCC.EXE V3.0.0.951
Controller: LPC2134 (ARM)
Danke
SS
Sergey S.
(serik00)
OP
(Firma: ARM LPC2134, uVision3, in C)
12.05.2009 10:29
#1259600
muss ich was im startup File eintragen?
SS
Sergey S.
(serik00)
OP
(Firma: ARM LPC2134, uVision3, in C)
12.05.2009 11:09
#1259667
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.
KF
Kai F.
(k-ozz)
12.05.2009 11:16
#1259677
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)?
U1DLM, U1DLL und U1FDR (nur bei LPC213xFBD64/01 vorhanden) sind abhängig
vom Takt und der gewünschten Baudrate.
SS
Sergey S.
(serik00)
OP
(Firma: ARM LPC2134, uVision3, in C)
12.05.2009 11:23
#1259688
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 }
KF
Kai F.
(k-ozz)
12.05.2009 11:34
#1259708
Ä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).
SS
Sergey S.
(serik00)
OP
(Firma: ARM LPC2134, uVision3, in C)
12.05.2009 11:56
#1259731
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.
KF
Kai F.
(k-ozz)
12.05.2009 12:16
#1259755
Ja, damit kannst du die Priorität vergeben, aber dann mußt du auch die
Funktionsadresse auf VICVectAddr0 zuweisen.
KF
Kai F.
(k-ozz)
12.05.2009 12:19
#1259759
Wie hast du denn den UART0 initialisiert?
SS
Sergey S.
(serik00)
OP
(Firma: ARM LPC2134, uVision3, in C)
12.05.2009 12:41
#1259790
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren