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

Странное поведение пина в прерывании

Добавлено: Чт янв 12, 2017 08:29:04
trengtor
Столкнулся со странным эффектом. Должен выдаваться импульс 1 мкс с периодом 1 мс, вместо этого выдается меандр с периодом 2 мс. Никто не сталкивался с подобным поведением МК?

Модель ATmega328P

В чем может быть причина?

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

program T_2;

var
  ButtonSelect : sbit at PIND2_bit;
  ButtonSelect_Direction : sbit at DDD2_bit;

begin
  ButtonSelect_Direction := 1;
  ButtonSelect := 0;
  InitTimer0;
  while TRUE do ;
end.

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

unit Dispatch;

var
  ButtonSelect : sbit; external; sfr; volatile;
  ButtonSelect_Direction : sbit; external; sfr;
  
procedure InitTimer0;

implementation

procedure InitTimer0;
begin
  SREG_I_bit := 1;
  OCR0A := 172;
  TCCR0A := 0x00;
  TCCR0B := 0x03;
  TCNT0 := 0;
  OCIE0A_bit := 1;
end;

procedure Pulse;
begin
  ButtonSelect := 1;
  Delay_us(1);
  ButtonSelect := 0;
end;

procedure Ticker1ms_Handler_Dispatcher; org IVT_ADDR_TIMER0_COMPA;
begin
  TCNT0 := 0;
  Pulse;
end;

end.
Изображение

Re: Странное поведение пина в прерывании

Добавлено: Чт янв 12, 2017 08:53:08
pyzhman
С вашими параметрами в CVAVR и протеусе:
Изображение
Отсюда вывод: дополнить утверждение
подобным поведением МК
словом эмулируемого.
+ я в модели поставил Fтакт= 20 МГц.

Re: Странное поведение пина в прерывании

Добавлено: Чт янв 12, 2017 09:01:21
Z_h_e
Почему не используете аппаратный ШИМ?

Re: Странное поведение пина в прерывании

Добавлено: Чт янв 12, 2017 09:32:26
trengtor
Z_h_e писал(а):Почему не используете аппаратный ШИМ?
Потому, что это не имеет отношения к ШИМ. Нужно было посмотреть длительности выполнения процедур – решил использовать короткие импульсы-маркеры. Наткнулся на меандр вместо иголок.

Добавлено after 1 minute 43 seconds:
pyzhman писал(а):С вашими параметрами в CVAVR и протеусе:
Отсюда вывод: дополнить утверждение
подобным поведением МК
словом эмулируемого.
+ я в модели поставил Fтакт= 20 МГц.
Вы излишне самоуверенны.
Никакой эмуляции тут нет, это реальное поведение.
Снято логическим анализатором.

Re: Странное поведение пина в прерывании

Добавлено: Чт янв 12, 2017 09:36:10
pyzhman
Не силён в паскале, но может быть засада в этом:

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

ButtonSelect : sbit at PIND2_bit;
?
Может быть нужно PORTD2_bit?

Re: Странное поведение пина в прерывании

Добавлено: Чт янв 12, 2017 09:40:35
trengtor
pyzhman писал(а):Не силён в паскале, но может быть засада в этом:

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

ButtonSelect : sbit at PIND2_bit;
?
Может быть нужно PORTD2_bit?
Вы абсолютно правы. Спасибо!
Надо будет прочитать, в чем тут разница.

Re: Странное поведение пина в прерывании

Добавлено: Чт янв 12, 2017 09:43:37
pyzhman
PIN в более поздних версиях мк AVR инвертирует лапку.

Re: Странное поведение пина в прерывании

Добавлено: Чт янв 12, 2017 09:45:12
trengtor
pyzhman писал(а):PIN в более поздних версиях мк AVR инвертирует лапку.
Спасибо, буду знать.

Re: Странное поведение пина в прерывании

Добавлено: Чт янв 12, 2017 09:45:33
Z_h_e
Основное назначение порта PIN считывать состояние порта. В некоторых МК, в том числе в 328 ом, запись 1 в PIN , дает инвертирование соответствующего PORT

Re: Странное поведение пина в прерывании

Добавлено: Чт янв 12, 2017 09:46:21
trengtor
Z_h_e писал(а):Основное назначение порта PIN считывать состояние порта. В некоторых МК, в том числе в 328 ом, запись 1 в PIN , дает инвертирование соответствующего PORT
Нюансики. Спасибо!

Re: Странное поведение пина в прерывании

Добавлено: Чт янв 12, 2017 10:15:46
akl
Toggling the Pin
Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn.
Note that the SBI instruction can be used to toggle one single bit in a port.
Лучше всё равно справляться в DS, т.к. не все современные камни AVR имеют такую возможность. Например, ATmega64A