mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sprung zu ISR klappt nicht


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

Bewertung
0 lesenswert
nicht 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)

/* UART1 Interrupt Initialization*********************************************/  
  U1IER = 0x00;               // Disable UART1 Interrupts  (U1 Interrupt Enable Register)
  U1IER = 0x03;         // Enable UART1Receive Data Available Interrupt and THRE Interrupts 
        
/* Initialize VIC (Vectored Interrrupt Controller) UART1 */

  VICVectAddr7= (unsigned long)uart_isr;   // Funktion uart_isr wird ausgeführt, wenn der Interrupt auslöst wird.
  VICIntEnable = 0x00000080;        //enable UART1 interrupt  
  VICVectCntl0 = 0x00000027;        // 1<<5(IRQ Slot_en | 7(UART1-interrupt)


Diese befindet sich in einem anderem c.File
void uart_isr(void) __irq 
{
  char IIR;  

  while (((IIR = U1IIR) & 0x01) == 0) 
  {
     switch (IIR & 0x0E) 
   {

   }

  }

  VICVectAddr = 0; /* Acknowledge Interrupt */
}

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.

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine Glaskugel liegt leider daheim:
- welcher Controller?
- welcher Compiler?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

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

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

Bewertung
0 lesenswert
nicht lesenswert
Sorry

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

Danke

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

Bewertung
0 lesenswert
nicht lesenswert
muss ich was im startup File eintragen?

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

Bewertung
0 lesenswert
nicht lesenswert
in startup steht folgendes:
Vectors         LDR     PC, Reset_Addr         
                LDR     PC, Undef_Addr
                LDR     PC, SWI_Addr
                LDR     PC, PAbt_Addr
                LDR     PC, DAbt_Addr
                NOP                            ; Reserved Vector 
                LDR     PC, IRQ_Addr
                LDR     PC, [PC, #-0x0FF0]     ; Vector from VicVectAddr
                LDR     PC, FIQ_Addr
        ldr   pc,[pc,#-0xFF0]           ;// IRQ - read the VIC

hab ihr einen Tipp???
Vielen Dank im Voraus.

Autor: Kai F. (k-ozz)
Datum:

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

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

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

Bewertung
0 lesenswert
nicht 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.
void Initialize (void)  
{           
   PINSEL0  =  0x00050005;      /*Enable TxD1,TxD0,RxD1,RxD0*/
  IODIR0  =  0x10400410;      /*OUT: RTS0_P0.4, RTS1_P0.14, COM1_P0.22,  COM0_P0.28*/
  IOCLR0  =  0x10400010;      /*LOW auf 0 COM1,0 = 0(RS485), RTS0=0(Sender)*/
  IOSET0  =  0x00000400;      /*HIGH auf 1 RTS1=1(Empfänger),P0.10*/

}

/*UART1 Initialization*/
 void uart1_init()
{ 
  U1LCR    =  0x83;    /*8 bits, 1 stopbit, no Parity, enable DLAB*/
  U1DLM    =  0x01;    /*9600 Baud Rate, 55.296.000 PCLK*/
  U1DLL    =  0x68;    /*360dez=0x0168*/
  U1LCR    =  0x03;    /*disable DLAB*/
  U1FCR    =  0x01;    /*enable UART1-FIFO*/

/* UART1 Interrupt Initialization*********************************************/  
  U1IER = 0x00;               // Disable UART1 Interrupts  (U1 Interrupt Enable Register)
  U1IER = 0x03;         // Enable UART1Receive Data Available Interrupt and THRE Interrupts 
        
/* Initialize VIC (Vectored Interrrupt Controller) UART1 */

  VICVectAddr7= (unsigned long)uart_isr;   // Funktion uart_isr wird ausgeführt, wenn der Interrupt auslöst wird.
  VICIntEnable = 0x00000080;        //enable UART1 interrupt  
  VICVectCntl0 = 0x00000027;        // 1<<5(IRQ Slot_en | 7(UART1-interrupt) 
}


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


Autor: Kai F. (k-ozz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ändere mal die Zeile
VICVectCntl0 = 0x00000027;
um in
VICVectCntl7 = 0x00000027;

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

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

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

Autor: Kai F. (k-ozz)
Datum:

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

Autor: Kai F. (k-ozz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hast du denn den UART0 initialisiert?

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

Bewertung
0 lesenswert
nicht lesenswert
UARTo

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


FIFo habe ich bei beiden UARTS aktiviert.

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.