Доброго дня всем форумчанам!
Задача: плавное зажигание произвольных светодиодов(могут быть подключены к любым свободным ножкам)
Проблема: мигающие светодиоды с разной яркостью каждые 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