เขียนโปรแกรมไมโครคอนโทรลเลอร์ PIC ด้วย CCS แล้วหน่วยความจำเต็ม มันขึ้น error ว่า
out of rom a segment or the program is too large Set_Feed_Time โค้ดของผมค่อนข้างยาวฟังก์ชั่น Set_Feed_Time() ที่ผมเขียนเป็นแบบนี้ครับ
/************* Set Feed Time **************/
void Set_Feed_Time(){
int i;
lcd_gotoxy(1,1);
printf(lcd_putc,"\r Set Feed Time ");
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"[Next] [OK]");
delay_ms(50);
while(1){
if(input(PIN_B3)==0){
delay_ms(500);
lcd_gotoxy(1,2);
printf(lcd_putc,"\r F1 : -- : -- ");
delay_ms(50);
for(i=0;i<5;i++){ // count feed time
feed_time(i);
delay_ms(50);
}
if(t_feed.hr!=25){
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"\r Next : d:d " ,t_feed.hr,t_feed.min);
delay_ms(50);
}else{
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"\r ");
delay_ms(50);
}
break;
}
if(!input(PIN_B0)){
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"\r ");
delay_ms(50);
break;
}
}
delay_ms(250);
}
/**************************************/
int16 next_time(int16 hr, int16 min, int pos){
int32 minimVal;
int i=0,check;
int16 now_all;
int32 all[5],t;
int16 hrk[5],mnk[5];
int n,j;
hrk[pos] = hr;
mnk[pos] = min;
all[pos] =(hrk[pos]*60 + mnk[pos]) ;
//minimVal2 = (hrk[0]*60) + mnk[0];
now_all = getNow();
//printf("\r\n pos=%d, n=%ld, ",pos,all[pos]);
n = sizeof(all)/sizeof(all[0]);
/* bubble sort */
for (i = pos; i > 0; i--) {
for (j = 0; j < i; j++) { /* move max (in [0] to [i]) to last ([i]) */
if (all[j] > all[j+1]) { /* exchange if bigger than next */
t = all[j];
all[j] = all[j+1];
all[j+1] = t; } } }
minimVal= all[0];
for (i = 0; i < pos+1; i++) {
//printf("\r\n%ld ", all[i]);
if(all[i]>now_all){
if(all[i]!=1500){
minimVal= all[i];
break;
}
}
}
return minimVal;
}
/************* feed time **************/
void feed_time(int count){
int hr[5],min[5];
int16 next;
while(1){
if(input(PIN_B1)==0){
delay_ms(150);
set_hr++;
if(set_hr>24){
set_hr=0;
set_min= 0;
}
if(set_hr==24){
set_min=60;
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"\r F%d : -- : -- ",count+1);
delay_ms(50);
}else{
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"\r F%d : d : d ", count+1, set_hr,set_min);
delay_ms(50);
}
}else if(input(PIN_B2)==0){
delay_ms(150);
set_min++;
if(set_min>=60){
set_min=0;
}
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"\r F%d : d : d " count+1, set_hr,set_min);
delay_ms(50);
}
if(input(PIN_B3)==0){
hr[count] = set_hr;
min[count] = set_min;
if(check_time(hr,set_hr,min,set_min,count)){
delay_ms(50);
lcd_gotoxy(1,1);
//printf(lcd_putc,"\rn=%d ar= %d,va= %d" ,count, set_hr,set_min);
printf(lcd_putc,"\r This is same. ");
delay_ms(50);
}
else{
next= next_time(hr[count],min[count],count);
t_feed.hr=next/60;
t_feed.min=next%60;
/*lcd_gotoxy(1,1);
printf(lcd_putc,"\r hr =%d , min=%d " ,t_feed.hr,t_feed.min);
delay_ms(500); */
if(set_hr==24){
delay_ms(50);
lcd_gotoxy(1,1);
printf(lcd_putc,"\r F%d : -- : -- ",count+1);
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"\r ");
delay_ms(50);
if((count+2)!=6){
lcd_gotoxy(1,2);
printf(lcd_putc,"\r F%d : -- : -- ",count+2);
delay_ms(50);
}
}else{
delay_ms(50);
lcd_gotoxy(1,1);
printf(lcd_putc,"\r F%d : d : d " count+1, set_hr,set_min);
delay_ms(50);
if((count+2)!=6){
lcd_gotoxy(1,2);
printf(lcd_putc,"\r F%d : d : d ",count+2,set_hr,set_min);
delay_ms(50);
}
}
break;
}
}
} // while hr
}
ผมไม่รู้จะแก้ยังไงครับลองหลายวิธีแล้วทั้งแยกเป็นฟังก์ชั่นย่อยทั้งลบโค้ดหน่วงเวลาออก แต่ยังไม่หายครับ ซึ่งผมคิดว่าอาจจะต้องเพิ่มไมโครคอนโทรลเลอร์อีกตัวนึง แต่การทำงานแต่ละฟังก์ชั่นของโปรแกรมจะต้องแสดงผลทาง LCD module ด้วย ไม่รู้จะต่อไมโครคอนโทรลเลอร์สองตัวเข้า LCD ตัวเดียวได้มั๊ย ถ้าให้ตัวเดิมแสดงผลเยอะๆมั๊ยก็ error เหมือนเดิมอีก พอจะมีวิธีแก้ยังไงได้บ้างครับ
เขียนโปรแกรมไมโครคอนโทรลเลอร์ PIC ด้วย CCS แล้วหน่วยความจำเต็ม แก้ยังไงได้บ้างครับ
/************* Set Feed Time **************/
void Set_Feed_Time(){
int i;
lcd_gotoxy(1,1);
printf(lcd_putc,"\r Set Feed Time ");
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"[Next] [OK]");
delay_ms(50);
while(1){
if(input(PIN_B3)==0){
delay_ms(500);
lcd_gotoxy(1,2);
printf(lcd_putc,"\r F1 : -- : -- ");
delay_ms(50);
for(i=0;i<5;i++){ // count feed time
feed_time(i);
delay_ms(50);
}
if(t_feed.hr!=25){
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"\r Next : d:d " ,t_feed.hr,t_feed.min);
delay_ms(50);
}else{
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"\r ");
delay_ms(50);
}
break;
}
if(!input(PIN_B0)){
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"\r ");
delay_ms(50);
break;
}
}
delay_ms(250);
}
/**************************************/
int16 next_time(int16 hr, int16 min, int pos){
int32 minimVal;
int i=0,check;
int16 now_all;
int32 all[5],t;
int16 hrk[5],mnk[5];
int n,j;
hrk[pos] = hr;
mnk[pos] = min;
all[pos] =(hrk[pos]*60 + mnk[pos]) ;
//minimVal2 = (hrk[0]*60) + mnk[0];
now_all = getNow();
//printf("\r\n pos=%d, n=%ld, ",pos,all[pos]);
n = sizeof(all)/sizeof(all[0]);
/* bubble sort */
for (i = pos; i > 0; i--) {
for (j = 0; j < i; j++) { /* move max (in [0] to [i]) to last ([i]) */
if (all[j] > all[j+1]) { /* exchange if bigger than next */
t = all[j];
all[j] = all[j+1];
all[j+1] = t; } } }
minimVal= all[0];
for (i = 0; i < pos+1; i++) {
//printf("\r\n%ld ", all[i]);
if(all[i]>now_all){
if(all[i]!=1500){
minimVal= all[i];
break;
}
}
}
return minimVal;
}
/************* feed time **************/
void feed_time(int count){
int hr[5],min[5];
int16 next;
while(1){
if(input(PIN_B1)==0){
delay_ms(150);
set_hr++;
if(set_hr>24){
set_hr=0;
set_min= 0;
}
if(set_hr==24){
set_min=60;
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"\r F%d : -- : -- ",count+1);
delay_ms(50);
}else{
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"\r F%d : d : d ", count+1, set_hr,set_min);
delay_ms(50);
}
}else if(input(PIN_B2)==0){
delay_ms(150);
set_min++;
if(set_min>=60){
set_min=0;
}
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"\r F%d : d : d " count+1, set_hr,set_min);
delay_ms(50);
}
if(input(PIN_B3)==0){
hr[count] = set_hr;
min[count] = set_min;
if(check_time(hr,set_hr,min,set_min,count)){
delay_ms(50);
lcd_gotoxy(1,1);
//printf(lcd_putc,"\rn=%d ar= %d,va= %d" ,count, set_hr,set_min);
printf(lcd_putc,"\r This is same. ");
delay_ms(50);
}
else{
next= next_time(hr[count],min[count],count);
t_feed.hr=next/60;
t_feed.min=next%60;
/*lcd_gotoxy(1,1);
printf(lcd_putc,"\r hr =%d , min=%d " ,t_feed.hr,t_feed.min);
delay_ms(500); */
if(set_hr==24){
delay_ms(50);
lcd_gotoxy(1,1);
printf(lcd_putc,"\r F%d : -- : -- ",count+1);
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"\r ");
delay_ms(50);
if((count+2)!=6){
lcd_gotoxy(1,2);
printf(lcd_putc,"\r F%d : -- : -- ",count+2);
delay_ms(50);
}
}else{
delay_ms(50);
lcd_gotoxy(1,1);
printf(lcd_putc,"\r F%d : d : d " count+1, set_hr,set_min);
delay_ms(50);
if((count+2)!=6){
lcd_gotoxy(1,2);
printf(lcd_putc,"\r F%d : d : d ",count+2,set_hr,set_min);
delay_ms(50);
}
}
break;
}
}
} // while hr
}
ผมไม่รู้จะแก้ยังไงครับลองหลายวิธีแล้วทั้งแยกเป็นฟังก์ชั่นย่อยทั้งลบโค้ดหน่วงเวลาออก แต่ยังไม่หายครับ ซึ่งผมคิดว่าอาจจะต้องเพิ่มไมโครคอนโทรลเลอร์อีกตัวนึง แต่การทำงานแต่ละฟังก์ชั่นของโปรแกรมจะต้องแสดงผลทาง LCD module ด้วย ไม่รู้จะต่อไมโครคอนโทรลเลอร์สองตัวเข้า LCD ตัวเดียวได้มั๊ย ถ้าให้ตัวเดิมแสดงผลเยอะๆมั๊ยก็ error เหมือนเดิมอีก พอจะมีวิธีแก้ยังไงได้บ้างครับ