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

[ATMEGA 16][C++/AVR Studio] Przerwania i programowy PWM

Ciapul 12 Lut 2011 21:19 4065 8
REKLAMA
  • #1 9142762
    Ciapul
    Poziom 11  
    Witam, mam problem z okiełznaniem programowego PWM. Pacjent to Atmega 16 taktowana zewnętrznym kwarcem 8MHz. Niby wszystko tak jak powinno być, a ruszyć nie chce. Będę wdzięczny za rzucenie świeżym okiem na program, bo kończą mi się pomysły co jest nie tak.

    
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    
    
    volatile uint8_t pwm1, pwm2, pwm3;
    
    int main(void)
    {
    
     DDRA |=(1<<PA0)|(1<<PA1)|(1<<PA2);
     PORTA|=(1<<PA0)|(1<<PA1)|(1<<PA2);
    
    
     TCCR2 |= (1<<WGM21);
     TCCR2 |= (1<<CS20)|(1<<CS21)|(1<<CS22);
     OCR2 = 200;
     TIMSK |= (1<<OCIE2);
    
     sei();
     uint8_t i;
    
     while (1);
      {
    
    	for (i=0;i<255;i++) 
    	{  
    		pwm1=i;
      		pwm2=255-i;
      		pwm3=i;
    		_delay_ms(100);
    	}
    	pwm1=255;
    	pwm2=255;
    	pwm3=255;
    	_delay_ms(1000);
      }
    }
    
    
    ISR( TIMER2_COMP_vect )
    {
     static uint8_t licznik;
     if(licznik>=pwm1) PORTA |= (1<<PA0); else PORTA &= ~(1<<PA0);
     if(licznik>=pwm2) PORTA |= (1<<PA1); else PORTA &= ~(1<<PA1);
     if(licznik>=pwm3) PORTA |= (1<<PA2); else PORTA &= ~(1<<PA2);
     licznik++;
    }
    
  • REKLAMA
  • #2 9143001
    mirekk36
    Poziom 42  
    A możesz napisać bliżej co to znaczy, że nie chce ruszyć? może jakiś schemat jak to podłączyłeś albo chociaż jakieś szczątkowe informacje co to znaczy że nie działa ?

    Dodano po 2 [minuty]:

    A tak całkiem przy okazji po co męczyć podłączanie zewnętrznego kwarca 8MHz skoro masz wewn. oscylator 8MHz ;) w procku.
  • REKLAMA
  • #3 9143242
    Ciapul
    Poziom 11  
    OK. "Poskładane" na szybko na płytce ZL10AVR, LEDy podpięte do portu A i.. świecą na stałe. Przewertowałem juz kilka przykładów, niby wszystko jest ok, ale efektu ściemniania brak. Inny program, obsługujący sprzętowego PWM'a działa.

    Co do kwarcu to testowałem i na wewnętrznym i na zewnętrznym.
  • #4 9143280
    mirekk36
    Poziom 42  
    No dobra, zobacz tera jaki ty ogromny preskaler użyłeś do programowego PWM'a ;) 1024 - szok ;) ... one ci się ciągle nie świecą tylko migają ale raz na godzinę - więc nawet nie czekałeś tyle żeby to zaobserwować.

    Daj preskaler = 1.
  • REKLAMA
  • #6 9143419
    mirekk36
    Poziom 42  
    No to musisz mieć coś źle podłączone albo jak? bo program jest ok. Może nie masz podłączonego zasilania do AVCC ??

    Dodano po 2 [minuty]:

    albo wgrywasz nie tego HEX'a
    albo jakoś źle to kompilujesz
    (w jakim środowisku w ogóle piszesz i kompilujesz ten program?)
  • REKLAMA
  • #7 9143470
    Ciapul
    Poziom 11  
    HEX właściwy, sprawdzałem więcej niż raz :/

    Środowisko:
    AVR Studio 4 SP 3 build 716,
    WinAVR 20100110,
    AVR Toolchain 3.0.0.240

    Sprawdzałem jeszcze na drugiej maszynie, efekt ten sam.

    Wg schematu płytki AVCC podłączone.
  • Pomocny post
    #8 9143510
    tadzik85
    Poziom 38  
    a ja chce zauważyć pewien średnik po while
  • #9 9143543
    Ciapul
    Poziom 11  
    Po usunięciu babola w postaci średnika zaczęło działać w ogóle, a po sugerowanych zmianach w kodzie zaczęło działać tak jak powinno.

    Dzięki
REKLAMA