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

 
 
 
Reply to this topicStart new topic
> Странный глюк, двумя словами не описать
masterpc
сообщение Jul 31 2008, 06:09
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



Работаю над контроллером для вентиляции, написал меню для жки 2*8, все работало нормально, пока я не решил вывод на жки перенести в основной цикл, до этого все выводилось по прерыванию таймера. Но я не постоянно что-то вывожу на ЖКИ, а только тогда, когда что-то новое нужно вывести. Все строковые литералы у меня храняться в флеше.
Глюк в следующем, включаю свой девайс и наблюдаю в верхней строке индикатора кракозябры, притом при переходе по меню,, кракозябры остаються. Начинаю думать, что может с настройками стека что-то не то, начинаю чтио-то пытаться настроить, вроде прошло. Целый день все нормально. Вот ушел домой, выключил девайс, прихожу утром, опять теже кракозябры. Провожу ту же процедуру поиска глюков, добиваюсь, чтобы все работало нормально. Подергал питание туда сюда, все нормально. И тут решил отключить питание на 10 минут. Включил после этого, и.... опять те же кракозябры. Даже не знаю где искать причину траблы, программер я пока не ас, только учусь, может и накосячил где. Помогите плиз crying.gif
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jul 31 2008, 06:26
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(masterpc @ Jul 31 2008, 15:09) *
Работаю над контроллером для вентиляции, написал меню для жки 2*8, все работало нормально, пока я не решил вывод на жки перенести в основной цикл, до этого все выводилось по прерыванию таймера. Но я не постоянно что-то вывожу на ЖКИ, а только тогда, когда что-то новое нужно вывести. Все строковые литералы у меня храняться в флеше.
Глюк в следующем, включаю свой девайс и наблюдаю в верхней строке индикатора кракозябры, притом при переходе по меню,, кракозябры остаються. Начинаю думать, что может с настройками стека что-то не то, начинаю чтио-то пытаться настроить, вроде прошло. Целый день все нормально. Вот ушел домой, выключил девайс, прихожу утром, опять теже кракозябры. Провожу ту же процедуру поиска глюков, добиваюсь, чтобы все работало нормально. Подергал питание туда сюда, все нормально. И тут решил отключить питание на 10 минут. Включил после этого, и.... опять те же кракозябры. Даже не знаю где искать причину траблы, программер я пока не ас, только учусь, может и накосячил где. Помогите плиз crying.gif

1. ЖК стабильно работает, когда к нему обращаются из прерывания? Если да, то в основном цикле, при обращении к ЖК, асинхронно (т.е. в любой момент) к тому же порту может что-то обратиться в возникшем прерывании. Висит ли что-нить еще на этом порту вместе с ЖК? Есть ли обращения к этому порту в каком-либо обработчики прерывания? Для диагностики можно попробывать выключить глобально прерывания и посмотреть, будет ли глюк продолжаться.
2. ЖК исправен 100 % ?
3. Провода до ЖК не очень длинные?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
masterpc
сообщение Jul 31 2008, 06:39
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



Цитата(haker_fox @ Jul 31 2008, 09:26) *
1. ЖК стабильно работает, когда к нему обращаются из прерывания? Если да, то в основном цикле, при обращении к ЖК, асинхронно (т.е. в любой момент) к тому же порту может что-то обратиться в возникшем прерывании. Висит ли что-нить еще на этом порту вместе с ЖК? Есть ли обращения к этому порту в каком-либо обработчики прерывания? Для диагностики можно попробывать выключить глобально прерывания и посмотреть, будет ли глюк продолжаться.
2. ЖК исправен 100 % ?
3. Провода до ЖК не очень длинные?


ЖКИ висит на отдельных ногах проца, в прерывании только опрос дискретных входов, кнопок и счетчик для возврата меню в исходное состояние если кнопки не нажимались 60 секунд. Я все это убрал из прерывания, не помогло. ЖКИ точно исправный, у меня есть еще одна платка такая же, я проверял. От процика до ЖКИ дорожки по плате не длинее 4,5 см. Наводок вроде нет никаких.
Есть одна особенность, кракозябры только в первой строке и толко когда я вытягиваю строки из флеша. Там где в программе просто написано
Код
  Out_LCD(1,1," Пароль ");
  Out_LCD(2,1,"  ****  ");


То все нормально выводиться.

Интересно почему глюк проявляется после того, как питание отсутствует некоторое время.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 31 2008, 06:47
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Похоже, что с инициализацией ЖКИ у Вас что-то не то.
Хотя, что значит "вытягиваю строки из флеша" - флеш внешний?
Go to the top of the page
 
+Quote Post
masterpc
сообщение Jul 31 2008, 06:56
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



Цитата(aaarrr @ Jul 31 2008, 09:47) *
Похоже, что с инициализацией ЖКИ у Вас что-то не то.
Хотя, что значит "вытягиваю строки из флеша" - флеш внешний?


