2014-12-13 4 views
0

우리는 프로그램의 60 %를 완료했지만 2 가지 문제가 발생했습니다 첫 번째 문제는 엔진을 5 초 동안 냉각해야한다는 것입니다. 은 10 초 동안 가열해야합니다. 이 스위치에서 내가하지 않으면 다시 작동하지 같은 중지해야 할 것은 다시microC 임베디드 시스템의 일부 오류

이 우리의 프로젝트입니다 : -

스위치 0 컨트롤 자동차의 작업 (0 무 조작을) (1 차 작동하는 경우) 우리가 이 부분과 함께 완료

스위치 1은 안전 벨트 용입니다 : 우리는

스위치 2 도어입니다이 부분 완료 : 우리는이 부분을 우리가 만드는에서이 부분

으로 수행하는 것이하지만 문제는이 1 시간 만 수행해야합니다! 하지만 우리는 while 루프를 영원히 가지고 있기 때문에 멈추지 않을 것입니다 !! 그래서 우리가해야 할 일?! 차량이 작동하는 동안

, 엔진이 가열 될 15 초를 취할 것입니다 : 를 시작 부분에 -> 'HH하는 것은'LCD에 표시됩니다, 히터가 켜집니다 응용 프로그램 보드 주도하고 동시에 모터에서 5 초 동안 정방향으로 작동하여 냉각시킵니다. 그러면 LCD에 'HN'이 표시됩니다. 그 후 엔진은 가열되기까지 10 초가 소요됩니다.

이것은 우리가 할 수없는 두 번째 문제입니다! 우리는 루프 내부의 루프를 다른 루프 내부의 루프로 만드는 것에 대해 생각하지만 도 작동하지 않습니다. 또한 타이머로 내부에서 다른 타이머를 시도합니다! 우리는 타이머 또는 인터럽트를 사용해야합니다. 사용 지연은 없습니다.

연료 레벨을 나타내는 데 4 개의 LED가 있습니다. 10 초마다 하나의 LED가 꺼집니다. 마지막으로 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); 

} 

답변

1

하지 적절한 대답은, 미안하지만, 코멘트 과언.

두 가지 문제점을 분명히 언급하지 않았습니다. 엔진 가열에 관한 것으로 보이는 첫 번째 문제에 대한 코드는 없습니다. 두 번째 문제에 대해서 당신은 방금 "무엇을 말하지 않고"효과가 없다고 말합니다.

나는 또한 당신의 작업에 스패너를 던지고 문이 열리거나 시트 벨트가 작동 단계에서 풀렸다면 어떻게 될지 물어볼 것입니다. "문 닫힘", "안전 벨트 고정", "전원 켜기"등과 같은 각 값에 대해 비트 필드가있는 단일 상태 변수를 유지하는 것이 좋습니다.

delay() 할 수는 없지만 말입니다. 실세계에서 프로세스 컨트롤러가 delay() 함수를 성공적으로 사용할 수있는 유일한 방법은 I/O 및 스케줄링 이벤트를 조사하는 다른 스레드 또는 인터럽트 루틴이있는 경우입니다.임베디드 컨트롤러의 핵심 기능 중 하나는 인터럽트 처리중인 타이머 틱 (tick)입니다. 다른 프로세스를 차단하지 않고 지연시킬 수 있습니다. 동일한 처리기가 키보드 및 버튼 입력을 폴링하고 디버깅 할 수도 있습니다. 귀하의 일반 타이머 인터럽트가 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 

이것은 히터 프로세스에 여러 단계를 제공하도록 확장 될 수 있습니다.

+0

죄송합니다. 너무 많이 설명하지 않아서 죄송합니다.하지만 질문의 같은 부분에서 우리 프로젝트의 문제를 설명했습니다. 나는 질문을하고 각 부분 위에 나는 우리의 문제를 설명한다. 나는 첫 번째 문제를 다시 설명했으며이 문제의 코드는 타이머 인 루프 이후의 코드에서 첫 번째 부분이며 가열 및 냉각 과정을 포함합니다. 두 번째 부분은 내가 어떻게 그렇게 많은 시간을 시도하고 이것이 우리의 시도 중 하나인지 몰라 설명했다. 그래서 나는 그 아이디어가 무엇인지 알 필요가있다. – student

+0

을 사용할 수는 있지만 주요 부분은 사용할 수 없습니다. 예를 들어 10을 위해 LED를 켜야 할 경우 타이머가 아닌 지연을 사용해야합니다. 우리는 귀하의 작업에 감사하지만 귀하의 코드는 작동하지 않습니다. 고맙습니다 . – student

+0

코드가 작동하지 않아야합니다. 이것은 메인 루프가 연속적으로가 아니라 모든 프로세스를 동시에 처리 할 수있는 방법을 보여주는 예입니다. –

관련 문제