Простой тахометр на atmega

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 9
Зарегистрирован: Ср дек 02, 2020 22:46:52

Сообщение kotokot131313131313 »

Кстати, при обьявлении

Код: Выделить всё

GICR = (1<<INT1)|(1<<INT0);
у меня INT1 пустой находился, получается из-за этого ничего не работало. позже я просто убрал int0 и все встало на свои места. Спасибо за подсказку. :beer:

не указал регистр, думал он никак не влияет

Код: Выделить всё

MCUCR = (1<<ISC01)
GICR = (1<<INT0)
, т.е. не должно быть что камень в прерывании все время находился и не давал работать другим прерываниям, ведь по спаду прерывание происходит. А работает только INT0.
Timer1 и timer2 работают в формировании синуса:

Код: Выделить всё

ISR(TIMER1_COMPA_vect)
{
	OCR2=aSin[i];
        OCR1A=254;
	i++;
	if (i>127) i=0;
}
Однако OCR1A не работает, на осцилле видно какието импульсы хаотичные, но ШИМа нет.
Реклама
akl
Друг Кота
Сообщения: 4447
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Думаю, проще будет прерываться по OCIE2, в котором менять значение OCR2, а импульсы на OC1A пусть формируются аппаратно без прерывания.

Код: Выделить всё

    PORTB=0x00;
    DDRB = (1<<PB1) |(1<<PB2)| (1<<PB3);
  OCR1A=254;
    TCCR1A = (1<<COM1A1)|(0<<COM1A0)|(0<<WGM11)|(1<<WGM10)     ;          //delaem fast pwm na ocr1a
    TCCR1B = (0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);
   TCCR2=(1<<WGM20)|(1<<COM21)|(0<<COM20)|(1<<WGM21)|(0<<CS22)|(0<<CS21)|(1<<CS20);
   TIMSK=(1<<OCIE2);
//
//
//
ISR(TIMER2_COMP_vect)
{
   OCR2=aSin[i];
   i++;
   if (i>127) i=0;
}
Реклама
Ответить

Вернуться в «AVR»