Atmega8 перезагружается :( Прерывания.

Обсуждаем контроллеры компании Atmel.
Ответить
chestnut
Родился
Сообщения: 3
Зарегистрирован: Вс май 01, 2011 18:16:21

Atmega8 перезагружается :( Прерывания.

Сообщение chestnut »

День добрый )
Строго не судите - только начинаю. Несложные вещи проблем не вызывали, но тут я столкнулся с необъяснимым :roll:

Задача: посчитать импульсы на INT0 и INT1 за промежуток времени (по таймеру) и вывести на LCD3310. Вроде простейшая задача, но.. если не трогать, то работает долго и без проблем, но как только подаю импульсы (кнопка с дребезгом:) ) на вход INT - переодически мк виснет, иногда перезагружается :( Иногда почти сразу, иногда через 30-40 секунд, но воспроизводится с лёгкостью :(

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

ЗЫ: Компил AVR Studio 5 и Atmel Studio 6.2.
Цепляю си-исходник и hex для продвинутых )))
Вложения
Termo6.hex
(6.01 КБ) 492 скачивания
Termo6.c
(3.22 КБ) 517 скачиваний
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Atmega8 перезагружается :( Прерывания.

Сообщение Gudd-Head »

Схему бы с платой.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Atmega8 перезагружается :( Прерывания.

Сообщение WiseLord »

Кстати, это ничего, что у Вас переменные imp_tacho и imp_speed, cnt только инкрементируются по прерываниям? И нигде не сбрасываются в 0. То есть, крутятся с переполнением в диапазоне 0-255, периодически отдавая значения на экран.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Atmega8 перезагружается :( Прерывания.

Сообщение BCluster »

Я так понимаю что это тахометр будет. В принципе причина этого видится только одна - помехи. Ресет подтянут? Питание нормальное? Проверяется в машине?
WiseLord писал(а):крутятся с переполнением в диапазоне 0-255
Да я тоже это заметил, но по ходу проект еще не дописан. Там еще много чего другого нет )
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Atmega8 перезагружается :( Прерывания.

Сообщение WiseLord »

Я это просто к тому, что мало ли что может происходить при этих переполнениях. Вроде бы по коду некритично, но...

Как бы делал это я. Вместо Timer0 взял бы Timer1, так как он 16-битный. Выставил бы CS1[2:0] в 1-0-0 (делитель 256).
Получается, частота тактирования таймера - 4000000/256=15625.

Это значение записал бы в OCR1AH и OCR1AL (Output compare register). И вместо прерывания по переполнению использовал бы прерывание по совпадению. Получилось бы, что прерывание срабатывало бы ровно раз в секунду.

По этому прерыванию текущее значение счётчиков сохранял бы в какие-нибудь глобальные переменные. Сами счетчики тут же бы обнулял, как обнулял бы и значение самого Timer1 (в принципе, вручную обнулять Timer1 не обязательно, можно записать в биты конфигурации COM1A1/COM1B1 = 1, COM1A0/COM1B0 = 0 в регистр TCCR1A, и таймер при достижении 15625 будет обнуляться сам).

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

Суть всего - раз в секунду счётчики что-то насчитывают, и обнуляются. Насчитанное значение выводится на экран.

Если изменение показаний раз в секунду - мало, можно прерывание настроить не на раз в секунду, а, например, на 10 раз в секунду, с соответствующим изменением коэффициентов.

Кстати, imp_tacho и imp_speed типа uint8_t подойдут только если предполагается, что за эту секунду они точно не насчитают больше 255. Если же могут насчитать больше - надо уже брать uint16_t тип.
Реклама
chestnut
Родился
Сообщения: 3
Зарегистрирован: Вс май 01, 2011 18:16:21

Re: Atmega8 перезагружается :( Прерывания.

Сообщение chestnut »

Ох блин... это называется "поймите и простите" :)))
я выставлял DDRD |= 1<<PD2.. :oops: не спрашивайте зачем, себе в комментарии записал что на вход )))
Ещё оттесщу, но похоже проблема пропала даже без подтяжки ресета (пробовал и с ней и без).

Gudd-Head, WiseLord, BCluster огромное спасибо за ответы и сорри за отнятое время (

Совет на счет подтяжки ресета принял. Плата чуть сложнее тахометра - тахометр + спидометр + 2 датчика температуры DS18B20 + индикатор нейтрали + заряд аккумулятора.
Собрал это все на breadboard, питал от usb (тестер показывал +5,05v, хаб 2.0 с внешним питанием), пару раз ткнул землёй в INT0 - побежали циферки.. :)

Счастливый подрубил к байку.. и получил сыпящиеся перезагрузки (
Сейчас упрощал код чтоб отловить момент подвисания, сузил до INT0 vs дисплей. Прочитал ща ещё раз основы про входы-выходы и прерывания.. и, блин, увидел эту долбаную '1' :))

WiseLord: про использование первого таймера вместо 0 я ещё раз перечитаю и наверное так и сделаю. Спасибо!
Про алгоритм - я так и делал - прерывания считали импульсы, таймер копировал то, что насчитали прерывания обнуляя счетчики, а главный цикл выводил то, что скопировал таймер :)

ЗЫ: я смело переполняю переменные и они исправно начинаются с нуля.. это чем-то чревато ?

Ещё раз большое спасибо!
Стыдно то как :roll:
Реклама
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Atmega8 перезагружается :( Прерывания.

Сообщение BCluster »

chestnut писал(а): Gudd-Head, WiseLord, BCluster огромное спасибо за ответы и сорри за отнятое время (
Не за что. Добро пожаловать на форум :)
chestnut писал(а):Стыдно то как
не стоит :)
Ответить

Вернуться в «AVR»