logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Nucleo l053R8] [Cortex m0+] - LCD realizacja opóźnień (systick) i inne pytania

moscow18-1990 02 Wrz 2015 22:31 1386 13
REKLAMA
  • #1 14967254
    moscow18-1990
    Poziom 8  
    Posty: 69
    Dzień Dobry

    Mam pewien problem chcę przenieść sobie obsługę wyświetlacza LCD z avr na stm i pojawiły się problemy związane z napięciem zasilania i realizacją opóźnień. Chciałbym najpierw zapytać o realizację opóźnień. Mam dwie funkcje na bazie systicka, ale pewne rzeczy mnie zastanawiają. Pokażę kod:

    1. Najpierw milisekundy

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Niby to działa, na analizatorze jest zmiana stanu co sekundę przy takim wywołaniu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    ale... mam wrażenie dziwne a mianowicie po wgraniu programu zawsze muszę nacisnąć przycisk reset na płytce nucleo żeby program zadziałał i tutaj po naciśnięciu resetu występuję dziwne opóźnienie powodujące oczekiwanie 2 może 3 sekund na to aż stan diody zacznie się zmieniać. Mam wrażenie jednorazowego "dodatkowego" opóźnienia. Zawsze po naciśnięciu tego resetu program działa praktycznie w momencie naciśnięcia tego klawisza a tutaj trzeba odczekać chwilę aż to zadziała i budzi to moje zastanowienie..... Czy taki stan rzeczy może powodować złe działanie tego opóźnienia?

    2.mikrosekundy

    Funkcja w zasadzie analogiczna:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Przy takim wywołaniu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tutaj również pojawia się "dodatkowe" opóźnienie ale jest też inny problem dodatkowo a mianowicie zmiana stanu powinna nastąpić po 1 sekundzie a następuje po 1.3 sekundy. Cały czas jest rozbieżność o 0.3 i nie wiem dlaczego tak się dzieje.

    3. Być może źle podchodzę do realizacji tych opóźnień, może mógłbym zrobić to inaczej w odniesieniu do LCD. Mógłbym liczyć na radę jak podejść do realizacji tych opóźnień?
  • REKLAMA
  • #2 14967349
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Ja się zastanawiam po co takie cuda na procesorze low-powerowym?
  • #3 14967375
    moscow18-1990
    Poziom 8  
    Posty: 69
    W zasadzie to bardziej chciałem poeksperymentować. Na studiach miałem ten rdzeń cortex m0+ i dlatego kupiłem płytkę z takim rdzeniem. Wiem że to energooszczędny procesor, ale moje doświadczenie w dziedzinie związanej z mikrokontrolerami jest póki co niewielkie i właściwości związanych z niskim poborem energii nie jestem w stanie wykorzystać w praktyce i postanowiłem po prostu przenieść obsługę tego wyświetlacza bardziej w celach edukacyjnych. Nie robię na razie żadnego konkretnego projektu tylko poznaję podstawy związane z tymi procesorami.
  • REKLAMA
  • #4 14967381
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    FREQUENCY == ??????
  • #5 14967403
    moscow18-1990
    Poziom 8  
    Posty: 69
    W sumie może wrzucę cały program taktowanie to 16MHz ustawione w rcc_config i taka jest też wartość FREQUENCY

    main:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W config.h jest FREQUENCY:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #6 14967407
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Nie zerujesz rejestru SysTick->VAL.

    Opóźnienia w takim stylu są ciut bez sensu, a LCD lepiej obsługuje się w przerwaniu timera, co było pokazane parę miesięcy temu w EP (na STM32F0).

    W przypadku nibyopóźnienia mikrosekundowego - prawdopodobnie gubisz przepełnienia timera, bo okres SysTick jest zbyt krótki.
  • #7 14969516
    moscow18-1990
    Poziom 8  
    Posty: 69
    W sumie zrobiłem coś takiego w oparciu o One-Pulse Mode:

    inicjalizacja:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    funkcja opóźniająca:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dla milisekund(ms) takie rozwiązanie działa poprawnie aczkolwiek przy pierwszych próbach na mikrosekundach(us) są rozbieżności i widać że czas nie jest odmierzany dokładnie. Chciałem zapytać czy takie rozwiązanie jest dobre i co ewentualnie mógłbym zrobić żeby mikrosekundy były odmierzane właściwie?
  • #8 14969610
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Narzut na włączenie i wyłączenie swoje zrobi przy dużym time.

    A na zwykłej fladze od przerwania ominąłbyś ten problem, kombinujesz tylko po co?

    Nie prościej zrobić timer programowy z tego? Nie prościej zapisać odpowiednią wartość do ARR?
  • #9 14969657
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Najpierw zastanów się po co chcesz odmierzać pojedyncze mikrosekundy... Moim zdaniem nie ma w ogóle takiej potrzeby. Nastaw timer na taki czas, jakiego naprawdę potrzebujesz.

    Podtrzymuję zdanie, że taka obsługa LCD (z opóźnieniami na timerze) ma same wady.
  • #10 14970573
    moscow18-1990
    Poziom 8  
    Posty: 69
    Nad tym opóźnieniem jeszcze pomyślę. Być może zrobię to jakoś bardziej sensownie... ale jest jeszcze inna kwestia a mianowicie zasilanie tego wyświetlacza i podawanie innego napięcia niż napięcie zasilania na linie sterujące. Wygląda to tak że gdy zasilam 3,3V nie wyświetla się kontrast i nie ma podświetlenia. Gdy zasilam 5V jest ok, jest kontrast i podświetlenie, ale na linie sterujące D4-D7, RS i Enable będę podawał 3,3V i moje pytanie brzmi czy zostanie to zinterpretowane jako stan wysoki? Czy w związku z tym mogą być problemy z inicjalizacją wyświetlacza?
  • REKLAMA
  • #11 14970711
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Nie wiemy co prawda, jaki wyświetlacz masz na myśli, ale odpowiedź na nurtujące Cię pytania znajdziesz z całą pewnością w karcie katalogowej układu sterownika wyświetlacza.
  • #12 14974889
    moscow18-1990
    Poziom 8  
    Posty: 69
    Przeprowadziłem test polegający na "ręcznej" inicjalizacji klawiszami. Diody sygnalizowały mi poszczególne stany na liniach sterujących i w ten sposób zainicjalizowałem wyświetlacz i wyświetliłem jedną literę. W takim wypadku 3,3V jest rozpoznawane jako stan wysoki i taka "ręczna" inicjalizacja przebiegła pomyślnie, ale napisałem też program i znowu jest problem. Polega on na tym że odbywa się sama inicjalizacja wyświetlacza(miga kursor w pierwszym wierszu na pierwszej pozycji), ale nie wyświetla się żaden napis. Zastanawia mnie dlaczego tak się dzieje. Program jest analogiczny do avr. Zmieniełem częstotliwość taktowania z 16MHz na 8MHz i dodałem jakieś opóźnienia w postaci milisekund i dalej nie działa. Byłby w stanie ktoś pomóc mi rozwiązać ten problem. Może mam jakiś rażący błąd w programie? Załączę cały:

    main:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    lcd.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    lcd.h:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    config.c:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #13 14975441
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Tu gwałcisz przynajmniej trzy parametry czasowe wyświetlacza:

    //delay_ms(1);// może byc delay 1us
    GPIOC->BSRR = LCD_EN;
    wysylanie_znaku_na_raty(data>>4); // ????

    za mały odstęp
    //delay_ms(1);//może byc 1us
    GPIOC->BRR = LCD_EN;
    za mały odstęp
    //delay_ms(1);// 1us
    GPIOC->BSRR = LCD_EN;
    wysylanie_znaku_na_raty(data);
    za mały odstęp
    //delay_ms(1);//1us
    GPIOC->BRR = LCD_EN;
  • #14 14979211
    moscow18-1990
    Poziom 8  
    Posty: 69
    W sumie działa aczkolwiek musiałem jeszcze raz napisać obsługę od początku. Problem dotyczył zapewne tych opóźnień. Napisy wyświetlają się więc problem został rozwiązany.

Podsumowanie tematu

✨ Dyskusja dotyczy przeniesienia obsługi wyświetlacza LCD z mikrokontrolera AVR na STM32 Nucleo L053R8 z rdzeniem Cortex M0+. Użytkownik napotkał problemy z realizacją opóźnień oraz zasilaniem wyświetlacza. W odpowiedzi na pytania, uczestnicy forum sugerowali różne metody implementacji opóźnień, w tym wykorzystanie SysTick oraz timerów. Użytkownik eksperymentował z opóźnieniami, ale ostatecznie zdecydował się na użycie trybu One-Pulse dla TIM6, co poprawiło działanie funkcji opóźniającej. Problemy z inicjalizacją wyświetlacza zostały rozwiązane po poprawieniu opóźnień w kodzie. Użytkownik potwierdził, że 3,3V jest interpretowane jako stan wysoki na liniach sterujących, co umożliwiło pomyślną inicjalizację.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA