Страница 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
Не силён в паскале, но может быть засада в этом:
?
Может быть нужно PORTD2_bit?
Re: Странное поведение пина в прерывании
Добавлено: Чт янв 12, 2017 09:40:35
trengtor
pyzhman писал(а):Не силён в паскале, но может быть засада в этом:
?
Может быть нужно 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