реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Глюк с Мега8, Странно работает ТС1
Skif_A
сообщение Jul 4 2007, 17:57
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 10-07-06
Пользователь №: 18 713



Здравствуйте.
Начинаю изучать программирование АВР. Задача - сделать суточный таймер.
Написано два варианта программы. Оба работают на эмуляторе стабильно и на контроллере при условии что установлены малые промежутки времени либо малые значения предделителя таймера. На больших промежутках времени контроллер не выполняет необходимое действие. Всё время работает и не сбрасывается. Оба задействованых таймера считают. ТС2 в асинхронном режиме от кварца 32768 считает секундные импульсы, передаёт импульсы со своей ноги на входную ногу ТС1, который их подсчитывает. Контроллер на время простоя крутится в замкнутом цикле.
Всё перепроверено и, повторюсь, прекрасно работает если задавать время выполнения действия менее 15 мин. Или если ускорить процесс установкой маленького значения предделителя ТС2.

Подскажите в чём может быть загводка??? Почему работающий ТС1 не входит в прерывание по сравнению через 30 и более минут???
Во втором варианте программы не использовалось прерывание от сравнения, каждую секунду считывались показания ТС1 и сравнивались с установленными. Ситуация такая же - если установить 10-15 мин то работает, если более то нет....

Я в панике.
Go to the top of the page
 
+Quote Post
Dimmy
сообщение Jul 4 2007, 19:12
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503



Неплохо бы код посмотреть. Но первое впечатление - слишком все усложнено. Зачем внешняя связь? Зачем 2 таймера?
Go to the top of the page
 
+Quote Post
bodja74
сообщение Jul 4 2007, 19:16
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Очень смахивает на переполнение стека.Подобное проявляется часто только через несколько минут.
Прогоните весь цикл и глянте не смеситилось ли значение уазателя стека.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 4 2007, 21:01
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 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)
     {
          Свершилось...
     }
}
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jul 4 2007, 21:30
Сообщение #5


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(defunct @ Jul 5 2007, 01:01) *
Подскажите в чем загвоздка такой замысловатой схемы?
Почему нельзя просто установить количество секунд которое надо отмерять и в прерывании от TC2 отнимать по единичке, когда получится 0 - обработать событие...

Иногда лучше чтобы это все выполнялось в "железе" (хотя не уверен что это именно тот случай smile.gif)

Автар, смотри сюда:
AN AVR133
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 4 2007, 21:42
Сообщение #6


кекс
******

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



Цитата(singlskv @ Jul 5 2007, 00:30) *
(хотя не уверен что это именно тот случай smile.gif)

А я уверен, что это совсем не тот случай.
Тратить два таймера, на бог весть что и как бонус получить еще целый букет "подарков"
1. ограничение в 65535 секунд;
2. исключения в обработке;
3. неясную логику работы;
4. дополнительную внешнюю цепь.

Когда надо забить гвоздь, не надо изобретать велосипед, надо просто взять молоток и забить гвоздь.
Go to the top of the page
 
+Quote Post
Skif_A
сообщение Jul 5 2007, 07:56
Сообщение #7





Группа: Новичок
Сообщений: 4
Регистрация: 10-07-06
Пользователь №: 18 713



Всем спасибо за ответы.
Внесу несколько объяснений.
Переполнения стека исключено. Прога малюсенькая, легко перепроверить. Да и работает же если установить ускоренный счёт (предделитель ТС2 на малые значения).
Всё это делаться лишь для того чтоб потренироваться в программировании. Выловить баги и быть готовым для вставки этого куска более сложную систему. Дальше есть желание сделать суточный таймер с LCD, термотетром, термостабилизатором, на десяток и более событий за сутки.
После вчерашних ковыряний склоняюсь к мысли что проблема именно в железе. Настроил на медленный счёт (предделитель ТС2 на 1024). Задаю время срабатывания 10,20, 30мин. Все три раза отработало как надо. 30 мин интервал решил перепроверить. Сбросил по питанию и ждал - второй и третий раз не отработало..... sad.gif
Недельку назад бился над этим, думал что происходит сброс ТС1 от каких-то помех. Для контроля счёта ТС1 я прикрутил к нему ШИМ и вывел на светодиод (На тестовой платке кроме силового ключа светодиода и кнопки больше из периферии ничего нет). Контролировал осциллографом. ШИМ менялась как нужно, таймер считал, но как-то забывал что ему нужно входить в прерывание и изменять состояние ноги.??? sad.gif
Сейчас я не хочу из принципа переписывать всё по другому. В целях обучения значительно полезнее выловить свою ошибку и приобрести на этом какой-то опыт.
Интересует вопрос - нет ли каких-то ограничений на длительность импульсов которые считает таймер и/или его предделитель. Счёт недельных промежутков времени и более считаются нормальным режимом работы?

Во вложении текст проги.
Кратко по тексту:
После старта происходит настройка всех таймеров на нужный режим работы, настройка задействованных ног. Считывается из еепром значение длительности суток, и времени первого события. Уходим в замкнутый цикл. После ухода в прерывание по сравнению ТС2 (каждую секунду) засвечивается светодиод и контролируется нажатие кнопки. Если нагрузка выключена то светодиод меняет своё состояние на противоположное при каждом входе это прерывание. Если была нажата кнопка то принудительно изменить состояние нагрузки. Возврат в замкнутый цикл. Если выполнилось прерывание от сравнения В ТС1 то изменить состояние нагрузки и записать новое значение времени события.
Прикрепленные файлы
Прикрепленный файл  timer.txt ( 2.87 килобайт ) Кол-во скачиваний: 103
 
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 5 2007, 13:59
Сообщение #8


кекс
******

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



Цитата(Skif_A @ Jul 5 2007, 10:56) *
Сейчас я не хочу из принципа переписывать всё по другому. В целях обучения значительно полезнее выловить свою ошибку и приобрести на этом какой-то опыт.

В целях обучения может оказаться полезнее вначале почитать книги, ознакомиться со стандартными методами решения той или иной проблемы.

Учатся на простом.

Создавать сложный синтетический тест для решения простой задачи в котором глюк происходит через час, это ни для обучения не полезно, ни для ваших нервов.

В вашем случае куча факторов может приводить к сбою (ведь для того чтобы найти глюк надо учитывать настройки 2х таймеров, портов, флага прерываний, масок прерываний, кода основной программы, настроек WDT, BOD, шумов питания, внешних цепей, кварцев, банальных опечаток в коде (программа же на асм) и т.д).
Go to the top of the page
 
+Quote Post
Skif_A
сообщение Jul 5 2007, 14:52
Сообщение #9





Группа: Новичок
Сообщений: 4
Регистрация: 10-07-06
Пользователь №: 18 713



На простом учился. Удачно написано несколько маленьких прог (терморегулятор, термометр с отправкой значения через FTDI на ком порт и другие) и одна довольно большая - Мега16 управляет работой часов с термометром (7-ми сегм. индикатор, микросхема часы реального времени, термометр ds18b20. Задействовано два таймера, вся инфа между микросхемами читалась и писалась вручную, с помощью циклов задержек и т.д) это было давно и неправильно, но работает уже не один месяц. А тут казалось бы мелочь, а не получается.
Несколько книг прочитал, несколько пролистал, т.к. ничего кроме перевода даташитов они не представляли.
Наверное усложню себе задачу, прикручу девайс к СОМ порту, буду выводить на экран промежуточные данные, может выловлю баг. Гланды через одно место..... а что делать????
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jul 5 2007, 17:17
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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"
...


Дело не в том, что нам неудобно читать Вашу программу и угадывать её смысл. Главное, что через малый промежуток времени, Вы будете сами с трудом догадываться что Вы хотели написать. Так как у Вас изменятся подходы, взгляды, частично Вы забудите. И будете в голос ругать того безобразника, который это написал. smile.gif

Это конечно мой взгляд на вещи и я Вам его не навязываю.

По существу вопроса.
У меня в последнем изделии есть часы на м48 (будет и на м8 работать) и как минимум на два-три месяца у меня к ним претензий нет. В остальном я советовал бы прислушаться к defunct. И сделать таймер на базе одного таймера. Если же Вам нужны секундные (или любые другие) импульсы на ноге, то выводите их не стесняйтесь. А учёт ведите внутри, а не по внешним событиям. А то заочно бороться с помехами, - как то не катит.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jul 5 2007, 18:35
Сообщение #11


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(SasaVitebsk @ Jul 5 2007, 21:17) *
В остальном я советовал бы прислушаться к defunct. И сделать таймер на базе одного таймера. Если же Вам нужны секундные (или любые другие) импульсы на ноге, то выводите их не стесняйтесь. А учёт ведите внутри, а не по внешним событиям. А то заочно бороться с помехами, - как то не катит.

А каких помехах Вы все говорите ???
В том AN который я привел для примера, с одной ноги mcu(выход одного таймера) сигнал
поступает на вход другого таймера и все 07.gif
расстояние между ногами пару сантиметров в худшем случае,
о каких помехах здесь вобще может быть речь...
или у Вас там непрерывно ядреные взрывы происходят biggrin.gif

P.S. Если все так печально как Вы описываете,
то я непонимаю как вобще соединяются микрухи на частотах >10-20MHz smile.gif
Например как работает память в Вашем компе на частотах 100+ smile.gif
Go to the top of the page
 
+Quote Post
bodja74
сообщение Jul 5 2007, 19:31
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Просто человек еще не научился работать с регистром ASSR ,вот и сделал через одно место lol.gif
При считывании данных с асинхронного таймера есть ньюансы ,но они решаются,
лучше и проще сделать на одном таймере ,как выше советовали.
Go to the top of the page
 
+Quote Post
Skif_A
сообщение Jul 6 2007, 08:12
Сообщение #13





Группа: Новичок
Сообщений: 4
Регистрация: 10-07-06
Пользователь №: 18 713



Цитата(SasaVitebsk @ Jul 5 2007, 20:17) *
Дело не в том, что нам неудобно читать Вашу программу и угадывать её смысл. Главное, что через малый промежуток времени, Вы будете сами с трудом догадываться что Вы хотели написать. Так как у Вас изменятся подходы, взгляды, частично Вы забудите. И будете в голос ругать того безобразника, который это написал. smile.gif


На недостаточные комментарии я уже натыкался, сам себя материл. Потихоньку исправляюсь. Из-за спешки и лени процесс привыкания к подробным комментам идёт медленно но идёт... smile.gif

Цитата(bodja74 @ Jul 5 2007, 22:31) *
Просто человек еще не научился работать с регистром ASSR ,вот и сделал через одно место lol.gif
При считывании данных с асинхронного таймера есть ньюансы ,но они решаются,
лучше и проще сделать на одном таймере ,как выше советовали.

Не понял что именно Вы имели ввиду когда сказали о регистре ASSR. Литературку перечитаю, мож я действительно что-то из его свойств упустил.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jul 6 2007, 19:00
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Skif_A @ Jul 6 2007, 11:12) *
На недостаточные комментарии я уже натыкался, сам себя материл. Потихоньку исправляюсь. Из-за спешки и лени процесс привыкания к подробным комментам идёт медленно но идёт... smile.gif
Не понял что именно Вы имели ввиду когда сказали о регистре ASSR. Литературку перечитаю, мож я действительно что-то из его свойств упустил.


Этот таймер работает асинхронно к основному ядру. Поэтому события регистрируются процессором несколько позже чем они наступают на самом деле. Для точного обнаружения, так сказать правильности существует пара готовностей. Эти готовности находятся в регистре ASSR. Но и это не всё. При работе с прерываниями тоже не всё гладко. Я это указывал в ветке http://electronix.ru/forum/index.php?showtopic=25453.

Но в принципе это не главное. Написать программу может любой. Главное алгоритм выдумать. И сделать это красиво. Чтобы самому нравилось. Короче подход нужен. Именно этому в институте учат. А на каком языке или процессоре писать, особенности переферии - дело третье. А Ваш подход не красивый, - Вы уж извините. Программисту всё равно 3 см или 3м - его это пугает. Потому, что он это проконтролировать не может. Чем меньше внешних связей и внешних элементов, - тем лучше для всех. Если я могу выкинуть из схемы лишний инвертор, но мне придётся добавить дополнительно 150-200 строк программы (при условии конечно, что процессору это не в тягость), то я это сделаю не задумываясь.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 09:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.0154 секунд с 7
ELECTRONIX ©2004-2016