Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[LPC2148][uVision 3.52b] SIO.c nie działa z UART na IRQ.

zorg666 07 Feb 2009 20:02 2298 8
Computer Controls
  • #1
    zorg666
    Level 22  
    na stronce Keila znalazłem program do obsługi UART-a pracujący na przerwaniach dla lpc2129.
    - przerobiłem skrypt, startup.s w linii [251] import swi_handler;
    oraz zakomentowałem
    ; swi_handler B swi_handler.
    - program nie odbiera znaków oraz nie nadaje.
    - jtag-a na ulink2 nie mam.
    - jak robię symulację to program kręci się w module sio.c w linii [219].
    - tak jakby nie otrzymywał przerwań, ponieważ bufor odbiornika jest pusty.
    - program wchodzi w SWI wychodzi i znowu jest w linii [219].
    - poniżej program oraz zrzut z ekranu dla UARTa.
    - martwi mnie ten wiersz " Interrupt: none !
    - może ktoś ma ten program uruchomiony na lpc2148.
    - albo proszę o wskazanie gdzie robię błąd.
    P.S.
    - program poprawiłem w poniższej części, dalej nie ma wyjscia z obsługi przerwania.
    P.S. -- 1
    - poprawiłem parametry tramsmisji UARTa wg. poniższej tabeli.

    --
    
    void com_initialize (void) {
      volatile char dummy;
    
      /*------------------------------------------------
      Clear com buffer indexes.
      ------------------------------------------------*/
      tbuf.in = 0;
      tbuf.out = 0;
      tx_restart = 1;
    
      rbuf.in = 0;
      rbuf.out = 0;
    
      /*------------------------------------------------
      Setup serial port registers.
      ------------------------------------------------*/
      PINSEL0 = UxPINS	;    		/* Enable RxD and TxD */
    
      UxLCR = 0x03;            		/* 8 bits, no Parity, 1 Stop bit */
      UxIER = 0;               		/* Disable UARTx Interrupts */
    
      VICIntSelect 	&= ~0x40;       /* UART0 interrupt is assigned to IRQ (not FIQ) */  
      VICVectAddr6 = (unsigned long)sio_irq;
      VICVectCntl6 = 0x20 | 6; 		/* UART0 Interrupt */
      VICIntEnable |= 0x40;  		/* Enable UART0 Interrupt */
    
      com_baudrate (115200);   		/* setup for 115200 baud (15MHz) */
      /*** Note that with the PLL and VPB setup the pclk is 15MHz. ***/
      /*** This does NOT generate nice baudrates!!! ***/
      /*** Most connection problems are baudrate mismatches. ***/
      /*** Symptoms we've seen include reception on PC but no ***/
      /*** reception on the target system. ***/
    
      UxIER = 3;       				/* Enable UARTx RX and THRE Interrupts */
      dummy = UxIIR;   				/* Read IrqID - Required to Get Interrupts Started */
      
    }
     
    


    --
    [LPC2148][uVision 3.52b] SIO.c nie działa z UART na IRQ.
    --

    
    
    keil Test 3D SX65 LCD ver.0.D
    UART calculation P0.==15.16.17
    
    bps=9600 -- UDLM: 0 UDLL: 71 DIVADDVAL: 3 MULVAL: 8 
    bps=10400 -- UDLM: 0 UDLL: 52 DIVADDVAL: 11 MULVAL: 15 
    -
    bps=19200 -- UDLM: 0 UDLL: 39 DIVADDVAL: 1 MULVAL: 4 
    -
    bps=38400 -- UDLM: 0 UDLL: 15 DIVADDVAL: 5 MULVAL: 8 
    bps=115200 -- UDLM: 0 UDLL: 12 DIVADDVAL: 4 MULVAL: 7 
    -
    bps=128000 -- UDLM: 0 UDLL: 15 DIVADDVAL: 0 MULVAL: 2 
    bps=256000 -- UDLM: 0 UDLL: 14 DIVADDVAL: 1 MULVAL: 8 
    
    

    --
  • Computer Controls
  • #2
    michalko12
    MCUs specialist
    Czegoś tu nie rozumiem...

    Mówisz o przerwaniach IRQ, a widzę że coś tam napisałeś w oparciu o programowe przerwania SWI, już nie wgłębiałem się dalej. Konfigurujesz VIC na IRQ, a gdzie masz obsługę IRQ? Dopisz procedurę obsługi przerwań IRQ i podstaw ją pod IRQ_Handler.
  • Computer Controls
  • Helpful post
    #4
    slomo
    Level 18  
    Sciagnalem twoj przyklad i dziala on u mnie w symulatorze.Po odkomntowaniu lini w petli while c=getchar() i dodatniu funkcji printf wyswietlajacej znak program przy uzyciu terminala UART w symulatorze wyswietla komunikat Press a key a po nacisnieciu klawisza na klawiaturze zwraca go na konsoli a wiec dziala tak jak oryginalny przyklad.

    pz
  • #5
    zorg666
    Level 22  
    @slomo
    - a jaką masz wersję keila.
    - jak zrobić aby w symulatorze wyświetlał komunikat Press a key a po naciśnieciu klawisza na klawiaturze zwracał go na konsoli "symulatora".
    - nie mogę tego skonfigurować w symulatorze.
    - czy symulator pokaże błędne znaki przy złym ustawieniu parametrów transmisji UART-a ?
  • #6
    slomo
    Level 18  
    Mam wersje 3.54.Aby wyswietlic bierzesz View->Serial Window i wybierasz UART ktory uzywasz.Symulator raczej nie wyswietli bledow transmisji ale przeciez gdy jestes w trybie debuggowania i wezmiesz jako podglad port UART to po przeprowadzeniu inicjalizacji UART-a masz tam podane jaka predkosc ustawiles i parametry transmisji.

    pz
  • #7
    zorg666
    Level 22  
    dzięki, w symulatorze też mi wyświetla poprawnie.
    - a na płytce ewulacyjnej, nie.
    - płytka sprawdzona innymi programami i nie ma z nią problemów, podczas programowania lub obsługi innych programów.
    - muszę sprawdzić na innej stacji roboczej.
    - a Ulink2 pokaże problemy w czasie rzeczywistym ?
  • #8
    slomo
    Level 18  
    Po wgraniu tego programu do uC dostajesz cos wogole na terminalu w komputerze tzn jakies smieci zamiast znakow czy nic sie nie wyswietla?

    pz
  • #9
    zorg666
    Level 22  
    na terminalu PC mam śmieci i to bez względu na ustawioną prędkość.
    - jak ustawię na stałe w terminalu RTS to wtedy mogę wprowadzać pojedyncze znaki i echo je wyświetla poprawnie.
    - coś mi to wyglada jakby nie wracał poprawnie z SWI.
    - podmienię jeszcze konwertor USB / rs232 może to jest problem.
    - ale ten konwertor poprawnie programuje lpc2148 po rs-232.
    P.S.
    - sprawa się wyjaśniła.
    - zrobiłem bląd w obliczaniu parametrów transmisji UARTa, ponizej poprawiona tabela.
    - w definicji dałem unsigned short baudrate a powinno być
    unsigned long baudrate.
    
    keil Test 3D SX65 LCD ver.0.D
    UART calculation P0.==15.16.17
    
    bps=9600 -- UDLM: 0 UDLL: 71 DIVADDVAL: 3 MULVAL: 8 
    bps=10400 -- UDLM: 0 UDLL: 52 DIVADDVAL: 11 MULVAL: 15 
    bps=19200 -- UDLM: 0 UDLL: 39 DIVADDVAL: 1 MULVAL: 4 
    
    bps=38400 -- UDLM: 0 UDLL: 15 DIVADDVAL: 5 MULVAL: 8 
    bps=115200 -- UDLM: 0 UDLL: 5 DIVADDVAL: 5 MULVAL: 8 
    
    bps=128000 -- UDLM: 0 UDLL: 5 DIVADDVAL: 6 MULVAL: 13 
    bps=256000 -- UDLM: 0 UDLL: 3 DIVADDVAL: 3 MULVAL: 14