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

[AVR-GCC] Czy Timer0 w Atmega16 może generować PWM jak Timer2?

snow 16 Gru 2007 18:40 2229 8
REKLAMA
  • #1 4594632
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    Chciałem odpalić sobie Timer0 jako generator PWM, w tym celu wpisałem:

    TCCR0=(1<<WGM00)|(1<<CS00)|(1<<COM01);
    
    OCR0=127;


    Po zmianie na Timer2:

    TCCR2=(1<<WGM20)|(1<<CS20)|(1<<COM21);
    
    OCR2=127;


    Procesor generuje PWM. Mam zatem pytanie czy z Timerem0 nie da się wygenerować PWM'a? Czy może ja jednak coś źle robie?
  • REKLAMA
  • #2 4594753
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Musisz uaktywnić PB3 jako OUT
  • REKLAMA
  • REKLAMA
  • #4 4594826
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Sprawdź może tryb FAST albo CTC, bo dla Phase Correct są tam jakieś ograniczenia.
  • #5 4594869
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    Próbowałem Fast, CTC nie, ale podejrzewam że i tak CTC nic nie zmieni, zresztą dziwne że 2 tryby nie działają które są wymienione w dokumentacji :roll:

    Dodano po 12 [minuty]:

    [AVR-GCC] Czy Timer0 w Atmega16 może generować PWM jak Timer2?

    Mniej wiecej tak wyglada przebieg na OC0.

    Mam jeszcze pytanie czy jeżeli wykorzystuje timer2 to czy istnieje możliwość regulacji częstotliwości w inny sposób niż przez preskaler? bo to trochę za bardzo skokowa zmiana.
  • Pomocny post
    #6 4595168
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Do tego służy właśnie tryb CTC plus preskaler, otrzymujesz wręcz płynną regulację częstotliwości.
  • #7 4595339
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    Dzieki za informacje, rzeczywiście działa.

    Co do tego Timera0 to nie mam kompletnie pojęcia co z nim nie tak :( W żadnym trybie nie chce działać :/
  • REKLAMA
  • #8 4596233
    rafe
    Poziom 10  
    Posty: 57
    Witam,
    Mam też problem z PWM tylko trochę innego rodzaju.
    Też pracuję na Atmega16. Oprócz tego używam AVRStudio w wersji 4.13 oraz WinAvr 20070525.
    Mój kod wygląda następująco:

    #include <avr/io.h>


    void main(void)
    {

    DDRB=0xFF;
    DDRD=0xFF;

    TCCR1A=0x83; // wy. jest ustawianie po osiągnięciu warunku
    // równości podczas zlicznia w dół
    // zerowane po osiągnięciu warunku równości podczas
    // zlicznia w górę
    // porównania, PWM jest 10 bitowy

    TCCR1B=0x02; // sygnał taktujący

    TCNT1L=0x00; //wyzerownie licznika
    TCNT1H=0x00; // j.w

    OCR1AH=0x00;
    OCR1AL=0x03;


    while(1)
    {

    }

    }



    Wyczytałem z dokumentacji że wyjście z OC1 jest na PORTD5.
    Wszystko ładnie chodzi i się liczy tylko......
    Po spełnieniu warunku równości OCR1 i TCNT1 ustawiana jest wartość w rejestrze PIND5, a nie na PORTD5. Co zrobić żeby wartość ta (w tym przypadku jedynka ) była ustawiana na PORTD5 a nie na PIND5.


    Dzięki . Pozdrawiam.
  • #9 4599002
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Widocznie to jakiś błąd symulatora, bo skoro to się pojawia na wyjściu procka to siłą rzeczy musi to być na PORTD5 jak również na PINB5 bo są one wewnętrznie połączone ze sobą.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy możliwości generowania sygnału PWM za pomocą Timer0 w mikrokontrolerze Atmega16. Użytkownik próbował skonfigurować Timer0 do pracy w trybie PWM, ustawiając odpowiednie bity w rejestrze TCCR0 oraz wartość OCR0, jednak sygnał PWM nie był generowany, podczas gdy analogiczna konfiguracja Timer2 działała poprawnie. Wskazano konieczność ustawienia pinu PB3 jako wyjścia, co użytkownik potwierdził, że zrobił (DDRB=0xff). Zasugerowano sprawdzenie trybów pracy timerów, takich jak Fast PWM i CTC, ponieważ tryb Phase Correct może mieć ograniczenia. Użytkownik próbował Fast PWM i CTC, ale Timer0 nadal nie generował poprawnego sygnału. Wskazano, że tryb CTC wraz z preskalerem umożliwia płynną regulację częstotliwości PWM, co potwierdzono w dalszej części dyskusji. Wątpliwości dotyczące działania Timer0 pozostały nierozwiązane. Dodatkowo poruszono problem z generowaniem PWM na Timer1 i wyjściem OC1 na pinie PORTD5, gdzie zauważono niezgodność między rejestrem PIN a PORT, co może wynikać z błędu symulatora.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA