Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

MiKroC Прерывания и дисплей 16х2, ошибка

Непрочитано 02.03.2013, 22:48  
feo
Временная регистрация
 
Регистрация: 30.03.2005
Адрес: Нижний Новгород
Сообщений: 75
Сказал спасибо: 29
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
feo на пути к лучшему
Вопрос MiKroC Прерывания и дисплей 16х2, ошибка

Господа, требуется Ваша помощь!

Который день бьюсь над программой, никак не получается заставить ее работать.
Программа для PIC16F876 считает импульсы от таймера, каждые несколько мс прерывается и заносит насчитанные показания в переменные. Далее отображает эти показания и некое значение высчитанное по формуле.
Проблема в том, что стоит поставить INTCON.GIE=1, как информация на дисплее перестает обновляться. Пробовал перед всеми функциями работы дисплея ставить INTCON=0, потом после обработки дисплея снова INTCON=0xC0. Не помогает, т.е. пока регистр не трогаю, на дисплее все отображается, но стоит хоть раз разрешить прерывание и обновить дисплей не получается. Ниже листинг, мои варианты размещения INTCON в комментариях.
Где-то, видимо, простейшую ошибку допустил...
Пробовал в дебаг жиме ее скомпилировать и посмотреть значения регистров, стоит INTCON=0xc0 поставить - пишет "Not enough RAM for call stack", хотя по проект вьюверу показано, что не более 40-50% ресурсов МК потрачено.

Код:
unsigned short freq=0; i[10]; i2[10]; //переменная частоты, вольтаж и 2 массива для хранения результатов
int t=0, j=0, t1=0, sum=0, avg_i=0, avg_i2=0, t2=0, i3, i1=0, j1=6,c3=0; // t и t1-для прохода по массиву, h-заглушка
bit timer;  // переключаемся между счетчиками
float volt=0;
unsigned int bak[40],c2=0, sobr_znachenie=0;
unsigned short v2,k1,k,ml_bait=0, st_bait=0,a=105;

/* Start Функция отображения кубиков процесса тарировки датчика*/
const unsigned short polosa1[]={0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10};   // Code for char num #0
const unsigned short polosa2[]={0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18};   // Code for char num #1
const unsigned short polosa3[]={0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c};   // Code for char num #2
const unsigned short polosa4[]={0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e};   // Code for char num #3
const unsigned short polosa5[]={0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f};   // Code for char num #4
const unsigned short strela_right[]={0x08, 0x0C, 0x06, 0x1F, 0x1F, 0x06, 0x0C, 0x08};   // Code for char num #3
const unsigned short strela_left[]={0x02, 0x06, 0x0C, 0x1F, 0x1F, 0x0C, 0x06, 0x02};   // Code for char num #3

// Lcd module connections
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;
// End Lcd module connections
char txt1[13], txt7[4], txt8[4];
char txt2[13];
char txt3[6], sobr_znachenie_txt[7];
char txt4[13];
char txt5[]="V_bat=";
char txt6[]="C2=";

  void load_char()   // Функция отображения процесс-бара тарировки
{
int i4;
LCD_Cmd(64);
for(i4=0;i4‹=7;i4++) LCD_Chr_Cp(polosa1[i4]);
LCD_Cmd(72);
for(i4=0;i4‹=7;i4++) LCD_Chr_Cp(polosa2[i4]);
LCD_Cmd(80);
for(i4=0;i4‹=7;i4++) LCD_Chr_Cp(polosa3[i4]);
LCD_Cmd(88);
for(i4=0;i4‹=7;i4++) LCD_Chr_Cp(polosa4[i4]);
LCD_Cmd(96);
for(i4=0;i4‹=7;i4++) LCD_Chr_Cp(polosa5[i4]);
LCD_Cmd(104);
for(i4=0;i4‹=7;i4++) LCD_Chr_Cp(strela_right[i4]);
LCD_Cmd(112);
for(i4=0;i4‹=7;i4++) LCD_Chr_Cp(strela_left[i4]);
 }

 void  Zapis_eeprom_tarirovka(unsigned short k){      // Функция записи данных в ипром
  /*пересылаем данные в ипром старт */
  st_bait=c2››8;
  ml_bait=c2;
 I2C1_Init(100000); //инициалицация шины для работы с ипром
  I2C1_Start();
  I2C1_Wr(0xA2);
  I2C1_Wr(2*k+2);
  I2C1_Wr(ml_bait);
  I2C1_Stop();  // Выдать комбинацию STOP
  Delay_ms(100);
  I2C1_Start();
  I2C1_Wr(0xA2);
  I2C1_Wr(2*k+3);
  I2C1_Wr(st_bait);
  I2C1_Stop();  // Выдать комбинацию STOP
  Delay_ms(100);

  I2C1_Start();
  I2C1_Wr(0xA2);
  I2C1_Wr(2*k+2);
  I2C1_Repeated_Start();
  I2C1_Wr(0xA3);
  ml_bait=I2C1_Rd(0u);
  I2C1_Stop();

  Delay_ms(200);

  I2C1_Start();
  I2C1_Wr(0xA2);
  I2C1_Wr(2*k+3);
  I2C1_Repeated_Start();
  I2C1_Wr(0xA3);
  st_bait=I2C1_Rd(0u);
  I2C1_Stop();

sobr_znachenie=(st_bait‹‹8)+ml_bait;
IntToStr(sobr_znachenie,sobr_znachenie_txt);
Lcd_Out(1,10,sobr_znachenie_txt);
Delay_ms(2000);
Lcd_Out(1,10,"rabotaet");
 Delay_ms(2000);
 Lcd_Out(1,10,"       ");
  }
  
/* Stop Функция отображения кубиков процесса тарировки датчика*/

void InitTimer2(){    //функция таймера
T2CON=0x4E;
PR2=250;
TMR2IE_bit=1;
//INTCON=0xc0;
//INTCON=0xC0;
}
void delay2S(){                                    // 2 seconds delay function
  Delay_ms(1000);
}
void interrupt(){      // обработка прерывания

if (TMR2IF_bit){  // проверка бита переполнения таймера

TMR2IF_bit = 0;
if (t1›0){    // обработка только на каждое второе прерывание
TMR2ON_bit=0;
T1CON.B0=0;  // stop счетчика по внешнему тактируемому сигналу
freq=((TMR1H‹‹8)+TMR1L);    //заносим показания насчитанные счетчиком
if (t‹10){
i[t]=freq;  // массивы данных из которых будем формировать среднее
i2[t]=TMR0;  // массивы данных из которых будем формировать среднее
t++;
sum=0;
for (t2=0;t2‹10;t2++){
sum=sum+i[t2];
}
avg_i=sum/10;  // первое среднее значение
sum=0;
t2=0;
for (t2=0;t2‹10;t2++){
sum=sum+i2[t2];
}
avg_i2=sum/10;     // второе среднее значение
sum=0;
}
else {
t=0;
}


freq=0;  //  зануляем переменные для нового счета
TMR1L=0;
TMR1H=0;
TMR2IF_bit = 0;
T1CON.B0=1;  // старт счетчика по внешнему тактируемому сигналу
TMR0=0;
TMR2ON_bit=1;
t1=0;
}
else{t1++;}
}
}

void main() {
TRISC.RC1=1; // RC1- настраиваем как вход
PORTC.RC1=0; // Значение на входе 0
PORTC.RC2=0; // Значение на входе 0
TMR1L=0;
TMR1H=0;
ADRESL=0;
/*START работа модуля АЦП измеряем напряжение*/
ADCON1=0b00000100; //RA3,1,0 - аналоговые входы
ADCON0=0b11011001; // конфигурируем под RA3
/*STOP работа модуля АЦП измеряем напряжение*/
 Lcd_Init();                        // Initialize Lcd
 LCD_Cmd(_LCD_RETURN_HOME);
 Lcd_Cmd(_LCD_CLEAR);               // Clear display
 Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
 Load_char();
 //
T1CON=0b00010111;  // старт счетчика по внешнему тактируемому сигналу
InitTimer2();
TMR0=0;
OPTION_REG=0b00100000;
TRISB = 0;                        // Configure PORTB pins as digital
//
delay_ms(2000);
while(1){
TMR2IE_bit=0;
T2CON=0x74;
PR2=250;
//INTCON=0x00;

 Lcd_Init();                        // Initialize Lcd
 LCD_Cmd(_LCD_RETURN_HOME);
 Lcd_Cmd(_LCD_CLEAR);               // Clear display
 Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
//ADCON0=0b11011101;  // бит старта преобразования
//Delay_ms(100);
//volt=((ADRESH‹‹8)+ADRESL)/13240.7;    //заносим показания насчитанные счетчиком
//ADCON0=0b11011001; // конфигурируем под RA3
Delay_ms(1000);

c2=(avg_i2*50.4)/avg_i; // c2 - емкость эталонного конденсатора = 50,4 pf
IntToStr(avg_i2,txt1); //выводим первое среднее значение
Lcd_Out(1,1,txt1);
IntToStr(avg_i,txt2);// выводим второе среднее значение
Lcd_Out(1,10,txt2);
Delay_ms(2000);
IntToStr(c2,txt3);
Lcd_Out(2,1,txt3);
Lcd_Out(2,1,txt6);
Delay_ms(200);
// пробуем тарировку сюды поставить
if(portc.rc1==1){         // Нажали кнопку, начали процесс тарировки бака.
  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);
  LCD_out(1,2,"Tarirovka baka");
  LCD_out(2,1,"1of2");
  LCD_chr(2,5,5);
  LCD_chr(2,16,6);
  Delay_ms(3000);
  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);
for(k=0;k‹99;k++){        // основной цикл тарировки по шагам 1
  k1=((1+k)*2)/10;
  v2=((1+k)*2)%10;
  byteToStr(v2,txt8);
  byteToStr(k1,txt7);
  LCD_out(1,3,txt8);
  LCD_out(1,1,txt7);
  LCD_out(1,4,".");
  LCD_out(1,7,"Lt=");
  LCD_out(2,1,"1of2");
  LCD_chr(2,5,5);
  LCD_chr(2,16,6);
  LCD_out(1,12,"     ");
   a:
   Delay_ms(1000);
if (portc.rc5==1){
  c2=(avg_i2*50.4*100)/avg_i; // c2 - емкость эталонного конденсатора = 50,4 pf *100 для получения нужной точности датчика.
  //пишем данные тарировки в ипром
  Zapis_eeprom_tarirovka(k);
LCD_chr(2,j1,i1);
  i1++;
  if (i1›4) {
         i1=0;
         j1++;}
    if(j1›15){
         j1=6;
         i1=0;
         LCD_out(2,1,"2of2");
          }
  }
 if (portc.rc5==0) {goto a;}
  Delay_ms(1000);
  }
}
/*Стартуем счетчик снова*/
freq=0;  //  зануляем переменные для нового счета
TMR1L=0;
TMR1H=0;
TMR2IF_bit = 0;
T1CON.B0=1;  // старт счетчика по внешнему тактируемому сигналу
TMR0=0;
TMR2ON_bit=1;
t1=0;
/*Стартуем счетчик снова*/
T2CON=0x4E;
PR2=250;
TMR2IE_bit=1;
//INTCON=0xC0;
Delay_ms(2000);
}
 }
Надеюсь на советы, спасибо!!!
Реклама:
feo вне форума  
Непрочитано 03.03.2013, 00:17  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: MiKroC Прерывания и дисплей 16х2, ошибка

Сообщение от feo Посмотреть сообщение
пишет "Not enough RAM for call stack", хотя по проект вьюверу показано, что не более 40-50% ресурсов МК потрачено.
А причем здесь ресурсы ? Вы полагаете что Data memory переполнилась ?
У вас стек забивает.
Обычно когда в этом вашем микроС вызывают в прерывании его дебильные встроенные функции из таких же либ ...
В прерывании не надо ничего вычислять, чем меньше там копошимся тем лучше.
Выставил флаг, инкрементировал сетчик и смылся...
__________________
Осторожно , злой кот

Последний раз редактировалось dosikus; 03.03.2013 в 00:20.
dosikus вне форума  
Сказали "Спасибо" dosikus
feo (03.03.2013)
Непрочитано 03.03.2013, 00:40  
feo
Временная регистрация
 
Регистрация: 30.03.2005
Адрес: Нижний Новгород
Сообщений: 75
Сказал спасибо: 29
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
feo на пути к лучшему
По умолчанию Re: MiKroC Прерывания и дисплей 16х2, ошибка

Спасибо за комментарий!
Мои знания пока не позволяют мне утверждать о переполнении. Факт в том, что стоит тронуть INTCON и разрешить в нем прерывание (GIE=1), как дисплейчик отваливается и не обновляется. Потом INTCON=0 уже не помогает.
Причем если, например закомментировать If (PORTC.RCO==1), то предыдущие команды вывода на дисплей отображаться будут корректно.
Как будто предывание налагает ограничение на длину основного участка программы и на количество команд вывода на монитор...
feo вне форума  
Непрочитано 03.03.2013, 00:46  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: MiKroC Прерывания и дисплей 16х2, ошибка

Какая версия компилятора? Там два ведра глюков имеется.
Easyrider83 вне форума  
Непрочитано 03.03.2013, 00:57  
feo
Временная регистрация
 
Регистрация: 30.03.2005
Адрес: Нижний Новгород
Сообщений: 75
Сказал спасибо: 29
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
feo на пути к лучшему
По умолчанию Re: MiKroC Прерывания и дисплей 16х2, ошибка

Версия компилятора 5.4.0

Сейчас по совету dosikus закомментировал строки в теле прерывания:
Код:
avg_i=sum/10;  // первое среднее значение
sum=0;
Код:
avg_i2=sum/10;     // второе среднее значение
sum=0;
И мониторчик заработал.
Чудеса какие-то.
feo вне форума  
Непрочитано 03.03.2013, 10:10  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: MiKroC Прерывания и дисплей 16х2, ошибка

Сообщение от feo Посмотреть сообщение
Чудеса какие-то.
Никаких чудес . Что мат операции, что индексное чтение -sum=sum+i2[t2];
Активно юзают стек , ибо реализованы функциями вызывающими функции.

И еще раз - перерабатывайте идеологию программы , в прерывании минимум действий .
__________________
Осторожно , злой кот
dosikus вне форума  
Сказали "Спасибо" dosikus
feo (03.03.2013)
 

Метки
intcon, mikroc
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Правильная инициализация ЖК 16х2 angelborn Микроконтроллеры, АЦП, память и т.д 33 26.01.2013 12:56
Вопрос по библиотекам HI-TECH PICC для подключения LCD 44780 16х2 к PIC 3ann Embedd С 9 20.12.2012 16:46
Ошибка компиляции mikroC PRO for PIC v4.60 O_kazus Микроконтроллеры, АЦП, память и т.д 3 31.01.2011 20:20
Индикатор 16х2 "OPVO" V0020380 rev.A Evg_55 Информация по радиокомпонентам 0 03.07.2010 13:06
Ошибка Proteus при отмене прерывания в AVR E97 Proteus 6 08.06.2010 12:24


Часовой пояс GMT +4, время: 09:03.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.