cảnh báo trong MPLAP

vd2020

Trứng gà
cho em hỏi vì sao có cảnh báo này và nó có ảnh hưởng gì tới chương trình chạy không :
Code:
Warning [1393] D:\......_main.c; 106. possible hardware stack overflow detected, estimated stack depth: 9
 
chắc có lẽ em khai báo biến sao đó nó kêu có thể tràn stack thôi. nhưng không sao đâu nó cũng không ảnh hưởng nhiều đến chương trình đâu.
 

tungbk

Cố Vấn CLB
Staff member
E có dùng ngắt không ? Cái lỗi này thường là do viết trong chương trình ngắt quá dài dẫn đến tràn vùng ngắt hoặc gọi các chương trình con lồng nhau trong ngắt quá nhiều. Cái này tuy nó báo build thành công nhưng khi chạy có thể gây ra những lỗi bất ngờ. Tốt nhất là tối ưu code lại cho đảm bảo đi.
 

vd2020

Trứng gà
code này đây, coi lại giùm em nha :D
/****************************************************************
* Description : ket noi bien tro voi chan RA3 de chuyen doi ADC :
* RA3 < 2.5v thi RB0 = 1
* RA3 > 2.5v thi RB0 = 0
* hien thi dien ap len LCD
* Tool : HI-TECH PIC
* Chip : 16F887
****************************************************************/

#include <htc.h>
#include "lcd.h"
__CONFIG(XT & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN
& IESODIS & FCMDIS & LVPDIS & DEBUGDIS);
__CONFIG(BORV21);

#define _XTAL_FREQ 4000000

/****************************************************************/
void port_init()
{
ANSEL = 0x08; //user ADC channel AN3
ANSELH = 0; //AN8 - 13 la digital
TRISA3 = 1; //RA3 la input
TRISB0 = 0; //RB0 là output
RB0 = 1;
}

/****************************************************************/
void ADC_init()
{
// ADC convertion clock = Fosc/8
ADCS1 = 0;
ADCS0 = 1;
// voltage referent : internal Vref
VCFG1 = 0;
VCFG0 = 0;
// select input channel : AN3
CHS3 = 0;
CHS2 = 0;
CHS1 = 1;
CHS0 = 1;
// result format : right
ADFM = 1;
// turn on ADC module
ADON = 1;
// delay to wait for ADC module init
__delay_ms (1);
}

/***************************************************************/
// interrupt initialization
void ini_init()
{
GIE = 1; // NGAT TOAN CUC
PEIE = 1; // NGAT NGOAI VI
ADIE = 1; // NGAT ADC
ADIF = 0; // XOA CO NGAT ADC
}

//----------------------------------------------------------------
// chuyen so de hien thi
void ADC_lcd(long i)
{
char a, b, c, d;
// tach hang ngan, tram, chuc, don vi
a = i / 1000;
b = (i - 1000*a)/ 100;
c = (i - 1000*a - 100*b)/ 10;
d = i - 1000*a - 100*b - 10*c;
//HIEN THI LEN LCD
lcd_puts("Vin = ");
lcd_gotoxy(7,0);
lcd_putc(a + 0x30);
lcd_puts(".");
lcd_putc(b + 0x30);
lcd_putc(c + 0x30);
lcd_putc(d + 0x30);
lcd_puts(" V");
unsigned char j=0;
for(;j<10;j++) __delay_ms(100);
}

/****************************************************************/
// interrup service rountine (thu tuc ngat)

void interrupt sir()
{
long ADC_result;
if (PEIE && ADIE && ADIF)
{
ADIF= 0;
//READ ADC RESULT
ADC_result = (ADRESH<<8)| ADRESL; //=ADRESH*256+ADRESL;
ADC_result=ADC_result*5*1000/1024;
ADC_lcd(ADC_result);
if (ADC_result > 2500)
{RB0 = 0;}
else {RB0 =1;}
}
}

/****************************************************************/
void main()
{
port_init();
ADC_init();
ini_init();
lcd_init();
while(1)
{
__delay_us(50);
lcd_clear(); //delay between 2 AD conversions
GODONE =1; //set GODONE bit to start conversions
}
}

/****************************************************************
* END OF ADC led main.c
****************************************************************/
 

tungbk

Cố Vấn CLB
Staff member
Chú ý chương trình trong ngắt nên viết ngắn gọn thôi và hạn chế gọi nhiều chương trình con!
Gợi ý cách giải quyết : đưa biến ADC_result thành biến toàn cục; khi nào ngắt convert xong thì bật 1 cờ ví dụ ADC_Flag lên 1. Trong vòng lặp while(1) của main chờ khi có cờ này thì cho hiển thị LCD : ADC_lcd(ADC_result) rồi xóa cờ đi. LCD thì cứ ghi đè giá trị mới lên không cần phải xóa bằng lcd_clear(). Chú ý cho thời gian cập nhật lên lcd khoảng 500ms hay 1s 1 lần để khỏi bị rung chữ trên LCD.
Thử lại nhé ! Chúc thành công.
 
Top