Муфты электромонтажные от производителя Fucon

Мистика и простейшая программа на С для PIC для аквариумного контроллера

Новичок
 
Регистрация: 05.12.2012
Сообщений: 11
Репутация: 11
1 0
0 0
 
30.04.2013 13:04 #1
Доброго времени суток.
Пишу программу для аквариумного контроллера.Первый уровень меню-выбор из семи функций с выводом на LCD. Функции перебираются кнопкой(сигнал InA0),а нужная функция выбирается другой кнопкой(InA3). Вот и вся программа.Запускаю,начинаю нажимать InA0- всё работает ,функции перебираются,но третья по счёту функция "SetSUNSET" - на ЖКИ не отображается.Всё остальное-нормально работает. Если гору if-ов сделать комментарием,то третья функция отображается нормально.Отладку веду на EasyPIC-5. Вот код в mikroC:




// LCD module connections from LCD Library
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
//------------------------------------------------------------------------------
unsigned int pMenu;
bit old_SA0,old_SA3;
bit InA0,InA1,InA2,InA3;
//Var.definitions for some text outputing to LCD--------------------------------
unsigned char temper[5];//Variable gets string value,converted from numTemp.
float numTemp=36.5; //Stores float of temperature.

//MY 7 functions
//------------------------------------------------------------------------------

SetHM()
{
Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"Set H / M");
while(1){

}
}

//------------------------------------------------------------
SetSR()
{
Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"Set SR H/M");
while(1){


}
}
//-----------------------------------------------------------------------------
SetSS()
{
Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"Set SS H/M");
while(1){

}
}
//-----------------------------------------------------------------------------
SetCO2start()
{
Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"Set CO2strt H/M");
while(1){

}
}
//-----------------------------------------------------------------------------
SetCO2end()
{
Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"Set CO2end H/M");
while(1){

}
}
//-----------------------------------------------------------------------------
SetO2start()
{
Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"Set O2strt H/M");
while(1){

}
}
//-----------------------------------------------------------------------------
SetO2end()
{
Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"Set O2end H/M");
while(1){

}
}
//================================================== ===================
//==========Начало программы================================ ========= ====

void main(){


ADCON1 |= 0x0F; // Configure AN pins as digital
CMCON |= 7; // Disable comparators
TRISA |=0x0F;
//------------------------------------------------------------------------------

Lcd_Init(); // Initialize LCD - from LCD library


Lcd_Cmd(_LCD_CLEAR); // Clear display - from LCD library
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_LCD_TURN_ON); // Cursor off - from LCD library

forCase: pMenu=0;
do {

InA0=PORTA.RA0;
InA3=PORTA.RA3;

if(InA0 == 0 && old_SA0==1){//Если нажата кнопка

switch(pMenu)
{
//Перебирать пункты меню
case 0: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetCLOCK");break;
case 1: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetSUNRISE");brea k;
case 2: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetSUNSET");break ;
case 3: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetCO2_STRT");bre ak;
case 4: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetCO2_END");brea k;
case 5: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetO2_STRT");brea k;
case 6: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetO2_END");break ;
case 7: goto forCase;
}

//pMenu содержит номер выбранной функции
pMenu++; }//продолжить перебор функций
old_SA0=InA0;

//================================================== ========== ==========
//при нажатии InA3 войти в подпрограмму соответствующую (pMenu)выбранной функции

if(inA3==0 && old_SA3==1 && pMenu==1)SetHM();
if(inA3==0 && old_SA3==1 && pMenu==2)SetSR();
if(inA3==0 && old_SA3==1 && pMenu==3)SetSS();
if(inA3==0 && old_SA3==1 && pMenu==4)SetCO2start();
if(inA3==0 && old_SA3==1 && pMenu==5)SetCO2end();
if(inA3==0 && old_SA3==1 && pMenu==6)SetO2start();
if(inA3==0 && old_SA3==1 && pMenu==7)SetO2end();
old_SA3=InA3 ;
}
while(1);//бесконечный возврат на do
}

