Поставки продукции Megawin по официальным каналам - микроконтроллеры, мосты USB-UART

Мистика и простейшая программа на С для 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??????
Может,кто поможет инвалиду умственного труда. Заранее спасибо от новичка.
Оценка
К конденсаторам источников питания высокой мощности предъявляются высокие требования по качеству и надежности. Пленочные – единственный тип конденсаторов, который может справиться с такой задачей. Компания Hongfa предлагает продукцию, которая подходит для применения практически во всех функциональных узлах типовых AC/DC- или DC/AC-преобразователей. Рассмотрим характеристики и применения плёночных конденсаторов Hongfa для различных решений.
Знаток
 
Регистрация: 06.01.2010
Адрес: Львов
Сообщений: 238
Репутация: 125
111 165
3 2
 
07.05.2013 01:12 #2
А Вы уверены, что симулятор Вас не обманывает? Недавно пробовал посмотреть работу своей схемы (собранной, кстати, и в железе) в Протеусе - и столкнулся с глюками вроде того, что светодиод не зажигается, хотя порт настроен на вывод и нужный его бит устанавливается в 1. В железе же всё работает... Единственный симулятор, которому, на мой взгляд, можно доверять, это MPLab Sim. Я лично им и пользуюсь при возникновении подобных "загадочных" ситуаций. Но программа должна быть написана на Ассемблере.
Оценка
Вслед за сериями на DIN-рейку DDRH-60/120/240 и на шасси RSDH-150/300 компания MEAN WELL выпустила новые маломощные DC/DC-преобразователи DDRH-15/30/45 со сверхшироким входным напряжением 150…1500 В, и монтажом не только на DIN-рейку, но и печатную плату или винтовым соединением. Все преобразователи семейства DDRH и RSDH работают при температурах -40…80°C и обладают высокой изоляцией 4000 В AC между входом и выходом, что обеспечивает надежную защиту. Они подходят для использования на высоте до 5000 м и сертифицированы по стандарту IEC62109-1 для фотоэлектрических систем. Преобразователи DDRH/RSDH есть в наличии и под заказ.
Новичок
 
Регистрация: 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 тоже есть с ошибкой.
Нарисуйте в протеусе, для проверки.

Есть же в микросях встроеная функция обработки нажатия кнопки с функцией антидребезга, воспользуйтес ею. Антидребезг у вас не обрабатывается.
Оценка
В последние годы растёт спрос на источники питания для промышленной автоматизации в связи с увеличением инфраструктурных проектов, требующих надёжного электропитания. Источники питания на DIN-рейку MEAN WELL обладают высокой эффективностью, надёжностью и безопасностью, обеспечивая стабильное выходное напряжение. Большой ассортимент в наличии позволяет выбрать подходящий ИП MW на DIN-рейку для решения любой задачи электропитания.
Новичок
 
Регистрация: 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 код Выкл.

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