簡體   English   中英

microC嵌入式系統中的一些錯誤

[英]some errors in microC embedded system

我們有一個項目,我們完成了60%的程序,但是我們遇到了2個問題。我們的第一個問題是使發動機冷卻5秒鍾,然后應加熱10秒鍾,然后應該停止運轉,因為它不再起作用,除非我在再次切換

這是我們的項目:-

開關0控制轎廂的運行(0空運行)(1轎廂正在運行)

開關1用於安全帶:我們完成了這一部分

開關2用於門:我們完成了這一部分

在這一部分中,我們做到了,但是問題只應該完成1次! 但是因為我們有一個while循環永遠不會停止! 所以我們應該怎么做?

在汽車運行期間,發動機將需要15秒鍾加熱:開始時–>“ HH”將顯示在LCD上,應用板上的LED指示燈將亮起,同時電動機將向前運行冷卻5秒鍾。 這樣“ HN”將顯示在LCD上。此后,發動機將需要10秒鍾加熱。

這是我們不能解決的第二個問題! 我們考慮在另一個循環內的一個循環內創建一個循環,但它不起作用,我們也嘗試通過計時器在另一個循環內進行! 我們應該通過定時器或中斷來做到,我們不能使用延遲

我們將有4個LED代表燃油水平。 每10秒一個指示燈將關閉。 當最后一個LED仍然存在時,將出現警告:(1)LCD的第2行將顯示“ FL”。 如果開關3接通,燃油將充滿,否則汽車將關閉。

這是我們的代碼!

sbit LCD_RS at RA1_bit;
sbit LCD_RW at RA2_bit;
sbit LCD_EN at RA3_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 TRISA1_bit;
sbit LCD_RW_Direction at TRISA2_bit;
sbit LCD_EN_Direction at TRISA3_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;

 int i;
sbit LED0 at RC0_bit;
sbit LED1 at RC1_bit;
sbit LED2 at RC2_bit;
sbit LED4 at RC4_bit;
sbit LED5 at RC5_bit;
sbit LED6 at RC6_bit;
sbit LED7 at RC7_bit;
sbit Switch0 at RB0_bit;
sbit Switch1 at RB1_bit;
sbit Switch2 at RB2_bit;
sbit Switch3 at RB3_bit;
int Num;
 void Move_Delay() {                  // Function used for text moving
  Delay_ms(1000);                     // You can change the moving speed here
}
void main() {

ADCON1 = 0X06;             //a port as ordinary i/o.
TRISA=0X00;                //a port as output.
TRISD=0X00;                //d port as output.
TRISC=0X00;
TRISB=0X0F;
PORTC = 0b00000000;
OPTION_REG = 0xD2;


Num = 0; //clear the number of overflows
   OPTION_REG = 0x82; //Timer, Internal cycle clock (Fosc/4)
    //Prescaler is assigned to the TMR0 timer/counter
    //Prescaler (1:128) is assigned to the timer TMR0
   TMR0 = 56; //Timer T0 counts from 39 to 255
         INTCON.T0IF=0;

Lcd_Init();                           // Initialize LCD
Delay_ms(200);
Lcd_Cmd(_LCD_CLEAR);                // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF);

LED0 = 0;
LED1= 0;

do {


if (Switch0)
  {
     Delay_ms(200); // pause 20 mS




if(INTCON.T0IF) //check for TMR0 register overflow
          {
          Num ++; // overflow causes Num to be incremented by 1
          TMR0 = 56; // TMR0 returns to its initial value
          INTCON.T0IF = 0 ; // Bit T0IF is cleared
                 Lcd_Cmd(_LCD_CLEAR);
           Lcd_Out(1,2,"cooling");

          }
          if(Num ==108)
          {
                  Lcd_Cmd(_LCD_CLEAR);
                LED0=~LED0;
                Lcd_Out(1,2,"heater ");
                Delay_ms(1000);

          }



  }
  else
Lcd_Cmd(_LCD_CLEAR);

         if (switch1)
         {
           Delay_ms(20); // pause 20 mS


                    Lcd_Out(2,1,"BO");
                    LED1=0;

          }
          else
          {
              if(INTCON.T0IF) //check for TMR0 register overflow
                  {
                  Num ++; // overflow causes Num to be incremented by 1
                  TMR0 = 39; // TMR0 returns to its initial value
                  INTCON.T0IF = 0 ; // Bit T0IF is cleared

                  /*Lcd_Cmd(_LCD_CLEAR);*/
                        Lcd_Out(2,1,"BF ");
                        LED1=~LED1;
                  }
                  if(Num == 108)
                  { //after 108 overflows
                          Num = 0;
                  }
           }
           if (switch2)
         {

                    Lcd_Out(2,5,"DO");
                    LED2=0;

          }
          else
          {
              if(INTCON.T0IF) //check for TMR0 register overflow
                  {
                  Num ++; // overflow causes Num to be incremented by 1
                  TMR0 = 39; // TMR0 returns to its initial value
                  INTCON.T0IF = 0 ; // Bit T0IF is cleared

                       /*Lcd_Cmd(_LCD_CLEAR);*/
                        Lcd_Out(2,5,"DF");
                        LED2=~LED2;
                  }
                  if(Num == 108)
                  { //after 108 overflows
                          Num = 0;
                  }
           }

//這是錯誤的

 if(switch3)
     {
  Delay_ms(500);               // Clear display
  //Lcd_Cmd(_LCD_CURSOR_OFF);           // Cursor off
  Lcd_Out(1,1,"     FFFFFFFFFF");                 // Write text in first row
  Delay_ms(500);
    for(i=0; i<15; i++) {             // Move text to the right 7 times

      Lcd_Cmd(_LCD_SHIFT_RIGHT);
      Move_Delay();
      if(i==14)
        {
            Lcd_Cmd(_LCD_CLEAR);           // Cursor off
            Lcd_Out(1,1,"  warning !!  ");
                Delay_ms(1000);
        }

  }
}





} while(1);

}

抱歉,答案不足夠,請發表評論。

您尚未明確說明兩個問題。 沒有第一個問題的代碼,第一個問題似乎與加熱發動機有關。 關於第二個問題,您只是說“它不起作用”,而沒有說什么。

我還想在您的作品中放一個扳手,並問一下在您的操作階段如果打開門或釋放安全帶會發生什么情況。 有時最好保留一個狀態變量,該變量對於每個值都具有一個位字段,例如“門已關閉”,“安全帶已固定”,“開機”等。

我確實注意到您使用了delay()盡管您說不能。 在現實世界中,過程控制器可以成功使用delay()函數的唯一方法是,如果有其他線程或中斷例程來照顧I / O和調度事件。 任何嵌入式控制器的一個基本功能是在中斷下提供服務的計時器滴答聲,使您可以延遲而不會阻塞其他進程(同一處理程序也可以輪詢和反跳鍵盤和按鈕輸入)。 假設您的常規計時器中斷會遞增一個稱為unsigned ticks的變量。 例如(與您的任務有關):

unsigned mark, elapsed;
int heating = 0;
while (1) {                      // main operational loop
    if (buttonpress) {           // pseudo code
        heating = 1;             // flag stage one of heater
        mark = ticks;            // start a delay
    }

    ...                          // service the fuel usage
    ...                          // check the door
    ...                          // check the seat belt

    if (heating) {
        elapsed = ticks - mark;  // don't directly compare...
        if (elapsed >= 1000) {   // ...because of counter wrap
            ...                  // heater jobs
            heating = 0;         // clear flag
        }
    }
}                                // repeat main loop

可以擴展它以使加熱器過程分為幾個階段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM