Я это понял так: По прерыванию компаратора таймера включаем один из разрядов семисегментного индикатора. По прерыванию переполнения гасим индикаторы. При фиксированной длине периода таймера гаситься и зажигаться сегменты индикатора будут с одинаковой периодичностью, а вот время от включения до выключения можно варьировать - чем больше OCR0A тем меньше он гореть будет, тем меньше яркость.
Попробовал это на Attiny2313. Код на С для AVRStudio:
Код: Выделить всё
#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define BIT0 0b00000001
#define BIT1 0b00000010
#define BIT2 0b00000100
#define BIT3 0b00001000
#define BIT4 0b00010000
#define BIT5 0b00100000
#define BIT6 0b01000000
#define BIT7 0b10000000
char digits[]={ //разряды для вывода цифр на порт В
//hgfedcba
0b00111111, //0
0b00000110, //1
0b01011011, //2
0b01001111, //3
0b01100110, //4
0b01101101, //5
0b01111101, //6
0b00000111, //7
0b01111111, //8
0b01101111, //9
0b01110111, //A
0b01111100, //b
0b00111001, //C
0b01011110, //d
0b01111001, //E
0b01110001, //F
};
char m[2] = {0,0}; //переменная для вывода на индикатор - 0 - 1й разряд, 1 - 2й разряд
char posit=0; //текущий разряд
ISR (TIMER0_COMPA_vect){
cli();
PORTD |= 0b00000011; //Выключаю индикатор
sei(); }
ISR (TIMER0_OVF_vect){
cli();
PORTB = digits[m[posit]];
if (posit==1) PORTD = BIT0;//;(1<<(posit));
if (posit==0) PORTD = BIT1;//;(1<<(posit));
posit++;
if(posit==2)posit=0;
sei();}
int main (void) {
TCCR0B |=(1<<CS10)|(1<<CS11); // Предделитель для T0 - 64.
TIMSK |=(1<<TOIE0); // Разрешить прерывание по переполнению T0.
SREG |= (1<<7); // Разрешить все прерывания.
TCNT0=0;// Инициализация счётчика.;
OCR0A = 128; //половинная яркость
char i=1;
DDRB = 0xFF;
DDRD = 0b00000011;
PORTB = 0;
PORTD = 0b00000011;// Общий Катод - гасим индикаторы
for (;;){
m[0] = i%10;
m[1] = (int)i/10;
_delay_ms(1000);
i++;
if(i==100) i = 0; }
return 0;}//end main
Если поменять код в прерываниях местами - не работает - индикатор не горит. Кажется не обрабатывается прерывание TIMER0_COMPA.



