Пример динамической индикации на микросхеме ТМ1636
|
|
Unicorn |
Дата: Вс, 15.01.2017, 21:24 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
25
Замечания:
±
На сайте с 27.10.2014
Статус:
Offline
|
Приветствую всех. В качестве альтернативной (программной или на регистрах) реализации динамической индикации семи-сегментных светодиодных индикаторов была опробована специализированная микросхема TM1636 китайского производителя. Все работает нормально. Преимущества: - реализация динамической индикации без участия микроконтроллера - цена 15-20 руб./шт. с учетом доставки с Aliexpress - одна микросхема на все разряды индикатора - двухпроводная линия связи с микроконтроллером - регулировка яркости (8 режимов) - отсутствие необходимости в подключении внешних, дополнительных элементов - управление любым разрядом и/или сегментом индикатора по отдельности
Небольшой пример работы с микросхемой.
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 'PIC16F84A + TM1636 'LED индикатор 4 разряда х 8 сегментов, общий анод 'Динамическая индикация.
@ device xt_osc, wdt_off, protect_off, pwrt_off DEFINE OSC 4
din VAR PORTB.1 'шина SPI, данные clk VAR PORTB.2 'шина SPI, такт
RG VAR BYTE 'регистр управления DIG1 VAR BYTE 'переменная для 1-го разряда индикатора DIG2 VAR BYTE 'переменная для 2-го разряда индикатора DIG3 VAR BYTE 'переменная для 3-го разряда индикатора DIG4 VAR BYTE 'переменная для 4-го разряда индикатора F VAR BYTE 'признак передачи команды "1" или данных "0"
TRISB = 0 'порт В на вывод PORTB = 0 'на всех выводах порта В установить логический сигнал "0"
F = 1 'передача команды RG = %01000000 'КОМАНДА №1 (режим записи данных) GOSUB serial 'подпрограмма последовательной передачи данных RG = %10001111 'КОМАНДА №3 (вкл. индикатора, максимальная яркость) GOSUB serial
'- - - отображение на индикаторе цифр 1 2 3 4 - - -
F = 0 'передача данных RG = %11000000 'КОМАНДА №2 (адрес первого разряда индикатора) DIG1 = $06 'код цифры "1" для 1-го разряда индикатора DIG2 = $5B 'код цифры "2" для 2-го разряда индикатора DIG3 = $4F 'код цифры "3" для 3-го разряда индикатора DIG4 = $66 'код цифры "4" для 4-го разряда индикатора GOSUB serial PAUSE 2000
'- - - отображение на индикаторе цифр 5 6 7 8 - - -
DIG1 = $6D 'код цифры "5" для 1-го разряда индикатора DIG2 = $7D 'код цифры "6" для 2-го разряда индикатора DIG3 = $07 'код цифры "7" для 3-го разряда индикатора DIG4 = $7F 'код цифры "8" для 4-го разряда индикатора GOSUB serial PAUSE 2000
'- - - выключение индикатора - - -
F = 1 'передача команды RG = %10000000 'КОМАНДА №3 (вкл. индикатора) GOSUB serial
END '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 'подпрограмма последовательной передачи данных serial: din = 1 : clk = 1 'подготовка SPI к началу передачи данных din = 0 : clk = 0 'старт передачи данных IF F = 1 THEN SHIFTOUT din,clk,0,[RG\9] 'передача команд ELSE SHIFTOUT din,clk,0,[RG\9,DIG1\9,DIG2\9,DIG3\9,DIG4\9] 'передача адреса и данных ENDIF clk = 0 : din = 0 'стоп передачи данных clk = 1 : clk = 1 'стоп передачи данных RETURN
Подробное описание принципов работы с микросхемой, различные тесты, картинки можно прочитать в статье: https://yadi.sk/d/BvV-EqUT39BJq4 или в прикрепленном архиве.
|
|
|
|
anatol |
Дата: Пн, 16.01.2017, 16:25 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Спасибо за наводку! + в репутацию.
Сообщение отредактировал
anatol - Пн, 16.01.2017, 16:27
|
|
|
|
Unicorn |
Дата: Пт, 20.01.2017, 18:40 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
25
Замечания:
±
На сайте с 27.10.2014
Статус:
Offline
|
Кроме динамический индикации, микросхема TM1636 поддерживает работу с клавиатурой из 16 кнопок (2-е линии сканирования по 8 кнопок). Коды кнопок: №1=F7h, №2=EFh, №3=F6h, №4=EEh, №5=F5h, №6=EDh, №7=F4h, №8=ECh, №9=F3h, №10=EBh, №11=F2h, №12=EAh, №13=$F1h, №14=E9h, №15=F0h, №16=E8h и FFh если ни одна из кнопок не нажата. Микросхема не поддерживает определение кода двух и более одновременно нажатых кнопок.
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 'PIC16F84A + TM1636 'Работа с клавиатурой.
@ device xt_osc, wdt_off, protect_off, pwrt_off DEFINE OSC 4
din VAR PORTB.1 'шина SPI, данные clk VAR PORTB.2 'шина SPI, такт
RG VAR BYTE 'регистр управления F VAR BYTE 'признак передачи команды "1" или данных "0"
TRISB = 0 'порт В на вывод PORTB = 0 'на всех выводах порта В установить логический сигнал "0"
F = 1 'передача команды RG = %01000000 'КОМАНДА №1 (режим записи данных) GOSUB serial 'подпрограмма последовательной передачи данных RG = %10001111 'КОМАНДА №3 (вкл. индикатора, максимальная яркость) GOSUB serial RG = %01000010 'КОМАНДА №1(режим чтения данных) din = 1 : clk = 1 'подготовка SPI к началу передачи данных din = 0 : clk = 0 'старт передачи данных SHIFTOUT din,clk,0,[RG\9] 'передача команды на чтение TRISB = %11111111 'все выводы порта В на ввод SHIFTIN din,clk,5,[RG\9] 'чтение данных (код кнопки) TRISB = %00000000 'все выводы порта В на вывод clk = 0 : din = 0 'стоп передачи данных clk = 1 : din = 1 'стоп передачи данных 'переменная RG будет хранить код нажатой кнопки
END '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 'подпрограмма последовательной передачи данных serial: din = 1 : clk = 1 'подготовка SPI к началу передачи данных din = 0 : clk = 0 'старт передачи данных IF F = 1 THEN SHIFTOUT din,clk,0,[RG\9] 'передача команд ELSE SHIFTOUT din,clk,0,[RG\9,DIG1\9,DIG2\9,DIG3\9,DIG4\9] 'передача адреса и данных ENDIF clk = 0 : din = 0 'стоп передачи данных clk = 1 : clk = 1 'стоп передачи данных RETURN
Более детальное описание работы с клавиатурой, схема подключения, программа тестирования и некоторые выводы изложены во второй части статьи.
|
|
|
|
PINCOD |
Дата: Сб, 21.01.2017, 16:46 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
31
Замечания:
±
На сайте с 05.10.2011
Статус:
Offline
|
Очень к стати статья,тоже заказал на Aliexpress такую штуковину на разборку с кодом и даташитом,а оказывается уже все расжеванно.Спасибо Алексей за заметку.
|
|
|
|
Unicorn |
Дата: Сб, 21.01.2017, 23:21 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
25
Замечания:
±
На сайте с 27.10.2014
Статус:
Offline
|
На бэйсик подобных языках очень мало примеров работы с этой серии микросхем, решил немного восполнить пробел. Надеюсь, статья будет полезной и поможет в освоении микросхем.
|
|
|
|
PINCOD |
Дата: Вт, 14.02.2017, 19:07 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
31
Замечания:
±
На сайте с 05.10.2011
Статус:
Offline
|
Доброго времени суток.Ну вот дождался девайс ТМ1637 с Китая, для изучения сего.И решил продолжить тему по этому поводу.Собрал Шим регулятор для коллекторного двигателя,на Pic12f675.Проекта в протеусе нет,так как не нагуглил модель для ТМ1637.Поэтому воплотил задуманное сразу в железе.Ну и не много пояснения к данной проге.Имеем 4разр индикатор на базе ТМ1637 + камень 12F675 и силовая цепь это мосфет IRF530.При первом влючении индикатор отображает значение шим на 2,3,4,разряде с минимальной яркостью.А 1й разряд за не надобностью пока потушен,Но как только нажмем кнопку "+" или "-" индикатор тут же зажигается на максимальную яркость все разряды, на 1разряде идёт подсчет секунд от нуля до 8,на 2,3,4,разряде значение оператора PWM ,с каждой последующей секундой яркость индикатора снижается до минимальной до следующей регулировки,после отчета 8 секунд идет запись значения ШИМ в EEPROM.Да и ШИМ регулирование в данной проге не самое главное,был вопрос по ТМ1637.Жаль что нет в Pic12f675 аппаратного ШИМ,но для коллекторного 12V вентилятора радиатора авто,программный ШИМ нормально справляется.Ну вот вроде бы и все,замечания приветствуются.Всем всего хорошего
Device 12F675 Declare Xtal = 4 Declare Reminders NO Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_OFF, BODEN_ON, MCLRE_OFF',CP_ON Declare Create_Coff = 1 Set_OSCCAL OSCCAL TRISIO = %000110 ANSEL = 0'0-назначим порты цифровыми,7-аналоговыми) CMCON = 7 '-------------------------------------------------------------------------- Symbol T0IF = INTCON.2 ; Флаг переполнения TMR0 Symbol T0IE = INTCON.5 ; Разрешить прерыв. по переполнен. TMR0 Symbol GIE = INTCON.7 ; Разрешить глобальные прерывания OPTION_REG = %00000111 T0IE = 1 GIE = 0 '--------------------------------------------------------------------------
Symbol clk = GPIO.0 'шина SPI, данные Symbol din = GPIO.5 'шина SPI, такт Symbol MINUS = GPIO.1 Symbol PLUS = GPIO.2 Dim SetMIN As Byte ;Для работы с кнопками Dim SetPlus As Byte ;Для работы с кнопками Dim BIG As Dword ;для счета секунд в прерывании Dim BIG1 As BIG.HighWord ;для счета секунд в прерывании Dim RG As Byte 'регистр управления Dim DIG1 As Byte 'переменная для 1-го разряда индикатора Dim DIG2 As Byte 'переменная для 2-го разряда индикатора Dim DIG3 As Byte 'переменная для 3-го разряда индикатора Dim DIG4 As Byte 'переменная для 4-го разряда индикатора Dim F As Byte 'признак передачи команды "1" или данных "0" Dim PlagPWM As Byte Dim OutPWM As Byte Dim N As Byte Dim FlagZap As Byte Dim SEC As Byte Dim SEC1 As Byte Dim C As Byte ;автоповтор кнопоки через С циклов Dim Value As Byte FlagZap = 0 SEC = 7 SEC1 = 0 C = 20 ;автоповтор кнопоки через С = 20 циклов '-----------------------------------------------------------------------------
PlagPWM = ERead 0 ;Считаем статус флага по адрсу -0- If PlagPWM = 1 Then ;Если флаг равен 1,значит был факт записи значения ШИМ OutPWM = ERead 1 ;по адресу -1-, с считаем его и присвоим значение OutPWM Else ;иначе присвоим ШИМ = 50% заполнения OutPWM = 127 OutPWM = 127 EWrite 1, [OutPWM];сохраняем значение PWM по адресу -1- EWrite 0, [1] ;сохраняем 1 флаг по адрсу -0- EndIf
GoSub Bright
On_Interrupt GoTo MYINT GoTo main ; Переход на начало программы
MYINT: '--------------------- Обработчик прерывания ---------------------------------------
Context Save big1 = big1 - 1 ' отнимаем единицу из старшего байта переменной BIG1 If BIG < 0 Then BIG = BIG + 1000000 If FlagZap = 1 Then Inc SEC EndIf T0IF = 0 ' сбросить флаг прерываний TOIF регистра TMRO Context Restore
'-------------------------------------------------------------------------------------------
main:
;-----------------------Подпрограмма работы с кнопками---------------------------------------
If FlagZap = 0 And MINUS = 1 Or PLUS = 1 Then FlagZap = 1 ;Флаг нужен для работы с EEPROM GIE = 1;Включим прерывания EndIf
If MINUS = 1 Then Inc SetMIN 'кнопка минус If SetMIN > C Then SetMIN = 0 : Dec OutPWM : SEC = 0 : GoSub Disp
If PLUS = 1 Then Inc SetPlus 'кнопка плюс If SetPlus > C Then SetPlus = 0 : Inc OutPWM : SEC = 0 : GoSub Disp ;Если флаг равен 1,значит была регулировка скорости и по истечении 8 сек запишем ; в EEPROM новое значение скорости вращения If FlagZap = 1 And SEC > 7 Then GIE = 0;Выключим прерывания FlagZap = 0 ;сбросим флаг 'SEC = 0 ;сбросим секунды EWrite 1,[OutPWM];сохраним новое значение ШИМ в EEPROM поадресу -1- EndIf If SEC <> SEC1 Then SEC1 = SEC : GoSub Bright ;Управляем яркостью
PWM GPIO.4, OutPWM,1;Формируем шим сигнал на ноге №3 мк.
GoTo main
Disp:
If OutPWM < 80 Then OutPWM = 80 ;Установим нижний предел ШИМ If OutPWM > 254 Then OutPWM = 254;Установим верхний предел ШИМ If FlagZap = 1 Then N = SEC : GoSub Convert DIG1 = Value Else DIG1 = $00'Погасим 1 разряд индикатора тысяч,у нас всего предел макс. 254 EndIf N = Dig OutPWM ,2 : GoSub Convert ;Выделим соответст цифру из перем OutPWM и сконвертируем её для ССИ DIG2 = Value N = Dig OutPWM ,1 : GoSub Convert DIG3 = Value N = Dig OutPWM ,0 : GoSub Convert DIG4 = Value 'F = 0 GoSub serial Return
Convert: Value = LookUp N, [63,6,91,79,102,109,124,7,127,103]'маска общий катод Return 'подпрограмма последовательной передачи данных на ТМ1637 serial:
din = 1 'подготовка SPI к началу передачи данных clk = 1 'подготовка SPI к началу передачи данных din = 0 'старт передачи данных clk = 0 'старт передачи данных If F = 1 Then SHOut din,clk,0,[RG\9] 'передача команд Else SHOut din,clk,0,[RG\9,DIG1\9,DIG2\9,DIG3\9,DIG4\9] 'передача адреса и данных EndIf clk = 0 'стоп передачи данных din = 0 'стоп передачи данных clk = 1 'стоп передачи данных din = 1 'стоп передачи данных Return
Bright: '----------------------------------------------------------------------------- F = 1 'передача команды на ТМ1637 RG = %01000000 'КОМАНДА №1(режим записи данных) $40 GoSub serial 'подпрограмма последовательной передачи данных ' YAR 0 1 2 3 4 5 6 7 выбор яркости RG = LookUp SEC, [143,142,141,140,139,138,137,136]'[136,137,138,139,140,141,142,143] GoSub serial '------------------------------------------------------------------------------- F = 0 'передача данных на ТМ1637 RG = %11000000 'КОМАНДА №2(адрес первого разряда индикатора) $C0 GoSub Disp Return
Сообщение отредактировал
PINCOD - Вт, 14.02.2017, 21:09
|
|
|
|
ADMIN |
Дата: Ср, 15.02.2017, 03:01 | Сообщение # 7 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Есть одно замечание - а почему не в каталог статей? В форуме затеряется проект, а в каталоге найти проще. Особенно красиво, когда с фотографиями готового устройства.
|
|
|
|
PINCOD |
Дата: Ср, 15.02.2017, 07:37 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
31
Замечания:
±
На сайте с 05.10.2011
Статус:
Offline
|
Я не считаю,это проектом,а просто эксперимент на беспаечной макетной плате.Думаю,кто ищет тот найдёт.Если найду ему применение,то выложу законченный девайс,в соответствующей ветке
|
|
|
|