Ср авг 11, 2021 15:58:25
// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
switch (a) {
case 0:
Cathode_0_on ();
print (a1);
break;
case 1:
Cathode_1_on ();
print (a2);
break;
case 2:
Cathode_2_on ();
print (a3);
break;
case 3:
Cathode_3_on ();
print (a4);
break;
case 4:
Cathode_4_on ();
print (a5);
break;
case 5:
Cathode_5_on ();
print (a1);
break;
}
a++;
if (a == 6) {a = 0;}
}
// Timer2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
all_off ();
off_segments ();
}
if (b < bright1) {зажигать} else {не зажигать}
Ср авг 11, 2021 16:56:02
Ср авг 11, 2021 17:03:12
uldemir писал(а):Если вы не можете запрячь под это дело DMA, то можете добавить просто прерывание по сравнению таймера и по прерыванию по переполнению показываете новую цифру, а по прерыванию сравнения - старую
Ср авг 11, 2021 17:15:32
А если использовать два канала сравнения? один для яркости, другой для эффекта? Или у AVR нет таймеров с несколькими каналами захвата/сравнения?*Trigger* писал(а):Такой вариант плохо совмещается с регулировкой яркости, к сожалению. Я по началу так и делал, а потом захотелось регулировать яркость, и пришлось от такого способа отказаться.
Ср авг 11, 2021 17:33:48
Ср авг 11, 2021 18:14:51
unsigned char digit1 [16] = {1, 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
unsigned char t = 0;
// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
switch (a) {
case 0:
Cathode_0_on ();
print (digit [t]);
break;
case 1:
Cathode_1_on ();
print (a2);
break;
case 2:
Cathode_2_on ();
print (a3);
break;
case 3:
Cathode_3_on ();
print (a4);
break;
case 4:
Cathode_4_on ();
print (a5);
break;
case 5:
Cathode_5_on ();
print (a1);
break;
}
a++;
t++;
if (t > 15) t = 0;
if (a == 6) {a = 0;}
}
// Timer2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
all_off ();
off_segments ();
}
Ср авг 11, 2021 18:38:30
Ср авг 11, 2021 18:52:39
Ср авг 11, 2021 19:10:40
if(bright_step_counter >= BRIGHT_STEPS)
return;
if(++bright_step_counter == BRIGHT_STEPS_WITH_SAFE_PAUSE){
bright_step_counter = 0;
digit_mask <<= 1;
if(++digit_counter == DIGITS){
digit_counter = 0;
digit_mask = (1 << 0);
}
}
Ср авг 11, 2021 19:23:41
Ср авг 11, 2021 19:30:21
t++;
if (t > 15){
t = 0;
a++;
if (a == 6)
a = 0;
}
Ср авг 11, 2021 19:43:17
Ср авг 11, 2021 19:48:12
Ср авг 11, 2021 19:52:12
Пн авг 23, 2021 21:29:53
volatile uint8_t Digit[4]={0,0,0,0};//текущие отображаемые цифры
volatile uint8_t NewDigit[4]={0,0,0,0};//новые отображаемые цифры
volatile uint8_t ChangeDigitCounter[4]={0,0,0,0};//счётчик перехода от старых к новым цифрам
//----------
//обработчик вектора прерывания таймера T0 (8-ми разрядный таймер) по переполнению
//----------
ISR(TIMER0_OVF_vect)
{
//выполняем плавное зажигание/погасание цифр с импользованием BAM (binary amplitude modulation)
static uint8_t weight=0;//вес разряда
uint8_t mask=0;
mask=(1<<weight);
TCNT0=0xff-mask;
weight++;
if (weight==5) weight=0;
uint8_t digit[4]={Digit[0],Digit[1],Digit[2],Digit[3]};
static bool new_digit[4]={false,false,false,false};
for(uint8_t n=0;n<4;n++)
{
if (ChangeDigitCounter[n]==0) Digit[n]=NewDigit[n];//цифра сменилась
if (ChangeDigitCounter[n]&mask) new_digit[n]=false;
else new_digit[n]=true;
if (new_digit[n]==true) digit[n]=NewDigit[n];
}
OUTPUT_OutputDigit(digit);
}
//----------
//обработчик вектора прерывания таймера T2 (8-ми разрядный таймер) по переполнению
//----------
ISR(TIMER2_OVF_vect)
{
//таймер вызывается 122.0703125 раза в секунду
TCNT2=0;
KEYBOARD_Scan();
SENSOR_DecrementEnabledDataCounter();
static uint8_t tick=0;
tick++;
if (tick==122)//прошла секунда (примерно)
{
if (CathodeCleaningCounter>0) CathodeCleaningCounter--;
tick=0;
}
if ((tick&0x01)!=0) return;
for(uint8_t n=0;n<4;n++)
{
if (ChangeDigitCounter[n]>0) ChangeDigitCounter[n]--;
}
}
for(uint8_t n=0;n<4;n++)
{
if (NewDigit[n]!=set_digit[n]) ChangeDigitCounter[n]=0x1f;
NewDigit[n]=set_digit[n];
}
Ср авг 25, 2021 07:52:28
Пн авг 30, 2021 07:13:15
Пн авг 30, 2021 09:26:54
ISR(TIMER0_OVF_vect) {
//выполняем плавное зажигание/погасание цифр с импользованием BAM (binary amplitude modulation
static uint8_t mask = 1;
TCNT0 = 0xff - mask;
mask <<= 1;
if (mask == (1 << 5)) mask = 1;
uint8_t digind[4];
for (uint8_t n = 0; n < 4; n++) {
if (ChangeDigitCounter[n] == 0) Digit[n] = NewDigit[n]; //цифра сменилась
digind[n] = (ChangeDigitCounter[n] & mask) ? Digit[n] : NewDigit[n];
}
OUTPUT_OutputDigit(digind);
}
Пн авг 30, 2021 09:54:28