안녕하세요. 좋은 스택 오버플로입니다. 내 문제는 결코 실행하지 않는 인터럽트 서비스 루틴 (ISR)입니다! 여기에 내 설정에 대한 정보가 있습니다 : 나는 avr attiny85를 깜박입니다. 지금까지 main.c와 두 개의 모듈 인 timer와 hardwareInit으로 프로젝트의 기본 프레임을 설정했습니다. 타이머 모듈에서 timer0_init 함수를 사용하여 타이머 0을 CTC 모드로 오버플로 1ms를 설정하는 데 사용하고 있습니다. 여기에 기능입니다 : 설정 한 타이머AVR 타이머 오버플로 인터럽트가 작동하지 않습니다.
void timer0_init(void)
{
cli();
TCCR0B |= 3; //clock select is divided by 64.
TCCR0A |= 2; //sets mode to CTC
OCR0A = 0x7C; //sets TOP to 124 so the timer will overflow every 1 ms.
TIMSK |= 2; //Enable overflow interrupt
sei(); //enable global interrupts
}
가, 내가 증가하는 ISR 때마다 카운터 오버 플로우 틱 추가, 그래서 나는 등 경과 된 시간을 추적,
ISR(TIMER0_OVF_vect)
{
cli();
//ticks ++;
PORTB |= (1 << PORTB0);
sei();
}
을 유지할 수 있습니다
당신이 볼 수 있듯이, 나는 진드기 ++를 주석 처리했다. 작동하지 않았기 때문이며, 단순히 LED를 켜는 PORTB |= (1 << PORTB0);
으로 바꿨다. 따라서 인터럽트가 실행되면 LED가 켜져 있다는 증거로 알 수있다.
불행히도, 나는 그것을 켜지 못하고 내가 무엇을 놓쳤는지를 볼 수 없습니다. (내가 1. 올바른 핀에 LED를 설정하고 올바른 레지스터에서 올바른 비트를 조작하고 있다는 것을 증명하기 위해이 무언가를 무한 루프에 넣고 LED가 켜지는 것을 확인했다.)
/*================================= main.c =================================*/
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "timer.h"
#include "hardwareInit.h"
int main(){
//Initialize hardware HERE
DDRB |= (1 << PORTB0); //set this pin as an output for an LED
SetClockPrescale(1); //internal clock divided by 1 = 8 MHz, from hardwareInit
timer0_init(); //set up timer0 for 1 ms overflow
while(1)
{
/* if(getTicks() > 0)
{
PORTB |= (1 << PORTB0);
_delay_ms(1000);
PORTB &= ~(1 << PORTB0);
_delay_ms(1000);
} */
}
return 0;
}
그럼, 당신은 무한 루프에서 보는 것은 처음 시도 것입니다,하지만 작동하지 않았다 후, 난 그냥를 가진 간단한 무언가를 시도 : 자세한 설명은
, 여기 내 main.c에있다 빈 루프 (이전 물건을 주석 처리) 및 인터럽트가 LED가 켜지도록 트리거 될 때까지 대기합니다.
도움을 주시면 감사하겠습니다. 왜 이것이 작동하지 않았는지 나는 아주 당황 스럽다.
TIMSK'변경 시도 | = 2; 'TIMSK'로 | = (1 < <4); 및'TIMER0_OVF_vect'를'TIM0_COMPB_vect '로 변경합니다. 아니 보장. – andars
또는 타이머 초기화를 그대로두고 벡터를 'TIM0_OVF_vect'로 변경해보십시오. – andars