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

[STM32] F103 SysTick Delayms

Pawel1243 13 Jan 2018 15:15 861 10
  • #1
    Pawel1243
    Level 7  
    Witam.
    Właśnie próbuję napisać obsługę hd44780 ale mam problem że funckaj delay_ms nie odlicza odpowiednio czasu.
    Stm32 podłaczony do kwarcu 8 MHz i taktowane na 72Mhz.
    Proszę o wskazanie w czym jest problem, oczywiście dalej sam będę poszukiwał problemu.
    Pozdrawiam

    Code: c
    Log in, to see the code


    [STM32] F103 SysTick Delayms
  • Helpful post
    #2
    excray
    Level 40  
    Code: c
    Log in, to see the code
  • #3
    Pawel1243
    Level 7  
    Dziekuję za gotowy kod.
    Właśnie sprawdziłem poprzez debugowanie że zmienna Load źle była oblicza abo jest 24 bit i wykraczało poza zakres.

    edit.
    Zmodyfikowałem linijke
    Code: c
    Log in, to see the code

    Dalej czas nie jest idealny, próbuję uzyskać 10ms.
    [STM32] F103 SysTick Delayms
  • #4
    Freddie Chopin
    MCUs specialist
    Pawel1243 wrote:
    Właśnie sprawdziłem poprzez debugowanie że zmienna Load źle była oblicza abo jest 24 bit i wykraczało poza zakres.

    Była źle wyliczana, ponieważ operacja którą tam miałeś:

    Pawel1243 wrote:
    7200000/10000


    daje w efekcie ~0.01 ms (pomijając inne błędy). Jeśli chcesz uzyskać milisekundy, to powinieneś zegar rdzenia (72 miliony, a nie 7.2 miliona) dzielić przez tysiąc, a nie przez dziesięć tysięcy.

    Od wartości którą tam wpisujesz powinieneś następnie odjąć 1.

    W rejestrze SysTick->CTRL musisz ustawić bit SysTick_CTRL_CLKSOURCE_Msk, inaczej SysTick dostaje zegar rdzenia podzielony przez 8, stąd czas który otrzymywałeś jest 8x za długi.
  • #5
    Pawel1243
    Level 7  
    Wszystko działa, dziękuje za pomoc ale mam jeszcze pytanie dlaczego od wartości Load odejmujemy 1 ?
  • Helpful post
    #6
    Freddie Chopin
    MCUs specialist
    Pawel1243 wrote:
    dlaczego od wartości Load odejmujemy 1 ?

    Bo liczniki używają też wartości 0, więc jeśli chcesz mieć przykładowo 5 cykli, to wpisujesz do licznika wartość "5 - 1". Licznik w efekcie odliczy 4-3-2-1-0 - razem pięć (;
  • #7
    Pawel1243
    Level 7  
    Właśnie przerabiam bibliotekę hd44780 która działa na atmega ale na stm32 nie może mi ruszyć inicjalizacja ekranu.
    Jeżeli kolegom nie będzie się chciało analizować całości to proszę chociaż oto jak koledzy robią inicjalizację ekranu.

    Plik .h
    Code: c
    Log in, to see the code

    Plik .c
    Code: c
    Log in, to see the code

    main.c
    Code: c
    Log in, to see the code


    Mam jedną zagwozdkę otóż jak w inicjalizacji ekranu dodam ustawienie pinów na wyjścia to nic się na nich nie pojawia dopiero jak ustawienia pinów napiszę w in main to działają.
    Przypuszczam że pytam o podstawy c ale elektronika jest moim hobby (mikrokontrolery dopiero zaczynam) i lubię poświęcać wieczory dla niej chodź jest ich coraz mniej ;(
  • Helpful post
    #8
    Freddie Chopin
    MCUs specialist
    Osobiście wyświetlacz tego typu inicjalizuję wysyłając do niego 0x3 3 razy a następnie 0x2 1 raz. Pomiędzy pierwszym półbajtem a kolejnymi jest 5 ms przerwy, pomiędzy kolejnymi - 200 us. Po tej sekwencji wysyłam już normalne komendy z ilością linii i czcionką, włączającą wyświetlacz itd.

    W Twojej funkcji main() nie ma nigdzie _WYWOŁANIA_ funkcji inicjalizującej LCD.
  • #9
    Pawel1243
    Level 7  
    Freddie Chopin nie wiem co powiedzieć. Masz rację jako funkcję inicjalizującą dałem void lcd_init();. Nawet nie będę pisał ile straciłem na to czasu.
    Dzięki wielkie;)
  • #10
    User removed account
    User removed account  
  • #11
    Pawel1243
    Level 7  
    Staram się używać debuger ale w tym przypadku było dla mnie oczywiste że wchodzi w funkcję i bardziej szukałem problemu w czasach inicjalizacji.
    Debuger dla mnie jest super bo o połowę skrócił moją ilosć postów na elektroda ale jeszcze nie zawsze jestem przyzwyczajony do jego używania.
    Wcześniej bawiłem się atmegami właściwie 3 lata temu ale teraz mam więcej czasu więc powróciłem do tematu ale mój synek rozwalił usbasp na cześć (jak to dziecko, ciekawość ). Wiec zostałem bez programatora pomijając LPT i z racji czytanych postów już wolałem kupić nucleo niż usbasp więc dla mnie wszystko jest nowe pomijając fakt że przez taki czas to i o atmegach nie wiele pamiętam ;)