Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » PIC16f84A + SPI TM1640 + 7-ми сег. LED индикатор (глюк прог. при совместном использовании SHIFTOUT и PAUSE)
PIC16f84A + SPI TM1640 + 7-ми сег. LED индикатор
Unicorn Дата: Вт, 03.01.2017, 00:25  |                                                                                                                Сообщение # 1
Группа: Пользователи
Ранг:  Новенький
Сообщений: 12
Репутация: 4   ±
Замечания:   ±
На сайте с 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
ЯНДЕКС Дата: 03.01.2017
mikhail09p Дата: Вт, 03.01.2017, 13:32  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 507
Репутация: 11   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Для того, чтобы программа могла вывести микроконтроллер из состояния сна, необходимо задействовать встроенный сторожевой таймер WDT. Для этого в начале программы необходимо включить список команд, определяющих конфигурацию
программирования PIC-микроконтроллера. В этом списке должна присутствовать команда включения сторожевого таймера WDT_ON

http://terrarus.ucoz.ru/proton_plus_ide/index.html
Unicorn Дата: Вт, 03.01.2017, 16:18  |                                                                                                                Сообщение # 3
Группа: Пользователи
Ранг:  Новенький
Сообщений: 12
Репутация: 4   ±
Замечания:   ±
На сайте с 27.10.2014

Статус: Offline

Спасибо за уточнение. Включил сторожевой таймер, программа так и не заработала должным образом. Сбой происходит на операторе PAUSE, дальше программа не выполняется.
Сообщение отредактировал Unicorn - Вт, 03.01.2017, 16:25
ivan_fd Дата: Ср, 04.01.2017, 21:03  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Специалист
Сообщений: 900
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Сторожевой таймер тут Вам не поможет.
Какая версия компилятора у Вас?
В Протеусе пробовали???


Меня все время преследуют умные мысли...но я быстрее!!!
ivan_fd Дата: Ср, 04.01.2017, 21:46  |                                                                                                                Сообщение # 5
Группа: Модераторы
Ранг:  Специалист
Сообщений: 900
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Запрограммируйте этот файл. В контроллер 84А.  Посмотрите, что будет.
Прикрепления: Untitled.hex(2Kb)


Меня все время преследуют умные мысли...но я быстрее!!!
mikhail09p Дата: Ср, 04.01.2017, 22:10  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 507
Репутация: 11   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Да, я не увидел, что 'sleep 3 - закоментировано...
Переходите на Протон.

Сообщение отредактировал mikhail09p - Ср, 04.01.2017, 22:10
Unicorn Дата: Ср, 04.01.2017, 23:24  |                                                                                                                Сообщение # 7
Группа: Пользователи
Ранг:  Новенький
Сообщений: 12
Репутация: 4   ±
Замечания:   ±
На сайте с 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
Группа: Модераторы
Ранг:  Специалист
Сообщений: 900
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Схема у Вас какая? Должно все работать. SHIFTOUT тут не при чем.

Да и Протеусе работает как надо.


Меня все время преследуют умные мысли...но я быстрее!!!
Unicorn Дата: Чт, 05.01.2017, 17:42  |                                                                                                                Сообщение # 9
Группа: Пользователи
Ранг:  Новенький
Сообщений: 12
Репутация: 4   ±
Замечания:   ±
На сайте с 27.10.2014

Статус: Offline

Вот схема.

Попробовал реализовать работу SPI используя набор команд PULSOUT вместо SHIFTOUT. Программа до конца так и не работает, все по прежнему виснет на PAUSE, единственное, что стало лучше это на индикаторе перестал появляться "мусор" и PIC начал реагировать на кнопку сброса. По хаотичному морганию контрольных светодиодов на выводах DIN и CLK видно, что на команде PAUSE шина SPI почему то остается в рабочем состоянии продолжая передачу данных ! А протэус умеет работать с TM1640, у него есть библиотека на эту микросхему ?
Прикрепления: 8214070.bmp(37Kb)
ivan_fd Дата: Чт, 05.01.2017, 18:19  |                                                                                                                Сообщение # 10
Группа: Модераторы
Ранг:  Специалист
Сообщений: 900
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

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


Меня все время преследуют умные мысли...но я быстрее!!!
xvovanx Дата: Чт, 05.01.2017, 23:51  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 263
Репутация: 12   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Глянул в схему - мне очень не понравилось, что и подтяжка к +5 и светодиоды все в кучу. Подтяжка через делитель напряжения получается.
Unicorn Дата: Чт, 05.01.2017, 23:57  |                                                                                                                Сообщение # 12
Группа: Пользователи
Ранг:  Новенький
Сообщений: 12
Репутация: 4   ±
Замечания:   ±
На сайте с 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
Группа: Модераторы
Ранг:  Специалист
Сообщений: 900
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Я думаю, что проблема у Вас в схеме а не программе. Посмотрите внимательно на питание, не просаживается ли оно. Отключите от контроллера все, только светодиод оставьте и посмотрите как себя поведет.
Есть ли конденсаторы на кварце? На сброс он должен реагировать всегда!!
Да и Вы говорили, что разные контроллеры одинаково себя ведут.


Меня все время преследуют умные мысли...но я быстрее!!!
Unicorn Дата: Пт, 06.01.2017, 12:07  |                                                                                                                Сообщение # 14
Группа: Пользователи
Ранг:  Новенький
Сообщений: 12
Репутация: 4   ±
Замечания:   ±
На сайте с 27.10.2014

Статус: Offline

Цитата ivan_fd ()
Я думаю, что проблема у Вас в схеме....

Благодарю за подсказку. Вы оказались правы. Проблема действительно была в качестве питания схемы. Установив дополнительный керамический конденсатор по питанию, непосредственно на выводы TM1640 удалось добиться стабильной работы всей программы. При работе с другими микросхемами в разных проектах таких проблем не было, всегда хватало фильтрующих конденсаторов в блоке питания, видимо китайская TM1640 оказалась намного более чувствительной к помехам. Еще раз спасибо !
Форум Picbasic.ru » Программирование МК » PicBasicPro » PIC16f84A + SPI TM1640 + 7-ми сег. LED индикатор (глюк прог. при совместном использовании SHIFTOUT и PAUSE)
Страница 1 из 11
Поиск: