2015-01-23 3 views
-4

부스트 컨버터 프로젝트의 C 코드를 작성했습니다. 임베디드 코드가 ilmatto (마이크로 프로세서)에 업로드 되 자마자 전압은 Vwanted의 초기 값으로 안정화됩니다.이 경우는 4입니다.C 프로그래밍, 무한 루프가 예기치 않게 멈 춥니 다.

그러나 호스트를 사용하여 VWanted 값을 보내면 문제가 발생합니다 프로그램에서 Vwanted의 값은 대체되지만 출력 전압의 값은 대체하기 전에 Vwanted의 값인 4로 유지됩니다.

나는 교체가 성공했는지 확인하기 위해 VWanted의 값을 인쇄하려고 시도했다.

그래서 초기에는 (;;)에 대한 내부가 실행되지만 Vwanted의 대체 값 다음에 프로그램이 결코 내부 (;;)로 이동하지 않는다고 생각됩니다. 이것은 내가 putty 및 uart 케이블을 사용하여 리턴 데이터를 관찰 할 때 증명됩니다. 그것은 인쇄 "." 처음에, 나는 Vwanted의 새로운 가치를 입력하지 않고. 그러나 나중에 Vwanted의 새 값이 입력되면 퍼티는 아무 것도 인쇄하지 않습니다.

이것이 사실이면, (for;) 루프의 바깥 쪽이 작동하지 않는 것 같습니다.

제발 도와주세요!

여기에 내가 프로그램을 종료, 메인 함수에서 반환

int main(void) 
{ 
    uint16_t cnt =0; 

    int duty_value = 210; 
    char cmd[BUFFSIZE]; 
    //char tail[BUFFSIZE]; 
    int prm; 
    int res; 

    init_stdio2uart0(); 
    init_pwm(); 
    init_adc(); 

    double Vwanted = 4; //initialise voltage 
    double *ptr = &Vwanted; 
    //pwm_duty(duty_value); 

    double v_out; 
    double Verror; 

    /* set LED pin as an output */ 
    DDRB |= _BV(PINB7); 

    printf("\r\nIlMatto Coms READY!\r\n"); 

    for(;;) 
    { 

     /* Following idea from jwaf1g14*/ 
     for(;;) 
     {  

      v_out = v_load()/0.150; 

      Verror = Vwanted - v_out; 
      printf("."); 

      if (Verror < 0) 
      { 
       if (Verror < -4) 
       { 
        duty_value = duty_value - 2; 
        pwm_duty(duty_value); /* Limited by PWM_DUTY_MAX */ 
       } 
       else if (Verror > -4) 
       { 
        duty_value = duty_value - 1; 
        pwm_duty(duty_value); /* Limited by PWM_DUTY_MAX */ 
       } 
      } 
      else if (Verror > 0) 
      { 
       if (Verror > 4) 
       { 
        duty_value = duty_value + 2; 
        pwm_duty(duty_value); /* Limited by PWM_DUTY_MAX */ 
       } 
       else if (Verror < 4) 
       { 
        duty_value = duty_value + 1; 
        pwm_duty(duty_value); /* Limited by PWM_DUTY_MAX */ 
       } 
      } 
      else 
      { 
       pwm_duty(duty_value); /* Limited by PWM_DUTY_MAX */ 
      } 

      if(kbhit()) // Check if there is an input available 
      { 
       res = scanf("%s %u", cmd, &prm); 

       printf("%04d: CMD was: \"%s\" with %d (%d)\r\n", cnt, cmd, prm, res); 

       break; 
      } 

     //printf(" Vout --> %5.3f V\r\n", v_out); 

    }/*End of inner forever loop*/ 

    if (res !=2)/* Error! */ 
     { 
      printf("Your serial connection is broken!!!"); 
      //scanf("%*s"); /* Clear input buffer */ 
      //fflush(stdin); 


     } 
    else 
     { 
      if (prm > 12 || prm < 1) 
      { 
       printf("The setpoint entered cannot be achieved"); 

       /* Set pin B7 high */ 
       PORTB |= _BV(PINB7); 
       _delay_ms(100); 
       /* Set pin B7 low */ 
       PORTB &= ~_BV(PINB7); 
       _delay_ms(900); 
      } 
      else if (prm < 12 && prm > 1) 
      { 

       *ptr = (double)prm; 
       printf("Vset is %f,", Vwanted); 

       //printf("Hello"); 
      } 

     } 


    }/*End of outer forever loop*/ 

    return 0; 

}/*End of main loop*/ 
+1

코드에 정의 된 동작이 없습니다. 'fflush (stdin);'. 'fflush()'는 출력 버퍼만을위한 것이다. –

+0

내 문제를 해결하기 위해 추가 된 내용입니다. 그것은 실제로 많이하지 않았다. 그 코드 문장을 삭제하는 것을 잊어 버렸습니다. –

+0

잘 제거하십시오. –

답변

2

루프가 return Vwanted;로 끝나는 내 embedded.c 프로그램의 주요 기능을 포함한다. 해당 줄을 제거하면 외부 루프를 계속할 수 있습니다. 나는 당신이이 기능에서 무엇이든 돌려 주려고하지 않는다고 생각합니다.

+0

VWanted의 새로운 값이 대체되지 않는다고 의심되는만큼 추가되었습니다. 그것은 어쨌든 무작위 추측이었습니다. 그것 없이도 문제는 여전히 지속됩니다. –

+0

@ zuladli : 그런 다음 질문의 코드에서 제거하십시오! – Clifford

관련 문제