|
|
  |
Глюк с Мега8, Странно работает ТС1 |
|
|
|
Jul 4 2007, 17:57
|
Группа: Новичок
Сообщений: 4
Регистрация: 10-07-06
Пользователь №: 18 713

|
Здравствуйте. Начинаю изучать программирование АВР. Задача - сделать суточный таймер. Написано два варианта программы. Оба работают на эмуляторе стабильно и на контроллере при условии что установлены малые промежутки времени либо малые значения предделителя таймера. На больших промежутках времени контроллер не выполняет необходимое действие. Всё время работает и не сбрасывается. Оба задействованых таймера считают. ТС2 в асинхронном режиме от кварца 32768 считает секундные импульсы, передаёт импульсы со своей ноги на входную ногу ТС1, который их подсчитывает. Контроллер на время простоя крутится в замкнутом цикле. Всё перепроверено и, повторюсь, прекрасно работает если задавать время выполнения действия менее 15 мин. Или если ускорить процесс установкой маленького значения предделителя ТС2.
Подскажите в чём может быть загводка??? Почему работающий ТС1 не входит в прерывание по сравнению через 30 и более минут??? Во втором варианте программы не использовалось прерывание от сравнения, каждую секунду считывались показания ТС1 и сравнивались с установленными. Ситуация такая же - если установить 10-15 мин то работает, если более то нет....
Я в панике.
|
|
|
|
|
Jul 4 2007, 21:01
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Skif_A @ Jul 4 2007, 20:57)  Оба задействованых таймера считают. ТС2 в асинхронном режиме от кварца 32768 считает секундные импульсы, передаёт импульсы со своей ноги на входную ногу ТС1, который их подсчитывает.
Подскажите в чём может быть загводка??? Почему работающий ТС1 не входит в прерывание по сравнению через 30 и более минут??? Подскажите в чем загвоздка такой замысловатой схемы? Почему нельзя просто установить количество секунд которое надо отмерять и в прерывании от TC2 отнимать по единичке, когда получится 0 - обработать событие... Код long MyTimer = 3600; // 1 час
обработчик прерывания TC2: { MyTimer -= 1; if (!MyTimer) { Свершилось... } }
|
|
|
|
|
Jul 4 2007, 21:42
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(singlskv @ Jul 5 2007, 00:30)  (хотя не уверен что это именно тот случай  ) А я уверен, что это совсем не тот случай. Тратить два таймера, на бог весть что и как бонус получить еще целый букет "подарков" 1. ограничение в 65535 секунд; 2. исключения в обработке; 3. неясную логику работы; 4. дополнительную внешнюю цепь. Когда надо забить гвоздь, не надо изобретать велосипед, надо просто взять молоток и забить гвоздь.
|
|
|
|
|
Jul 5 2007, 07:56
|
Группа: Новичок
Сообщений: 4
Регистрация: 10-07-06
Пользователь №: 18 713

|
Всем спасибо за ответы. Внесу несколько объяснений. Переполнения стека исключено. Прога малюсенькая, легко перепроверить. Да и работает же если установить ускоренный счёт (предделитель ТС2 на малые значения). Всё это делаться лишь для того чтоб потренироваться в программировании. Выловить баги и быть готовым для вставки этого куска более сложную систему. Дальше есть желание сделать суточный таймер с LCD, термотетром, термостабилизатором, на десяток и более событий за сутки. После вчерашних ковыряний склоняюсь к мысли что проблема именно в железе. Настроил на медленный счёт (предделитель ТС2 на 1024). Задаю время срабатывания 10,20, 30мин. Все три раза отработало как надо. 30 мин интервал решил перепроверить. Сбросил по питанию и ждал - второй и третий раз не отработало.....  Недельку назад бился над этим, думал что происходит сброс ТС1 от каких-то помех. Для контроля счёта ТС1 я прикрутил к нему ШИМ и вывел на светодиод (На тестовой платке кроме силового ключа светодиода и кнопки больше из периферии ничего нет). Контролировал осциллографом. ШИМ менялась как нужно, таймер считал, но как-то забывал что ему нужно входить в прерывание и изменять состояние ноги.???  Сейчас я не хочу из принципа переписывать всё по другому. В целях обучения значительно полезнее выловить свою ошибку и приобрести на этом какой-то опыт. Интересует вопрос - нет ли каких-то ограничений на длительность импульсов которые считает таймер и/или его предделитель. Счёт недельных промежутков времени и более считаются нормальным режимом работы? Во вложении текст проги. Кратко по тексту: После старта происходит настройка всех таймеров на нужный режим работы, настройка задействованных ног. Считывается из еепром значение длительности суток, и времени первого события. Уходим в замкнутый цикл. После ухода в прерывание по сравнению ТС2 (каждую секунду) засвечивается светодиод и контролируется нажатие кнопки. Если нагрузка выключена то светодиод меняет своё состояние на противоположное при каждом входе это прерывание. Если была нажата кнопка то принудительно изменить состояние нагрузки. Возврат в замкнутый цикл. Если выполнилось прерывание от сравнения В ТС1 то изменить состояние нагрузки и записать новое значение времени события.
Прикрепленные файлы
timer.txt ( 2.87 килобайт )
Кол-во скачиваний: 103
|
|
|
|
|
Jul 5 2007, 13:59
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Skif_A @ Jul 5 2007, 10:56)  Сейчас я не хочу из принципа переписывать всё по другому. В целях обучения значительно полезнее выловить свою ошибку и приобрести на этом какой-то опыт. В целях обучения может оказаться полезнее вначале почитать книги, ознакомиться со стандартными методами решения той или иной проблемы. Учатся на простом. Создавать сложный синтетический тест для решения простой задачи в котором глюк происходит через час, это ни для обучения не полезно, ни для ваших нервов. В вашем случае куча факторов может приводить к сбою (ведь для того чтобы найти глюк надо учитывать настройки 2х таймеров, портов, флага прерываний, масок прерываний, кода основной программы, настроек WDT, BOD, шумов питания, внешних цепей, кварцев, банальных опечаток в коде (программа же на асм) и т.д).
|
|
|
|
|
Jul 5 2007, 14:52
|
Группа: Новичок
Сообщений: 4
Регистрация: 10-07-06
Пользователь №: 18 713

|
На простом учился. Удачно написано несколько маленьких прог (терморегулятор, термометр с отправкой значения через FTDI на ком порт и другие) и одна довольно большая - Мега16 управляет работой часов с термометром (7-ми сегм. индикатор, микросхема часы реального времени, термометр ds18b20. Задействовано два таймера, вся инфа между микросхемами читалась и писалась вручную, с помощью циклов задержек и т.д) это было давно и неправильно, но работает уже не один месяц. А тут казалось бы мелочь, а не получается. Несколько книг прочитал, несколько пролистал, т.к. ничего кроме перевода даташитов они не представляли. Наверное усложню себе задачу, прикручу девайс к СОМ порту, буду выводить на экран промежуточные данные, может выловлю баг. Гланды через одно место..... а что делать????
|
|
|
|
|
Jul 5 2007, 17:17
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Выбор за Вами, естественно. Я взял посмотреть Вашу программу. Я не собираюсь Вас в чём-то убеждать, но предложу Вам некоторые кусочки из моей старой программы. Сразу оговорюсь что сейчас я коментирую ещё более подробно. Код ...
; PC.0 - Vol0 \ Громкость ; 1 - Vol1 / динамика ; 2 ; 3 - OH - Трубка снята (0) ; 4 - DTR - Готовность компьютера ; 5 - DCD - Обнаружение несущей
...
; Порт D
.equ RxD = pd0; Вход с RS232С .equ TxD = pd1; Выход на RS232С .equ ReadyL = pd2; Готовность 1200
...
.equ ONTONE = $85; начало гудка .equ ONPAUSE = $86; конец гудка .equ CARRIER = $ff; Несущая .equ CONNECTA= $b0; Соединение установить на ответ .equ CONNECTD= $b1; Соединение установить на передачу
...
.def tmpsreg = r2; для сохранения sreg в прерываниях .def TBH = r3; Начало буфера передачи .def TBE = r4; Конец буфера передачи
...
s22: .byte 1; XON s23: .byte 1; XOFF s24: .byte 1; Побитно устанавливаемый регистр .equ bl0 = 0; d0 \ Громкость звука динамика .equ bl1 = 1; d1 / .equ becho = 2; d2 - ECHO
...
ComC0: ld wl, Y+; Прочитать следующий символ lds wh, s3; Код CR cp wl, wh; Конец команды? breq ComEnd ; если да, то закончить cpi wl, $61; Если это малые буквы, то brlo ComC1 ; оставить как есть andi wl, $df; а иначе сделать их большими ComC1: brts ComC2 cpi wl, $44; "D" ... Дело не в том, что нам неудобно читать Вашу программу и угадывать её смысл. Главное, что через малый промежуток времени, Вы будете сами с трудом догадываться что Вы хотели написать. Так как у Вас изменятся подходы, взгляды, частично Вы забудите. И будете в голос ругать того безобразника, который это написал. Это конечно мой взгляд на вещи и я Вам его не навязываю. По существу вопроса. У меня в последнем изделии есть часы на м48 (будет и на м8 работать) и как минимум на два-три месяца у меня к ним претензий нет. В остальном я советовал бы прислушаться к defunct. И сделать таймер на базе одного таймера. Если же Вам нужны секундные (или любые другие) импульсы на ноге, то выводите их не стесняйтесь. А учёт ведите внутри, а не по внешним событиям. А то заочно бороться с помехами, - как то не катит.
|
|
|
|
|
Jul 5 2007, 18:35
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(SasaVitebsk @ Jul 5 2007, 21:17)  В остальном я советовал бы прислушаться к defunct. И сделать таймер на базе одного таймера. Если же Вам нужны секундные (или любые другие) импульсы на ноге, то выводите их не стесняйтесь. А учёт ведите внутри, а не по внешним событиям. А то заочно бороться с помехами, - как то не катит. А каких помехах Вы все говорите ??? В том AN который я привел для примера, с одной ноги mcu(выход одного таймера) сигнал поступает на вход другого таймера и все расстояние между ногами пару сантиметров в худшем случае, о каких помехах здесь вобще может быть речь... или у Вас там непрерывно ядреные взрывы происходят P.S. Если все так печально как Вы описываете, то я непонимаю как вобще соединяются микрухи на частотах >10-20MHz  Например как работает память в Вашем компе на частотах 100+
|
|
|
|
|
Jul 6 2007, 08:12
|
Группа: Новичок
Сообщений: 4
Регистрация: 10-07-06
Пользователь №: 18 713

