전에 아크마님께서 조언해 주신건데요.
코드의 전체적인 문맥은 잡았습니다..
unsigned int data;
int a=0;
#pragma interrupt_handler int4_isr:6
void int4_isr(void)
{
a=1;
unsigned int duty;
_CLI();
data=duty;
_SEI();
}
void main(void)
{
while(1){
if(a==0){
모터각도함수(duty); // 90도
delay();
모터각도함수(duty); // 100도
delay();
모터각도함수(duty); // 110도
delay();
.......
모터각도함수(duty); // 180도
delay();
모터각도함수(duty); // 170도
delay();
모터각도함수(duty); // 160도
delay();
......
모터각도함수(duty); // 90도
delay();
}
else if(a==1){
모터각도함수(data); X도
..................
..............
실행할내용..
.......
...
}
위에 처럼 코드를 생각해봤습니다.
문제는 data변수에 duty값을 저장하는건데요... 보시면, 외부인터럽트가 발생되야 저장이 됩니다..
인터럽트금지, 허용을 저렇게 하면 멈췄을 때의 듀비값이 저장될지가 의문이네요 -_-;;;
외부인터럽트 플래그레지스터를 if문의 조건으로 달아놨는데 저게 가능한지 -_-;
아.. 요즘 너무 어수선하네요.. 미치겠습니다 집중이 너무 안되네요..
너무 무기력해있으니...
인터럽트금지, 허용을 저렇게 하면 멈췄을 때의 듀비값이 저장될지가 의문이네요 -_-;;;
-> 저장됩니다. 다른 인터럽트로 진입을 멈춘것으로 상관없습니다. 단지 저러케 하게 되면 타이머 인터럽트도 정지되버릴거에요 그래서 타이머가 죽으면 서보가 동작 안하겠지요..
님문장에서는 딱히 인터럽트를 껏다켰다할 필요가 없습니다. 언제나 인터럽트 enable로 해주시면 됩니다.
그리고 a=1이라고 인터럽트 걸릴때 해주셧는데요.
그럼 main문에서 인터럽트에 따른 처리후에 a=0이라고 넣어주시면 되요.
또 채터링 방지를 위해서는 인터럽트 문에서도 a=1이라고해서 무조건 실행하지 마시고요
if(a==0)일때만 하위 명령문을 실행하면 됩니다. (채터링에 의해 2번연속이상 인터럽트 호출루틴이 실행되지 못하게요)
int data[20]; //duty값을 저장하는 변수
int z , x;
int b = 0;
#pragma interrupt_handler int4_isr:6
void int4_isr(void)
{
b=1;
data[ x ] = z;
}
void main(void)
{
int b=0;
int i,j;
while(1){
if(b==0) {
while(1){
for(z=1500,x=0; z<2200; z++,x++)
{
z=z+(101-1);
Servo24SetDuty1(0,7,z);//all Center Value
delay();
delay();
delay();
}
for(z=2100,x=0; z>1500; z++,x++)
{
z=z-(101-1);
Servo24SetDuty1(0,7,z);
delay();
delay();
delay();
}
}
//}
else if(b==1) {
while(1)
{
Servo24SetDuty1(0,7,data[x]);
delay(10);
Servo24SetDuty1(0,7,2300);
delay(10);
}
}
}
} // end main
b==1 부분이 죽어라 실행이 안되네요... 스위치를 눌리면 b변수에 1이 할당되면서 되야 하는거 아닌가요 ㅠㅠ?;;
스위치는 핀 2개중에 한개는 GND, 다른쪽은 10k짜리 저항을 물리고 포트E4에 물렀습니다..