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

[ATMEGA32][C] Początek programu

kuba123654789 12 Wrz 2011 11:47 1657 18
REKLAMA
  • #1 9918808
    kuba123654789
    Poziom 10  
    Witam
    mam problem przy pisaniu programu na procesor ATMEGA32. Chodzi mi o to, że nie wiem jak poprawnie napisać początek programu. W programie mam 4 funkcje. Muszą być wywoływane jedna po drugiej(każda poprzednia niesie informacje dla kolejnej). Jedna z tych funkcji (najlepiej wszystkie) musi być wywoływana z określoną częstotliwością(w tej funkcji występuje całkowanie). Do tego jeszcze dochodzi obsługa LCD. I moje pytanie brzmi jakbyście podeszli do sprawy napisania początku takiego programu? Już gdzieś czytałem, żeby coś wsadzić do pętli głównej, coś do przerwania. Tylko nie wiem co gdzie i jak to będzie wtedy wyglądało w czasie?
    Jeśli czegoś wystarczająco nie wytłumaczyłem to proszę pytać.
    Liczę na Waszą pomoc.
    Pozdrawiam
  • REKLAMA
  • #2 9918840
    tadzik85
    Poziom 38  
    Jakbyś rozpisał szerzej i precyzyjniej te założenia sam udzieliłbyś sobie odpowiedzi. A póki co wróżkami nie jesteśmy by zgadywać.
  • REKLAMA
  • #3 9918942
    kuba123654789
    Poziom 10  
    Jest to program sterowania silnikiem na bazie informacji z czujników.
    Funkcja1 pobiera dane z czujników
    Funkcja2 (filtr Kalmana) odfiltrowuje informacje - częstotliwość przeliczania 50Hz
    Funkcja3 wylicza sterowanie silników
    Funkcja4 obsługa silników - PWM
    Nie wiem jak to "połączyć" ze sobą. Jeśli nie podałem czegoś istotnego, to proszę napisać dokładnie o jaką informację chodzi to ją od razu napiszę.
  • #4 9919199
    Mephistofeles
    Poziom 11  
    Użyj przerwań timera, PWM możesz zrealizować sprzętowo (też na timerze).
  • #5 9919247
    kuba123654789
    Poziom 10  
    Dzięki za odpowiedź. Chodzi o przerwanie od timera w trybie CTC? I do niego wszytko mam wsadzić? Czyli np.:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A pętlę główną zostawić pustą?
  • REKLAMA
  • #6 9919267
    tadzik85
    Poziom 38  
    Tak się nie robi!!!

    Zastanów się co ma być wykonywane synchronicznie i co od czego zależy.
  • #7 9919331
    kuba123654789
    Poziom 10  
    Też się już o tym przekonałem, że tak się nie robi. Program działa wtedy o wiele wolniej niż jakbym wszystko wrzucił bezmyślnie do głównej pętli.
    Niestety Twoja podpowiedź mi zbyt dużo nie mówi:( Funkcje muszą być wywoływane jedna po drugiej. Z każdej poprzedniej funkcji informacje są brane do kolejnej.
  • #8 9919378
    tadzik85
    Poziom 38  
    To wcale nie oznacza że muszą być wykonywane jedna po drugiej. Istotna jest kolejność przetwarzania danych.
  • REKLAMA
  • #9 9919562
    tmf
    VIP Zasłużony dla elektroda
    Bynajmniej z tego jak zdefiniowałeś te funkcje nie wynika że mają byc wywoływane w określonej kolejności. Parametry pomiędzy nimi przekazujesz jako zmienne globalne? To bardzo zły nawyk.
    Przede wszystkim zastanów się co jest od czego zależne i co jest wywoływane asynchronicznie. Np. sterowanie PWM zależy od jakiegoś parametru, ale tak naprawdę jest niezależne od funkcja1-4. A więc warto go wywalić do przerwania. Pozostałe funkcje mają coś przeliczać - zakładam, że ten cały ciąg przeliczeń inicjowany jest zmianą stanu jakiegoś czujnika - wydaje się więc logiczne, że to zdarzenie inicjuje cały ciąg wywołań funkcji - bo przecież zapewne nie ma sensu je w kółko wywoływać z takimi samymi wartościami argumentów. Efektem ich działania xzapewne jest wartość PWM - no i już masz logiczną kolejność i podział.
  • #10 9921569
    kuba123654789
    Poziom 10  
    Gdzie się da używam return, żeby wyjść ze zmienną z funkcji. Tam gdzie trzeba wyciągnąć więcej niż jedną zmienną używam wskaźników. Tak to dokładnie wygląda:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Ja wciąż uważam, że te funkcje muszą się wywoływać w takiej kolejności. Nie rozumiem w jaki sposób można je inaczej pogrupować.
    Bardzo byłbym wdzięczny za jakiś pseudokod. Wtedy spróbowałbym to sam napisać i pochwaliłbym się co mi wyszło:)
  • #11 9925716
    kuba123654789
    Poziom 10  
    Proszę bardzo o jakąś pomoc, ciągle stoję w tym samym miejscu. Szukałem jakichś porad w Internecie, przeglądałem nawet gotowe już programy ale nic nie potrafię znaleźć. Rozumiem, że w przerwaniu nie może być nic co zajmuje dużo czasu. To jak inaczej do obsługi takiej funkcji wykorzystać przerwanie?:/
  • #12 9925750
    drzasiek
    Specjalista CNC
    Wytłumacz jaśniej o co chodzi..
    Wszystkie funkcje mają być wykonywane z jakąś częstotliwością?
    Czy tylko jedna z jakąś określoną a reszta lata wkoło jak pasuje?
    Jeśli tak to która kiedy?
  • #13 9925810
    kuba123654789
    Poziom 10  
    Funkcja1 pobiera dane z czujników. Następnie te dane muszą być przesłane do Funkcji2, która jest filtrem Kalmana. Z tej funkcji informacje muszą być przesłane do Funkcji3, która wylicza sterowanie silników. Na koniec zmienne z obliczonymi wartościami do silników idą do Funkcji4, która steruje silnikami poprzez PWM. Z określoną częstotliwością muszą być wykonywane Funkcja2 i Funkcja3 ze względu, że w nich występuje całkowanie i dlatego dokładny czas jest ważny.
    Dziękuję:)
  • #14 9925858
    drzasiek
    Specjalista CNC
    No niekoniecznie wyjaśniłeś to o co pytałem ale powtórzyłeś to co pisałeś wyżej :)
    Czyli skoro funkcja 2 i 3 muszą być wykonywane z określoną częstotliwością to funkcja 1 i 4 raczej też skoro się uzupełniają nawzajem.
    To teraz, o ile Cię dobrze zrozumiałem postaram się pomóc.
    Nie wiem jakie masz wymagania, czyli z jaką częstotliwością te funkcje się mają wykonywać ale przede wszystkim zależy to od tego, jak długo się wykonują wszystkie 4 jedna po drugiej.
    Ja bym to zrobił tak:
    (pseudo kod)
    
    
    Ustawiasz jeden Timer;
    przerwanie owerflow od Timera;//ustawiasz interesującą Cię częstotliwosć zgłaszania przerwania
    włączasz obsługę przerwań;
    
    volatile uint8_t flaga=0;
    
    main()
    {
    jakieś tak deklaracje, zmienne itd;
    
       for(;;)
       {
       funkcja1();
       funkcja2();
       funkcja3();
       funkcja4();
    
       flaga=0;
    
          for(;;)
          {
           if(flaga) break;
          }
       }
    }
    
    przerwanie od przepełnienia timera()
    {
    flaga=1;
    }
    


    To oczywiście pod warunkiem, że dobrze cię zrozumiałem Smile
  • #15 9925926
    kuba123654789
    Poziom 10  
    Bardzo Ci dziękuję:) Mam jeszcze tylko pytanie w jaki sposób sprawdzić jak długo będą się wykonywać wszystkie te funkcje? Bo jedna z nich jest na zmiennych typu float i dlatego jestem ciekawy ile to trwa.
  • #16 9925935
    tadzik85
    Poziom 38  
    Flaga =0; powinno być przed funkcjami. po funkcjach od razu sprawdź stan flagi. Jeśli ustawiona oznacza to ze za długo wykonywane są funkcje,
  • Pomocny post
    #17 9925965
    drzasiek
    Specjalista CNC
    Na początek sorki za zmiany w poprzednim moim poście.
    Chciałem siebie zacytować a niechcący dałem zmień i zamieniłem cały post, musiałem spowrotem go przywrócić :)

    Jak zmierzyć czas?
    To już zależy od twojej wyobraźni:
    
    włącz timer;
    deklarazja zmiennej czas;
    wyzeruj timer;
       funkcja1();
       funkcja2();
       funkcja3();
       funkcja4(); 
    czas=wartość timera;
    wyświetl(czas)
    

    Albo jak tam sobie chcesz.

    I z tą flagą daj tak jak pisze tadzik85.
    Chociaż tak jak jest też jest dobrze, z tym, że nie sprawdzisz czy funkcje nie wykonują się za długo.
  • #18 9926040
    kuba123654789
    Poziom 10  
    Bardzo Ci dziękuję drzasiek za pomoc:)

    Dodano po 20 [minuty]:

    Mam jeszcze tylko pytanie odnośnie PWM. Żeby użyć PWM muszę skonfigurować drugi timer do tego? Czyli będzie jeden do przerwania, drugi do PWM?
REKLAMA