2013-06-26 3 views
1

여러 가지 장기 실행 섹션 (한 번에 15 분이 될 수 있음)이 있고 실행 섹션을 결정하기 위해 "IF"문을 사용하는 프로그램이 있습니다.버튼 누르기 스케치 시작 부분으로 건너 뛰기

내 문제는 버튼을 눌러 현재 섹션이 완료 될 때까지 기다리지 않고 즉시 다른 섹션으로 이동할 수 있기를 원합니다.

나는 외부 인터럽트를 사용할 수 있다고 생각했지만 인터럽트가 발생하면 프로그램이 인터럽트 코드 실행을 멈추고 인터럽트가 호출되기 전과 같은 장소에서 계속 실행됩니다.

나는 "goto"문을 사용할 수 있다고 생각했는데 레이블이 "goto"문을 사용하는 함수 밖에있을 경우 컴파일러가 불평하기 때문에 ether가 작동하지 않습니다.

나는 기본적으로 버튼을 눌러 다음 버튼을 눌렀을 때 무슨 일을 하던지 "IF"문으로 넘어갈 수 있기를 원한다.

지연은 프로그램이 수행 할 작업을 시뮬레이션하는 것입니다. 프로그램은 실제로 많은 다른 모드를 가진 로봇을위한 것입니다. 모드 1에서 주변을 탐색합니다. 모드 2에서는 컨트롤러로 제어 할 수 있습니다. 모드 3에서는 PIR 센서가 어떤 물건을 볼 때까지 앉아서 로밍을 시작합니다.

로봇이 어떤 일을하든 어떤 상태에서도있을 수 있습니다. 버튼을 누르고 중지하고 모드를 변경하려고합니다.

예 코드

volatile int state = LOW; 
int mode = 0; 

void setup() 
{ 
    Serial.begin(9600); 
    attachInterrupt(0, blink, RISING); 
} 

void loop() 
{ 
    Serial.println(); 
    Serial.print("##########################"); 
    Serial.println(); 
    Serial.print("Start it again"); 
    Serial.println(); 
    Serial.print("##########################"); 

if(mode==0) 
    {Serial.println(); 
    Serial.print("0"); 
    Serial.println(); 
    delay(30000);} 

if(mode==1) 
    {Serial.println(); 
    Serial.print("1"); 
    Serial.println(); 
    delay(30000);} 

if(mode==2) 
    {Serial.println(); 
    Serial.print("2"); 
    Serial.println(); 
    delay(30000);} 

if(mode==3) 
    {Serial.println(); 
    Serial.print("3"); 
    Serial.println(); 
    delay(30000);} 

if(mode==4) 
    {Serial.println(); 
    Serial.print("4"); 
    Serial.println(); 
    delay(30000);} 

} 

void blink() 
{ delay(800); // This is just a delay to allow for the button press 
    if(mode >= 4) 
    {mode = 0;} 
    else{mode = ++mode ;} 
} 

답변

0

다음 30 배 않는 새로운 기능과 delay(3000); 모두 차례 나오는 바꾸 버튼이 눌러 진 경우, 반환, 그렇지 않으면, 지연 (100)

+0

지연은 프로그램에서 수행 할 작업을 시뮬레이션하는 것입니다. 프로그램은 실제로 많은 다른 모드를 가진 로봇을위한 것입니다. 모드 1에서 주변을 탐색합니다. 모드 2에서는 컨트롤러로 제어 할 수 있습니다. 모드 3에서는 PIR 센서가 어떤 물건을 볼 때까지 앉아서 로밍을 시작합니다. 로봇은 어떤 일을하는 데 어떤 상태에있을 수 있습니다. 나는 버튼을 누르고 정지하고 모드를 변경하려고합니다. – justinf

+0

똑같은 사항이 적용됩니다. - 각 모드의 기능 전반에 걸쳐 정기적으로 버튼을 눌렀는지 확인한 후 돌아옵니다. 시간이 오래 걸리는 하위 함수가있는 경우에도 버튼을 눌러도 동일한 결과가 적용됩니다. –

1

서브 루틴이 오래 걸리지 않도록 코드를 구조화해야합니다.

while(1){ 
    switch(mode){ 
     case 0: //one cycle of case 0 
     break; 
     case 1: //one cycle of case 1 
     break; 
    } 
} 

그런 다음 인터럽트 서비스 루틴에서 모드를 설정할 수 있습니다.

관련 문제