Микроконтроллер: Atmega328P IDE: Microchip Studio v7.0.2594 Инструментарий: Atmel AVR 8-бит (язык C), встроенный Я пытаюсь запустить прерывание переполнения таймера 0. Однако похоже, что ISR не выполняется. Вывод переключается внутри while(1), но остается в НИЗКОМ состоянии при работе внутри ISR. Такие же проблемы возникают, когда я пытаюсь запустить таймеры Atmega2560. Вот мой основной код. Я работал над многими микроконтроллерами Atmega, но такого еще никогда не случалось. Примечание. Наблюдение за сигнальным контактом с помощью логического анализатора.
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
ISR(TIMER0_OVF_vect)
{
PORTB ^= (1<<5); //Toggle once in every 8.12ms
TCNT0 = 127;
}
int main(void)
{
/* Replace with your application code */
DDRB = (1<<5);
PORTB = 0;
TCCR0A = 0;
TCNT0 = 127;
TIMSK0 = (1<<TOIE0);
TIFR0 = 0;
TCCR0B = (1<<CS02)|(1<<CS00); // CLKio Divide by 1024
//Duration of 1 count = 16MHz/1024 = 15.625KHz = 64us
//Duration of 127counts = 64*127 = 8.12ms
sei();
while (1);
{
PORTB ^= (1<<5);
_delay_ms(10);
}
}
Когда я отключаю прерывание, используя //сей(); или //TIMSK0 = (1<<TOIE0); Код внутри, пока 1 работает нормально
@hcheung да, я знаю об этой точке с запятой. Я поместил это туда, чтобы избежать конфликта между while(1) и ISR (в случае, если ISR работает). Когда я говорю, что while(1) работает нормально, я имею в виду, что ; удаляется, и код внутри работает нормально. Должен ли я удалить это; из сообщения, если оно вызывает путаницу.?
Меня это определенно смутило, особенно когда с остальным кодом все в порядке. На самом деле вы упомянули и ATmega328P, и ATmega2560, что тоже сбивает с толку.





С вашим кодом проблем нет, он только очень быстро мигает - около 1 кГц (поэтому вам придется быстро перемещать светодиод перед глазами, чтобы увидеть, как он мигает).
Ваш код будет слегка пульсировать, когда вы используете тактовую частоту, деленную на 1024, но с делителем тока 64 слишком быстро, чтобы что-либо заметить без такого быстрого движения светодиода. (Или вы можете переключить светодиод на горящий на стороне высокого напряжения, и он тоже будет мигать)
Я использую логический анализатор для наблюдения за сгенерированным сигналом.
@ManishVerma Я использую светодиод высокого напряжения и мультиметр для измерения частот. Единственный способ счетчика не работал, когда я установил все CS на 1 (так что он ожидал внешние часы). По сути, while должно работать в любом случае (если только это не полный код и не имеется какой-то другой неперехваченный ISR)
Просмотрев техническое описание ATmega2560, он сказал: Векторы прерываний можно переместить в начало раздела Boot Flash, установив бит IVSEL в регистре управления MCU (MCUCR). Дополнительную информацию см. в разделе «Прерывания» на стр. 101. Вектор сброса также можно переместить в запуск раздела Boot Flash путем программирования BOOTRST Fuse"
Когда я депрограммировал (установил в 1) бит BOOTRST старшего байта предохранителя, это решило проблему, и ISR теперь работает с приведенным выше кодом.
«Код внутри while 1 работает нормально». Внутри while(1) нет кода, потому что это просто пустой
while (1) ;, заметили;в конце?