Страница 1 из 1
Atmega8 перезагружается :( Прерывания.
Добавлено: Чт фев 06, 2014 22:18:59
chestnut
День добрый )
Строго не судите - только начинаю. Несложные вещи проблем не вызывали, но тут я столкнулся с необъяснимым
Задача: посчитать импульсы на INT0 и INT1 за промежуток времени (по таймеру) и вывести на LCD3310. Вроде простейшая задача, но.. если не трогать, то работает долго и без проблем, но как только подаю импульсы (кнопка с дребезгом:) ) на вход INT - переодически мк виснет, иногда перезагружается

Иногда почти сразу, иногда через 30-40 секунд, но воспроизводится с лёгкостью
INT-пины на вход выставил, подтяжка только внутренняя, библиотеку дисплея взял с изиэлектроникс.ру..
Что-то совсем простое и глупое упускаю, но не вижу что )
ЗЫ: Компил AVR Studio 5 и Atmel Studio 6.2.
Цепляю си-исходник и hex для продвинутых )))
Re: Atmega8 перезагружается :( Прерывания.
Добавлено: Пт фев 07, 2014 10:56:15
Gudd-Head
Схему бы с платой.
Re: Atmega8 перезагружается :( Прерывания.
Добавлено: Пт фев 07, 2014 11:10:43
WiseLord
Кстати, это ничего, что у Вас переменные imp_tacho и imp_speed, cnt только инкрементируются по прерываниям? И нигде не сбрасываются в 0. То есть, крутятся с переполнением в диапазоне 0-255, периодически отдавая значения на экран.
Re: Atmega8 перезагружается :( Прерывания.
Добавлено: Пт фев 07, 2014 11:15:07
BCluster
Я так понимаю что это тахометр будет. В принципе причина этого видится только одна - помехи. Ресет подтянут? Питание нормальное? Проверяется в машине?
WiseLord писал(а):крутятся с переполнением в диапазоне 0-255
Да я тоже это заметил, но по ходу проект еще не дописан. Там еще много чего другого нет )
Re: Atmega8 перезагружается :( Прерывания.
Добавлено: Пт фев 07, 2014 11:45:07
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 тип.
Re: Atmega8 перезагружается :( Прерывания.
Добавлено: Пт фев 07, 2014 15:24:50
chestnut
Ох блин... это называется "поймите и простите"

я выставлял DDRD |= 1<<PD2..

не спрашивайте зачем, себе в комментарии записал что на вход )))
Ещё оттесщу, но похоже проблема пропала даже без подтяжки ресета (пробовал и с ней и без).
Gudd-Head, WiseLord, BCluster огромное спасибо за ответы и сорри за отнятое время (
Совет на счет подтяжки ресета принял. Плата чуть сложнее тахометра - тахометр + спидометр + 2 датчика температуры DS18B20 + индикатор нейтрали + заряд аккумулятора.
Собрал это все на breadboard, питал от usb (тестер показывал +5,05v, хаб 2.0 с внешним питанием), пару раз ткнул землёй в INT0 - побежали циферки..
Счастливый подрубил к байку.. и получил сыпящиеся перезагрузки (
Сейчас упрощал код чтоб отловить момент подвисания, сузил до INT0 vs дисплей. Прочитал ща ещё раз основы про входы-выходы и прерывания.. и, блин, увидел эту долбаную '1'
WiseLord: про использование первого таймера вместо 0 я ещё раз перечитаю и наверное так и сделаю. Спасибо!
Про алгоритм - я так и делал - прерывания считали импульсы, таймер копировал то, что насчитали прерывания обнуляя счетчики, а главный цикл выводил то, что скопировал таймер
ЗЫ: я смело переполняю переменные и они исправно начинаются с нуля.. это чем-то чревато ?
Ещё раз большое спасибо!
Стыдно то как

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