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.

[STM32] F103 SysTick Delayms

Pawel1243 13 Sty 2018 15:15 435 10
  • #1 13 Sty 2018 15:15
    Pawel1243
    Poziom 5  

    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

    Kod: c
    Zaloguj się, aby zobaczyć kod


    [STM32] F103 SysTick Delayms

    0 10
  • Pomocny post
    #2 13 Sty 2018 15:24
    excray
    Poziom 39  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #3 13 Sty 2018 15:29
    Pawel1243
    Poziom 5  

    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

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Dalej czas nie jest idealny, próbuję uzyskać 10ms.
    [STM32] F103 SysTick Delayms

    0
  • #4 13 Sty 2018 16:39
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Pawel1243 napisał:
    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 napisał:
    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.

    0
  • #5 13 Sty 2018 17:10
    Pawel1243
    Poziom 5  

    Wszystko działa, dziękuje za pomoc ale mam jeszcze pytanie dlaczego od wartości Load odejmujemy 1 ?

    0
  • Pomocny post
    #6 13 Sty 2018 17:17
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Pawel1243 napisał:
    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ęć (;

    0
  • #7 13 Sty 2018 18:17
    Pawel1243
    Poziom 5  

    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

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Plik .c
    Kod: c
    Zaloguj się, aby zobaczyć kod

    main.c
    Kod: c
    Zaloguj się, aby zobaczyć kod


    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 ;(

    0
  • Pomocny post
    #8 13 Sty 2018 18:37
    Freddie Chopin
    Specjalista - Mikrokontrolery

    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.

    0
  • #9 13 Sty 2018 20:47
    Pawel1243
    Poziom 5  

    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;)

    0
  • #10 13 Sty 2018 20:55
    22053
    Użytkownik usunął konto  
  • #11 13 Sty 2018 21:04
    Pawel1243
    Poziom 5  

    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 ;)

    0