Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

ATMega64 & ШИМ

Сб май 19, 2012 14:13:16

Доброго дня всем форумчанам!

Задача: плавное зажигание произвольных светодиодов(могут быть подключены к любым свободным ножкам)

Проблема: мигающие светодиоды с разной яркостью каждые 0.5 сек. Т.е. ШИМ реализовать удалось - яркость меняется. Но светодиоды не горят постоянно, а каждые 0.5 сек мигают с этой яркостью.

Сейчас подключено 4 светодиода на ножки портов А и С.

Код:

Код:
#define F_CPU 800000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

//банально счетчик
volatile uint8_t i=0;
volatile int ni,nl,nj,t_sys;

//время задержки старта
#define START_DELAY 500

void delay_ms(volatile int count) {
   while(count--) {
      _delay_ms(1);
   }
}


ISR (TIMER1_OVF_vect)
   {
      PORTA |= _BV(PA3);
      PORTA |= _BV(PA6);
      PORTC |= _BV(PC7);
      PORTC |= _BV(PC4);
   };
 
ISR (TIMER1_COMPA_vect)
   {
      PORTA = 0x00;
      PORTC = 0x00;
   };

EMPTY_INTERRUPT (BADISR_vect);

int main(void)
{
   DDRA = 0xFF;
   DDRC = 0xFF;
   PORTA = 0x00;
   PORTC = 0x00;

   delay_ms(START_DELAY);
   //////////////
    while(1)
    {
       //настройка прерываний от таймера 0
       TIMSK = _BV(TOIE1); //разрешаем прерывание по переполнию таймера 0
       TIMSK |= _BV(OCIE1A); //разрешаем прерывание по регистру сравнения таймера 0
      
       //OCR1A=0x000;
      
       TCCR1A = 0<<WGM11|0<<WGM10; //режим normal
       TCCR1B = 0<<WGM13|0<<WGM12|0<<CS12|1<<CS11|0<<CS10;
      
       //TCCR2 = 0<<WGM00|0<<WGM01|0<<CS02|1<<CS01|1<<CS00;
       //OCR0A = 0xFF;

 
      
       sei(); //разрешаем работу прерываний вообще
        i = 1;
        nl=0;

       while (nl <= 511)
         {
            cli();

            TCCR1B = 0;
            
            OCR1A = i;

            i++;
            
             TCCR1B = 0<<WGM13|0<<WGM12|0<<CS12|1<<CS11|0<<CS10;

            sei();
            delay_ms(1);
            nl++;
   
         }
   
          
      cli();   
    }
}


Если кому понадобятся фьюзы, то держите батник для avrdude:
Код:
avrdude.exe -p m64 -c ftbb -P ft0 -B 4800  -U hfuse:w:154:m -U lfuse:w:228:m -U lock:w:63:m
avrdude.exe -p m64 -c ftbb -P ft0 -U flash:w:"plate.hex":a
avrdude.exe -p m64 -c ftbb -P ft0 -B 4800  -U hfuse:w:154:m -U lfuse:w:225:m -U lock:w:63:m -U efuse:w:255:m
Тема закрыта