Страница 1 из 2

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

Добавлено: Вт окт 16, 2012 22:20:46
rjhaviy
Имеется PIC16f73, кварц 4 мгц, 4-х разрядный семисегментный индикатор для динамической индикации

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

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

Только прошу... не царапайтесь сразу, я в ентом деле еще новичек :)

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

Добавлено: Ср окт 17, 2012 00:22:15
Antifritz
Я так понимаю, что время свечения одного разряда - 64мкс. Работать оно будет, но возможна паразитная засветка, лучше как-то уменьшить частоту.

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

Добавлено: Ср окт 17, 2012 00:53:00
rjhaviy
Спасибо за ответ! Я тоже думаю, что маловато 64мкс. Добавлю еще счетчик.
Если не ошибаюсь, нужно обновлять 1 раз в 10 миллисекунд (100гц) , хотя для 4-х разрядов частоту надо побольше

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

Добавлено: Ср окт 17, 2012 04:05:48
zero648
Делай прерывание с частотой 400Гц, по 100 Гц на разряд.

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

Добавлено: Ср окт 17, 2012 07:08:55
korsaj
Если прерывание раз в 256 мкс, то и индикация одного разряда будет 256мкс. Можно внутри обработчика прерываний сделать доп счетчик и уже по нему переходить на обработку индикации.

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

Добавлено: Ср окт 17, 2012 07:29:03
BOB51
собственно прерывание генерирует только флаг тайм-сетки, который воспринимается (и сбрасывается) обработчиком дисплея выполняющимся в фоновом режиме :beer:

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

Добавлено: Ср окт 17, 2012 07:44:10
pyzhman
Для красивости частота обновления индикатора должна быть не менее 50 Гц, или 20 мсек. При четырехразрядном дисплее на каждый разряд получается 20/4= 5 мсек. Вот с таким временем и обновляйте. Не более.

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

Добавлено: Ср окт 17, 2012 07:45:40
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
Можно организовать ПП индикации с косвенной адресацией, тогда будет использоватся меньше памяти.

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

Добавлено: Чт окт 18, 2012 01:02:02
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

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

Добавлено: Чт окт 18, 2012 06:59:36
korsaj
Для сравнения лучще использовать команду xor ну или вычитания.
Это даст возможность сравнивать несколько цифр.

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

Добавлено: Пт окт 19, 2012 13:56:26
rjhaviy
Еще раз спасибо за советы! Про сравнение при помощи ХOR знаю, сам ей пользуюсь, и косвенную адресацию тоже. :)

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

Добавлено: Пн ноя 05, 2012 18:35:34
rjhaviy
Есть еще вопрос. Допустим у меня в пребывании генерируется ежесекундное событие, в котором уменьшается на 1 значение моего таймера. Каждые 5 мсек происходит обновление дисплея (регистры индикации + маска разряда). Как лучше поступить? Заполнять регистры индикации прямо в прерывании, или в фоновом режиме? Надеюсь понятно выразил свою мысль... :)

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

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

А вот заполнять буфер нужными значениями необходимо в основной проге...
Тогда обновление дисплея не будет зависеть от происходящего в основной проге...

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

Добавлено: Вт ноя 13, 2012 16:08:53
rjhaviy
У меня в прерывании генерируется секундный импульс, обновляется дисплей и опрашиваются кнопки. Заполнять регистры индикации буду в основной проге, при наступлении секундного события. У меня снова вопрос, нужно синхронизировать как-то основную прогу с прерыванием, что-бы не пропустить очередной секундный импульс,???? Занимать мк ожиданием сек события как-то не хочется...

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

Добавлено: Вт ноя 13, 2012 16:33:42
Аlex
нужно синхронизировать как-то основную прогу с прерыванием
Зачем ? Это 2 разных процесса, пусть выполняются асинхронно (собственно, как и должно быть). А общение между ними - через флаги. Тут установили, там прочитали, когда освободились, и сбросили.

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

Добавлено: Ср ноя 14, 2012 10:22:32
rjhaviy
Спасибо! Попытался включить мозг..... В принципе обработка секундного события в основной проге, не сильно разойдется с его возникновением в прерывании, если не делать задержек. И еще, я решил вместо прерывания при переполнении TMR0, использовать TMR1 и CCP...

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

Добавлено: Ср ноя 14, 2012 10:36:38
Аlex
А CCP зачем ?

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

Добавлено: Ср ноя 14, 2012 11:51:12
rjhaviy
Буду использовать модуль сравнения и прерывание при совпадении. Когда значение в регистрах CCPRxH и CCPRxL совпадет со значением в TMR1H и TMR1L, произойдет прерывание

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

Добавлено: Ср ноя 14, 2012 13:44:04
Аlex
Я так понял, Вы используете PIC16F73 ? Тогда заюзайте модуль таймера TMR2. В этом модуле есть компаратор с аппаратным сбросом. Можно настроить прерывания на любой период тактов, причём сброс и продолжение счёта будет аппаратными.
А 1-ый таймер оставьте, он Вам ещё пригодится :)

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

Добавлено: Ср ноя 14, 2012 15:27:19
rjhaviy
Спасибо за советы, попробую каждый модуль. А про TMR1 я у Заеца прочитал. Да и исходников много, с TMR1.