Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

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

Вт окт 16, 2012 22:20:46

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

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

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

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

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

Ср окт 17, 2012 00:22:15

Я так понимаю, что время свечения одного разряда - 64мкс. Работать оно будет, но возможна паразитная засветка, лучше как-то уменьшить частоту.

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

Ср окт 17, 2012 00:53:00

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

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

Ср окт 17, 2012 04:05:48

Делай прерывание с частотой 400Гц, по 100 Гц на разряд.

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

Ср окт 17, 2012 07:08:55

Если прерывание раз в 256 мкс, то и индикация одного разряда будет 256мкс. Можно внутри обработчика прерываний сделать доп счетчик и уже по нему переходить на обработку индикации.

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

Ср окт 17, 2012 07:29:03

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

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

Ср окт 17, 2012 07:44:10

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

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

Ср окт 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


Можно организовать ПП индикации с косвенной адресацией, тогда будет использоватся меньше памяти.

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

Чт окт 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

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

Чт окт 18, 2012 06:59:36

Для сравнения лучще использовать команду xor ну или вычитания.
Это даст возможность сравнивать несколько цифр.

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

Пт окт 19, 2012 13:56:26

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

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

Пн ноя 05, 2012 18:35:34

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

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

Пн ноя 05, 2012 19:00:12

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

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

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

Вт ноя 13, 2012 16:08:53

У меня в прерывании генерируется секундный импульс, обновляется дисплей и опрашиваются кнопки. Заполнять регистры индикации буду в основной проге, при наступлении секундного события. У меня снова вопрос, нужно синхронизировать как-то основную прогу с прерыванием, что-бы не пропустить очередной секундный импульс,???? Занимать мк ожиданием сек события как-то не хочется...

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

Вт ноя 13, 2012 16:33:42

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

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

Ср ноя 14, 2012 10:22:32

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

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

Ср ноя 14, 2012 10:36:38

А CCP зачем ?

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

Ср ноя 14, 2012 11:51:12

Буду использовать модуль сравнения и прерывание при совпадении. Когда значение в регистрах CCPRxH и CCPRxL совпадет со значением в TMR1H и TMR1L, произойдет прерывание

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

Ср ноя 14, 2012 13:44:04

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

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

Ср ноя 14, 2012 15:27:19

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