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

[C][ATmega128] pwm na serwo - coś nie halo

rozwielitka 31 Mar 2011 18:23 1546 8
REKLAMA
  • #1 9345490
    rozwielitka
    Poziom 10  
    Witam

    Od pewnego czasu próbuję się uporać ze sterowaniem serwomechanizmem i jestem w kropce bo niby wszystko powinno być ok a serwo nie obraca się ani o milimetr. Jedyne oznaki "życia" serwo daje kiedy się je wpina do płytki ciągnącej już zasilanie.

    Teoretycznie serwo powinno się wychylić w skrajne położenie a nic się nie dzieje :/

    Kabel sygnału na PB5 oczywiście.
    Kod:
    
    #define F_CPU 8000000L 
    
    #include <avr/io.h> 
    #include <util/delay.h> 
    
    
    int main(void) { 
    
    
    _delay_ms(2000); 
    
    
    TCCR1A|=    (0<<COM1A0)| 
                (0<<COM1A1)| 
                (0<<COM1B0)| 
                (1<<COM1B1)| 
                (0<<FOC1A) | 
                (0<<FOC1B) | 
                (0<<WGM11) | 
                (0<<WGM10); 
    
    TCCR1B|=    (0<<ICNC1)| 
                (0<<ICES1)| 
                (1<<WGM13)| 
                (0<<WGM12)| 
                (0<<CS12) | 
                (1<<CS11) | 
                (0<<CS10); 
    
    //preskaler 8, phase&freq control 
    
    DDRB = 0b00100000; 
    ICR1=10000;  
    
    
    for (;;) 
    {OCR1A = 1000;} 
    
    
    } 
    



    ICR1 jest ustawione na 10 k ze względu na częstotliwość procka, zakres 0-180st powinien odpowiadać OCR1A od 500 do 1000. Manipulacja wartościami w tym zakresie jednak nic nie daje.

    Byłbym bardzo wdzięczny gdyby ktoś wypatrzył co jest nie tak

    aha, fuse są ustawione dobrze
  • REKLAMA
  • Pomocny post
    #2 9345563
    nsvinc
    Poziom 35  
    wtf?

    Czy ty myślisz, że jak zrobisz 0<<[cośtam] i zorujesz to z rejestrem tak jak napisałeś TCCR1A|=, to w tym rejestrze na danym miejscu ustawi się zero?
    Ten config jest pisany na pałę czy dokładnie wiesz jaka wartosc przyjmuje ten rejest po POR?

    Wywal tego ORa. Skoro najpewniej patrzysz się w datasheet pisząc ten init, to dokładnie wiesz jakie bity mają mieć jaką wartość.

    Konfigurujesz OC1B1 na aktywne wyjście a zmieniasz OCR1A, to się rzuca w oczy na pierwszy rzut oka :]
  • REKLAMA
  • #3 9345704
    rozwielitka
    Poziom 10  
    przestawiłem int

    
    TCCR1A=     (0<<COM1A0),
    			(0<<COM1A1),
    			(0<<COM1B0),
    			(1<<COM1B1),
    			(0<<FOC1A) ,
    			(0<<FOC1B) ,
    			(0<<WGM11) ,
    			(0<<WGM10);
    
    TCCR1B =	(0<<ICNC1),
    			(0<<ICES1),
    			(1<<WGM13),
    			(0<<WGM12),
    			(0<<CS12) ,
    			(1<<CS11) ,
    			(0<<CS10);
    


    fakt, wygłupiłem się z ORami

    ale co do ICR/OCR dalej nie bardzo kojarzę
    PB5 jest wyjście licznika OC1A, konfiguruje się go OCR1A (?)
    ...widze, że chodzi o ICR1?
    ale totalnie nie mam pojęcia co ustawić
    z noty nic nie mogę wywnioskować
    (wybaczcie idiotycznie pewnie błędy - AVR bawię się może z miesiąc w sumie niecały i to raczej lekkim tempem)
  • REKLAMA
  • #5 9345868
    rozwielitka
    Poziom 10  
    tak się komiluje i tak...
    niemniej bardziej logiczne wydają mi się przecinki
  • REKLAMA
  • #6 9345891
    dondu
    Moderator na urlopie...
    :!::?: Czyżbym czegoś nie wiedział?
    Prawidłowo powinno być tak, jak podałem powyżej.

    Nsvinc-owi chodziło o to, że przy takiej konstrukcji jak podałeś pierwotnie czyli używając |= ustawiasz tylko te bity które są jedynkami, a te które chciałeś ustawić na 0 niestety nie zmienią swojej wartości jeżeli były poprzednio 1.
    Wynika to z tego że |= jest sumą bitową czyli OR:

    [C][ATmega128] pwm na serwo - coś nie halo

    http://www.java2s.com/Tutorial/C/0100__Operator/Bitwiseorc1c2.htm
    http://www.java2s.com/Tutorial/C/0100__Operator/Commaoperator.htm

    Ten ostatni link pokazuje dlaczego Twój kod się kompiluje prawidłowo, ale TCCR1B nie będzie miał takiej wartości jakiej oczekujesz.
  • #7 9345926
    rozwielitka
    Poziom 10  
    bardzo możliwe, że masz rację, jak mówiłem wyżej jestem zielony z uC i generalnie traktuje rejestry jak tablice... nie wiem na ile szczęśliwe jest takie podejście
    niemniej przetestowałem obie wersje i skutek jest taki sam (czyli brak jakiegokolwiek) więc błąd tkwi w konfiguracji ICR/OCR ale nie mogę dojść co i jak choć czytam dokumentacje już chyba trzeci raz pod tym kątem
  • #9 9345969
    rozwielitka
    Poziom 10  
    
    #define F_CPU 8000000L
    
    #include <avr/io.h>
    #include <util/delay.h>
    
    
    int main(void) {
    
    
    _delay_ms(2000);
    
    
    TCCR1A=     (0<<COM1A0)|
    			(0<<COM1A1)|
    			(0<<COM1B0)|
    			(1<<COM1B1)|
    			(0<<FOC1A) |
    			(0<<FOC1B) |
    			(0<<WGM11) |
    			(0<<WGM10);
    
    TCCR1B =	(0<<ICNC1)|
    			(0<<ICES1)|
    			(1<<WGM13)|
    			(0<<WGM12)|
    			(0<<CS12) |
    			(1<<CS11) |
    			(0<<CS10);
    
    //preskaler 8, phase&freq control
    
    DDRB  = 0b01000000;
    ICR1  = 10000;  
    OCR1B = 500;
    
    
    }
    


    rozwiązane... przestawiłem port i OCR1A na OCR1B
    pojęcia mówiąc nie mam czemu to działa bo jeszcze pół h temu byłem pewien, że konfiguruję OCR1A...

    tak czy inaczej dzięki chłopaki wielkie ;)
REKLAMA