-
29.04.2012, 09:38 #1Без позывного
- Регистрация
- 08.01.2011
- Адрес
- Ярославль
- Сообщений
- 17
- Поблагодарили
- 0
- Поблагодарил
- 0
Помогите с кодом на С++. ATtiny2313. Бегущие огни
Доброго времени суток дорогие форумчане!!!
Нужна Ваша консультация (помощь). Изучаю работу микроконтроллера ATtiny2313 все как бы получается, все работает, но по моему мнению некорректно. Суть схемы очень проста (фото ниже). Собранная схема хорошо функцианирует если программа работает по первому варианту (от внутреннего RC генератора с использованием функции из библиотеки delay.h с временем 200 мс.).
Но при работе от внешнего кварцевого резонатора на 4 МГц (CKSEL=1101, SUT=10) с использованием 16-ти разрядного таймера T1 (Предделитель на 1024 TCCR1B=0x05, коэффициент деления рассчитан по формуле: 4000000/1024=3906,25~3906; 1/3906=0,000256; 200мс/256мкс=781~780). реально время переключения светодиодов стало более 1 сек. О времени переключения 200 мс даже и речи быть не может. В чем косяк???
В архиве svetodiod.rar исходный код программы в CodeVision AVR (вариант с таймером, который работает некорректно);
В архиве Prog5.rar исходный код программы в CodeVision AVR (вариант с использованием внутреннего RC генератора и библиотеки delay.h. рабочий вариант)radiomost
-
07.05.2012, 15:00 #2High Power
- Регистрация
- 30.01.2008
- Адрес
- Тульская область г.Кимовск
- Возраст
- 66
- Сообщений
- 502
- Поблагодарили
- 84
- Поблагодарил
- 93
Я на Си не пишу, но есть у меня замечание.
Таймер всегда считает в обратную сторону, т.е. на вычитание. Макс. значение таймера - 65536 (соответствует нулям в счётном регистре таймера). Вычитание в счётном регистре таймера происходит след. образом - 65536(точнее 0), 65535, 65534, 65533 и т.д. до нуля.
Поэтому событие таймера надо ловить по достижению 65536-780=64756
while (TCNT1<64756) {};
Пользуйтесь калькуляторами для AVR (в них можно быстро посчитать события таймеров). Например KAVRCalc.Последний раз редактировалось RA3PKJ; 07.05.2012 в 15:20.
SDR и Ретро на http://ra3pkj.ru/ Николай RA3PKJ
-
07.05.2012, 19:01 #3
-
07.05.2012, 19:52 #4High Power
- Регистрация
- 30.01.2008
- Адрес
- Тульская область г.Кимовск
- Возраст
- 66
- Сообщений
- 502
- Поблагодарили
- 84
- Поблагодарил
- 93
А я работаю на ассемблере, поэтому текст на Си меня сбил с толку. Всё-равно там ошибка есть в программировании таймера, скорее всего подход неправильный. Признаю свою ошибку в предыдущем своём посте, бес попутал. Что-то навеяло не оттуда, блин. Конечно же таймер считает на увеличение, когда таймер дойдёт до переполнения, то сработает прерывание от таймера. Просто нужно правильно записать стартовое число в счётный регистр таймера. На ассемблере я бы записал стартовое число 65536-780=64756.
Последний раз редактировалось RA3PKJ; 07.05.2012 в 20:15.
SDR и Ретро на http://ra3pkj.ru/ Николай RA3PKJ
-
08.05.2012, 00:23 #5High Power
- Регистрация
- 26.02.2006
- Адрес
- Рыбинск, Ярославская обл.
- Возраст
- 43
- Сообщений
- 783
- Поблагодарили
- 157
- Поблагодарил
- 478
Код не смотрел, но у меня такое было, когда не правильно работал с регистрами таймера. Что-то не так настроили/инициализировали. Пробуйте в Proteus'е.
С уважением, Алексей. UA3MQJ
|
|

URL обратной ссылки
Подробнее про обратные ссылки












Ответить с цитированием


Социальные закладки