Теперь мистика. Если не нажимать кнопку InA3,а только перебирать функции кнопкой InA0,то,как я и говорил,третья функция не отображается.остальное всё в порядке. Но(!!!),если я расширяю в этой третьей фукции "Set SS H/M" на "Set SS H/Mллллллллллллллллл" ,то вижу часть символов "л" в первой строке ЖКИ.Получается,что без нажатия InA3 всё равно как-то выбирается и выполняется(при этом не сначала строки!) третий if??????
Может,кто поможет инвалиду умственного труда. Заранее спасибо от новичка.
Оценка
Знаток
 
Регистрация: 06.01.2010
Адрес: Львов
Сообщений: 238
Репутация: 125
111 162
3 2
 
07.05.2013 01:12 #2
А Вы уверены, что симулятор Вас не обманывает? Недавно пробовал посмотреть работу своей схемы (собранной, кстати, и в железе) в Протеусе - и столкнулся с глюками вроде того, что светодиод не зажигается, хотя порт настроен на вывод и нужный его бит устанавливается в 1. В железе же всё работает... Единственный симулятор, которому, на мой взгляд, можно доверять, это MPLab Sim. Я лично им и пользуюсь при возникновении подобных "загадочных" ситуаций. Но программа должна быть написана на Ассемблере.
Оценка
Новичок
 
Регистрация: 01.05.2013
Сообщений: 6
Репутация: 10
0 1
0 0
 
07.05.2013 08:47 #3
Наверно к вас здесь косячок

Код:
case 1: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetSUNRISE");brea k;
Посмотритекак написано break
Остальные break тоже есть с ошибкой.
Нарисуйте в протеусе, для проверки.

Есть же в микросях встроеная функция обработки нажатия кнопки с функцией антидребезга, воспользуйтес ею. Антидребезг у вас не обрабатывается.
Оценка
Новичок
 
Регистрация: 01.05.2013
Сообщений: 6
Репутация: 10
0 1
0 0
 
07.05.2013 08:49 #4
Цитата:
Сообщение от Guaho
А Вы уверены, что симулятор Вас не обманывает? Недавно пробовал посмотреть работу своей схемы (собранной, кстати, и в железе) в Протеусе - и столкнулся с глюками вроде того, что светодиод не зажигается, хотя порт настроен на вывод и нужный его бит устанавливается в 1. В железе же всё работает... Единственный симулятор, которому, на мой взгляд, можно доверять, это MPLab Sim. Я лично им и пользуюсь при возникновении подобных "загадочных" ситуаций. Но программа должна быть написана на Ассемблере.
В этом случае, наверно, неправильно было выставленно слово конфигурации в протеусе или вывод порта аналоговый был.
А лучше проектик выложите, посмотрели бы.
Оценка
Новичок
 
Регистрация: 05.12.2012
Сообщений: 11
Репутация: 11
1 0
0 0
 
08.05.2013 00:08 #5
Цитата:
Сообщение от russo_turisto
Наверно к вас здесь косячок

Код:
case 1: Lcd_Cmd(_LCD_CLEAR);Lcd_Out(2,1,"SetSUNRISE");brea k;
Посмотритекак написано break
Остальные break тоже есть с ошибкой.
Нарисуйте в протеусе, для проверки.

Есть же в микросях встроеная функция обработки нажатия кнопки с функцией антидребезга, воспользуйтес ею. Антидребезг у вас не обрабатывается.
на break не обращайте внимания- запостил с ошибками,виноват.Кнопки сидят каждая на отдельном железном триггере.
Оценка
Новичок
 
Регистрация: 01.05.2013
Сообщений: 6
Репутация: 10
0 1
0 0
 
08.05.2013 09:05 #6
в
//MY 7 functions

может быть косячок, в while(1){

}

пустого оператора нет.

Нарисуйте в протеусе, посмотрим в отладке.
Оценка
Ответ
Похожие темы
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход
Электронные компоненты. Скидки 15%, кэшбэк 15% и бесплатная доставка от ТМ Электроникс
Часовой пояс GMT +3, время: 02:02.
Обратная связь РадиоЛоцман Вверх