реклама на сайте
подробности

 
 
> Связка Ведущий - Драйвер
Anub
сообщение Sep 19 2008, 20:33
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 26-05-08
Пользователь №: 37 825



Я делаю часы с индикацией на ЦСИ. Так как ЦСИ не цифровые пришлось самому сделать под них драйвер с регулированием яркости частоты перерисовки и т д. Ведущий МК отвечает за все остальное в то время как драйвер только отрисовывает цифры. Обмен между МК происходит по средствам пакетной передачи. Но с недавних пор я столкнулся с крайне неприятной проблемой - временами индикаторы тухнут, а это прямо говорит о том что драйверная функция потребила что то несъедобное, так как иначе появились бы нули. Вот как это выглядит
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
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th July 2025 - 07:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016