Easyelectronics.ru

Электроника для всех
Текущее время: 22 янв 2021, 21:22

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Дрейф прерывания по таймеру в AtTiny13
СообщениеДобавлено: 03 янв 2020, 19:26 
Заглядывает иногда

Зарегистрирован: 03 ноя 2017, 20:00
Сообщения: 76
Привет. Скорее всего мой косяк в коде, но хоть убей - понять в чем проблема не могу.
Короче - изобретаю велосипед: программный RX UART 9600 на AtTiny13.
Период бита = t;
Первое прерывание срабатывает по спадающему фронту в момент получения START Bit (который по умолчанию всегда = 0);
Заводит таймер на 1.5 t так чтобы он вызвал прерывание по совпадению на момент середины первого DATA Bit.
Второе прерывание (по совпадению) выставляет таймер 1 t.

Прием первого байта проходит блестяще.
а вот на последующих байтах по какой то причине первый таймер срабатывает значительно раньше и тайминги плывут...
код:
Show


Картинка:
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дрейф прерывания по таймеру в AtTiny13
СообщениеДобавлено: 03 янв 2020, 19:35 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3051
У вас даже по картинке видно, что прерывание по таймеру на 2ом байте стреляет сразу после прерывания спада INT0. На 1.5t задержки не происходит. В этом направлении копайте.
EDIT: Вот прям совсем показываю куда копать, в этом ваша проблема:
The Output Compare Flag is automatically cleared when the interrupt is executed. Alternatively, the flag can be cleared by software by writing a logical one to its I/O bit location


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дрейф прерывания по таймеру в AtTiny13
СообщениеДобавлено: 03 янв 2020, 19:42 
Заглядывает иногда

Зарегистрирован: 03 ноя 2017, 20:00
Сообщения: 76
NStorm писал(а):
EDIT: Вот прям совсем показываю куда копать, в этом ваша проблема:
The Output Compare Flag is automatically cleared when the interrupt is executed. Alternatively, the flag can be cleared by software by writing a logical one to its I/O bit location

- пойду расчехлю лопату.


Последний раз редактировалось sybiC 03 янв 2020, 19:46, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дрейф прерывания по таймеру в AtTiny13
СообщениеДобавлено: 03 янв 2020, 19:44 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3051
Ну читайте же:
A match will set the Output Compare Flag (OCF0A or OCF0B) at the next timer clock cycle. If the corresponding interrupt is enabled, the Output Compare Flag generates an Output Compare interrupt. The Output Compare Flag is automatically cleared when the interrupt is executed. Alternatively, the flag can be cleared by software by writing a logical one to its I/O bit location.

Вы таймер взводите-то кодом одним. Но вы ведь его не останавливаете потом. Вы просто выключаете прерывание. А таймер продолжает тикать и устанавливает бит срабатывания совпадения (OCF0A). Потом вы включаете прерывание назад и оно сразу же срабатывает, потому что установлен бит. Добавьте TIFR0 |= (1 << OCF0A); перед включением прерывания TIMSK0 |= (1 << OCIE0A);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дрейф прерывания по таймеру в AtTiny13
СообщениеДобавлено: 03 янв 2020, 19:49 
Заглядывает иногда

Зарегистрирован: 03 ноя 2017, 20:00
Сообщения: 76
NStorm писал(а):
Ну читайте же:
A match will set the Output Compare Flag (OCF0A or OCF0B) at the next timer clock cycle. If the corresponding interrupt is enabled, the Output Compare Flag generates an Output Compare interrupt. The Output Compare Flag is automatically cleared when the interrupt is executed. Alternatively, the flag can be cleared by software by writing a logical one to its I/O bit location.

Вы таймер взводите-то кодом одним. Но вы ведь его не останавливаете потом. Вы просто выключаете прерывание. А таймер продолжает тикать и устанавливает бит срабатывания совпадения (OCF0A). Потом вы включаете прерывание назад и оно сразу же срабатывает, потому что установлен бит. Добавьте TIFR0 |= (1 << OCF0A); перед включением прерывания TIMSK0 |= (1 << OCIE0A);

Спасибо! Действительно.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB