Форум » Для начинающих. » Динамическая индикация » Ответить

Динамическая индикация

slv: У меня вопрос: Можно ли использовать для реализации динамической индикации прерывания от таймера? Урок читал- пока не въехал, сложно все-2 счетчика... С прерыванием от таймера как-то проще или я чего-то не понимаю?

Ответов - 52, стр: 1 2 All

Алексей: Да, с прерыванием от таймера проще. Настроил таймер как надо, в прерывании написал программку и забыл. А вот без прерывания все гораздо сложнее. там и надо организовывать два счетчика(Малое кольцо индикации, этот счетчик отвечает за время горения одного разряда и большое кольцо, это полный цикл индикации), плюс ко всему надо зоботится еще и о времении индикации одного разряда, переходить на следующий разряд, в нем позаботится о таком же времени и ко всему прочему не надо забывать еще и о выполнении основной программы. Без прерываний жизнь становится очень тяжелой. Обо всем надо помнить, все нужно высчитывать... Если умеете работать с прерываниями, используйте конечно их. Если нет, то что конкретно непонятно в уроке.

MAZ: А почему нельзя? Все можно. Но не интересно. Потратье время на HD44780 и не пожелеете. Я думаю это даже проще динамической индикации. Хотя можно помучится для общего развития, все на пользу.

kroko: MAZ пишет: Потратье время на HD44780 и не пожелеете Человек только начинает осваивать пики, а вы ему сразу 44780 :) Согласен, с ним проще работать в программе когда все уже изучено, но начинать все-таки будет легче с динамической индикации. К тому же мы не знаем, может человеку нужно всего-то вывести 2 цифры и такой "монстр" ему просто ни к чему :)


MAZ: Извините, а что там сложного. И какой там "монстр". Чудный котенок, зеленоглазый и ласковый. А вот динамика - это монстр, победить которого нужно, я не спорю. Но лучше держаться подальше. Если хотите, дам иницилизацию и команды, а потом сравните, с динамической с её мерцанием, кольцами и т.д.

kroko: Кстати динамическая индикация в открытой части самоучителя, а 44780 в закрытой - еще один аргумент в пользу динамики :)

Dmitry Dubrovenko: MAZ пишет: Чудный котенокОно, конечно, да, но иногда, необходимо использовать именно 7-ми сегментные.

slv: Cпасибо всем.

Пётр: slv пишет: Можно ли использовать для реализации динамической индикации прерывания от таймера Можно, и даже нужно, поскольку так намного проще реализовать динамическую индикацию. Вот пример [pre]; LIST P=16F84a __CONFIG 03FF1H ;+/ Спец. регистры option_reg equ 01h tmr0 equ 01h pcl equ 02h status equ 03h porta equ 05h portb equ 06h trisa equ 05h trisb equ 06h intcon equ 0bh eedata equ 08h eeadr equ 09h eecon1 equ 08h eecon2 equ 09h ;-/ ;+/ Переменные count equ 0ch ; Счётчик w_temp equ 0dh ; Временная ячейка для регистра "W" s_temp equ 0eh ; Временная ячейка для регистра "Status" ind1 equ 0fh ; Данные, отображаемые в первом (то что справа) разряде индикации ind2 equ 10h ; Данные, отображаемые во втором разряде индикации ind3 equ 11h ; Данные, отображаемые в третьем разряде индикации ind4 equ 12h ;-/ Данные, отображаемые в четвёртом (тот что слева) разряде индикации ; Биты регистров rp0 equ 5 ; Переключатель банков памяти c equ 0 z equ 2 w equ 0 f equ 1 t0if equ 0 ; Флаг прерываний от таймера TMR0 org 0 goto start ; Переход на начало основной программы org 4 ; Начало подпрограммы прерываний от таймера TMR0 movwf w_temp ; Сохранили аккумулятор во временную ячейку swapf status,W ; Загрузили регистр STATUS в аккумулятор, со сменой полубайтов movwf s_temp ; Сохранили во временную ячейку bcf status,rp0 ; Выбрали 0-й банк clrf portb ; Устанавливаем на всех выводах portb логические нули decf count,f ; Инкриминируем счётчик movlw 3 ; andwf count,w ; Обнуляем шесть старших бит регистра count, результат помешается в аккумулятор addwf pcl,f ; Увеличиваем на значение аккумулятора, счётчика инструкций goto ind_m1 ; Переходим на индикацию 1 разряда goto ind_m2 ; Переходим на индикацию 2 разряда goto ind_m3 ; Переходим на индикацию 3 разряда goto ind_m4 ; Переходим на индикацию 4 разряда pr_exit bcf intcon,t0if ; Сбрасываем флаг прерывания от таймера TMR0 swapf s_temp,W ; Загрузили регистр STATUS в аккумулятор, со сменой полубайтов movwf status ; Восстановили регистр STATUS swapf w_temp,F swapf w_temp,W ; Восстановили аккумулятор retfie ; Возврат из прерывания ;+/ *** Индикация** ; Первый разряд ind_m1 movfw ind1 ; Загружаем данные из регистра ind1 в аккумулятор movwf portb ; Переписываем данные из аккумулятора в portb bsf portb,4 ; Устанавливаем логическую единицу на выводе 10 контроллера goto pr_exit ; Второй разряд ind_m2 movfw ind2 ; Загружаем данные из регистра ind2 в аккумулятор movwf portb ; Переписываем данные из аккумулятора в portb bsf portb,5 ; Устанавливаем логическую единицу на выводе 11 контроллера goto pr_exit ; Третий разряд ind_m3 movfw ind3 ; Загружаем данные из регистра ind3 в аккумулятор movwf portb ; Переписываем данные из аккумулятора в portb bsf portb,6 ; Устанавливаем логическую единицу на выводе 12 контроллера goto pr_exit ; Четвёртый разряд ind_m4 movfw ind4 ; Загружаем данные из регистра ind4 в аккумулятор movwf portb ; Переписываем данные из аккумулятора в portb bsf portb,7 ; Устанавливаем логическую единицу на выводе 13 контроллера goto pr_exit ;-/ ;**** Начало программы**** start bsf status,rp0 ; Переходим в первый банк movlw b'10000011' movwf option_reg ; Выключаем подтягивающие регистры, подключаем предделитель к таймеру TMR0, устанавливаем коэффициент деления предделителя равным 16. clrf trisb ; Все выводы порта Б работают на вывод информации bcf status,rp0 ; Переходим в нулевой банк movlw b'10100000' movwf intcon ; Разрешаем прерывания от таймера TMR0 ; Записываем данные в ячейки индикации для демонстрации работы movlw 1 movwf ind1 movlw 2 movwf ind2 movlw 3 movwf ind3 movlw 4 movwf ind4 snova goto snova ; "Вечное" кольцо end ; Конец программы [/pre] Контроллер PIC16F84A, кварц на 4МГц, индикатор: 4-ёх разрядный с общими анодами. К 4-ём младшим (0-3) разрядам порта Б следует подключить дешифратор типа К176ИД2 К старшим (4-7) нужно подключать аноды разрядов индикатора. Младший (тот что справа) подключается к выводу 10, ПИКа, а старший к выводу 13 ПИКа. Данные, выводимые на индикацию, следует помещать в регистры ind1-ind4 (ind1 - младший разряд). Числа должны быть в пределах 0-9.

MAZ: Когда ,иногда, надо использовать динамическую индикацию, я не знаю. Но на терпелся от всяких "загагулин" на 7 сегментном. Это типа режимы, и гадай, или зубри. А что же у нас сейчас показывает? Часы конечно можно, а хочется и календарь туда и температуру дом/улица. Можно с динамической, но это уже все больше маразм. Извиняюсь, высказал свое мнение. Убедите, поменяю.

slv: Пытаюсь написать программу, которая преобразунт байт двоичного числа в BCD, потом в код семисегментного индикатора и выводит на 2 индикаторы число единиц и число десятков. Индикация динамическая, используются транзисторные ключи. В тексте программы есть вопрос. Используется прерывание от TMR1. Помогите, пожалуйста. list p=16f877 #include <P16F877.INC> DES equ 20h ODIN equ 21h A equ 22h RBIN EQU 23h RHAN EQU 24h RDEC EQU 25h RSIM EQU 26h ;----------------------------- ORG 0x000 goto main ORG 0x004 bcf PIR1, TMR1IF movlw b'10001111' movwf TMR1L movlw b'11111111' movwf TMR1H ;--------------------- btfsc A,0 goto L1 movf DES,0 clrf PORTC movwf PORTB movlw b'10' movwf PORTC clrf A bsf A,0 goto NEXT L1 movf ODIN,0 clrf PORTC movwf PORTB movlw b'01' movwf PORTC clrf A bsf A,1 NEXT retfie ;--------------- main bsf STATUS,RP0 clrf TRISB clrf TRISC bcf STATUS, RP0 clrf PORTB clrf PORTC clrf A bsf A,0 ; movlw b'01101101' ; movwf DES ; movlw b'01100110' ; movwf ODIN ;--------------------- clrf TMR1L clrf TMR1H clrf PIR1 movlw b'11111111' movwf TMR1H movlw b'10001111' movwf TMR1L movlw b'0001001' movwf T1CON bsf STATUS,RP0 bsf PIE1,TMR1IE bcf STATUS,RP0 bsf INTCON,GIE bsf INTCON,PEIE ;------------------------ clrf RBIN clrf RHAN clrf RDEC clrf RSIM ;------------------------ movlw .234 movwf RBIN CON_100 movlw .100 subwf RBIN, W btfss STATUS, C goto CON_10 incf RHAN, f movwf RBIN goto CON_100 ;------------------------ CON_10 movlw .10 subwf RBIN,W btfss STATUS, C goto END_CON incf RDEC, f movwf RBIN goto CON_10 ;----------------------- END_CON movf RBIN, W movwf RSIM ;----------------------- movf RSIM,0 goto Tabl; как мне сделать, чтобы после выполнения этой команды программа вернулась с константой не на метку main, ;а на следующую за ней команду: movwf ODIN movwf ODIN movf RDEC goto Tabl movwf DES ;----------------------- Tabl addwf PCL,F retlw b'00111111' retlw b'00000110' retlw b'01011011' retlw b'01001111' retlw b'01100110' retlw b'01101101' retlw b'01111101' retlw b'00000111' retlw b'01111111' retlw b'01101111' ;---------------------------- goto$ END

kroko: Используйте call вместо goto (ответ на ваш вопрос).

slv: Спасибо, kroko.

Dmitry Dubrovenko: MAZ пишет: Когда ,иногдаHD44780 Вы на стенку не повесите.

MAZ: А почему? Я не имею, этот контроллер, я имею в виду другие LCD индикаторы. Очень красиво, только, конечно дорого. Подумал, наверно правы. Хотя только не с сегментные индикаторы, а матричные, знаете, такие в поездах бывают, бегущие строки на них делают. Можно и динамику и статику. Информационные возможности огромные, хоть картины рисуй. Цена тоже неплохая. Но на стену точно повесишь. С новым годом

Alberto: Dmitry Dubrovenko пишет: HD44780 Вы на стенку не повесите. странно , а я повесил. Часы + температура в комнате и на улице.

Dmitry Dubrovenko: Alberto пишет: а я повесилДа, повесить-то, конечно, можно. Только будет ли что-нибудь видно метров с трёх хотя бы.

Пётр: Ребята, тема называется Динамическая индикация, а что обсуждать начали! Вроде совсем недавно Вы же кричали что на форуме полный бардак, так зачем его опять устраивать?

Alberto: Пётр пишет: а что обсуждать начали! очень сложно обсуждать что-то и не уклониться в сторону. Хотя замечание верное.

MAZ: В споре, рождается истина. Но мы здесь динамическую и обсуждали, вернее, кто-то критиковал. Если кто не знает, что это за зверь, начнет читать и интересоваться. А чего мужики копья ломают? Вопросы будут. А динамическая индикация без индикатора, как машина без колес. Вот и обсуждаем. По моему, так.

Пётр: Так то оно так, только если человеку понадобилась динамическая индикация, то зачем ему навязывать HD44780? Ведь соответствующая тема уже есть. А не лучше ему помощь разобраться с динамической индикацией?

MAZ: А какая помощь? Помоему в открытой части все написано. Куда лучше. Бери да читай. Пока Сам не дойдешь, никто не поможет. Тут другой вопрос, хочу или не хочу. Хотя человек спрашивал: Можно ли по прерыванию делать динамическую? Я не хочу повторять свой ответ. Но дал совет, а не навязывал. Мне кажется, это не плохо. Ну и по спорили. Конкретный вопрос, конкретный ответ. Можно? Да,можно. Если бы спросил, от чего делать прерывание, тоже можно поспорить. Но это уже не динамическая индикация, а прерывание. Все связано в этом мире . А как по другому?. Если я увидел слово "прерывание" мне надо бежать на другую ветку. Не дай бог, упомянуть не по теме. Или HD44780. Странно и запутанно, согласитесь.

dosikus: MAZ пишет: Можно ли по прерыванию делать динамическую? Есть собственная разработка движка динамической индикации именно на прерывании TMR0 . Собственно сам принцип (точней кусок реализации) выложен в моей статье в "РАДИО". Но если захотите , и администрация будет не против ,могу подробно изложить все на С , на асме то же можно но лень . Способ достаточно универсален и может быть применим практически к любому LED индикатору с любым числом разрядов ( при небольшой доработке).

playme: Доброго времени суток. Поставил задачу: отображение числа 101010.10 на 8 индикаторах соответственно. За основу взят шаблон, приведенный в самоучителе. Проблема заключается в том, что вместо вышеприведенного числа отображается число 684300.90. Ошибка где-то в подпрограмме преобразования двоичных чисел в двоично-десятичные. Та же проблема у меня возникла и при отображении на 6 и 4 знакоместах. Единственная ситуация когда заготовка работает (у меня) - это вывод на 2 индикатора. У меня получилось вывести двухбайтовое число только применив два раза подряд программу преобразования одного байта, но наверняка просто есть нюанс, который я не заметил. Привожу две программы. Первая отображение числа 101010.10, которая не работает и вторую - отображение числа 1.0, которая работает. Прошу помощи в решении проблемы. Заранее спасибо. [pre] Dinam8Seg LIST p=16f876a ; __CONFIG 03FF1h ; ;-------------------------------------------------------------------- ; Регистры специального назначения ;-------------------------------------------------------------------- INDF equ 00h ; PC equ 02h ; STATUS equ 03h ; FSR equ 04h ; PORTA equ 05h ; PORTB equ 06h ; PORTC equ 07h ; TRISA equ 05h ; TRISB equ 06h ; TRISC equ 07h ; ;-------------------------------------------------------------------- ; Регистры общего назначения ;-------------------------------------------------------------------- LED0 equ 20h ; LED1 equ 21h ; LED2 equ 22h ; LED3 equ 23h ; LED4 equ 24h ; LED5 equ 25h ; LED6 equ 26h ; LED7 equ 27h ; Index equ 28h ; Count equ 29h ; Temp equ 2Ah ; Mem equ 2Bh ; TimerL equ 2Ch ; TimerM equ 2Dh ; TimerH equ 2Eh ; TimerHH equ 2Fh ; ;-------------------------------------------------------------------- ; Векторы ;-------------------------------------------------------------------- org 0 ; goto START ; ;-------------------------------------------------------------------- ; Основная часть программы ;-------------------------------------------------------------------- START bsf STATUS,5 ; clrf TRISB ; clrf TRISC ; bcf STATUS,5 ; ;==================================================================== ; Преобразование двоичных чисел в двоично-десятичные ;==================================================================== ;-------------------------------------------------------------------- ; Формирование числа для вывода на индикацию ;-------------------------------------------------------------------- MAIN movlw .10 ; movwf TimerL ; movwf TimerM ; movwf TimerH ; movwf TimerHH ; ;-------------------------------------------------------------------- ; Подготовительные операции ;-------------------------------------------------------------------- Bin2_10 bcf STATUS,0 ; movlw .32 ; movwf Count ; clrf LED0 ; clrf LED1 ; clrf LED2 ; clrf LED3 ; clrf LED4 ; clrf LED5 ; clrf LED6 ; clrf LED7 ; ;-------------------------------------------------------------------- ; Циклический сдвиг влево ;-------------------------------------------------------------------- loop16 rlf TimerL,1 ; rlf TimerM,1 ; rlf TimerH,1 ; rlf TimerHH,1 ; rlf LED0,1 ; rlf LED1,1 ; rlf LED2,1 ; rlf LED3,1 ; decfsz Count,1 ; goto adjDEC ; ;-------------------------------------------------------------------- ; Поразрядное распределение содержимого регистров LED0...3 по ; младшим полубайтам регистров LED0...7 ;-------------------------------------------------------------------- swapf LED3,0 ; andlw 0Fh ; movwf LED7 ; movfw LED3 ; andlw 0Fh ; movwf LED6 ; swapf LED2,0 ; andlw 0Fh ; movwf LED5 ; movfw LED2 ; andlw 0Fh ; movwf LED4 ; swapf LED1,0 ; andlw 0Fh ; movwf LED3 ; movfw LED1 ; andlw 0Fh ; movwf LED2 ; swapf LED0,0 ; andlw 0Fh ; movwf LED1 ; movfw LED0 ; andlw 0Fh ; movwf LED0 ; goto Exit_Tr ; ;-------------------------------------------------------------------- ; Запись в регистр FSR адресов регистров LED0...3 для дальнейшей ; косвенной адресации ;-------------------------------------------------------------------- adjDEC movlw LED0 ; movwf FSR ; call adjBCD ; movlw LED1 ; movwf FSR ; call adjBCD ; movlw LED2 ; movwf FSR ; call adjBCD ; movlw LED3 ; movwf FSR ; call adjBCD ; goto loop16 ; ;-------------------------------------------------------------------- ; Основные операции преобразования двоичных чисел в двоично-дес ;-------------------------------------------------------------------- adjBCD movlw 3 ; addwf 0,0 ; movwf Mem ; btfsc Mem,3 ; movwf 0 ; movlw 30 ; addwf 0,0 ; movwf Mem ; btfsc Mem,7 ; movwf 0 ; retlw 0 ; ;-------------------------------------------------------------------- ; Подготовка счетчика количества малых колец индикации Index к ; началу полного цикла динамической индикации ;-------------------------------------------------------------------- Exit_Tr clrf Index ; ;-------------------------------------------------------------------- ; Предварительная закладка количества больших колец индикации, ; которое нужно "пройти" за один полный цикл динамической индикации ; в регистре Count ;-------------------------------------------------------------------- movlw 1 ; movwf Count ; ;-------------------------------------------------------------------- ; Использование косвенной адресации при работе с таблицей данных ;-------------------------------------------------------------------- CYCLE movlw LED0 ; addwf Index,0 ; ;-------------------------------------------------------------------- ; Косвенная адресация ;-------------------------------------------------------------------- movwf FSR ; movf INDF,0 ; call TABLE ; ;-------------------------------------------------------------------- ; Установка запятой ;-------------------------------------------------------------------- movwf Temp ; movlw 2 ; bsf STATUS,2 ; subwf Index,0 ; btfss STATUS,2 ; goto No_Dot ; bsf Temp,7 ; ;-------------------------------------------------------------------- ; Вывод десятичной цифры на индикацию ;-------------------------------------------------------------------- No_Dot movf Temp,0 ; movwf PORTB ; ;-------------------------------------------------------------------- ; Формирование адресного кода дешифратора ;-------------------------------------------------------------------- movf Index,0 ; call Dec ; movwf PORTC ; ;-------------------------------------------------------------------- ; Время нахождения одного индикатора в активном состоянии ;-------------------------------------------------------------------- movlw .200 ; movwf Temp ; PAUSE decfsz Temp,1 ; goto PAUSE ; ;-------------------------------------------------------------------- ; Гашение разряда ;-------------------------------------------------------------------- clrf PORTB ; ;-------------------------------------------------------------------- ; Увелечение содержимого счетчика количества малых колец индикации ;-------------------------------------------------------------------- incf Index,1 ; movlw .08 ; bcf STATUS,2 ; subwf Index,0 ; btfss STATUS,2 ; goto CYCLE ; ;-------------------------------------------------------------------- ; Новое большое кольцо индикации ;-------------------------------------------------------------------- nop ; clrf Index ; ;-------------------------------------------------------------------- ; Уменьшение счетчика количества больших колец ;-------------------------------------------------------------------- decfsz Count,1 ; goto CYCLE ; nop ; ;-------------------------------------------------------------------- ; Подпрограммы ;-------------------------------------------------------------------- ;-------------------------------------------------------------------- ; Точное формирование времени полного цикла динамической индикации ;-------------------------------------------------------------------- movlw .10 ; movwf Temp ; PAUSE_1 decfsz Temp,1 ; goto PAUSE_1 ; ;-------------------------------------------------------------------- ; Гашение разряда ;-------------------------------------------------------------------- clrf PORTB ; ;-------------------------------------------------------------------- ; Возврат в полный цикл ;-------------------------------------------------------------------- goto MAIN ; ;-------------------------------------------------------------------- ; Коды для семисегментного индикатора ;-------------------------------------------------------------------- TABLE addwf PC,1 ; retlw b'00111111' ; retlw b'00000110' ; retlw b'01011011' ; retlw b'01001111' ; retlw b'01100110' ; retlw b'01101101' ; retlw b'01111101' ; retlw b'00000111' ; retlw b'01111111' ; retlw b'01101111' ; ;-------------------------------------------------------------------- ; Дешифратор ;-------------------------------------------------------------------- Dec addwf PC,1 ; retlw b'11111110' ; retlw b'11111101' ; retlw b'11111011' ; retlw b'11110111' ; retlw b'11101111' ; retlw b'11011111' ; retlw b'10111111' ; retlw b'01111111' ; ;******************************************************************** end Dinam2Seg LIST p=16f84a ; __CONFIG 03FF1h ; ;-------------------------------------------------------------------- ; Регистры специального назначения ;-------------------------------------------------------------------- INDF equ 00h ; PC equ 02h ; STATUS equ 03h ; FSR equ 04h ; PORTA equ 05h ; PORTB equ 06h ; TRISA equ 05h ; TRISB equ 06h ; ;-------------------------------------------------------------------- ; Регистры общего назначения ;-------------------------------------------------------------------- LED0 equ 10h ; LED1 equ 11h ; Index equ 0Ch ; Count equ 0Dh ; Temp equ 0Fh ; Mem equ 1Fh ; Timer equ 1Bh ; ;-------------------------------------------------------------------- ; Векторы ;-------------------------------------------------------------------- org 0 ; goto START ; ;-------------------------------------------------------------------- ; Основная часть программы ;-------------------------------------------------------------------- START bsf STATUS,5 ; clrf TRISB ; clrf TRISA ; bcf STATUS,5 ; ;==================================================================== ; Преобразование двоично-десятичных чисел в десятичные ;==================================================================== ;-------------------------------------------------------------------- ; Формирование числа для вывода на индикацию ;-------------------------------------------------------------------- MAIN movlw .10 ; movwf Timer ; ;-------------------------------------------------------------------- ; Подготовительные операции ;-------------------------------------------------------------------- Bin2_10 bcf STATUS,0 ; movlw .8 ; movwf Count ; clrf LED0 ; clrf LED1 ; ;-------------------------------------------------------------------- ; Циклический сдвиг влево ;-------------------------------------------------------------------- loop16 rlf Timer,1 ; rlf LED0,1 ; decfsz Count,1 ; goto adjDEC ; ;-------------------------------------------------------------------- ; Поразрядное распределение содержимого регистра LED0 по ; младшим полубайтам регистров LED0...1 ;-------------------------------------------------------------------- swapf LED0,0 ; andlw 0Fh ; movwf LED1 ; movfw LED0 ; andlw 0Fh ; movwf LED0 ; goto Exit_Tr ; ;-------------------------------------------------------------------- ; Запись в регистр FSR адреса регистра LED0 для дальнейшей ; косвенной адресации ;-------------------------------------------------------------------- adjDEC movlw LED0 ; movwf FSR ; call adjBCD ; goto loop16 ; ;-------------------------------------------------------------------- ; Основные операции преобразования двоичных чисел в двоично-дес ;-------------------------------------------------------------------- adjBCD movlw 3 ; addwf 0,0 ; movwf Mem ; btfsc Mem,3 ; movwf 0 ; movlw 30 ; addwf 0,0 ; movwf Mem ; btfsc Mem,7 ; movwf 0 ; retlw 0 ; ;-------------------------------------------------------------------- ; Подготовка счетчика количества малых колец индикации Index к ; началу полного цикла динамической индикации ;-------------------------------------------------------------------- Exit_Tr clrf Index ; ;-------------------------------------------------------------------- ; Предварительная закладка количества больших колец индикации, ; которое нужно "пройти" за один полный цикл динамической индикации ; в регистре Count ;-------------------------------------------------------------------- movlw 1 ; movwf Count ; ;-------------------------------------------------------------------- ; Использование косвенной адресации при работе с таблицей данных ;-------------------------------------------------------------------- CYCLE movlw LED0 ; addwf Index,0 ; ;-------------------------------------------------------------------- ; Косвенная адресация ;-------------------------------------------------------------------- movwf FSR ; movf INDF,0 ; call TABLE ; ;-------------------------------------------------------------------- ; Установка запятой ;-------------------------------------------------------------------- movwf Temp ; movlw 1 ; bsf STATUS,2 ; subwf Index,0 ; btfss STATUS,2 ; goto No_Dot ; bsf Temp,7 ; ;-------------------------------------------------------------------- ; Вывод десятичной цифры на индикацию ;-------------------------------------------------------------------- No_Dot movf Temp,0 ; movwf PORTB ; ;-------------------------------------------------------------------- ; Формирование адресного кода дешифратора ;-------------------------------------------------------------------- movf Index,0 ; call Dec ; movwf PORTA ; ;-------------------------------------------------------------------- ; Время нахождения одного индикатора в активном состоянии ;-------------------------------------------------------------------- movlw .10 ; movwf Temp ; PAUSE decfsz Temp,1 ; goto PAUSE ; ;-------------------------------------------------------------------- ; Гашение разряда ;-------------------------------------------------------------------- clrf PORTB ; ;-------------------------------------------------------------------- ; Увелечение содержимого счетчика количества малых колец индикации ;-------------------------------------------------------------------- incf Index,1 ; movlw .02 ; bcf STATUS,2 ; subwf Index,0 ; btfss STATUS,2 ; goto CYCLE ; ;-------------------------------------------------------------------- ; Новое большое кольцо индикации ;-------------------------------------------------------------------- nop ; clrf Index ; ;-------------------------------------------------------------------- ; Уменьшение счетчика количества больших колец ;-------------------------------------------------------------------- decfsz Count,1 ; goto CYCLE ; nop ; ;-------------------------------------------------------------------- ; Подпрограммы ;-------------------------------------------------------------------- ;-------------------------------------------------------------------- ; Точное формирование времени полного цикла динамической индикации ;-------------------------------------------------------------------- movlw 10 ; movwf Temp ; PAUSE_1 decfsz Temp,1 ; goto PAUSE_1 ; ;-------------------------------------------------------------------- ; Гашение разряда ;-------------------------------------------------------------------- clrf PORTB ; ;-------------------------------------------------------------------- ; Возврат в полный цикл ;-------------------------------------------------------------------- goto MAIN ; ;-------------------------------------------------------------------- ; Коды для семисегментного индикатора ;-------------------------------------------------------------------- TABLE addwf PC,1 ; retlw b'00111111' ; retlw b'00000110' ; retlw b'01011011' ; retlw b'01001111' ; retlw b'01100110' ; retlw b'01101101' ; retlw b'01111101' ; retlw b'00000111' ; retlw b'01111111' ; retlw b'01101111' ; ;-------------------------------------------------------------------- ; Дешифратор ;-------------------------------------------------------------------- Dec addwf PC,1 ; retlw b'11111110' ; retlw b'11111101' ; retlw b'11111011' ; retlw b'11110111' ; retlw b'11101111' ; retlw b'11011111' ; retlw b'10111111' ; retlw b'01111111' ; ;******************************************************************** end[/pre]

MAZ: Вы посмотрите на исходные данные для преобразования. число .10101010 ( в десятичной) = 9A2112h (в шестнадцатиричной) а у Вас 0A0A0A0Ah=.168430090 (единичка даже не вписалась) Но все то правильно MAIN movlw 0x12 ; movwf TimerL movlw 0x21 movwf TimerM movlw 0x9A movwf TimerH ; clrf TimerHH Пока путаете системы счисления, внимательней. А с программой все нормально. Привет Севастополю. И особенно Качи.

playme: Спасибо, все заработало.

FAI: Составил программу динамической индикации для 6-ти знакомест испоьзуя в качестве основы файл "din_bin" из Самоучителя. Погонял программу в симуляторе,работает нормально. При проверке в "железе" на индикаторах высветиилось не понятно что. Проверил монтажку. индикаторы. все исправно. Оказалось "собака" зарылась в кодах вывода цифры на индикатор. Это коды вывода цифры на индикатор из файла "din_bin" retlw b'00111111' ; ..FEDCBA = 0 retlw b'00000110' ; .....CB. = 1 retlw b'01011011' ; .G.ED.BA = 2 retlw b'01001111' ; .G..DCBA = 3 retlw b'01100110' ; .GF..CB. = 4 retlw b'01101101' ; .GF.DC.A = 5 retlw b'01111101' ; .GFEDC.A = 6 retlw b'00000111' ; .....CBA = 7 retlw b'01111111' ; .GFEDCBA = 8 retlw b'01101111' ; .GF.DCBA = 9 Это коды вывода цифры на индикатор после инвертирования retlw b'11000000' ; b'00111111' ..FEDCBA = 0 retlw b'11111001' ; b'00000110' .....CB. = 1 retlw b'10100100' ; b'01011011' .G.ED.BA = 2 retlw b'10110000' ; b'01001111' .G..DCBA = 3 retlw b'10011001' ; b'01100110' .GF..CB. = 4 retlw b'10010010' ; b'01101101' .GF.DC.A = 5 retlw b'10000010' ; b'01111101' .GFEDC.A = 6 retlw b'11111000' ; b'00000111' .....CBA = 7 retlw b'10000000' ; b'01111111' .GFEDCBA = 8 retlw b'10010000' ; b'01101111' .GF.DCBA = 9 После этого на индикаторах высвечиваются те показания которые заложены в программу. Прошу объяснить это преобразование. Используется PIC16F84A, индикатор BT-M322RD в кол.-2шт. Файл программы не выкладываю, имеется в Самоучителе.

MAZ: Суть в том, как подключены выводы индикатора к выводам порта куда выводится символ. Т.е. светодиод, (диод - сегмент индикатора) В Вашем случае очень похоже, что перепутан анод с катодом. В первом варианте зажигали светодиод 1. Во втором варианте 0. И так, и так конечно можно, но надо определится в начале с индикатором.. Обычно, зная какой индикатор, с общим анодом или катодом, определяют какие выводы порта будут зажигать определенный сегмент индикатора. Вариантов много и коды в каждом варианте будут разные. И еще обычно подключают транзисторы ключи к каждому сегменту, что тоже влияет на полярность включения светодиода.

FAI: Индикаторы с общм катодом. Подключены к PortB через гасящие резисторы. Дешифратор MM74HC138N аналог 555ИД7. Катоды подключены через него.

Bigor: FAI пишет: Используется PIC16F84A, индикатор BT-M322RD в кол.-2шт Уважаемый FAI, индикатор BT-M322RD - это индикатор с общим анодом, с общим катодом такой же маркируется как BT-N322RD. Так, что работающие коды правильные.

MAZ: Тогда, что получается на катодах 0, а на анодах тоже 0 и сегмент горит? Такого быть не может. Что то у Вас в сборке. Есть еше мысль о внутренних подтягивающих резисторах. Но они так влиять не будут.

Bigor: MAZ пишет: Тогда, что получается на катодах 0, а на анодах тоже 0 и сегмент горит? Такого быть не может. Там, видимо, "удачный хомут" в ПП переключения разрядов индикатора. В сочетании с индикатором с ОА дало положительный эффект. Об индикаторах см. здесь: http://kazus.ru/datasheets/574435/pdf-BT-M322RD.html

FAI: Огромное спасибо MAZ,Bigor. за разъяснения. Виноват сам. MAZ пишет: надо определится в начале с индикатором.. Нашел в инете даташит на этот индикатор. Все правильно, как пишет Bigor, он с общим анодом. MAZ пишшет: Тогда, что получается на катодах 0, а на анодах тоже 0 и сегмент горит? Такого быть не может. Попробую разобраться. О результатах сообщу.

MAZ: Успехов!

FAI: Разобрался. Обыкновенная невнимательность. Транзисторные ключи стоят на выводах дешифратора 8-штук. Индикатор 6-ть знакомест. Когда после инвертирования вывел результаты на индикатор, решил попробовать убрать ключи. Убрал сначала один, затем второй на индикаторах высвечивается то что надо. По своей невнимательности убрал ключи с выводов дешифратора, которые не задействованы. Этим ввел всех в заблуждение. Прошу извенить меня за это.

