ATMega64 & ШИМ

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Acionyx
Родился
Сообщения: 1
Зарегистрирован: Сб май 19, 2012 14:08:44

ATMega64 & ШИМ

Сообщение Acionyx »

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

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

Проблема: мигающие светодиоды с разной яркостью каждые 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
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»