2012-01-07 1 views
0

ATmega 64 microcontroller의 8 비트 타이머를 모두 사용하고자합니다. 내가 처음 인터럽트 (0x0012)를 입력하면 두 번째 타이머가 ... 인터럽트가 생성되지 않습니다 작동하지 않는 것으로 나타났습니다두 개의 8 비트 타이머를 사용하는 AVR ATmega64

.org 0x0012 ; Timer2 8 bit counter 
    rjmp TIM2 
.org 0x001E ; Timer0 8 bit counter 
    rjmp TIM1 

:

나는 그들의 비교 인터럽트를 선언하려면 다음 코드를 사용했다. 왜 이런 일이 발생하며 어떻게 해결할 수 있습니까?

나는 또한 이상한 것을 발견했다. 순서를 바꾸면 오류가 발생합니다.

Error 3 Overlap in .cseg: addr=0x1e conflicts with 0x1e:0x1f

답변

4

ATmega에서 다른 인터럽트는 인터럽트 벡터 실행 중에 차단됩니다.

이것은 여러 가지 이유로 유용한 기능입니다. 이렇게하면 인터럽트가 인터럽트되지 않도록 방지하고 재귀로 인해 스택 오버 플로우가 발생하지 않도록 할 수 있으며 특수 레지스터를 먼저 저장하지 않고도 대기 시간이 적은 인터럽트에서 사용할 수 있도록 특별히 설정하여 처리기가 원자 단위로 유지되도록합니다. .

특히 인터럽트 우선 순위 수준이없는 ATmega에서 재진입 인터럽트를 명시 적으로 사용하는 것이 유용 할 때가 있습니다. 이렇게하려면 SEI 명령어를 추가하여 인터럽트 활성화 플래그를 설정하면됩니다.

위에서 언급 한 문제가 발생하지 않도록주의해야합니다. 일반적으로 이는 사용되는 모든 레지스터가 스택에 보존되어야하며 재진입 부분이 시작되기 전에 인터럽트 자체를 비활성화해야 함을 의미합니다.

주소 중복 문제는 데이터 시트의 인터럽트 벡터 주소가 단어로 지정되어있는 반면 (예를 들어, 타이머 2 비교 인터럽트가 0x24 일 때 어셈블러가 프로그램 주소를 바이트로 계산한다는 것이 문제라고 생각됩니다. 0x12 대신). 벡터의 정의를 마친 후에는 주 코드 세그먼트로 돌아 가야합니다. 그러면 후속 코드가 다른 벡터로 계속 실행됩니다.

+0

이것은 매우 좋은 답변입니다! 고마워요! –

관련 문제