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

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

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

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

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

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


 
Опции темы
Непрочитано 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
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
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,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
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
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
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, время: 16:24.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot