Описание:
Я попытался создать схему, используя микроконтроллер PIC18F4550 и язык программирования MikroC.Это моя последовательность программ.
- Можно выбрать 20 расписаний, и у каждого расписания есть 6 значений времени.
- Этот номер расписания хранится в первой памяти EEPROM и других данных времени от 10 до 129 памяти EEPROM.(6 значений времени x 20 расписаний и запускается из 10 памяти)
- Пользователь может выбрать одно из расписаний и редактировать время каждого расписания.
- Когда пользователь выбирает расписание, значения этих времен для задержки выходов.
- Данные отображаются на ЖК-дисплее
- Имеет 6 входов.(Настройки (B1), Вверх (B2), Вниз (B3), Ввод (B4), Сброс (B5), Тест (B6), Близость (B7)
Я просто добавляю это только для понимания кода.
Код:
Это моя программа для этой последовательности на языке MikroC. Еще не законченаit.
// LCD module connections
sbit LCD_RS at RD0_bit;
sbit LCD_EN at RD1_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD0_bit;
sbit LCD_EN_Direction at TRISD1_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module connections
unsigned short shedno=0,i=0,shedc=0,streg,lsreg,rang,x,ed,edi;
unsigned count=0,reg1, reg2, reg3, reg4, reg5, reg6,sttime=1000,editno1=0,editno2=0,editno3=0,editno4=0,editno5=0,editno6=0;
char shednon[4]="",countn[6]="",stregn[4]="",lsregn[4]="",regval[6]="",ntrel1[6]="",ntrel2[6]="",ntrel3[6]="",ntrel4[6]="",ntrel5[6]="",ntrel6[6]="";
void findshed(short sno){
shedno = EEPROM_Read(0x00);
shedno = 256 - shedno;
shedno = shedno + sno;
ByteToStr(shedno, shednon);
streg = 6*shedno+4;
lsreg = streg + 5;
ByteToStr(streg, stregn);
ByteToStr(lsreg, lsregn);
}
void shedrelay(){
rang =0;
for(x=streg; x<=lsreg; x++){
regval[rang] = EEPROM_Read(x);
Delay_ms(100);
if(rang < 6){
rang++;
}
}
reg1 = regval[0]+sttime+editno1;
reg2 = regval[1]+sttime+editno2;
reg3 = regval[2]+sttime+editno3;
reg4 = regval[3]+sttime+editno4;
reg5 = regval[4]+sttime+editno5;
reg6 = regval[5]+sttime+editno6;
Wordtostr(reg1,ntrel1);
Wordtostr(reg2,ntrel2);
Wordtostr(reg3,ntrel3);
Wordtostr(reg4,ntrel4);
Wordtostr(reg5,ntrel5);
Wordtostr(reg6,ntrel6);
}
void shedselectdis(){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Next Shedule: S");
Lcd_Out(1,16,shednon);
Lcd_Out(2,1,"R1:");
Lcd_Out(2,4,ntrel1);
Lcd_Out(2,11,"R2:");
Lcd_Out(2,14,ntrel2);
Lcd_Out(3,1,"R3:");
Lcd_Out(3,4,ntrel3);
Lcd_Out(3,11,"R4:");
Lcd_Out(3,14,ntrel4);
Lcd_Out(4,1,"R5:");
Lcd_Out(4,4,ntrel5);
Lcd_Out(4,11,"R6:");
Lcd_Out(4,14,ntrel6);
}
void editshed(){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"Edit Shedule: S");
Lcd_Out(1,16,shednon);
Lcd_Out(2,1,"R1:");
Lcd_Out(2,4,ntrel1);
Lcd_Out(2,11,"R2:");
Lcd_Out(2,14,ntrel2);
Lcd_Out(3,1,"R3:");
Lcd_Out(3,4,ntrel3);
Lcd_Out(3,11,"R4:");
Lcd_Out(3,14,ntrel4);
Lcd_Out(4,1,"R5:");
Lcd_Out(4,4,ntrel5);
Lcd_Out(4,11,"R6:");
Lcd_Out(4,14,ntrel6);
}
void relayssw(int x1, int x2, int x3, int x4, int x5, int x6){
PORTA = 0b00000001;
VDelay_ms(x1);
PORTA = 0b00000000;
Delay_ms(50);
PORTA = 0b00000010;
VDelay_ms(x2);
PORTA = 0b00000000;
Delay_ms(50);
PORTA = 0b00000100;
VDelay_ms(x3);
PORTA = 0b00000000;
Delay_ms(50);
PORTA = 0b00001000;
VDelay_ms(x4);
PORTA = 0b00000000;
Delay_ms(50);
PORTA = 0b00010000;
VDelay_ms(x5);
PORTA = 0b00000000;
Delay_ms(50);
PORTA = 0b00100000;
VDelay_ms(x6);
PORTA = 0b00000000;
Delay_ms(50);
}
void disval(){
Lcd_Cmd(_LCD_CLEAR);
findshed(0);
Lcd_Out(1,1,"Shedule: S");
Lcd_Out(1,11,shednon);
Lcd_Out(2,1,"Count:");
WordToStr(count, countn);
Lcd_Out(2,1,"Count:");
Lcd_Out(2,8,countn);
Lcd_Out(3,1,"Steps:");
Lcd_Out(4,1,"Temp:");
}
void main() {
TRISA = 0b00000000;
TRISB = 0b11111111;
PORTA = 0b00000000;
ADCON0=0;
ADCON1=0X0F;
CMCON=0X07;
CCP1CON=0;
CCP2CON=0;
SSPCON1=0;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,6,"Welcome !");
Delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR);
disval();
EEPROM_Write(0x00,255);
/*for(i=1;i<131;i++){
EEPROM_Write(i,i);
Delay_ms(50);
}*/
while(1){
if(PORTB.B7 = 1){ //proximity count
Delay_ms(300);
count++;
disval();
}
//
if(PORTB.B5 = 1){ //proximity count reset
Delay_ms(300);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Reset Count?");
WordToStr(count, countn);
Lcd_Out(2,1,countn);
Lcd_Out(3,1,"Press Enter to Reset");
Lcd_Out(4,1,"Press Up to Back");
while(1){
if(PORTB.B4 = 1){ //enter
Delay_ms(300);
count=0;
disval();
break;
}else if(PORTB.B2 = 1){ //up
Delay_ms(300);
disval();
break;
}
}
}
//
if(PORTB.B1 = 1){ //settings
shedc = 0;
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Select Shedule: S");
findshed(0);
Lcd_Out(1,18,shednon);
Lcd_Out(2,1,"Select Set. to Back");
Lcd_Out(3,1,"Select Enter to Edit");
Lcd_Out(4,1,"Select Up or Down");
Lcd_Cmd(_LCD_FIRST_ROW);
for(i=1;i<17;i++){
Lcd_Cmd(_LCD_MOVE_CURSOR_RIGHT);
}
Lcd_Cmd(_LCD_BLINK_CURSOR_ON);
while(1){
if(PORTB.B1 = 1){ //exit
Delay_ms(300);
disval();
Lcd_Cmd(_LCD_CURSOR_OFF);
break;
}else if(PORTB.B2 = 1){ //up button
Delay_ms(300);
if(shedno < 20){
shedc++;
}
findshed(shedc);
Lcd_Out(1,18,shednon);
Lcd_Cmd(_LCD_FIRST_ROW);
for(i=1;i<17;i++){
Lcd_Cmd(_LCD_MOVE_CURSOR_RIGHT);
}
Lcd_Cmd(_LCD_BLINK_CURSOR_ON);
}else if(PORTB.B3 = 1){ //down button
Delay_ms(300);
if(shedno > 1){
shedc--;
}
findshed(shedc);
Lcd_Out(1,18,shednon);
Lcd_Cmd(_LCD_FIRST_ROW);
for(i=1;i<17;i++){
Lcd_Cmd(_LCD_MOVE_CURSOR_RIGHT);
}
Lcd_Cmd(_LCD_BLINK_CURSOR_ON);
}else if(PORTB.B4 = 1){ //enter button
Delay_ms(300);
findshed(shedc);
shedrelay();
editshed();
Lcd_Cmd(_LCD_SECOND_ROW);
Lcd_Cmd(_LCD_BLINK_CURSOR_ON);
editno1 = 0;
editno2 = 0;
editno3 = 0;
editno4 = 0;
editno5 = 0;
editno6 = 0;
while(1){
for(ed = 1; ed < 6; ed++){
while(1){
if(PORTB.B2 == 1){ //up
//Delay_ms(300);
if(ed ==1){
editno1++;
}else if(ed ==2){
editno2++;
}else if(ed ==3){
editno3++;
}else if(ed ==4){
editno4++;
}else if(ed ==5){
editno5++;
}else if(ed ==6){
editno6++;
}
findshed(shedc);
shedrelay();
editshed();
}else if(PORTB.B3 == 1){ //down
//Delay_ms(300);
if(ed ==1){
editno1--;
}else if(ed ==2){
editno2--;
}else if(ed ==3){
editno3--;
}else if(ed ==4){
editno4--;
}else if(ed ==5){
editno5--;
}else if(ed ==6){
editno6--;
}
findshed(shedc);
shedrelay();
editshed();
}else if(PORTB.B4 == 1){ //enter
//------------------------------------------------------------------------
//Delay_ms(300); //POINT A
//------------------------------------------------------------------------
break;
}
}
}
Lcd_Cmd(_LCD_CLEAR);
}
}
}
}
//
if((PORTB.B2 = 1)||(PORTB.B3 = 1)){ //up or down
shedc = 0;
Delay_ms(300);
Lcd_Cmd(_LCD_CLEAR);
findshed(0);
Lcd_Out(1,1,"Runing: S");
Lcd_Out(1,10,shednon);
Lcd_Out(2,1,"Next:");
Lcd_Out(3,1,"Press Up or Down Key");
Lcd_Out(4,1,"Press Reset to Back");
while(1){
if(PORTB.B3 = 1){ //down
Delay_ms(300);
if(shedno > 1){
shedc--;
}
findshed(shedc);
shedrelay();
shedselectdis();
}else if(PORTB.B2 = 1){ //up
Delay_ms(300);
if(shedno < 20){
shedc++;
}
findshed(shedc);
shedrelay();
shedselectdis();
}else if(PORTB.B4 = 1){ //enter
Delay_ms(300);
findshed(shedc);
EEPROM_Write(0x00,256-shedno);
disval();
break;
}else if(PORTB.B6 = 1){ //test
Delay_ms(300);
PORTC = 0b00000000;
Delay_ms(100);
relayssw(reg1, reg2, reg3, reg4, reg5,reg6);
}else if(PORTB.B5 = 1){ //reset
Delay_ms(300);
disval();
break;
}
}
}
//
}
}
Ошибка:
Когда я добавляю еще одну строку к этому коду, например, строку Delay_ms(300);
, тогда моя симуляция Proteus и реальная практика не работаютНо программная память не заполнена в IC . IC is сброс .
Proteus Simulation дает мнеследующее сообщение об ошибке постоянно .
[PIC18 STACK] PC = 0x09BC. Переполнение стека вызывает принудительный сброс устройства. [U1]
Я думаю этоне является ошибкой ограничения вложенных вызовов, поскольку этот код не имеет больше вызовов функций, чем рекомендуемые вызовы функций.
mikroC PRO для PIC ограничивает количество нерекурсивных вложенныхзвонки:
8 звонков для семьи PIC12, 8 звонков для семьи PIC16, 16 звонков для расширенной семьи PIC16.31 вызов для семейства PIC18.
Вопрос:
Как определить точки ошибки в коде и как решить эту проблему?Что такое 0x09BC
балл.
Если вы хотите, чтобы какие-либо другие данные идентифицировали ошибку, сообщите мне.
Это код Proteus и MikroC LINK для загрузки
SimulationПрактическое занятие:
Я сделал следующее практическое занятие, но не могу определить точки ошибки.
Это данные без ошибки переполнения стека в стеке ЦП и в памяти данных ЦП.Хранение памяти данных ЦП в последней ячейке памяти и в средних ячейках памяти свободно.
Это данные с ошибкой переполнения стека в стеке ЦП и данных ЦПОбъем памяти.Хранилище данных ЦП в последней ячейке памяти и в средних ячейках памяти свободно.
Также в стеке ЦП непрерывно изменяется от 31 до 0, и это значение меняется на 0x09BC
.
EEPROM также имеет много свободных областей памяти.