DYK писал(а):Darth Cuauhtemoc , программу подправить я несмогу незнаю как ето делать , могу разве что залить в пик , вообще-то если подскажешь где чаво ,мож попробую подправить
Подсказка, как первоначально было сделано у меня (без паузы, и я решил первоначально гасить оптроны на время смены кода на 155ИД1, но это лишнее):
Спойлер
Код: Выделить всё
ISR(TIMER0_OVF_vect)
{
static unsigned char ind_state;
switch (ind_state)
{
case 0:
PORTB = 0x00;
PORTC = time_data[0];
PORTB = 0x01 & ind_blank_mask;
ind_state = 1;
break;
case 1:
PORTB = 0x00;
PORTC = time_data[1];
PORTB = 0x02 & ind_blank_mask;
ind_state = 2;
break;
case 2:
PORTB = 0x00;
PORTC = time_data[2];
PORTB = 0x04 & ind_blank_mask;
ind_state = 3;
break;
case 3:
PORTB = 0x00;
PORTC = time_data[3];
PORTB = 0x08 & ind_blank_mask;
ind_state = 4;
break;
case 4:
PORTB = 0x00;
PORTC = time_data[4];
PORTB = 0x10 & ind_blank_mask;
ind_state = 5;
break;
case 5:
PORTB = 0x00;
PORTC = time_data[5];
PORTB = 0x20 & ind_blank_mask;
ind_state = 0;
break;
default:
PORTB = 0x00;
ind_state = 0;
break;
}
return;
}
и как пришлось сделать, чтобы добавить паузы
Спойлер
Код: Выделить всё
ISR(TIMER0_OVF_vect)
{
static unsigned char ind_state;
switch (ind_state)
{
case 0:
PORTB = 0x00;
ind_state = 1;
break;
case 1:
PORTC = time_data[0];
PORTB = 0x01 & ind_blank_mask;
ind_state = 2;
break;
case 2:
PORTB = 0x00;
ind_state = 3;
break;
case 3:
PORTC = time_data[1];
PORTB = 0x02 & ind_blank_mask;
ind_state = 4;
break;
case 4:
PORTB = 0x00;
ind_state = 5;
break;
case 5:
PORTC = time_data[2];
PORTB = 0x04 & ind_blank_mask;
ind_state = 6;
break;
case 6:
PORTB = 0x00;
ind_state = 7;
break;
case 7:
PORTC = time_data[3];
PORTB = 0x08 & ind_blank_mask;
ind_state = 8;
break;
case 8:
PORTB = 0x00;
ind_state = 9;
break;
case 9:
PORTC = time_data[4];
PORTB = 0x10 & ind_blank_mask;
ind_state = 10;
break;
case 10:
PORTB = 0x00;
ind_state = 11;
break;
case 11:
PORTC = time_data[5];
PORTB = 0x20 & ind_blank_mask;
ind_state = 0;
break;
default:
PORTB = 0x00;
ind_state = 0;
break;
}
return;
}
Младшие 6 разрядов порта B - оптроны, младшие 4 разряда порта C - выход на 155ИД1
как видишь, все просто - прерывания по переполнению от таймера 0. С каждым прерыванием конечный автомат устанавливает выходные сигналы в зависимости от текущего состояния и входной переменной ind_blank_mask (это битовая маска, позволяющая выборочно гасить разряды, так, в режиме установки я гашу секунды), и готовит состояние, в которое он перескакивает на следующем прерывании.
Объясняю, как работает, по второму подправленному варианту, никаких разрядов не гасим (ind_blank_mask = 0xFF).
Допустим, начинаем с состояния 0 (на самом деле это неважно).
Первое прерывание: Состояние 0. Вырубаем все оптроны (это пауза, когда ничего не горит), следующее состояние будет 1
Второе прерывание: Состояние 1. Выдаем на 155ИД1 единицы секунд, врубаем оптрон единиц секунд, следующее состояние будет 2
Третье прерывание: Состояние 2. Вырубаем все оптроны (это пауза, когда ничего не горит), следующее состояние будет 3
Четвертое прерывание: Состояние 3. Выдаем на 155ИД1 десятки секунд, врубаем оптрон десятков секунд, следующее состояние будет 4
...
Ну и так далее, до состояния 11, после которого следующее состояние будет 0.
default поставлен поскольку неизвестно, каким будет значение ind_state после сброса, если оно не в диапазоне 0 ... 11, первое же прерывание переведет автомат в состояние 0, ну а дальше он будет работать как описано.
Tvala писал(а):так и сделаем, спасибки. чегото сразу не додумался

От 12 В питать, так три диода последовательно и резистор, две такие цепочки параллельно соединить, вот и будет 6 диодов.
У кошки четыре ноги - вход, выход, земля и питание. Но трогать ее не моги - получится замыкание.