Форум по микроконтроллерам: ПП динамической индикации - Форум по микроконтроллерам

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

ПП динамической индикации

#1 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 02 Май 2011 - 13:06

Статья здесь
В архиве исходник библиотеки и пример использования.
Прикрепленный файл  ind.rar (37,19К)
Количество загрузок:: 865

Привязка библиотеки под нужный индикатор и схему подключения.

#define	ind_size	x	; Кол-во индикаторов
Эта строчка отвечает за кол-во используемых индикаторов, где x это число индикаторов. Их может быть от 1 до 8 штук.

#define	ind_invert		; Инверсия общего вывода индикатора. Закоментировано - нет инверсии.
#define	seg_invert		; Инверсия выводов сегментов. Закоментировано - нет инверсии.
Эти 2 строчки отвечают за активные уровни для общих и сегментных выводов индикатора.
Например. Если Вы хотите сделать для общих выводов активный уровень - лог.1, то закоментируйте первую строку. Если он будет лог 0, то снимите знак коментария.
Так-же и для сегментных выводов (2-я строчка).
Этими строками можно с лёгкостью поменять тип индикатора, например с ОА на ОК, или наоборот. Так-же можно быстро проинвертировать выводы если используются ключи (транзисторы) как на общих выводах, так и на сегментных.

Далее.
;==================================================================================================
; Назначение выводов
;==================================================================================================
.....
.....
Думаю, тут всё понятно. В этом участке кода настраиваются каждый вывод индикатора под конкретный пин МК.
ind_1 - ind_8 это пины для общих выводов индикаторов.
ind_A - ind_P это пины для сегментных выводов индикаторов, от A до P.
TRIS'ы так-же должны соответствовать используемым пинам.

Далее. В блоке
;==================================================================================================
; Объявление переменных
;==================================================================================================
.....
.....
Необходимо закоментировать неиспользуемые переменные led_x.
Т.е., если у Вас используется 4 индикатора, то закоментируем led_5 - led_8.
Пример:
			Led1       
			Led2
			Led3            
			Led4
;			Led5       
;			Led6         
;			Led7            
;			Led8


Использование процедур библиотеки

IND_INIT
Инициализирует пины.
Настраивает необходимые для индикатора выводы МК на выход и устанавливает на них соотв. уровни.
Вызывается, как не сложно догадаться, в начале программы.

IND_OFF
Гашение индикаторов.
Выставляет на пинах, соответствующих общим выводам индикаторов, необходимые для гашения уровни.
Вызывается перед вызовом процедуры IND_OUT.
Так-же, процедуру можно использовать для изменения яркости индикатора, привязав её к таймеру гашения. Пример реализации яркости в архиве.

IND_OUT
Зажигает очередной индикатор и выводит на его сегменты соответствующее значение.
Вызывается в переодично-повторяющемся месте программы, например оброботчике прерывания таймера.
Процедура не гасит предыдущий индикатор ! По этому, перед её вызовом, необходимо вызвать IND_OFF. Если этого не сделать, библиотека просто зажгёт все индикаторы и на них будет "абракадабра".

Использование переменных библиотеки

Led1-Ledx Где x - количество индикаторов
Переменные текущих значений индикаторов. В них записывается то, что нужно вывести на индикаторы.
Например, для вывода 1234, в led_1 записываем .1, в led-2 - .2, и т.д..
movlw	.1	; На первый индикатор
movwf   Led1	; Цифру 1
movlw	.2	; На второй индикатор
movwf   Led2	; Цифру 2
movlw	.3	; На третий индикатор
movwf   Led3	; Цифру 3
movlw	.4	; На четвёртый индикатор
movwf   Led4	; Цифру 4

Для создания собственных символов необходимо в таблицу добавить свои значения.
Таблица:
;************************************************************************************************** 
; Таблица значений сегментов
;************************************************************************************************** 
SEGTAB	addwf       PCL,F       ;
		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 or S
		retlw       b'01111101' ; .GFEDC.A = 6
		retlw       b'00000111' ; .....CBA = 7
		retlw       b'01111111' ; .GFEDCBA = 8
		retlw       b'01101111' ; .GF.DCBA = 9
		retlw       b'00000000' ; ........ = 10 пробел
		retlw       b'01000000' ; .G...... = 11 символ "минус"
Как видно, по мимо цифр 0-9, добавлено ещё 2 символа - пробел и минус. Коды их соответсвуют порядковому номеру в таблице (10,11).

ind_p
Переменная для вывода точек на индикаторы.
Значение каждого бита в переменной является условием вывода точки на индикатор, соответствующий порядковому номеру бита.
Т.е., если нужно зажечь точку на 3-ем индикаторе, необходимо установть 2-ой бит в этой переменной. Биты адресуются с 0-ого по 7-ой, по этому и разница на еденицу. Это для тех, кто не понял :)
bsf		ind_p, 1 ; Точка на 2-ом индикаторе


В принципе всё. Будут вопросы - задавайте. Разберёмся.
Удачного программирования !
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#2 Пользователь офлайн   avtomat78 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 19
  • Регистрация: 18 Июнь 11

Отправлено 18 Июнь 2011 - 19:46

Здравствуйте, а на Си есть такая библиотека?
0

#3 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 18 Июнь 2011 - 22:32

