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.

AVR/Atmega32 - sterowanie serwem

nariox 21 Gru 2014 15:30 702 2
  • #1 21 Gru 2014 15:30
    nariox
    Poziom 11  

    Witam!
    znalazłem wreszcie chwile czasu,żeby pobawić się serwami modelarskimi i Atmegą 32.


    Napisałem program który powinien realizować następujące funkcji:
    -ustawić serwo w pozycji zadanej
    -po zwarciu pinu PB0 do masy,wykonać obrót do odpowiedniej wartości(w stopniach)
    - po zwarciu pinu PB1 do masy,wykonać obrót w drugą stronę do odpowiedniej wartości

    Jednak mam problem,ponieważ program obraca serwem cały czas w jedną stronę, a w drugą ani drgnie.

    kod programu:

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Jeżeli w programie zastosuje tylko
    Kod: asm
    Zaloguj się, aby zobaczyć kod




    to wtedy serwo kreci się prawidłowo,analogicznie jeżeli obrotwl zastąpie obrotwp
    to kręci się w drugą stronę.
    Problem -tak jak pisałem wyżej- pojawią się gdy chce sprzęgnąć obrót w jedną i drugą stronę-nawet użycie 4 różnych rejestrów r18,r19- do obrotu w jedna strone r20,r21 do obortu w druga strone nie przynosi rezultatu..


    Czy mógłbym prosić o nakierowanie na rozwiązanie problemu?

    0 2
  • #2 21 Gru 2014 15:59
    excray
    Poziom 39  

    Witam. Kolego to nie może Ci działać poprawnie. Skaczesz do funkcji obrotwp i zobacz jaki będzie następny wykonywany rozkaz po out OCR1AL, R18 Twój procesor właśnie idzie "w krzaki". Zresztą analogicznie źle przy obrotwl. Po pierwsze zamiast rjmp daj rcall:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Po drugie na końcu funkcji obrotwl i obrotwp daj ret:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #3 21 Gru 2014 22:05
    nariox
    Poziom 11  

    Dzięki za wskazówki, poprawiłem tak jak mówiłeś, niestety nie udało się rozwiązać mojego problemu: dalej tak jak pisałem w pierwszym pości,jeżeli skopiuje tylko kod odpowiedzialny za obrót w jedną stronę,działa prawidłowo.
    Gdy próbuję połączyć dwie instrukcje: obrót w lewo i obrót w prawo to przy zwarciu PINB,0
    jest tylko slaby impuls na serwo i drgnie ,ale później przestaje trzymać pozycje 0
    gdy zewrę PINB,1 zaczynać drgać raz w prawo a raz w lewo wokół pozycji 0
    ,a po odłączeniu PINB,1 tak samo jak w przypadku PINB serwo nie trzyma pozycji 0.
    KOmbinowałem i wymyśliłem czy nie możnaby tego tak zrobić:
    Zamiast main, wrzucić:

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Ale to też nie przyniosło rezultatów

    Jeżeli są inne komendy,których powinienem użyć to z chęcia przygarne,póki co utknąłem w martwym punkcie


    EDIT: poradziłem sobie w ten sposób
    Program sprawdza stan pierwszego z pinów,jeżeli jest 1, przechodzi do następnego,jeżeli kolejny też jest 1,zaczyna od początku.
    Gdy PINB,0=0 wtedy nastepuje skok do etykiety obrotwp lub obrotwl,która zmienia szerokość impulsu
    następnie wywoływana jest etykieta, w której program srawdza cały czas stan PINB,0
    jeżeli ten ulegnie zmianie,wpisuje do rejestru wartości dla pozycji 0, i rozpoczyna dalsze sprawdzenie kolejnego pinu.

    Poprzednie programy miały tą wadę,że wpisywały cały czas wartość do rejestru,gdy na PINB,0 panował stan niski,powodując ciągłe zmniejszanie lub zwiększanie.


    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0