밑에 소스 보시면 led가 좌 ==> 우 , 우 =>좌 로 이동해야 되는데
좌 ===> 우 로 밖에 되지 않네요..
이것때문에 벌써 몇 시간째 하고 있는데... 왕복으로 할려면 소스를 어떻게 짜야 될까요 ㅠ.ㅠ
#include<avr/io.h>
#include<avr/iom128.h>
#include<avr/interrupt.h>
#include<compat/deprecated.h>
unsigned char data=0x01;
int main(void)
{
DDRB=0xFF; // 포트 B 출력
PORTB=data;
DDRD = 0x00; // PD0 입력
EIMSK|=0x01; // INT0 개별 인터럽트 인에이블
EICRA|=0x03; // INT0 상승 에지
EIFR|=0x01; // INTF0 클리어
sei();
while(1);
}
ISR(INT0_vect)
{
data <<= 1; // led 변수의 좌 쉬프트
if(data == 0x00)
{
data ==0x01;
}
PORTB = data; // 포트 B에 LED 값 출력함
}
-----------------------------------------------------------------------------------------------
요건 제가 생각해 본 소스인데.. 계속 안되네용 ㅠ.ㅠ
#include<avr/io.h>
#include<avr/iom128.h>
#include<avr/interrupt.h>
#include<compat/deprecated.h>
#include<util/delay.h>
unsigned char led=0x00;
int main(void)
{
DDRB=0xFF; // 포트 B 출력
PORTB=0x00;
DDRD = 0x00; // PD0 입력
EIMSK|=0x01; // INT0 개별 인터럽트 인에이블
EICRA|=0x03; // INT0 상승 에지
EIFR|=0x01;
sei();
return 0;
}
ISR(INT0_vect)
{
unsigned char led=0;
while(1)
{
for(led=0; led< 8; led++)
{
PORTB=~(1<<led);
_delay_ms(1500);
}
// PORTB = led;
for(led=7; led>=0; led--)
{
PORTB=~(1<<led);
_delay_ms(1500);
}
//PORTB = led;
}
}
위에 코드는 한칸씩 옆으로 가는거고요..
밑에 코드가 스위치 누를때마다 좌==>우 , 우===>좌로 가야 되는데..
for문은 바로 스위치 누르면 같다가 바로 오네요.
스위치 눌렀을때 옆으로 한 칸씩 갔다가 다시 와야 되는데..
어떻게 짜야 되는지 모르겠네요.ㅠ.
지금 아래쪽코드를 보면 스위치를 눌러서 인터럽트 발생시마다 ISR함수가 실행되는데 이렇게 될때마다 led라는 변수가 계속 0으로 초기화 되네요 하나씩 차근차근 보면서 다시 해보시면 쉬우실텐데..
winavr에서 compile한 거라면
인터럽트에서 전역변수를 사용하려면 "volatile"을 써주어야 합니다.
즉
volatile unsigned char data;
라고 선언해야 합니다.
서비스 루틴안에 코드를 짜신건가요?
이런 방식의 코딩은 좋지 않은것 같습니다.
ISR 내부에는 간략한 변수 바꿈이나 if문 정도만 써주시고 좌-> 우 , 우-> 좌 따로따로 함수를 만들어서
서비스 루틴에서 함수를 바꾸어주는 방식을 쓰시는 편이 제어하기 편합니다.
메인문에서 함수 돌리고 인터럽트 발생시에 함수를 왔다갔다 하는 방법이죠
ISR 내부에 무한 반복문은 충격적이군요