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

[Atmega16][C] PWM niedziała

cz_e_ch_u 01 Paź 2010 17:34 1526 4
REKLAMA
  • #1 8572315
    cz_e_ch_u
    Poziom 10  
    Testowo podłączyłem diode i zmiana OCR1AL nic nie daje dioda cały czas swieci tak samo próbowałem chyba wszystkich kąbinacji i nie wiem dlaczego nie działa mi regulacja wypełnienia
    Fproc= 12 Mhz
    
    DDRD=(1<<PORTD5);
    TCCR1A=(1<<COM1A1)|(1<<WGM11); 
    TCCR1B=(1<<CS12)|(1<<WGM13)|(1<<WGM12);
    TCNT1H=0xff;
    TCNT1L=0x00;
    OCR1AH=0xff;
    OCR1AL=0xff;
    

    gdzie coś zepsułem ?
  • REKLAMA
  • #2 8572358
    ppawel12
    Poziom 16  
    Witam coś mi tu nie pasuje w tym kodzie rozumiem że zaprogramowałeś klocka i podłączasz diodę i nie chodzi tak ?

    według mnie nie pójdzie bo nie masz przekazania sygnału na wyjście :]
    wyjście tam gdziem masz wyprowadzenie ok zmieni swój stan ale rejestr PIND !! a nie jako PORTD !!

    musisz w kodzie dodać linijkę PORTD = PIND;
    to sprawi że sygnał zostanie wyprowadzony na zewnątrz.

    tak wygląd mój kod na atmege8 dla PWM

    #include <avr/io.h>
    #define F_CPU 1000000UL
    
    int main()
    {
    	DDRB = 0x08;
    	
    	TCCR2 = (1<<WGM20)|(0<<WGM21)|(1<<CS22)|(1<<CS21)|(1<<CS20)|(0<<COM20)|(1<<COM21);
    	TCNT2 = 0x00;
    	OCR2 = 128;
    	while(1)
    	{
    	PORTB = PINB;
    	}
    }


    sprawdź to bo to mi się rzuciło w oczy

    ściągnij sobie darmowy symulator Hapsim on pomaga przy testach w symulatorze :D:D:D

    czekam na info od ciebie jak to nie pójdzie zajmę się sprawdzaniem rejestrów.

    pozdro ppawel
  • REKLAMA
  • #3 8572392
    sulfur
    Poziom 24  
    Cytat:
    In fast PWM mode the counter is incremented until the counter value matches either
    one of the fixed values 0x00FF, 0x01FF, or 0x03FF (WGM13:0 = 5, 6, or 7), the value in
    ICR1 (WGM13:0 = 14), or the value in OCR1A (WGM13:0 = 15). The counter is then
    cleared at the following timer clock cycle.

    Kolega zdaje się mieć tryb 14.
  • REKLAMA
  • #4 8572617
    ZbeeGin
    Poziom 39  
    ppawel12 napisał:
    według mnie nie pójdzie bo nie masz przekazania sygnału na wyjście :]
    wyjście tam gdziem masz wyprowadzenie ok zmieni swój stan ale rejestr PIND !! a nie jako PORTD !!

    musisz w kodzie dodać linijkę PORTD = PIND;
    to sprawi że sygnał zostanie wyprowadzony na zewnątrz.

    Może by kolega sobie notę katalogową w sekcji I/O Ports przeczytał? Ale tym razem dokładnie.

    cz_e_ch_u napisał:
    
    TCCR1A=(1<<COM1A1)|(1<<WGM11); 
    TCCR1B=(1<<CS12)|(1<<WGM13)|(1<<WGM12);

    Nie ten tryb. Zamiast WGM13 ustaw WGM10 i ogranicz się do wartości w OCR1A do zakresu 0-1023.

    I na przyszłość podawaj więcej szczegółów co chcesz zrobić, a nie tylko co wyszło.
  • #5 8574650
    cz_e_ch_u
    Poziom 10  
    Właśnie wydawało mi się że to 14 trzeba ale teraz już chyba rozumiem wszystko
    Działający kod
    
    //PORTD5 jako wyjście
    DDRD=(1<<PORTD5);
    //kasuje 0C1A przy zrównaniu zliczaniu w górę ustawia w dół  
    TCCR1A=(1<<COM1A1);
    //tryb PWM korekcja fazy 8 bit
    TCCR1A|=(1<<WGM10); 
    //preskaler na 256
    TCCR1B=(1<<CS12);
    //start od 0 do 0x00FF na mniej znaczącej części
    TCNT1L=0x00;
    //wypełnienie czyli wartość dla której zmienia sie 0C1A przy zrównaniu licznika 
    OCR1AL=255;
    
REKLAMA