2016-04-22 11 views
3

MCUリセットピンの外部リセットボタンを使用せずに、whileループを解除してコードを特定の位置から再起動できるかどうかを知りたかったのです。whileループを中断してコードを再起動

以下はif文が真であるときに中断したいwhileループです。私はLCDを使用していて、テキストが表示されているコード内の特定の部分に戻りたいと思います)。

"if"ステートメントがtrueの場合、whileループは壊れてコードが終了します。

int main(void) 
{ 
    /***************************************** BUTTON CONFIGURATION ********************************/ 

    DDRA &= ~((1<<PINA0) | (1<<PINA1) | (1<<PINA2) | (1<<PINA3)); // Config pins as inputs (ADC3 - Matching with ADMUX assignment below in ADC configuration) 

    DDRC = 0xFF;  // Output pins for LEDs 

    PORTA |= (1<< PINA0) | (1<<PINA1) | (1<<PINA2); // Three pins for three push buttons 

    /****************************************** ADC CONFIGURATION **********************************/ 

    ADMUX |= (1<<MUX0) | (1<<MUX1) | (1<<REFS0);  // ADC3 and Internal voltage as reference voltage 

    MCUCR &= ~((1<<ADTS2) | (1<<ADTS1) | (1<<ADTS0)); // Free running mode 

    ADCSRA |= (1<<ADEN) | (1<<ADATE) | (1<<ADIE); // ADC, Auto trigger source enable and start conversion 

    sei(); // Enable global interrupts 

    /***************************************** LCD CONFIGURATION ***********************************/ 

    LCD_Data_DDRB |= (1<<LCD_D7) | (1<<LCD_D6) | (1<<LCD_D5) | (1<<LCD_D4);  // Set output lines for lower 4 bits 

    LCD_Data_DDRD |= (1<<LCD_B3) | (1<<LCD_B2) | (1<<LCD_B1) | (1<<LCD_B0);  // Set output lines for upper 4 bits 

    LCD_Control_DDRB |= (1<<RS) | (1<<RW) | (1<<EN);    // Set RS, RW & EN output lines 

    /******************************************** START CODE **************************************/ 

    LCD_Initialise(); // Run function to initialize the LCD 

    LCD_startup();  // Run function which displays default start up text 

    ADCSRA |= (1<<ADSC); // Start conversion 

    LCD_Send_Command(DISP_CL); 

    while(1) 
    { 

     if(Default > Final) 
     { 
     LCD_Send_Command(DISP_CL); 
     LCD_Send_Command(DISP_CS | LINE_1); 
     LCD_Send_String(" text would go here"); 
     break; 
     } 

     else 
     { 
      ; 
     } 

    } 

}

+1

@unwindはあなたの問題を安全に解決します。私はAtmelコントローラの仕様に精通していませんが、main関数を終了するとmain関数が再入力されると思います。これは私がマイクロチップコントローラで見たものです。実際にあなたは簡単にそれを試すことができます。特定の場所でいくつかのピンを切り替えて、オシロスコープで見る。 – jwsc

+0

コメントありがとうございます私はこれを調べ、試してみましょう! – LoneCoder

答えて

5

これは、あなたが「再起動」したいコードを表示しないので、理解することは少し難しいです。

おそらくあなたは、あなたが表示さ1を囲む別のループを使用することができます。

while(1) 
{ 
    code_that_is_restarted(); 
    while(1) 
    { 
    if(Default > Final) /* Very bad variable names */ 
    { 
     break; /* Exits the inner loop only. */ 
    } 
    } 
} 

break;だけ最も内側のループを終了しますので、実行はcode_that_is_restarted();で継続されます。

+0

あなたの迅速な対応をありがとう、私はこれを試してみましょう。また、コードを単純化したバージョンを追加して、壊れた後に再入力しようとしている場所を示しています。 – LoneCoder

関連する問題