Bigor: FAI пишет: По своей невнимательности убрал ключи с выводов дешифратора, которые не задействованы. Этим ввел всех в заблуждение. Прошу извенить меня за это. Кто не работает, тот не делает ошибок. Зато теперь Вы знаете как к вашему устройству подключать индикаторы как с общими катодами, так и с общими анодами. Все нормально. Форум для того и существует. Успехов!

MAZ: Bigor пишет: Кто не работает, тот не делает ошибок. Все правильно! Сами такие.

Вячеслав: При задании параметров динамической индикации, считаю необходимым напомнить Сообществу о инерционности зрения. Для отображения информации на индикаторах (люминесцентных, светодиодных ) без мигания и "размазывания", ЧАСТОТУ возобновления - FВ-информации на неподвижном объекте лучше задавать около 100 Гц. При этом меньше сказывается влияние мерцание внешнего освещения. На подвижном объекте( при частоте вибрации до 2 кГц)- FB лучше взять примерно в 5 раз больше - (но вполне допустимо 350...375 Гц). Для исключения "размазывания" при очень высокой частоте FB (10 кГц и более), необходимо предусмотреть между включением одного знакоместа и отключением другого - фиксированный временной интервал 2...4% вревени включения знакоместа.

Вячеслав: Вопрос начинающего. Обычно для вывода на LED в динамической индикации имеем таблицу кодов преобразования (выше по ветке их много): ; Коды для семисегментного индикатора ;-------------------------------------------------------------------- TABLE addwf PC,1 ; retlw b'00111111' ; retlw b'00000110' ; retlw b'01011011' ; и т.д. Для технаря ясее-ясного: это коды для индикатора и хорошо прослеживаются по 1 и 0. Но вот начинающему попалась статья В. Тимофеева -" MPASM. Как правильно оформить программы...(пособие для начинающих)." Там есть пример варианта вывода на индикатор: сначала в области определения констант делается ряд записей - SEG_A equ (1<<0) ; SEG_B equ (1<<1)...и т.д. для всех сегментов LED. В области кода строк таблицы: retlw SEG_A+SEG_B+SEG_C+SEG_C+SEG_D+SEG_E+SEG_F; для вывода символа "0" retlw SEG_B+SEG_C; для вывода символа "1" .... и т.д. Начинающему ясно, что используется нотация языка СИ ( сдвиг влево, сложение...). и далее- алгебра. Не понимаю, насколько этот подход более нагляден для чтения? В чём здесь фишка? Вопрос второй: возможно есть ещё и другой подход для записи таблиц кодов?

Alex: насколько этот подход более нагляден для чтения?Он не на столько нагляден, на сколько удобен в быстром изменении/конфигурации выводов индикатора.

Вячеслав: Alex пишет: удобен в быстром изменении/конфигурации выводов индикатора Надо ли это для конкретного проекта? Для средних PIC - один конструктор - один проект - один прибор. В основном пока. Но в целом понятно. Таблицу с 1/0 создам быстро. А такую создать - пока мудрёно. Но ради удобства перевоплощения... На второй вопрос нет ответа?

Al_Kuz: Можно так: addwf PCL DT 3F,06,5B, и т.д.

Alex: Надо ли это для конкретного проекта?А почему бы и нет ? Я например всегда сначала пишу программу, а потом уже развожу плату и в программе меняю быстренько выводы на нужные.

Вячеслав: Alex пишет: потом уже развожу плату Всегда так делал в схемах с разъемами и эквивалентными узлами. Al_Kuz пишет: Можно так: addwf PCL DT 3F,06,5B, и т.д. Наглядности нет, мне кажется. Надо переводить код, считать позицию. Но - вариант. Учту.

MAZ: мы уже спорили. кому то приятно читать в строчку, кому в столбец. Думаю не принципиально

Al_Kuz: Вячеслав пишет: Наглядности нет, мне кажется А так: addwf PLC DT "HELLO WORLD"

MAZ: А по русски удивите или значки заряда аккумулятора тоже буквами?

Al_Kuz: По русски можно так: А equ 0x41 Б equ 0xA0 В equ 0x42 . . Я equ 0xB1 addwf PLC DT П,Р,И,В,Е,Т,"!" Значки тоже можно как нибудь обозвать.

MAZ: Логика А MPLAB, кирилицу поймет? : ж, я...

Al_Kuz: Мой MPLAB и такое понимает: cblock 0x20 Mem count счетчик endc Д equ 0xE0 О equ 0x4F Б equ 0xA0 Р equ 0x50 П equ 0xA8 Ж equ 0xA3 Ы equ 0xAE Я equ 0xB1 ORG 0x000 Начало nop nop movlw .10 movwf счетчик Первый movfw Mem addwf PCL, f DT Д,О,Б,Р,О," ",П,О,Ж ;АЛОВАТЬ goto Первый nop goto Начало end Не понимает только маленькую "я".

MAZ: А "мой" это какой? Хорошая идея, честно не знал. Спасибо!

Al_Kuz: У меня старый MPLAB V7.40

MAZ: у меня 7.52



полная версия страницы