Главная » Статьи » Proton PICBasic

Применение динамической индикации. Пример 3 - Управление по трем проводам
В этом примере попытаемся еще больше сократить количество выводов для индикации, задействованных у МК. Для этого нам понадобятся два сдвиговых регистра 74HC595 и маленький микроконтроллер PIC12F675. Сначала в качестве примера я не хотел внедрять в программу работу АЦП, но ввиду иногда возникающих сложностей с настройкой АЦП у данного пика решил организовать еще и вольтметр (для желающих есть еще свободный вывод для амперметра).
Итак, чем отличается управление в данном примере от предыдущего, где задействован только один сдвиговый регистр? В принципе ничем: алгоритм один и тот же. Разница лишь в том, что разрядами управляют теперь не порты микроконтроллера непосредственно, а один из сдвиговых регистров. Схема приведена ниже:



Переходим сразу к делу:

'Цифровой вольтметр с возможностью добавления амперметра
Device 12F675
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_OFF, BODEN_ON, MCLRE_OFF
Declare Xtal = 4
Declare Reminders NO
Set_OSCCAL OSCCAL
'---------------------------------------------------------------------------------------------------
Symbol SH_CP = GPIO.2
Symbol But = GPIO.3  
Symbol DS = GPIO.4
Symbol ST_CP = GPIO.5  
'---------------------------------------------------------------------------------------------------
Dim AD_RESULT As ADRESL.Word'Переменная для хранения результата преобразования АЦП  
Dim j As Word 'Переменная для хранения цифрового значения числа
Dim n As Byte 'Число для вывода на индикатор ССИ
Dim Value As Byte 'Переменная для осуществления табличного конвертирования цифры
Dim Dot As Byte 'Символ точки для вывода на ССИ
Dot = 128
'-------------------------------Инициализация микроконтроллера--------------------------------------
  DelayMS 500 'Задержка для стабилизации микроконтроллера
  GoTo OVER_ADC_SUBS 'Переход на конфигурацию портов
'-----------------------------------Старт преобразования--------------------------------------------
ADC:
  ADCON0.0 = 1 'Включим АЦП
  DelayUS 50 'Задержка для заряда внутреннего конденсатора
  ADCON0.1 = 1 'Разрешение преобразования
  While ADCON0.1 = 1: Wend 'Опрос флага GO_DONE для завершения преобразования
  ADCON0.0 = 0 'Выключим АЦП
  Return
'----------------------------Инициализация регистров АЦП--------------------------------------------
OVER_ADC_SUBS:  
  GPIO = %000000  
  TRISIO = %001011 'GP0, GP1 - АЦП; GP2, GP4, GP5 - выходы; GP3 - 10к на +5В
  ANSEL.4 = 1 ' \
  ANSEL.5 = 1 ' FRC
  ANSEL.6 = 0 ' /
  ADCON0.6 = 0 'Источник опорного напряжения - +5В от шины питания
  ADCON0.7 = 1 '
  ANSEL.0 = 1 'Установим GPIO.0 аналоговым входом
  ANSEL.1 = 1 'Установим GPIO.1 аналоговым входом
  ANSEL.2 = 0 'Установим GPIO.2 цифровым выходом
  ANSEL.3 = 0 'Установим GPIO.3 цифровым выходом
'-----------------------------------Главная программа-----------------------------------------------
Start: 'Бесконечный цикл
  ADCON0.2 = 1 'Выбор канала АЦП (см. 43 страницу даташита)
  ADCON0.3 = 0 'Выбор канала АЦП
  GoSub ADC 'Выполним преобразование АЦП
  j = AD_RESULT / 0.2048  
  GoSub Ind
GoTo Start
'--Подпрограмма динамической индикации с использованием двух сдвиговых регистров 74HC595 и 4-x ССИ--
Ind:  
'---------------Зажигание первого справа разряда индикатора и вывод на него цифры-------------------
n = Dig j, 0 'Выделяем из числа единицы
GoSub Convert 'и конвертируем в код ССИ
SHOut DS, SH_CP, msbfirst, [8] 'Проталкиваем в нижний регистр бит для зажигания разряда № 4
SHOut DS, SH_CP, msbfirst, [Value] 'Проталкиваем в верхний регистр сконвертированный код для единиц
ST_CP = 1 'Защелкиваем данные
ST_CP = 0 'Обнуляем защелку данных
'---------------Зажигание второго справа разряда индикатора и вывод на него цифры-------------------
n = Dig j, 1 'Выделяем из числа десятки
GoSub Convert 'и конвертируем в код ССИ
SHOut DS, SH_CP, msbfirst, [4] 'Проталкиваем в нижний регистр бит для зажигания разряда № 3
SHOut DS, SH_CP, msbfirst, [Value]
ST_CP = 1 'Защелкиваем данные
ST_CP = 0 'Обнуляем защелку данных
'---------------Зажигание третьего справа разряда индикатора и вывод на него цифры------------------
n = Dig j, 2 'Выделяем из числа сотни
GoSub Convert 'и конвертируем в код ССИ
SHOut DS, SH_CP, msbfirst, [2] 'Проталкиваем в нижний регистр бит для зажигания разряда № 2
SHOut DS, SH_CP, msbfirst, [Value + Dot] 'Проталкиваем в верхний регистр сконвертированный код для сотен
ST_CP = 1 'Защелкиваем данные
ST_CP = 0 'Обнуляем защелку данных
'---------------Зажигание четвертого справа разряда индикатора и вывод на него цифры----------------
n = Dig j, 3 'Выделяем из числа тысячи
GoSub Convert 'и конвертируем в код ССИ
SHOut DS, SH_CP, msbfirst, [1] 'Проталкиваем в нижний регистр бит для зажигания разряда № 1
SHOut DS, SH_CP, msbfirst, [Value] 'Проталкиваем в верхний регистр сконвертированный код для тысяч
ST_CP = 1 'Защелкиваем данные
ST_CP = 0 'Обнуляем защелку данных

Return
'---------------Зажигание первого справа разряда индикатора и вывод на него цифры-------------------
Convert:
Value = LookUp n, [192,249,164,176,153,146,130,248,128,144,156]
Return
'---------------------------------------------------------------------------------------------------
End

Из комментариев ясно, что сначала зажигаем разряд - проталкиваем байт, содержащий один единственный включенный бит, который подает единицу на разряд. Поскольку данный байт пошел на сдвиговые регистры первым, он поселится в самом нижнем регистре, т.е. во втором. Далее отсылаем байт, содержащий переконвертированное значение цифры для индикации. Теперь уже на ноги индикаторов проскочила настоящая цифра. Остается только защелкнуть данные и смотреть на результат работы.
В примерах на сдвиговых регистрах я не устанавливал задержки на индикацию, поэтому можете поиграться с ними сами (смотрите как это сделано в первом примере)

Как видите - нечего сложного, когда разберешься как это делается.


Категория: Proton PICBasic | Добавил: S_moke (10.01.2012)
Просмотров: 15552 | Комментарии: 4 | Рейтинг: 3.6/5
Всего комментариев: 4
1 retas   (10.01.2012 18:18) [Материал]
Спасибо, S_moke!
Несколько ? :
1. Почему ПП --Старт преобразования-- (метка ADC:) сидит в месте инициализации МК а не в главной прогре?
2. В ПП ADC, ПМ нехватка результата - возвращаемся из неё то ни с чем!

2 S_moke   (11.01.2012 09:12) [Материал]
1.Можно ПП --Старт преобразования-- вставить вместо команды GoSub ADC - ничего не изменится. Просто так наверное решили создатели примера АЦП для PIC12F675 (в Протоне есть).
2.На счет второго вопроса сам думал о том же. Скорее всего здесь по дефолту результат преобразования сбрасывается автоматом в регистр привязанный к AD_RESULT (Dim AD_RESULT As ADRESL.Word)/

3 HardMaster   (14.03.2012 19:54) [Материал]
А как в программе решается проблема с выводом точки ?

4 S_moke   (12.04.2012 12:17) [Материал]
А что за проблема с точкой?

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]