Elektroda.pl
Elektroda.pl
X
Computer Controls
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

LPC1114 - programuje się, ale nie wykonuje programu

06 Lis 2011 17:10 1608 14
  • Poziom 31  
    Mikrokontroler LPC1114/301, programowanie ISP z wykorzystaniem Flash Magic.
    Próbowałem programować wsadem stąd: http://www.microbuilder.eu/projects/LPC1114ReferenceDesign/FlashMagic.aspx (P3.5) i zrobić swój program migający diodą na P0.2 w Keil. Kod:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    W czasie programowania diody świecą bardzo słabo (prąd 2µA, dziwne, że w ogóle coś widać). Nie pojawiają się błędy weryfikacji. Podanie stanu wysokiego na P0.1 i naciśnięcie przycisku reset nie powoduje żadnej reakcji.
    Mój program w symulatorze Keila działa.
    Co przegapiłem lub zepsułem?
  • Computer Controls
  • Specjalista - Mikrokontrolery
    Nie rób takich opóźnień bo kompilator je wytnie:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Spróbuj coś takiego

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zajrzyj tu -Link
  • Poziom 31  
    Problem rozwiązany.
    Sprawa pierwsza: konfiguracja Keila domyślnie zmieniała źródło zegara na kwarc (którego nie ma) - wyłączyłem autokonfigurację zegara.
    Sprawa druga: brak zegara dla GPIO (nie wiadomo czemu, bo w konfiguracji nigdzie nie jest ustawiany albo go nie potrafiłem znaleźć, a domyślnie powinien być włączony).
    michalko12 napisał:
    Nie rób takich opóźnień bo kompilator je wytnie
    Moje doświadczenia z gcc mówią, że takie opóźnienie zawsze działa, a tę konkretną funkcję skopiowałem z przykładu z Keila. Możesz napisać, jaki kompilator robi z tego problemy?
  • Computer Controls
  • Poziom 19  
    Nie pamiętam jak z gcc, a w Keilu (na pewno w kompilatorze real view) taka pętla nie jest nie jest nigdy optymalizowana ani na -O0 ani na -O2.

    EDIT:
    Z ciekawości sprawdziłem w symulatorze, -O3 też tego nie optymalizuje.

    EDIT2:
    Cytat:
    nie wiadomo czemu, bo w konfiguracji nigdzie nie jest ustawiany albo go nie potrafiłem znaleźć, a domyślnie powinien być włączony

    Nie miałem dotyczenia z LPC ale w STM zegary do peryferiów po resecie są domyślnie wyłączone. Obstawiam, że w LPC dokładnie tak samo.
  • Specjalista - Mikrokontrolery
    k4be napisał:
    Moje doświadczenia z gcc mówią, że takie opóźnienie zawsze działa, a tę konkretną funkcję skopiowałem z przykładu z Keila. Możesz napisać, jaki kompilator robi z tego problemy?


    No to rób tak dalej, nic nie stoi na przeszkodzie. Podam ci tylko jak na dłoni efekt działania GCC (-O2), sam oceń

    Wersja 1
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Code:
    int
    
    main( void )
    {
     158:   4b06         ldr   r3, [pc, #24]   ; (174 <main+0x30>)
        // Pętla główna
        while( 1 )
        {
            for(int i = 0; i < 1000000UL; i++ )
            {
                LPC_GPIO0->DATA;    // Odczyt portu jako dodatkowe opóźnienie
     15a:   24a0         movs   r4, #160   ; 0xa0
     15c:   3b02         subs   r3, #2
     15e:   5888         ldr   r0, [r1, r2]
     160:   05e0         lsls   r0, r4, #23
     162:   588c         ldr   r4, [r1, r2]
        LPC_GPIO0->DIR |= LED_PORT;    // Port P0.2 jako wyjście
       
        // Pętla główna
        while( 1 )
        {
            for(int i = 0; i < 1000000UL; i++ )
     164:   2b00         cmp   r3, #0
     166:   d1f8         bne.n   15a <main+0x16>
            {
                LPC_GPIO0->DATA;    // Odczyt portu jako dodatkowe opóźnienie
            }
          LPC_GPIO0->MASKED_ACCESS[LED_PORT] ^= LED_PORT;
     168:   6903         ldr   r3, [r0, #16]
     16a:   406b         eors   r3, r5
     16c:   6103         str   r3, [r0, #16]
        }
     16e:   e7f3         b.n   158 <main+0x14>
     170:   00003ffc    .word   0x00003ffc
     174:   000f4240    .word   0x000f4240


    Wersja 2:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Code:
    int
    
    main( void )
    {
     144:   b500         push   {lr}
        // Konfiguracja portu P0.2
        LPC_GPIO0->DIR |= LED_PORT;    // Port P0.2 jako wyjście
     146:   2180         movs   r1, #128   ; 0x80
     148:   23a0         movs   r3, #160   ; 0xa0
     14a:   020a         lsls   r2, r1, #8
     14c:   05db         lsls   r3, r3, #23
     14e:   5898         ldr   r0, [r3, r2]
     150:   2104         movs   r1, #4
     152:   4308         orrs   r0, r1
     154:   5098         str   r0, [r3, r2]
       
        // Pętla główna
        while( 1 )
        {
            for(int i = 0; i < 1000000UL; i++ );
           LPC_GPIO0->MASKED_ACCESS[LED_PORT] ^= LED_PORT;
     156:   6918         ldr   r0, [r3, #16]
     158:   4048         eors   r0, r1
     15a:   6118         str   r0, [r3, #16]
     15c:   e7fb         b.n   156 <main+0x12>
     15e:   46c0         nop         ; (mov r8, r8)

  • Poziom 31  
    Inny problem, ale nie chcę tworzyć nowego tematu.
    Kod: c
    Zaloguj się, aby zobaczyć kod
    Linie P0.4 i P0.5 prawidłowo zmieniają się w GPIO (oczywiście OD), natomiast P0.10 i P0.11 nadal zachowują się jak z włączonymi pullupami, a zapis do LPC_GPIO0->DATA nie zmienia ich stanu.
    Trzeba ustawić coś jeszcze?
  • Specjalista - Mikrokontrolery
    Kierunek portu na wyjście masz ustawiony?
    k4be napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    A po co te | (1<<8), na 8 bicie nic nie ma?
  • Poziom 31  
    Powinno być 7 nie 8 - ale to tylko pomyłka w poście (w kodzie wpisałem 0x81).
    Cały DIR ustawiam na 0xffc, P0.2 do 9 działają jak powinny.
    Sprawdziłem, że nie jest to problem z kompilatorem - zachowanie przy Keil i gcc jest takie samo.
  • Specjalista - Mikrokontrolery
    16 bit w SYSAHBCLKCTRL masz ustawiony na 1?
  • Poziom 31  
    Trafiłeś - wpisałem 0x105f zamiast 0x1005f. A podobno nie mam problemów ze wzrokiem ;)
    Już działa.
  • Specjalista - Mikrokontrolery
    I to jest doskonałe podsumowanie na temat wpisywania "magicznych numerków" zamiast "ludzkich" operacji bitowych typu (1 << bit_od_uartu) | (1 << bit_od_spi).

    Jeśli będziesz tak robił dalej, to wróżę Ci jeszcze dużo podobnych tematów lub dużo straconego czasu.

    4\/3!!
  • Poziom 31  
    Właśnie z tego powodu oczekiwałbym, że położenia wszelkich bitów/wartości konfiguracyjnych będą zdefiniowane w pliku nagłówkowym (bo czy to będzie jedna liczba szesnastkowa, czy kilka dziesiętnych + operacje bitowe, to wielkiej różnicy nie sprawia). Tu nie są (albo nie potrafię znaleźć właściwego pliku). W AVR (gnu) i MSP430 (IAR i CodeComposer) wszystko było, a przepisanie kilkuset (a może kilku tysięcy?) wartości z dokumentacji zajmie zdecydowanie więcej czasu niż sporadyczne naprawianie takich błędów.
  • Specjalista - Mikrokontrolery
    no definitywnie plik z STM32 będzie idealny dla LPC1114...

    Czyżbym teraz musiał zmienić swoje powiedzenie, że "świat nie kończy się na AVR" na wersję o STM32?

    4\/3!!
  • Poziom 19  
    oj sory, akurat pisałem do gościa z STM i już mi się w głowie poplątało. Zmęczenie, pora skończyć dzisiaj.