외부인터럽트 추가 질문 및 답변
#include <avr/io.h>#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>
volatile unsigned char i =0 ;
int main(void)
{
DDRA = 0xff;
DDRE = (1<<DDRE4)|(1<<DDRE5); //DDE(0~7)
sei();//SREG |= 0x80;
EIMSK = (1<<INT4)|(1<<INT5);
//EICRB = (1<<ISC41)|(0<<ISC40)|(1<<ISC51)|(0<<ISC50); //
EICRB = (1<<ISC41)|(1<<ISC40)|(1<<ISC51)|(1<<ISC50); //
while (1)
{
PORTE |= 1<<4;
PORTE &= ~(1<<4);
_delay_ms(200);
PORTE |= 1<<5;
PORTE &= ~(1<<5);
_delay_ms(200);
}
}
ISR (INT4_vect)
{
PORTA |= ((1<<PORTA7)>>i++);
if(i>4)
{
i=0, PORTA = 0x00;
}
}
ISR (INT5_vect)
{
PORTA |= ((1<<PORTA0)<<i);
}
답변으로 알려주신 DDRE의 초기값을 입력이 아닌 출력 상태로 하여 PORTE에서 출력 값을 _delay_ms(x)마다 0과 1로 edge trigger와 같은 유사 신호(?)를 출력하였을시에 예기하신데로 인터럽트가 _ delay_ms(x) 마다 각각의 ISR루틴이 main에 맞춰
계속적으로 발생하는것을 확인했습니다. 현상이 전혀 이해가 않가서 atmel사의 128 datasheet에서 alternative port functions
보면서 해당 핀에 대한 부분을 보았지만 왜 그런지는 잘 모르겠습니다 ^^;; 아래는 datasheet에서 살펴본 Equivalent schematic 인데요 일단 봐도 잘 모르겠습니다 ;; I/O port는 자주 연습해봐서 원문을 보면서 이해가 갔는데 이부분은 너무 생소
해서 어떤 현상을 얘기하는지 이해도 않되서 도움을 요청드립니다. 왜이런건가요? atmega128만 이런건가요? 아니면 GPIO를 사용하는 대부분의 MCU PORT들은 그 alternative function 에 따라 이런 현상을 나타내는지 어떻게 이런 현상에 대해 개략적으로 살펴봐야 할지 datasheet 에서 어떤부분을 살펴봐야 할지도 모르겠습니당. 위와 같은 현상의 이해를 돕기위한 어떤 조언이라도 감사드립니다.
ATMEL-128 datasheet
DDXn(DDRxn), PORTXn(Pxn), PINxn
General I/O Port (Input/Output)
Datasheet도 같이 살펴보고 싶은데 이런것을 언급한 부분을 못찾겠습니다 가능하다면 요런부분도 코치해주시면 대단히 감사드리겠습니다.
이런건 데이타 쉬트에 나오지 않는 내용이지만
블럭도(님이올리신 그림) 만 봐도 유추를 할수 있습니다.
블럭도를 보시면 ddr 을 통해 출력으로 지정하면 port레지스터 값이
핀으로 나가개 되어 있죠?
또한 해당핀의 상태는 출력 경로 와 별개로 alternate block으로
들어오잖아요?
이런 구현에 종속적인 동작은 칩을 만드는 사람에의해 결정되며
일반적이라고 할건 아닙니다.
어떤칩은 특정 레지스터 를 통해서도 외부인터럽트
를 발생시킬수도 있습니다.
칩의 블럭도를 보고 어떤동작을 유추하고
확실치 않는 경우에는 실험을 통해서 확인하면 됩니다.
그리고 avr칩에서의 그런 능력은 칩을 설계한 사람의
의도가 아닐수 있습니다.
아!!!! 그럼 AVR에있는 GPIO 핀은 I/O PORT로 구성되는 하나의 블럭도와 alternative function으로 구성되는 다른 하나의 블럭도 이 두가지를 Pxn 에 하드웨어적으로 각 블럭도에 해당하는 회로(?) 2개가 분리되어 연결되어져 있는건가요? 표현하면 아래처럼... 혹은 물리적인 개념으로...
Pxn (ex:PE4)
|
|--(enable)--(블럭도 회로1(?))---- Alternative Port functions : EIMSK |= (1<<INT4) 외부인터럽트로 설정됨.
|
|-----(블럭도 회로2(?))---- Ports as General Digital I/O : (DDRE=(1<<DDE4)) 출력으로 설정됨
정리해보면 블럭도 회로2에서 DDRE (DDE4,DDE5)를 출력으로 결정하고 PE4,PE5에 그 값을 0,1의 반복으로
출력 시키면 PE4,PE5의 alternative function을 enable해서 INT4,INT5에 외부 입력신호를 확인할때 PE4,PE5
에 지속적으로 출력되는 신호를 블럭도 회로1에서 edge 신호로 감지하여 ISR루틴을 실행한다라고 볼수있다
인가요....
예.
출처 : http://cafe.naver.com/lazydigital/delay
.
No comments:
Post a Comment