Я делаю часы с индикацией на ЦСИ. Так как ЦСИ не цифровые пришлось самому сделать под них драйвер с регулированием яркости частоты перерисовки и т д. Ведущий МК отвечает за все остальное в то время как драйвер только отрисовывает цифры. Обмен между МК происходит по средствам пакетной передачи. Но с недавних пор я столкнулся с крайне неприятной проблемой - временами индикаторы тухнут, а это прямо говорит о том что драйверная функция потребила что то несъедобное, так как иначе появились бы нули. Вот как это выглядит
http://rutube.ru/tracks/1028588.html?v=c5e...bfe97242aa66f18Функция получения пакета вроде бы как давно проверена, много раз ее использовал, вот она
Код
interrupt [USART_RXC] void usart_rx_isr(void)
{
char data = UDR;
if (!rx_done) {
if (data == ':') fbp = 1;
if (fbp) {
rx_buffer[rx_wr_index++] = data;
if (data =='/') {
rx_done = 1;
fbp = 0;
rx_wr_index = 0;
activeCommand(rx_buffer);
}
else if (rx_wr_index>=RX_BUFFER_SIZE) {
rx_wr_index = 0;
rx_buffer_overflow = 1;
}
} else;
} else rx_data_overrun = 1;
}
void activeCommand(char c[])
{
USHORT a, b, d, e;
a=rx_buffer[1];
b=rx_buffer[2];
d=rx_buffer[3];
e=rx_buffer[4];
fi=a-48; //Так как преобразование идет в ASCII код приходится доводить значение
se=b-48;
th=d-48;
fo=e-48;
rx_done = 0;
}
Шлю команду по прерыванию каждую секунду так
Код
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
PORTB=0x00;
TCNT1=57723;//57723
if (S!=59){
S++;
} else {
S=0;
M++;
}
if (M==60){
M=0;
H++;
}
if (H==24){
H=0;
}
SetCountCommand[1]=M/10+48;
SetCountCommand[2]=M%10+48;
SetCountCommand[3]=S/10+48;
SetCountCommand[4]=S%10+48;
puts(SetCountCommand);
}
Как видно из вышеприведенного все это прекрасно работает за исключением только того бага. Что это может быть и как это лечить?
Сообщение отредактировал Anub - Sep 19 2008, 20:34