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

[ATmega16][C]Pwm - prośba o poprawienie kodu (rejestrów)

krzysiek_p 31 Lip 2010 23:07 2149 7
  • #1 8352512
    krzysiek_p
    Poziom 14  
    #include <avr/io.h>                // dostęp do rejestrów
    #include <util/delay.h>
    
    void main(void)
    {
    
    TCCR1A=0b10100010; 
    TCCR1B=0b10110000; 
    
    DDRD = 0b110000; 
    
    OCR1A = 0;
    OCR1B = 255;
    
    while(1)
    {
    
    OCR1A = OCR1A + 5;
    OCR1B = OCR1B - 5;
    _delay_ms(5);
    
    }
    }


    Pod OC1A (PD.5) mam podpiętą diodę led - świeci non-stop, na maxa. Jeśli zrobię program zupełnie prosty, na stałe zapiszę w programie do OCR1A jakąś wartość, dioda nadal świeci tak samo. Sądzę, że problem tkwi w ustawieniu rejestrów TCCR1A i TCCR1B, chcę uzyskać zwykłe PWM, preskalowane 1024, na dwóch niezależnych kanałach (sterowanie silnikami w robocie). Dodam, że mam megę16l (chociaż raczej to nie robi żadnej różnicy). Taktowana 8MHz, w makefile'u jest to zapisane. Już nie wiem co robię źle, od godziny-dwóch czytam raz-po-raz opis timera1 w DSie i nadal nie rozumiem co robię źle. Dodam, że w C programuję może od kilku dni, a akurat pwm to dla mnie zupełny mus, koniecznie sprzętowo (potem muszę mieć jak najbardziej odciążonego proca do wszelakich bardziej skomplikowanych obliczeń - jakaś kontrola trakcji itp, przy prędkości robota ponad 1 m/s (minisumo) raczej się przyda).
  • Pomocny post
    #2 8353003
    Konto nie istnieje
    Konto nie istnieje  
  • #3 8353786
    krzysiek_p
    Poziom 14  
    O, działa :) Dzięki wielkie :) Rozumiem, że np. to:
    TCCR1B = _BV(CS12)
    ustawia w rejestrze TCCR1B bit CS12? A co do tego zasilania - prawdę mówiąc mam proca puszczonego na 5V, u mnie w sklepie zwykłe m16 (nie l) podrożały jeszcze bardziej. Wystarczy mi 8bit, dzięki wielkie, klikam pomógł ;)
  • #4 8353816
    Konto nie istnieje
    Konto nie istnieje  
  • #5 8353840
    gaskoin
    Poziom 38  
    technics6 napisał:
    Tak. Ustawia w TCCR1B bit CS12.



    nie ustawia bitu, tylko ustawia cały rejestr TCCR1B, tak, że ustawiony jest jedynie bit CS12, poprawnie powinno być

    TCCR1B |= _BV(CS12);


    to ustawia pojedynczy bit, bez ingerencji w inne. Jak kto woli, taki zapis jest równoważny:

    TCCR1B |= (1 << CS12);


    \\no zdążyłeś się poprawić
  • #6 8353844
    Konto nie istnieje
    Konto nie istnieje  
  • #7 8353850
    gaskoin
    Poziom 38  
    i niższych zegarach
  • #8 8354353
    krzysiek_p
    Poziom 14  
    technics6 napisał:
    Poczytaj jakieś kursy C/C++ bo jesteś na razie za zielony żeby pisać oprogramowanie robota ;)

    Mam już praktycznie cały szkielet, funkcje wypisane, brakowało mi właśnie tego PWM, no ijeszcze muszę dopisać funkcje ADC.
REKLAMA