HRP-N3 - серия источников питания с максимальной пиковой мощностью в 350% от MEAN WELL

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

Новичок
 
Регистрация: 05.12.2012
Сообщений: 10
Репутация: 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
Адрес: Львов
Сообщений: 193
Репутация: 79
64 123
0 0
 
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
Сообщений: 10
Репутация: 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, время: 15:54.
Обратная связь РадиоЛоцман Вверх