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.
↑ Nach oben
← Zurück zu Mikrocontroller und Digitale Elektronik
Antwort schreiben
Eine eigene Frage?
Dieser Thread ist über 17 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.
Neuen Thread starten
Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.