|
Цитата(SasaVitebsk @ Jul 5 2007, 20:17)  Дело не в том, что нам неудобно читать Вашу программу и угадывать её смысл. Главное, что через малый промежуток времени, Вы будете сами с трудом догадываться что Вы хотели написать. Так как у Вас изменятся подходы, взгляды, частично Вы забудите. И будете в голос ругать того безобразника, который это написал.  На недостаточные комментарии я уже натыкался, сам себя материл. Потихоньку исправляюсь. Из-за спешки и лени процесс привыкания к подробным комментам идёт медленно но идёт...  Цитата(bodja74 @ Jul 5 2007, 22:31)  Просто человек еще не научился работать с регистром ASSR ,вот и сделал через одно место  При считывании данных с асинхронного таймера есть ньюансы ,но они решаются, лучше и проще сделать на одном таймере ,как выше советовали. Не понял что именно Вы имели ввиду когда сказали о регистре ASSR. Литературку перечитаю, мож я действительно что-то из его свойств упустил.
|
|
|
|
|
Jul 6 2007, 19:00
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Skif_A @ Jul 6 2007, 11:12)  На недостаточные комментарии я уже натыкался, сам себя материл. Потихоньку исправляюсь. Из-за спешки и лени процесс привыкания к подробным комментам идёт медленно но идёт...  Не понял что именно Вы имели ввиду когда сказали о регистре ASSR. Литературку перечитаю, мож я действительно что-то из его свойств упустил. Этот таймер работает асинхронно к основному ядру. Поэтому события регистрируются процессором несколько позже чем они наступают на самом деле. Для точного обнаружения, так сказать правильности существует пара готовностей. Эти готовности находятся в регистре ASSR. Но и это не всё. При работе с прерываниями тоже не всё гладко. Я это указывал в ветке http://electronix.ru/forum/index.php?showtopic=25453. Но в принципе это не главное. Написать программу может любой. Главное алгоритм выдумать. И сделать это красиво. Чтобы самому нравилось. Короче подход нужен. Именно этому в институте учат. А на каком языке или процессоре писать, особенности переферии - дело третье. А Ваш подход не красивый, - Вы уж извините. Программисту всё равно 3 см или 3м - его это пугает. Потому, что он это проконтролировать не может. Чем меньше внешних связей и внешних элементов, - тем лучше для всех. Если я могу выкинуть из схемы лишний инвертор, но мне придётся добавить дополнительно 150-200 строк программы (при условии конечно, что процессору это не в тягость), то я это сделаю не задумываясь.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|