Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

STM32f103rb - Komunikacja Modbus

ienecode 11 May 2016 18:01 6849 150
Tespol
  • #31
    User removed account
    User removed account  
  • Tespol
  • #32
    ienecode
    Level 21  
    To w takim razie nie da się zrobić na tym liczniku przerwań np po 2sekundy skoro to tylko 24 bity?

    Dodano po 6 [minuty]:

    16777216 / 72000000 = 0,23 s - rozumie że to jest najwyższy czas przerwania jaki mogę osiągnąć za pomocą tego licznika ?
  • Helpful post
    #33
    grko
    Level 33  
    Tak. Tak bardzo Ci to przeszkadza? Przecież jeżeli chcesz coś wykonać co 2 sekundy to po prostu robisz to co ileś tam wystąpień przerwania. Ponadto, zastanowiłbym się nat tym czy Twój kod musi być w przerwaniu. Skoro chcesz go wykonywać z częstotliwością 1Hz to raczej to nie jest konieczne.
  • #34
    ienecode
    Level 21  
    GrzegorzKostka wrote:
    Przecież jeżeli chcesz coś wykonać co 2 sekundy to po prostu robisz to co ileś tam wystąpień przerwania.


    No racja, dzięki.
    jeszcze tak dla pewności: to w ten sposób mam przerwanie co 0,2s:

    SysTick_Config(CLK_FREQ/14400000);

    I teraz poza mianem wystarczy napisać funkcję :
    Code: c
    Log in, to see the code



    I automatycznie za każdym przerwaniem powinna wykonywać się powyższa funkcja (nie rozumie dlaczego)? I w ten sposób uzyskał bym wykonanie kodu co 2 s?
  • #35
    grko
    Level 33  
    Quote:

    No racja, dzięki.
    jeszcze tak dla pewności: to w ten sposób mam przerwanie co 0,2s:

    SysTick_Config(CLK_FREQ/14400000);


    Nie. Taka konfiguracja spowoduje to, że przerwania będą bardzo szybko występować (co kilka cykli zegara). Jak chcesz mieć przerwanie co 200ms to skonfiguruj timer tak:

    Code: c
    Log in, to see the code


    Quote:
    I automatycznie za każdym przerwaniem powinna wykonywać się powyższa funkcja (nie rozumie dlaczego)? I w ten sposób uzyskał bym wykonanie kodu co 2 s?


    Czego dokładnie nie rozumiesz? Koncepcji przerwania?
  • Tespol
  • #36
    ienecode
    Level 21  
    GrzegorzKostka wrote:
    Nie. Taka konfiguracja spowoduje to, że przerwania będą bardzo szybko występować (co kilka cykli zegara). Jak chcesz mieć przerwanie co 200ms to skonfiguruj timer tak:


    Kod: c [rozwiń] [zaznacz wszystko]

    SysTick_Config((CLK_FREQ/1000) * 200);



    Hmm to muszę to jeszcze przemyśleć.

    GrzegorzKostka wrote:
    Czego dokładnie nie rozumiesz? Koncepcji przerwania?


    Dlaczego akurat funkcja o nazwie "SysTick_Handler" jest wywoływana w przerwaniu ?
  • Helpful post
    #37
    grko
    Level 33  
    Ok. Przeszukaj pliki w swoim projekcie po nazwie "SysTick_Handler". Znajdziesz tą nazwę w pliku asemblerowym (lub w pliku *.c) w tablicy wektorów przerwań. Ta tablica zawiera między innymi adres funkcji o nazwie SysTick_Handler. Linker umieszcza tablicę pod odpowiednim adresie w pamięci (zgodnie z datasheet procesora).
  • #38
    ienecode
    Level 21  
    Dzięki za pomoc.

    Dodano po 3 [minuty]:

    To teraz powinien być czas na odbiór danych w przerwaniu od RX z MAX485 ?
    Code: c
    Log in, to see the code

    Jeśli maina mam takiego:

    Code: c
    Log in, to see the code


    Wysyłanie ramki:
    Code: c
    Log in, to see the code
  • #40
    grko
    Level 33  
    @Damian7546
    Tak. Powinieneś mieć czas na odbiór ramki. Jednak, nie podoba mi się to, że realizujesz ta funkcjonalność w przerwaniu od systicka. Nie powinno to szkodzić w przypadku Twojej transmisji (Half Duplex). Jeżeli Twoja transmisja byłaby w obie strony jednocześnie to rozwiązanie musiałoby uwzględniać wywłaszczanie przerwania systicka przez przerwanie od USARTa.
  • #41
    ienecode
    Level 21  
    Freddie Chopin wrote:
    Akurat na SysTicku da się zrobić przerwania w dłuższym okresie niż te wyliczone 0.23s, ponieważ można skonfigurować mu podział zegara przez 8.


    Dzięki ale to już nie jest takie istotne.
    A tak jak już o tym piszesz to gdzie w systcku można zrobić preskaler ?
  • #43
    User removed account
    User removed account  
  • #44
    Freddie Chopin
    MCUs specialist
    Piotrus_999 wrote:
    Bit 31 w ST32F446 pokazuje ze external refernce clock nie jest zaimplementowany
    Ciekawe jaki efekt wywoła właczenie? Muszę sprawdzić.

    O jakim bicie 31 mowa? W rejestrze SYST_CSR nie ma takiego bitu, za to jest info, że jeśli external clock nie jest zaimplementowany, to po prostu nie da się przestawić CLKSOURCE na inną wartość niż 1.

    Dodatkowo w RM dla STM32F446:

    Quote:
    The RCC feeds the external clock of the Cortex System Timer (SysTick) with the AHB clock
    (HCLK) divided by 8. The SysTick can work either with this clock or with the Cortex clock
    (HCLK), configurable in the SysTick control and status register.
  • #45
    User removed account
    User removed account  
  • #47
    User removed account
    User removed account  
  • #49
    ienecode
    Level 21  
    Panowie... Nie wywołuje się Funkcja SysTick_Handler.

    Jak debuguje to wchodzi mi w SysTick_Config, potem do while(1) i tam pozostaje...
  • #51
    User removed account
    User removed account  
  • #52
    ienecode
    Level 21  
    Jechałem debugerem i nie wchodziło w SysTick_Handler...

    Kod poniżej:
    Code: c
    Log in, to see the code
  • #53
    stracho
    Level 13  
    Ustawiłeś na nim breakpoint czy "przeskakiwałeś" linijki ?
  • #54
    ienecode
    Level 21  
    NO tak wstawiłem teraz breakpointa i wchodzi rzeczywiście. Jednak po długim czasie wchodzi dopiero do if'a - jakies 12 sekund a powinien wejść co 2 sekundy.

    Jednak do urządzenia zapytania nie ida ....
  • #55
    User removed account
    User removed account  
  • #56
    rajszym
    Level 20  
    Freddie Chopin wrote:
    To sprawdź jak to jest w tym układzie, wprowadzę odpowiednie zmiany do mojego RTOSa jeśli faktycznie by się nie dało ustawić tego "reference clock".

    Wygląda na to, że w tym temacie wśród producentów uC opartych na Cortex-M panuje dowolność.

    Źródło: TEXAS INSTRUMENTS Stellaris LM4F120H5QR Microcontroller DATA SHEET
    Clock Source (CLK_SRC)
    Value Description
    0 Precision internal oscillator (PIOSC 16MHz) divided by 4
    1 System clock
  • #57
    User removed account
    User removed account  
  • #58
    grko
    Level 33  
    @Damian7546
    Na pewno twój procesor ma chodzi z prędkością 72MHz ?
  • #59
    ienecode
    Level 21  
    Konfiguracja taka jak wyżej w programie... Do tego kwarc 8MHz.

    Dodano po 47 [minuty]:

    Piotrus_999 wrote:
    Tu ustawiaj flagę, która spowoduje ze w Twoim głównym kodzie zostaną zrobione obliczenia i wysłane ramki.


    Czyli w ten sposób jak zrobiłem teraz:
    Code: c
    Log in, to see the code

    Main:
    Code: c
    Log in, to see the code


    Jednak jest dalej jakiś problem bo nie działa...