Готовой нет. Но можно будет сделать.
Покумекаю.... :rolleyes:
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#4 Пользователь офлайн   fox 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 42
  • Регистрация: 19 Март 11

Отправлено 20 Август 2011 - 14:57

Алекс, я попытался переделать эту конструкцию под 16F628. Как говорится - получилось наполовину. :) То есть - 2 индикатора правильно показывают, а на 2-х абракадабра. Гляньте, пожалуйста, наметанным глазом - чего я там упустил? В архиве проект в Протеусе. Да, я там второй таймер выключил для последующих разборок с ним..

Прикрепленные файлы

  • Прикрепленный файл  indicator.rar (57,06К)
    Количество загрузок:: 248

0

#5 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 20 Август 2011 - 17:45

Вы использовали для перменных в main.asm те-же адреса, что и в 7_seg.inc.

main.asm:
Cblock 0x70
            w_temp                ; 
            s_temp                ;
            Br_L                  ; Младший байт яркости
            Br_H                  ; Старший байт яркости   
Endc

7_seg.inc:
Cblock 0x70
	;--- Значения индикаторов -----------
	;--- Ненужные закоментировать !!! ---
			Led1       
			Led2
			Led3            
			Led4
	;------------------------------------
			ind_p	; Точки индикаторов
			ind_num	; Текущий индикатор
			seg_tmp	; Временная переменная                     
Endc

При первом-же прерывании у Вас данные в Led1-Led4 портились.

Прикрепленный файл  indicator.rar (53,95К)
Количество загрузок:: 244
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#6 Пользователь офлайн   fox 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 42
  • Регистрация: 19 Март 11

Отправлено 20 Август 2011 - 18:05

Точно!! Спасибо! Не привык с инклудами дело иметь. Вообще - приходится привыкать к новому стилю программирования ;)
0

#7 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 11 Сентябрь 2011 - 23:11

Тут выложена та-же, только немного модернизированная и для перемещаемого кода библиотечка.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#8 Пользователь офлайн   Eugene 

  • Прибывший
  • Группа: Пользователи
  • Сообщений: 4
  • Регистрация: 03 Февраль 14

Отправлено 04 Февраль 2014 - 09:25

Alex, у меня есть небольшие непонятки по данной ПП.
Данная ПП успешно заработала в основной программе (пока в симуляторе), но для полной ясности, объясните, пожалуйста, как работает
логика регулировки яркости индикаторов.
И, в частности, этот момент
;-------------------------------------------
; Инициализируем яркость индикаторов
;-------------------------------------------
#define br_start .250 ; 250 МЦ = ~25%
movlw br_start & 0xFF ; Младший байт
movwf Br_L ; в Br_L
movlw br_start >> .8 ; Старший байт
movwf Br_H
;------------------------------------------
Во второй строке переменной br_start присваивается значение .250
Для какой цели проводится ещё операция И?
А также вопрос по этой строке
movlw br_start >> .8
Почему именно сдвиг?

Сообщение отредактировал Eugene: 04 Февраль 2014 - 09:26

0

#9 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 04 Февраль 2014 - 09:30

Это разделение константы br_start на 2 байта и записи в регистры Br_L и Br_H.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#10 Пользователь офлайн   Eugene 

  • Прибывший
  • Группа: Пользователи
  • Сообщений: 4
  • Регистрация: 03 Февраль 14

Отправлено 04 Февраль 2014 - 11:06

Цитата

Это разделение константы br_start на 2 байта и записи в регистры Br_L и Br_H.

То есть она может быть больше 0xFF?
Почему при её значении 0xFFFF получается чехарда?

Сообщение отредактировал Eugene: 04 Февраль 2014 - 11:15

0

#11 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 04 Февраль 2014 - 12:23

Просмотр сообщенияEugene (04 Февраль 2014 - 11:06) писал:

То есть она может быть больше 0xFF?
Да.

Просмотр сообщенияEugene (04 Февраль 2014 - 11:06) писал:

Почему при её значении 0xFFFF получается чехарда?
Потому что это больше периода переключения одного индикатора. Скважность не может быть больше периода :)
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#12 Пользователь офлайн   Eugene 

  • Прибывший
  • Группа: Пользователи
  • Сообщений: 4
  • Регистрация: 03 Февраль 14

Отправлено 04 Февраль 2014 - 14:02

Alex, я в железе ещё не пробовал свой проект, хотя плата уже разведена. И мне не приходилось ещё применять таймеры в динамической индикации.
При симуляции происходит какая то рваная работа. Никак не могу понять, где косяк.
Если не трудно, гляньте на мой исходник, где я напортачил. Исходник пока ещё без математики, но это не главное.

Прикрепленные файлы

  • Прикрепленный файл  CC_CA_819.rar (22,78К)
    Количество загрузок:: 160

0

#13 Пользователь офлайн   Eugene 

  • Прибывший
  • Группа: Пользователи
  • Сообщений: 4
  • Регистрация: 03 Февраль 14

Отправлено 05 Февраль 2014 - 16:45

Цитата

При симуляции происходит какая то рваная работа. Никак не могу понять, где косяк.
Разобрался сам.
Ларчик открывался очень просто. При сборке тупо скопировал ПП main, не обратил внимание на время переключения разрядов (TM0).
Изменил его и всё стало lege artis.
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей