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

Z111xP - lpc1114 - pierwsze kroki

DokDaniel1993 08 Mar 2017 21:33 1386 16
  • #1 08 Mar 2017 21:33
    DokDaniel1993
    Poziom 3  

    Cześć Wam !

    Kupiłem za śmieszne pieniądze płytke Z111xP gdzie ładuje plik hex programem FlashMagic. Poczyniłem pewne próby kompilacji kodów examples w Keil mdk 4.1. Szukając informacji o lpc1114 natrafiłem na program LpcXpreso w którym stawiam pierwsze kroki.
    Wstawiam kod programu. Prosze o opisanie/przetłumaczenie po polsku co ten program robi :)
    Też wstawiam schemat płytki

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 16
  • #2 08 Mar 2017 22:01
    2675900
    Użytkownik usunął konto  
  • #3 09 Mar 2017 18:52
    DokDaniel1993
    Poziom 3  

    Jezyk C znam w technikum nawet pisaliśmy conieco na AVR. Później hobbystycznie AVR i Arduino.
    Wiem że program ustawia stan niski i wysoki z pewnym delay. Interesuje mnie ile wynosi delay. Czy 2000000 to us czy ms ? Co robi Systeminit i co robi LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6); ?
    Wiem że włącza zegar GPIO ale z jaką prędkością ?

    0
  • Pomocny post
    #5 10 Mar 2017 11:39
    Badmaneq
    Poziom 23  

    W uC od NXP do zapoznania się z rejestrami i jego działaniem jest User Manual (w skrócie UM), natomiast Data Sheet opisuję ogólnie parametry danego uC - taka mała dygresia.
    UM dla Twojego uC można pobrać z www.lpcware.com w linku Downloads dla lpc11xx. Jest pod nazwą UM10398 aktualnie Rev. 12.3 — 10 June 2014. W podanym linku znajduje się też wiele przydanych informacji i not aplikacyjnych.

    Odnośnie pytania o delay trudno oszacować ponieważ nie wiadomo:
    1. jaką predkością taktowany jest uC
    2. w jaki sposób przetłumaczy kompilator funkcję Delay, czyli jakich instrukcji asemblera użyje

    Do tworzenie precyzyjnych opóźnień wykorzystuje się timer.

    Trudno określić co "robi" funkcja SystemInit :) Tak na poważnie to zapewne wstępnie konfiguruję uC lecz bez ciała tej funkcji nie można powiedzieć czy taktowany jest z zewnętrznego kwarcu oraz z jaką częstotliwością. Tutaj http://mikrokontrolery.blogspot.com/2011/04/arm-lpc1114-ustawienie-inicjalizacja.html masz informację związane z ustawieniem taktowania uC.

    Zapis LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6); włącza taktowania bloku odpowiedzialnego za GPIO (porty WE/WY) bez taktowania blok ten jest "martwy", tzn. jakiekolwiek rozkazy na nim nie odnoszą skutku (ustawienie stanu niskiego lub wysokiego na pinie, odczyt stanu na pinie). Informację znajdziesz we wskazanym wcześniej UM w rozdziale 3.5.14 System AHB clock control register i tabeli Table 21. System AHB clock control register (SYSAHBCLKCTRL, address 0x4004 8080) bit description. Jak widzisz po resecie 6 bit rejestru SYSAHBCLKCTRL jest ustawiony czyli taktowanie dociera do bloku GPIO zatem nie jest wymagane ponowne włączenie taktowania lecz na podstawie przedstawionego przez Ciebie kodu trudno powiedzieć co robi funkcja SystemInit - byc może wyłącza ona taktowanie bloku GPIO...

    Dodatkowy kurs dla LPC1114 http://www.forbot.pl/forum/topics20/kurs-programowanie-arm-lpc1114-cz1-wstep-vt4779.htm

    0
  • #6 11 Mar 2017 13:45
    DokDaniel1993
    Poziom 3  

    Dzięki za odpowiedzi.
    Z tego co dotychczas widziałem i przeczytałem operacje na pinach bardzo podobne jak w AVR. Tylko piny mogą mieć różne funkcje ale jak na razie to tylko jestem do przodu z teorią z podręcznika i podanych odnośników. Dziś zamierzam poeksperymentować z płytką.
    Pobrałem nowy Usermanual bo ten który miałem był z 2012 roku. W podręczniku pisze o pinach że są 5 V tolerant w związku z tym czy mogę bezpośrednio podłączyć wyświetlacz LCD HD44780 taki jaki używałem z Atmega 32 i Arduino ? Może trzeba przez bufor ?

    0
  • #7 11 Mar 2017 13:56
    2675900
    Użytkownik usunął konto  
  • #8 11 Mar 2017 17:36
    Badmaneq
    Poziom 23  

    Możesz podłączyć LCD zasilany napięciem 5V z pewnym ale...
    http://mikrokontrolery.blogspot.com/2011/03/ARM-LPC11xx-Wlasciwosci-portow-GPIO.html?m=1

    Dodam od siebie gdybyś korzystał z pinów, któte są m. in. wejściami przetwornika analogowo cyfrowego czyli ADC nie możesz dojść do pomyłki ustawienia ich jako wejściowe przetwornika ADC i w tym samym czasie podać stan wysoki TTL 5V, max. napięcie na tak skonfigurowany pin to Vdd.

    0
  • #9 12 Mar 2017 13:43
    lehastar
    Poziom 14  

    HD44780 pin RW stale = 0. A dane są rejestrowane tylko w LCD. Nie czytaj. SystemInit() prawdopodobnie zdecydowany w startupe. Prowadzi zegar systemowy.

    Można to zrobić dla Delay

    Code:

    //::::::::::::::::::::::::::::::::::::::::::::::::::::::
    // Delay
    //::::::::::::::::::::::::::::::::::::::::::::::::::::::
    void DWT_On(void)
    {
      #define    DWT_CYCCNT    *(volatile u32_t *)0xE0001004ul
      #define    DWT_CONTROL   *(volatile u32_t *)0xE0001000ul
      #define    SCB_DEMCR     *(volatile u32_t *)0xE000EDFCul

      SCB_DEMCR |= 0x01000000ul;
      DWT_CYCCNT  = 0;
      DWT_CONTROL |= 1;
    }

    #pragma inline
    u8_t DWT_Compare(signed long tp)
    {
      return (((signed long)DWT_CYCCNT - tp) < 0);
    }

    #define  SYSCLK               72000000ul
    void DWT_Delay(u32_t us)
    {
      signed long tp = DWT_CYCCNT + us * (SYSCLK/1000000ul);
      while (DWT_Compare(tp));
    }

    0
  • #10 12 Mar 2017 19:48
    Badmaneq
    Poziom 23  

    lehastar: nie jestem pewien czy w ten sposób zrealizowany delay zadziała w Cortex M0, z tego co kojarzę to można tak robić w M3 i M4.

    0
  • #11 12 Mar 2017 20:03
    lehastar
    Poziom 14  

    Być może masz rację. Skompilowałem dla lpc1225 - ok. Ale nie testowal. Używam z stm32f103.. Z STM32F100xB pracował ten code (stm32 discovery).

    0
  • #12 13 Mar 2017 20:52
    DokDaniel1993
    Poziom 3  

    Starałem się zrozumieć podany wyżej delay nawet mając z boku user manual lecz jestem w czarnej dziurze ;)
    Znalazłem ten temat https://www.elektroda.pl/rtvforum/viewtopic.php?p=14923781
    Użyję do delaya właśnie kodu z tego tematu, teraz mój program jest taki

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #13 13 Mar 2017 22:16
    Badmaneq
    Poziom 23  

    Jeżeli piszesz w środowisku LPCXpresso to wywołanie funkcji SystemInit jest zbędne ponieważ startup wykonywany przed main ją wywołuje.

    0
  • Pomocny post
    #15 14 Mar 2017 14:26
    Badmaneq
    Poziom 23  

    Wskazany w linku debugger to zapewne JLink ale za cenę niespełna 10 $ to napewno nielegalny klon :)

    Jeżeli chcesz poznać LPC'ki i mieć debugger to EA-XPR-019 jak najbardziej polecam. Jest tam uC LPC11U68 z rdzeniem Cortex M0+, na płytce wyprowadzenia zgodne z Arduino UNO. Dodatkowo programator / debugger LPC-Link2.

    Super z małych LPC'ów jest NXP OM13077. Zawarty tam LPC54102 zawiera dwa rdzenie, tzn. jeden Cortex-M4 z FPU i drugi Cortex M0+. Również wyprowadzenie zgodne z arduino, oczywiście jest tam debugger LPCLink2.


    Opóźnienia również można realizować przy użyciu Systick'a jednak raczej służy on do odmierzania czasów rzędu ms. Przykład masz tutaj https://www.elektroda.pl/rtvforum/viewtopic.php?p=14373022#14373022
    Ja bym użył takiego schematu:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    dzięki czemu w pętli while może wykonywać się inny kod, a nie całą moc uC poświęca na oczekiwanie warunku zakończenia się opóźnienia...

    Jeszcze jedna uwaga związana GPIO, zaraz po resecie rejestry GPIOnDIR mają wartość 0 zatem są wejściami. Kiedyś zapomniałem o tym fakcie i dziwiłem się dlaczego program nie działa tak jakbym się tego spodziewał.

    0
  • #16 14 Mar 2017 15:55
    lehastar
    Poziom 14  

    Dokładnie :) Ale to działa w porządku. SWD & JTAG. Firmware jest aktualizowana zbyt bez żadnych problemów.
    Z111xP - lpc1114 - pierwsze kroki

    0
  • #17 06 Kwi 2017 18:44
    DokDaniel1993
    Poziom 3  

    W ciągu nie spełna miesiąca poznałem jak mrugać diodą, robić dokładne opóźnienia w wykorzystaniu timera, uart, przekierowanie printf na uart i ostatnio udało się z dalmierzem odległości HC-SR04. Zamówiłem w TME EA-XPR-019 to nie będzię trzeba programować przez uart. Jak ktoś w miare ogarnął avr to lpc1114 nie jest trudny.
    Zamykam temat

    1