Как определить точки ошибки, когда переполнение стека вызывает ошибку сброса устройства в коде MikroC - PullRequest
0 голосов
/ 27 сентября 2018

Описание:

Я попытался создать схему, используя микроконтроллер 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 сброс .

memo

Proteus Simulation дает мнеследующее сообщение об ошибке постоянно .

[PIC18 STACK] PC = 0x09BC. Переполнение стека вызывает принудительный сброс устройства. [U1]

Я думаю этоне является ошибкой ограничения вложенных вызовов, поскольку этот код не имеет больше вызовов функций, чем рекомендуемые вызовы функций.

mikroC PRO для PIC ограничивает количество нерекурсивных вложенныхзвонки:

8 звонков для семьи PIC12, 8 звонков для семьи PIC16, 16 звонков для расширенной семьи PIC16.31 вызов для семейства PIC18.

Вопрос:

Как определить точки ошибки в коде и как решить эту проблему?Что такое 0x09BC балл.

Если вы хотите, чтобы какие-либо другие данные идентифицировали ошибку, сообщите мне.

Это код Proteus и MikroC LINK для загрузки

SimulationПрактическое занятие:

Я сделал следующее практическое занятие, но не могу определить точки ошибки.

Это данные без ошибки переполнения стека в стеке ЦП и в памяти данных ЦП.Хранение памяти данных ЦП в последней ячейке памяти и в средних ячейках памяти свободно.

without error

Это данные с ошибкой переполнения стека в стеке ЦП и данных ЦПОбъем памяти.Хранилище данных ЦП в последней ячейке памяти и в средних ячейках памяти свободно.

Также в стеке ЦП непрерывно изменяется от 31 до 0, и это значение меняется на 0x09BC.

with error

EEPROM также имеет много свободных областей памяти.

memory

...