PIC16f84A + SPI TM1640 + 7-ми сег. LED индикатор
|
|
Unicorn |
Дата: Вт, 03.01.2017, 00:25 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
25
Замечания:
±
На сайте с 27.10.2014
Статус:
Offline
|
Приветствую. PIC16f84A (4МГц) передает данные по SPI в TM1640 (драйвер 7-ми сег. индикаторов). Используется 7-ми сег. индикатор на 4-ре разряда. SPI реализован через ком. SHIFTOUT din,clk,0,[dat,....].
Нужно на индикатор вывести число "0 1 2 3" подождать 3 сек. и вывести другое число "4 5 6 7". Часть программы, отвечающая за передачу данных в TM1640 работает нормально, нужные цифры загораются в нужных разрядах индикатора, регулировка яркости работает. Как только в программу добавляю PAUSE 3000 или SLEEP 3 или NAP 7 (не принципиально) начинаются проблемы.
Первая часть программы работает нормально, цифры "0 1 2 3" отображаются на индикаторе, но, спустя буквально 0,5 сек. на индикаторе начинает появляться "мусор" из хаотично меняющихся различных цифр и/или отдельных сегментов и так происходит до бесконечности. Цифры "4 5 6 7" не появляются и контрольный светодиод не загорается в подтверждении окончания выполнения программы. PIC на кнопку сброса не реагирует, помогает только отключение питания. Если в начало программы добавить INCLUDE "MODEDEFS.BAS" то "мусора" на индикаторе нет, PIC реагирует на кнопку сброса, но вторая часть программы, которая выводит на индикатор цифры "4 5 6 7", все равно не выполняется и контрольный светодиод не загорается.
Программу тестировал на PIC16F84A 2шт. (куплены в разное время и местах), PIC16F628A, TM1640 5шт. Пробовал PicBasic PRO и Proton, результат одинаков - программа не работает должным образом. В книгах есть примеры где команды SHIFTOUT и PAUSE используются совместно и это не вызывает проблем, но почему тогда не получается у меня ? Прошу совета. Спасибо.
'PIC16F84A @ device xt_osc, wdt_off, protect_off, pwrt_off DEFINE OSC 4 INCLUDE "MODEDEFS.BAS"
din var PORTB.1 'шина SPI, данные clk var PORTB.2 'шина SPI, такт
TRISB = 0 PORTB = 0
Pause 2000 PORTB.4 = 1 'контрольный светодиод, моргаем, програм. начала выполнение PAUSE 500 PORTB.4 = 0 pause 500
din = 1 'подготовка SPI к началу передачи данных clk = 1 'подготовка SPI к началу передачи данных din = 0 'старт передачи данных clk = 0 'старт передачи данных SHIFTOUT din,clk,0,[%01000100] 'передача кода инициализации TM1640 clk = 0 'стоп передачи данных din = 0 'стоп передачи данных
clk = 1 din = 1
din = 0 clk = 0 SHIFTOUT din,clk,0,[%11000000,$3F,$06,$5B,$4F] 'передача адреса (номер разряда индик.) и кодов цифр "0 1 2 3" clk = 0 din = 0
clk = 1 din = 1 din = 0 clk = 0 SHIFTOUT din,clk,0,[%10001000] 'передача кода включения индикатора и выбор режима ШИМ (яркость) clk = 0 din = 0
'nap 7 'sleep 3 pause 3000 'пауза 3 сек.
clk = 1 din = 1
din = 0 clk = 0 SHIFTOUT din,clk,0,[%01000100] 'передача кода инициализации TM1640 clk = 0 din = 0
clk = 1 din = 1
din = 0 clk = 0 SHIFTOUT din,clk,0,[%11000000,$66,$6D,$7D,$07] 'передача адреса (номер разряда индик.) и кодов цифр "4 5 6 7" clk = 0 din = 0
clk = 1 din = 1 din = 0 clk = 0 SHIFTOUT din,clk,0,[%01000100] 'передача кода включения индикатора и выбор режима ШИМ (яркость) clk = 0 din = 0
clk = 1 din = 1
PORTB.4 = 1 'контрольный светодиод, включить, программы закончила выполнение End
|
|
|
|
mikhail09p |
Дата: Вт, 03.01.2017, 13:32 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Для того, чтобы программа могла вывести микроконтроллер из состояния сна, необходимо задействовать встроенный сторожевой таймер WDT. Для этого в начале программы необходимо включить список команд, определяющих конфигурацию программирования PIC-микроконтроллера. В этом списке должна присутствовать команда включения сторожевого таймера WDT_ON
http://terrarus.ucoz.ru/proton_plus_ide/index.html
|
|
|
|
Unicorn |
Дата: Вт, 03.01.2017, 16:18 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
25
Замечания:
±
На сайте с 27.10.2014
Статус:
Offline
|
Спасибо за уточнение. Включил сторожевой таймер, программа так и не заработала должным образом. Сбой происходит на операторе PAUSE, дальше программа не выполняется.
Сообщение отредактировал
Unicorn - Вт, 03.01.2017, 16:25
|
|
|
|
ivan_fd |
Дата: Ср, 04.01.2017, 21:03 | Сообщение # 4 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Сторожевой таймер тут Вам не поможет. Какая версия компилятора у Вас? В Протеусе пробовали???
|
|
|
|
ivan_fd |
Дата: Ср, 04.01.2017, 21:46 | Сообщение # 5 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Запрограммируйте этот файл. В контроллер 84А. Посмотрите, что будет.
|
|
|
|
mikhail09p |
Дата: Ср, 04.01.2017, 22:10 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Да, я не увидел, что 'sleep 3 - закоментировано... Переходите на Протон.
Сообщение отредактировал
mikhail09p - Ср, 04.01.2017, 22:10
|
|
|
|
Unicorn |
Дата: Ср, 04.01.2017, 23:24 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
25
Замечания:
±
На сайте с 27.10.2014
Статус:
Offline
|
Цитата ivan_fd ( ) Какая версия компилятора у Вас? В Протеусе пробовали???......Запрограммируйте этот файл. Пробовал разные версии, но результат везде одинаков, программа все равно не работает как надо. MicroCode Studio Plus 3.0.0.5+PBP 2.50C MicroCode Studio Plus 5.0.0.5+PBP 3.0.7.1(Trial) Proton 3.5.3.3 В Proteus не пробовал, нет возможности, сомневаюсь, что в нем есть библиотека на TM1640 или TM1636.
Проверил Ваш файл, изменений нет, первая часть программы работает, цифры 0123 отображаются, а дальше все виснет как и раньше. Простая задачка, а решения пока не найду. Пробую прописать вручную работу шины SPI в обход SHIFTOUT, посмотрим, что получится.
|
|
|
|
ivan_fd |
Дата: Чт, 05.01.2017, 11:39 | Сообщение # 8 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Схема у Вас какая? Должно все работать. SHIFTOUT тут не при чем.
Да и Протеусе работает как надо.
|
|
|
|
Unicorn |
Дата: Чт, 05.01.2017, 17:42 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
25
Замечания:
±
На сайте с 27.10.2014
Статус:
Offline
|
Вот схема.
Попробовал реализовать работу SPI используя набор команд PULSOUT вместо SHIFTOUT. Программа до конца так и не работает, все по прежнему виснет на PAUSE, единственное, что стало лучше это на индикаторе перестал появляться "мусор" и PIC начал реагировать на кнопку сброса. По хаотичному морганию контрольных светодиодов на выводах DIN и CLK видно, что на команде PAUSE шина SPI почему то остается в рабочем состоянии продолжая передачу данных ! А протэус умеет работать с TM1640, у него есть библиотека на эту микросхему ?
|
|
|
|
ivan_fd |
Дата: Чт, 05.01.2017, 18:19 | Сообщение # 10 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Нет, в Протеусе нету этой библиотеки. Но саму пограмму можно симулировать пошагово и видно, что все работает нормально. Ничего не виснет. Можно поставить анализатор и посмотреть, что там. У Вас светодиод на порту B4 загорается в конце?
|
|
|
|
xvovanx |
Дата: Чт, 05.01.2017, 23:51 | Сообщение # 11 |
Группа:
Модераторы
Ранг:
Помогаю всем
Сообщений:
332
Замечания:
±
На сайте с 02.05.2013
Статус:
Offline
|
Глянул в схему - мне очень не понравилось, что и подтяжка к +5 и светодиоды все в кучу. Подтяжка через делитель напряжения получается.
|
|
|
|
Unicorn |
Дата: Чт, 05.01.2017, 23:57 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
25
Замечания:
±
На сайте с 27.10.2014
Статус:
Offline
|
Если из программы убрать строку PAUSE 3000 то все работает нормально, на индикаторе появляется вторая группа цифр (4567) и контрольный светодиод на В4 загорается. Как только в программе появляется задержка времени реализованная каким либо способом (PAUSE, SLEEP, NAP, FOR-TO-NEXT) то выполняется только первая часть программы - отображаются цифры 0123, контрольный светодиод на В4 не загорается. Спустя 10-15 сек. он может кратковременно моргнуть, а может и не моргнуть, закономерности нет, все это происходит хаотично. Я понимаю, что компьютерное моделирование это замечательно и полезно но вот в реальности почему то не работает и в чем причина пока не могу разобраться. Казалось бы задачка элементарная, а решение ставит в тупик.
Добавлено (05.01.2017, 23:57) ---------------------------------------------
Цитата xvovanx ( ) Глянул в схему - мне очень не понравилось, что и подтяжка к +5 и светодиоды все в кучу. Подтяжка через делитель напряжения получается. Это не принципиально, программа все равно не работает, подключены или нет светодиоды ! Схема тестово-тренировочная, в проекте будет все по другому.
Сообщение отредактировал
Unicorn - Пт, 06.01.2017, 00:00
|
|
|
|
ivan_fd |
Дата: Пт, 06.01.2017, 09:46 | Сообщение # 13 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Я думаю, что проблема у Вас в схеме а не программе. Посмотрите внимательно на питание, не просаживается ли оно. Отключите от контроллера все, только светодиод оставьте и посмотрите как себя поведет. Есть ли конденсаторы на кварце? На сброс он должен реагировать всегда!! Да и Вы говорили, что разные контроллеры одинаково себя ведут.
|
|
|
|
Unicorn |
Дата: Пт, 06.01.2017, 12:07 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
25
Замечания:
±
На сайте с 27.10.2014
Статус:
Offline
|
Цитата ivan_fd ( ) Я думаю, что проблема у Вас в схеме.... Благодарю за подсказку. Вы оказались правы. Проблема действительно была в качестве питания схемы. Установив дополнительный керамический конденсатор по питанию, непосредственно на выводы TM1640 удалось добиться стабильной работы всей программы. При работе с другими микросхемами в разных проектах таких проблем не было, всегда хватало фильтрующих конденсаторов в блоке питания, видимо китайская TM1640 оказалась намного более чувствительной к помехам. Еще раз спасибо !
|
|
|
|