Поклонники продукции Microchip Technology Inc тусуются тут.
Вт окт 16, 2012 22:20:46
Имеется PIC16f73, кварц 4 мгц, 4-х разрядный семисегментный индикатор для динамической индикации
Хочу использовать прерывание при переполнении TMR0, причем предделитель перенаправить на WDT,
таким образом прерывание будет происходить раз в 256 командных циклов.
При частоте 4 мгц длительность командного цикла будет равна 1 микросекунде, значит прерывание будет выполняться
1 раз в 256 микросек. или 0,256 миллисек.
Нужно ли будет делать дополнительный счетчик, или можно переключать разряды индикатора с такой, достаточно высокой частотой?
Только прошу... не царапайтесь сразу, я в ентом деле еще новичек
Ср окт 17, 2012 00:22:15
Я так понимаю, что время свечения одного разряда - 64мкс. Работать оно будет, но возможна паразитная засветка, лучше как-то уменьшить частоту.
Ср окт 17, 2012 00:53:00
Спасибо за ответ! Я тоже думаю, что маловато 64мкс. Добавлю еще счетчик.
Если не ошибаюсь, нужно обновлять 1 раз в 10 миллисекунд (100гц) , хотя для 4-х разрядов частоту надо побольше
Ср окт 17, 2012 04:05:48
Делай прерывание с частотой 400Гц, по 100 Гц на разряд.
Ср окт 17, 2012 07:08:55
Если прерывание раз в 256 мкс, то и индикация одного разряда будет 256мкс. Можно внутри обработчика прерываний сделать доп счетчик и уже по нему переходить на обработку индикации.
Ср окт 17, 2012 07:29:03
собственно прерывание генерирует только флаг тайм-сетки, который воспринимается (и сбрасывается) обработчиком дисплея выполняющимся в фоновом режиме
Ср окт 17, 2012 07:44:10
Для красивости частота обновления индикатора должна быть не менее 50 Гц, или 20 мсек. При четырехразрядном дисплее на каждый разряд получается 20/4= 5 мсек. Вот с таким временем и обновляйте. Не более.
Ср окт 17, 2012 07:45:40
Вот пример с доп счетчиком.
Спойлер
- Код:
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
Можно организовать ПП индикации с косвенной адресацией, тогда будет использоватся меньше памяти.
Чт окт 18, 2012 01:02:02
Всем спасибо за советы! У меня есть еще вопрос.
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
Чт окт 18, 2012 06:59:36
Для сравнения лучще использовать команду xor ну или вычитания.
Это даст возможность сравнивать несколько цифр.
Пт окт 19, 2012 13:56:26
Еще раз спасибо за советы! Про сравнение при помощи ХOR знаю, сам ей пользуюсь, и косвенную адресацию тоже.
Пн ноя 05, 2012 18:35:34
Есть еще вопрос. Допустим у меня в пребывании генерируется ежесекундное событие, в котором уменьшается на 1 значение моего таймера. Каждые 5 мсек происходит обновление дисплея (регистры индикации + маска разряда). Как лучше поступить? Заполнять регистры индикации прямо в прерывании, или в фоновом режиме? Надеюсь понятно выразил свою мысль...
Пн ноя 05, 2012 19:00:12
Правильно - организовать буфер по количеству разрядов... рулить обновлением по прерыванию - вытащить значение из буфера, затолкать его в порт управления сегментами, выставить нужный разряд и смыться из прерывания...
В следующем прерывании - взять данные из буфера для следующего разряда, затолкать его в порт управления сегментами, выставить следующий разряд и опять смыться из прерывания...
А вот заполнять буфер нужными значениями необходимо в основной проге...
Тогда обновление дисплея не будет зависеть от происходящего в основной проге...
Вт ноя 13, 2012 16:08:53
У меня в прерывании генерируется секундный импульс, обновляется дисплей и опрашиваются кнопки. Заполнять регистры индикации буду в основной проге, при наступлении секундного события. У меня снова вопрос, нужно синхронизировать как-то основную прогу с прерыванием, что-бы не пропустить очередной секундный импульс,???? Занимать мк ожиданием сек события как-то не хочется...
Вт ноя 13, 2012 16:33:42
нужно синхронизировать как-то основную прогу с прерыванием
Зачем ? Это 2 разных процесса, пусть выполняются асинхронно (собственно, как и должно быть). А общение между ними - через флаги. Тут установили, там прочитали, когда освободились, и сбросили.
Ср ноя 14, 2012 10:22:32
Спасибо! Попытался включить мозг..... В принципе обработка секундного события в основной проге, не сильно разойдется с его возникновением в прерывании, если не делать задержек. И еще, я решил вместо прерывания при переполнении TMR0, использовать TMR1 и CCP...
Ср ноя 14, 2012 10:36:38
А CCP зачем ?
Ср ноя 14, 2012 11:51:12
Буду использовать модуль сравнения и прерывание при совпадении. Когда значение в регистрах CCPRxH и CCPRxL совпадет со значением в TMR1H и TMR1L, произойдет прерывание
Ср ноя 14, 2012 13:44:04
Я так понял, Вы используете PIC16F73 ? Тогда заюзайте модуль таймера TMR2. В этом модуле есть компаратор с аппаратным сбросом. Можно настроить прерывания на любой период тактов, причём сброс и продолжение счёта будет аппаратными.
А 1-ый таймер оставьте, он Вам ещё пригодится
Ср ноя 14, 2012 15:27:19
Спасибо за советы, попробую каждый модуль. А про TMR1 я у Заеца прочитал. Да и исходников много, с TMR1.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.