2016-08-31 6 views
0

저는 arduino의 초보자이며 부비동 파 발생 장치를 만들려고합니다. 최근에 모든 것을 주 무효 루프에 넣을 수 없다는 것을 알았 기 때문에 인터럽트를 사용하려고합니다. 인터럽트 (지연) 내부에서 변수를 변경하는 데 문제가 있습니다. 실수가 어디인지는 알 수 없습니다.arduino 인터럽트 변수가 작동하지 않습니다.

int sine256[] = { //256 sin values from 0 to 2pi 
}; 

int i = 0; 
int sensorPin = 7; 
int outputPin = 6; 
volatile float Delay = 10000; 


void setup() 
{ 
    Serial.begin(9600); 
    pinMode(outputPin, OUTPUT); 
    pinMode(sensorPin, INPUT); 
    attachInterrupt(digitalPinToInterrupt(sensorPin), freq, RISING); 

} 
void loop() 
{ 
    analogWrite(6,sine256[i]); 
    i = i + 1; 
    if(i == 256){ 
    i = 0; 
    } 

    Serial.println(Delay); 

    delayMicroseconds(Delay); 
} 

void freq() { 
    Delay = Delay/2;  
} 
+0

'void setup'에서'pinMode (sensorPin, INPUT);을 변경하십시오. 'to''pinMode (sensorPin, INPUT_PULLUP);'. 평균'INPUT'은'RISING/FALLING' 가장자리를 포함하지 않습니다. @nyuhanC – dsgdfg

답변

0

편집

이 시도 :

int sine256[] = { //256 sin values from 0 to 2pi 
}; 

int i = 0; 
int sensorPin = 7; 
int outputPin = 6; 
volatile float Delay = 10000; 


void setup() 
{ 
    Serial.begin(9600); 
    pinMode(outputPin, OUTPUT); 
    pinMode(sensorPin, INPUT); 
    //attachInterrupt(digitalPinToInterrupt(sensorPin), freq, RISING); 

} 
void loop() 
{ 
    analogWrite(6,sine256[i]); 
    i = i + 1; 
    if(i == 256){ 
    i = 0; 
    } 

    Serial.println(Delay); 

    freq(); 
    delay(Delay); 
} 

void freq() { 
    Delay = Delay/2;  
} 

https://www.arduino.cc/en/Reference/AttachInterrupt

그에서 살펴 본다보십시오 다음은 내 코드입니다.

어떤 모델을 사용하고 있습니까?

+0

나는 잘못 핀을 사용하여 알아 냈어, 우노 2 핀이나 3 핀에해야합니다.하지만 여전히 제대로 작동하지 않습니다, 내가 직렬 모니터에 지연을 변경 버튼을 누르면 볼 수 있지만 출력 주파수 변경되지 않습니다 :/ – nyuhanC

+0

o 정기적 인 지연()으로 작업하고있는 것으로 보이는데, 지연 시간이 뭐니? – nyuhanC

+0

@nyuhanC 좋은 질문입니다, 그냥 하드웨어에 결함이있을 수 있습니다, 보드에 의존 수 있습니다. 나는 모든 보드에서 delay()가 작동한다는 것을 알고있다. 루프에 지연을 넣고 루프를 통해 코드를 실행하는 것이 좋습니다. 나는 내 대답을 편집했는데 어떻게했을지 모르겠다. – Astrify

0

지금 문제가되는 유일한 원인은 버튼입니다. 나는 버튼을 여러 번 누르거나 (2,3 또는 4x) 반응하는 경우가 종종 있습니다.

이것은 현재 최종 코드입니다. void 루프의 실행 시간은 12 마이크로 초이므로, 20,40 & 60Hz에서 생성기를 실행하는 데 필요한 지연을 계산했습니다.

int sine256[] = { //256 sin values from 0 to 2pi (from 0 to 255) 
int i = 0; 
int sensorPin = 2; 
volatile int outputPin = 7; 
volatile float Delay = 1000; 
int time1; 
int time2; 

void setup() 
{ 
    Serial.begin(9600); 
    pinMode(outputPin, OUTPUT); 
    pinMode(sensorPin, INPUT_PULLUP); 
    attachInterrupt(digitalPinToInterrupt(sensorPin), freq, FALLING); 

} 
void loop() 
{ 
    //time1 = micros(); 

    analogWrite(outputPin,sine256[i]); 
    i = i + 1; 
    if(i == 256){ 
    i = 0; 
    } 

    //time2 = micros(); 

    //Serial.println(time2 - time1); 

    delay(Delay); 
} 

void freq() { 
    outputPin = 6; 
    if(Delay == 0.02){ 
    analogWrite(6,LOW); 
    outputPin = 7; 
    Delay = 1000; 
    } 
    if(Delay == 0.04){ 
    Delay = 0.02; 
    } 
    if(Delay == 0.09){ 
    Delay = 0.04; 
    } 
    if((Delay == 1000)&&(outputPin == 6)){ 
    Delay = 0.09; 
    } 
    Serial.println(Delay); 
} 
관련 문제