Страница 2 из 2

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

Добавлено: Ср янв 06, 2021 15:54:25
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 не работает, на осцилле видно какието импульсы хаотичные, но ШИМа нет.

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

Добавлено: Чт янв 07, 2021 05:07:53
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;
}