pic16fxxx динамическая индикация на прерывании (TMR0)

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
rjhaviy
Опытный кот
Сообщения: 762
Зарегистрирован: Чт мар 04, 2010 12:38:27

pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение rjhaviy »

Имеется PIC16f73, кварц 4 мгц, 4-х разрядный семисегментный индикатор для динамической индикации

Хочу использовать прерывание при переполнении TMR0, причем предделитель перенаправить на WDT,
таким образом прерывание будет происходить раз в 256 командных циклов.
При частоте 4 мгц длительность командного цикла будет равна 1 микросекунде, значит прерывание будет выполняться
1 раз в 256 микросек. или 0,256 миллисек.

Нужно ли будет делать дополнительный счетчик, или можно переключать разряды индикатора с такой, достаточно высокой частотой?

Только прошу... не царапайтесь сразу, я в ентом деле еще новичек :)
Против лома - нет приема! ...разве что, Закона Ома!
Лом ужасен и велик! Но... хороший проводник!
Реклама
Аватара пользователя
Antifritz
Прорезались зубы
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение Antifritz »

Я так понимаю, что время свечения одного разряда - 64мкс. Работать оно будет, но возможна паразитная засветка, лучше как-то уменьшить частоту.
Реклама
Аватара пользователя
rjhaviy
Опытный кот
Сообщения: 762
Зарегистрирован: Чт мар 04, 2010 12:38:27

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение rjhaviy »

Спасибо за ответ! Я тоже думаю, что маловато 64мкс. Добавлю еще счетчик.
Если не ошибаюсь, нужно обновлять 1 раз в 10 миллисекунд (100гц) , хотя для 4-х разрядов частоту надо побольше
Против лома - нет приема! ...разве что, Закона Ома!
Лом ужасен и велик! Но... хороший проводник!
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение zero648 »

Делай прерывание с частотой 400Гц, по 100 Гц на разряд.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
korsaj
Потрогал лапой паяльник
Сообщения: 330
Зарегистрирован: Чт июн 23, 2011 07:55:51

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение korsaj »

Если прерывание раз в 256 мкс, то и индикация одного разряда будет 256мкс. Можно внутри обработчика прерываний сделать доп счетчик и уже по нему переходить на обработку индикации.
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение BOB51 »

собственно прерывание генерирует только флаг тайм-сетки, который воспринимается (и сбрасывается) обработчиком дисплея выполняющимся в фоновом режиме :beer:
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение pyzhman »

Для красивости частота обновления индикатора должна быть не менее 50 Гц, или 20 мсек. При четырехразрядном дисплее на каждый разряд получается 20/4= 5 мсек. Вот с таким временем и обновляйте. Не более.
Docendo discimus
Аватара пользователя
korsaj
Потрогал лапой паяльник
Сообщения: 330
Зарегистрирован: Чт июн 23, 2011 07:55:51

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение korsaj »

Вот пример с доп счетчиком.
Спойлер

Код: Выделить всё

	org	0x04	
	movwf	W_temp			;Сохраняем аккамулятор
	swapf	STATUS,W
	movwf	STATUS_temp
	btfsc	INTCON,T0IF		;Прерывание по TMR0?
	goto	ClearIntTMR0	            ;Да переход на обработчик прерывания
endInt
	swapf	STATUS_temp,W
	movwf	STATUS
	swapf	W_temp,F		
	swapf	W_temp,W		;Востанавливаем значение аккамалятора
	retfie

-----------------------------------------------------------------------------------------------------------
ClearIntTMR0

	bcf		INTCON,T0IF		;Очишаем флаг прерывания по TMR0
	Bank_0

	incf	Tc,F

	movf	Tc,W
	xorlw	.10
	btfsc	STATUS,Z
	goto	Seg1			;Переход к обработке первого сигмента

	movf	Tc,W
	xorlw	.20
	btfsc	STATUS,Z
	goto	Seg2			;Переход к обработке второго сигмента

	movf	Tc,W
	xorlw	.30
	btfsc	STATUS,Z
	goto	Seg3			;Переход к обработке третьего сигмента

	movf	Tc,W
	xorlw	.40
	btfsc	STATUS,Z
	goto	Seg4			;Переход к обработке пчетвертого сигмента

	goto	endInt
---------------------------------------------------------------------------------------------------------
Seg4
   clrf       Tc
   -  -  -
   -  -  -
   -  -  -
	goto	endInt
Можно организовать ПП индикации с косвенной адресацией, тогда будет использоватся меньше памяти.
Аватара пользователя
rjhaviy
Опытный кот
Сообщения: 762
Зарегистрирован: Чт мар 04, 2010 12:38:27

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение rjhaviy »

Всем спасибо за советы! У меня есть еще вопрос.
http://piclist.ru/S-ZERO-ERR-TIMER-RUS/ ... R-RUS.html
Секундный таймер с нулевой погрешностью!

Думаю, а можно-ли на одном прерывании (TMR0) сделать, например, таймер десятичного счета + динамическая индикация. Главное, чтобы обработчик успел все циклов так за 250.

Была мысль завести еще один счетчик:

Код: Выделить всё

    incf    display_counter,w
    andlw    0x07
    movwf    display_counter
    skpz
    goto  xxxxx;
;
тут будем обновлять, уже за 2048 циклов, т.е. за 2,048 мсек, если не ошибаюсь, получается 488,28125 гц (на  4 разряда)
Если 488,28125 гц много, то можно сделать 244,140625 гц (4,096 мсек), если заменить andlw 0x07 на andlw 0x0F
Против лома - нет приема! ...разве что, Закона Ома!
Лом ужасен и велик! Но... хороший проводник!
Аватара пользователя
korsaj
Потрогал лапой паяльник
Сообщения: 330
Зарегистрирован: Чт июн 23, 2011 07:55:51

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение korsaj »

Для сравнения лучще использовать команду xor ну или вычитания.
Это даст возможность сравнивать несколько цифр.
Аватара пользователя
rjhaviy
Опытный кот
Сообщения: 762
Зарегистрирован: Чт мар 04, 2010 12:38:27

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение rjhaviy »

Еще раз спасибо за советы! Про сравнение при помощи ХOR знаю, сам ей пользуюсь, и косвенную адресацию тоже. :)
Против лома - нет приема! ...разве что, Закона Ома!
Лом ужасен и велик! Но... хороший проводник!
Аватара пользователя
rjhaviy
Опытный кот
Сообщения: 762
Зарегистрирован: Чт мар 04, 2010 12:38:27

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение rjhaviy »

Есть еще вопрос. Допустим у меня в пребывании генерируется ежесекундное событие, в котором уменьшается на 1 значение моего таймера. Каждые 5 мсек происходит обновление дисплея (регистры индикации + маска разряда). Как лучше поступить? Заполнять регистры индикации прямо в прерывании, или в фоновом режиме? Надеюсь понятно выразил свою мысль... :)
Против лома - нет приема! ...разве что, Закона Ома!
Лом ужасен и велик! Но... хороший проводник!
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение HHIMERA »

Правильно - организовать буфер по количеству разрядов... рулить обновлением по прерыванию - вытащить значение из буфера, затолкать его в порт управления сегментами, выставить нужный разряд и смыться из прерывания...
В следующем прерывании - взять данные из буфера для следующего разряда, затолкать его в порт управления сегментами, выставить следующий разряд и опять смыться из прерывания...

А вот заполнять буфер нужными значениями необходимо в основной проге...
Тогда обновление дисплея не будет зависеть от происходящего в основной проге...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
rjhaviy
Опытный кот
Сообщения: 762
Зарегистрирован: Чт мар 04, 2010 12:38:27

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение rjhaviy »

У меня в прерывании генерируется секундный импульс, обновляется дисплей и опрашиваются кнопки. Заполнять регистры индикации буду в основной проге, при наступлении секундного события. У меня снова вопрос, нужно синхронизировать как-то основную прогу с прерыванием, что-бы не пропустить очередной секундный импульс,???? Занимать мк ожиданием сек события как-то не хочется...
Против лома - нет приема! ...разве что, Закона Ома!
Лом ужасен и велик! Но... хороший проводник!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение Аlex »

нужно синхронизировать как-то основную прогу с прерыванием
Зачем ? Это 2 разных процесса, пусть выполняются асинхронно (собственно, как и должно быть). А общение между ними - через флаги. Тут установили, там прочитали, когда освободились, и сбросили.
Аватара пользователя
rjhaviy
Опытный кот
Сообщения: 762
Зарегистрирован: Чт мар 04, 2010 12:38:27

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение rjhaviy »

Спасибо! Попытался включить мозг..... В принципе обработка секундного события в основной проге, не сильно разойдется с его возникновением в прерывании, если не делать задержек. И еще, я решил вместо прерывания при переполнении TMR0, использовать TMR1 и CCP...
Против лома - нет приема! ...разве что, Закона Ома!
Лом ужасен и велик! Но... хороший проводник!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение Аlex »

А CCP зачем ?
Аватара пользователя
rjhaviy
Опытный кот
Сообщения: 762
Зарегистрирован: Чт мар 04, 2010 12:38:27

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение rjhaviy »

Буду использовать модуль сравнения и прерывание при совпадении. Когда значение в регистрах CCPRxH и CCPRxL совпадет со значением в TMR1H и TMR1L, произойдет прерывание
Против лома - нет приема! ...разве что, Закона Ома!
Лом ужасен и велик! Но... хороший проводник!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение Аlex »

Я так понял, Вы используете PIC16F73 ? Тогда заюзайте модуль таймера TMR2. В этом модуле есть компаратор с аппаратным сбросом. Можно настроить прерывания на любой период тактов, причём сброс и продолжение счёта будет аппаратными.
А 1-ый таймер оставьте, он Вам ещё пригодится :)
Аватара пользователя
rjhaviy
Опытный кот
Сообщения: 762
Зарегистрирован: Чт мар 04, 2010 12:38:27

Re: pic16fxxx динамическая индикация на прерывании (TMR0)

Сообщение rjhaviy »

Спасибо за советы, попробую каждый модуль. А про TMR1 я у Заеца прочитал. Да и исходников много, с TMR1.
Против лома - нет приема! ...разве что, Закона Ома!
Лом ужасен и велик! Но... хороший проводник!
Ответить

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