Вот инициализация ЖК:
Код
//Функция инициализации ЖКИ
void LCDinit(void){

  PAUSE_US(15000);     // ~15 ms
  write_LCD(0x30, 0);
  PAUSE_US(5500);      // ~5,5 ms
  write_LCD(0x30, 0);
  PAUSE_US(250);      // ~250 us
  write_LCD(0x30, 0);
  
  
  BFcontrol();  
  write_LCD(0x01, 0);   //очистка экрана
  BFcontrol();
  write_LCD(0x28, 0);   //выбираем 4-х разрядную шину, размер символа 5х8, развертка в 2 строки
  BFcontrol();  
  write_LCD(0x0C, 0);   //дисплей включен, курсор никак не отображаем /E
  BFcontrol();  
  write_LCD(0x06, 0);   //Перемещает курсор вправо, счетчик адреса инкрементируется
  BFcontrol();  
  write_LCD(0x02, 0);   //AC=0
  BFcontrol();  
  write_LCD(0x01, 0);   //очистка экрана
  
}



А вот как меню организовано:
Код
__flash const byte s0[]=" MASTER ";
__flash const byte s1[]=" v-0.1a ";
__flash const byte s2[]=" Журнал ";
__flash const byte s3[]=" работы ";
__flash const byte s4[]="Конфиг. ";
__flash const byte s5[]="системы ";
__flash const byte s6[]=" Ручной ";
__flash const byte s7[]=" режим  ";
__flash const byte s8[]="Текущие ";
__flash const byte s9[]="настр-ки";

и т.д.


/*Структуры всех пунктов меню*/
struct MENU{
      __flash const byte *st1;
      __flash const byte *st2;
      const byte next;
      const byte func;      
}__flash mas[]={
                            
            s0,     //0
            s1,                // " MASTER "
            1,                 // " v-0.1a "
            0x00,
            
            s2,     //1
            s3,                // " Журнал "
            0,                 // " работы "              
            0x00,
            
            s4,     //2
            s5,                // "Конфиг. "
            4,                 // "системы "
            0x08,
            
            
            s6,     //3
            s7,                // " Ручной "
            0,                 // " режим  "
            0x09,
            
            
            s8,     //4
            s9,                // "Текущие "
            2,                 // "настр-ки"
            0x0A,


и т.д.


//Вывод текущей информации на ЖКИ
void DISPLAY(void){
    
        
  
         static byte buf=0xFF;
         if(buf!=Current_Punkt){          
                       buf=Current_Punkt;                        
                       ChType(1,1, (mas[Current_Punkt].st1));
                       ChType(2,1, (mas[Current_Punkt].st2));                        
         }
        
         else if(permit>0){          
                       buf=Current_Punkt;                        
                       ChType(1,1, (mas[Current_Punkt].st1));
                       ChType(2,1, (mas[Current_Punkt].st2));
                       permit--;  
         }
        
         NextPunkt=mas[Current_Punkt].next;
         Function=mas[Current_Punkt].func;          
        
        
            
}



void ChType(byte x, byte y, byte const __flash  *str){    
  byte i=0;
  byte buf[8];    
                  
    
          while (str[i]!='\0'){
            buf[i]=str[i];
            i++;
          }
         Out_LCD(x,y, buf);
}



По меню я передвигаюсь с помощью двумерного массива, в котором записаны номера пунктов меню из __flash mas[].
Go to the top of the page
 
+Quote Post
aesok
сообщение Jul 31 2008, 07:03
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(masterpc @ Jul 31 2008, 10:56) *
Код
void ChType(byte x, byte y, byte const __flash  *str){    
  byte i=0;
  byte buf[8];    
                  
.....
}


Почему размер buf[] - 8?

Анатолий.
Go to the top of the page
 
+Quote Post
masterpc
сообщение Jul 31 2008, 07:06
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



Цитата(aesok @ Jul 31 2008, 10:03) *
Почему размер buf[] - 8?

Анатолий.


Потому, что ЖК 2*8 и я по очереди конвертирую сначала первую строку, потом вторую. Или я тупо ошибку не вижу?
Go to the top of the page
 
+Quote Post
aesok
сообщение Jul 31 2008, 07:09
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(masterpc @ Jul 31 2008, 11:06) *
Потому, что ЖК 2*8 и я по очереди конвертирую сначала первую строку, потом вторую. Или я тупо ошибку не вижу?


А что пишут в вашей книге по С, сколько места занимант строка из 8 символов в памяти?

Анатолий.
Go to the top of the page
 
+Quote Post
masterpc
сообщение Jul 31 2008, 07:14
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



Цитата(aesok @ Jul 31 2008, 10:09) *
А что пишут в вашей книге по С, сколько места занимант строка из 8 символов в памяти?

Анатолий.

Я понял, о чем Вы. Переписал byte buf[9]; - ничего не помогло.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 31 2008, 07:16
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Не помогло - потому, что девятый символ со значением 0 в buf не переписывается
Go to the top of the page
 
+Quote Post
masterpc
сообщение Jul 31 2008, 07:28
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 1-03-07
Из: Винница
Пользователь №: 25 788



Цитата(Палыч @ Jul 31 2008, 10:16) *
Не помогло - потому, что девятый символ со значением 0 в buf не переписывается


Получилось! Написал после цикла
Код
buf[8]='\0';

И все заработало yeah.gif

Спасибо всем огромное beer.gif beer.gif beer.gif
Go to the top of the page
 
+Quote Post

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

 


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


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