Например TDA7294

Форум РадиоКот • Просмотр темы - фонарик на контроллере PIC12F675
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вт фев 10, 2026 06:11:53

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: фонарик на контроллере PIC12F675
СообщениеДобавлено: Пт янв 01, 2016 17:49:02 
Встал на лапы

Зарегистрирован: Вт дек 15, 2015 18:36:20
Сообщений: 111
Рейтинг сообщения: 0
контроллер управляет сециолизированым драйвером собраным на микросхеме ZXSC400. Несколько нюансов диоды VD1-3 быстродействующие подних подобрать резистор между контактами 2 и 3 микросхемы LP2985 (ориентировочно 2Ком). Резистором R1 устанавливается напряжнние выхода с микросхемы К1156ЕН5ВП. Совместно с подбором резистором R10 устонавить ток заряда (выбрать меньше 0.5а иначе сработает защита К1156ЕН5ВП) желательно взять проволочный. В моей схеме напряжение выхода 4.2в и 1.2ом. Резистором R14 калибруем АЦП чтобы 1в = 204 в бинарном выражении.
Изображение

Программа написана на асемблере

Спойлер
Код:
;программа управления светодиодным фонариком
;на контроллере 12F675 
   LIST P=12F675, R=DEC
   include "P12F675.INC"
   __CONFIG (_CPD_OFF&_CP_OFF&_BODEN_ON&_MCLRE_OFF&_PWRTE_ON&_WDT_ON&_INTRC_OSC_NOCLKOUT)
;         cpd_ защита пам данных выкл     
;                   cp_ защита пам програм выкл   
;                           boden_ разр сброса по снижению питания вкл
;                                     mclre_ gp3 как порт, -mclre подключен к vdd
;                                               pwrte_ таймер включения питания вкл
;                                                         wdt_ сторожевой таймер вкл
;                                                                 intrc_ вутренний rc, gp4 gp5 как порт
   errorlevel 0,-305,-302
;*******************************************************************************
;      ПЕРЕМЕННЫЕ
;*******************************************************************************
               cblock      20h         ; Начальный адрес блока пользовательской памяти
      P_Err                        ; Счётчик периодов в цикле
      STATBAT                        ; Статус батареи
                                 ;7- 0-заряжено 1-разряжено
                                 ;6- разрешение на включение фонаря 1-можно 0-нельзя
      FLAGIZM                        ;0-флаг сравнения
                                 ; если U> UMAX, UMIN то выставляем флаг =1
                                 ; если U< UMAX, UMIN то выставляем флаг =0
                                 ;1-флаг нажатия кнопки
                                 ; кнопка нажималась     флаг =1
                                 ; кнопка не нажималась  флаг =0
                                 ;2- разрешение на включение фонаря 1-можно 0-нельзя
                                 ;3-флаг не нажатия кнопки
                                 ; кнопка не нажималась  флаг =1
                                 ; кнопка нажималась     флаг =0

      var01                        ; Временный регистр
      var02                        ; Временный регистр
      var03                        ; Временный регистр
      var04                        ; Временный регистр
      U_H                           ; напряжение старший разряд
      U_L                           ; напряжение младший разряд
      UMAX_H                        ; максимальное напряжение старший разряд
      UMAX_L                        ; максимальное напряжение младший разряд
      UMIN_H                        ; минимальное напряжение старший разряд
      UMIN_L                        ; минимальное напряжение младший разряд
               endc
;*******************************************************************************
;      ПРОГРАММА
;*******************************************************************************
      ORG         0                  ; Начало
      goto      start               ; Переход на основную программу
      ORG         4                  ; Вектор прерывания
                                 ; далее код обработчика которого нет
      RETFIE                        ; Возврат из прерывания
;*******************************************************************************
;      ИНИЦИАЛИЗАЦИЯ
;*******************************************************************************
start
;******** КОНФИГУРИРОВАНИЕ КОНТРОЛЛЕРА ********************************************************
;*** Необходимо помнить, что калибровочные константы стираются при программировании, **********
;****** Калибровка Генератора *****************************************************************
      bsf         STATUS,RP0            ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
      Call      3FFh               ; калибровочная константа внутреннего RC генератора в w
      movwf      OSCCAL               ; Загрузить калибровочную константу
;****** Калибровка предделителя ****************************************************************
      bcf         STATUS,RP0            ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
      clrwdt                        ; сброс сторожевго таймера и прдделителя
      bsf         STATUS,RP0            ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
      movlw      b'11001111'            ;7-1 подтягивающие резисторы выключены,
                                 ;5-0 внутренний тактовый сигнал
                                 ;3-1 предделитель WDT 
                                 ;2,1,0-111 ккоэффициент 1:128 2.3сек
      movwf      OPTION_REG            ; запись управляющего слова
;****** Калибровка прерывания ******************************************************************
      bcf         STATUS,RP0            ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
      movlw      b'00000000'            ;7,0 все прерывания запрещены
      movwf      INTCON               ; запись управляющего слова
;******** Установка направления работы ног *****************************************************
;GP0 -вход   аналоговый   измерение напряжения аккумулятора
;GP1 -выход  цыфровой     управление светом фонаря              1-включено
;GP2 -выход  цыфровой     управление питанием контроллера       1-включено
;GP3 -вход   цыфровой     кнопка                                1-включено
;GP4 -выход  цыфровой     индикация                             0-зелёный 1-красный 3-е ссостояние потушить
;GP5 -выход  цыфровой     управление зарядом                    0-включить 3-е состояние выключить
      clrf      GPIO               ; инициализация защелок (все выходы равны нулю)
      movlw      b'00000111'            ;2,1,0-111 выключить компаратор
      movwf      CMCON               ; компаратор выключен, GP0, GP1, GP2 - цифровые вх/вых
      bsf         STATUS,RP0            ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
      movlw      b'00000000'            ; выключить опорное напряжение
      movwf      VRCON               ; компаратор выключен
      movlw      b'00001001'            ; настройка входов/выходов (Порт направления: 1=вход 0=выход)
      movwf      TRISIO               ; запись управляющего слова
      clrf      WPU                   ; подтягивающие резисторы выключены
      clrf      IOCB               ; прерывания по измненению сигнвла на входвх запрещены
      movlw      b'01110001'            ; настройка входов АЦП
                                 ;6,5,4-Х11 отдельнфй внутренний RC генератор
                                 ;3,2,1,0-0001 GP3,2,1-выход цыфровой GP0-вход аналоговый
      movwf      ANSEL               ; запись управляющего слова
;******** Управление АЦП ***********************************************************************
      bcf         STATUS,RP0            ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
      movlw      b'10000001'            ;7-1 правое выравнивание 
                                 ;6-0 опорное напряжение от питания контроллера Vdd
                                 ;3,2-00 выбор 0-го аналогового канала, GP0-вход аналоговый
                                 ;1-0 бит статуса модуля АЦП 1-начать преобразование 0-преобразование завершено
                                 ;0-1 бит включения модуля АЦП 1-модуль включен, 0-модуль выключен и не потребляет ток
      movwf      ADCON0               ; запись управляющего слова
;******** Начало логики работы *****************************************************************
      bsf         GPIO,GP2            ; включение питания контроллера 1-включено
prodprov
      clrwdt                        ; сброс сторожевго таймера и прдделителя
      clrf      FLAGIZM               ; обнулить все флаги измерения
      Call      knop1               ;подпрограмма проверка нажатия кнопки
      Call      knop2               ;подпрограмма проверка не нажатия кнопки
;проверка вариантов запуска
      btfsc      FLAGIZM,1            ;проверка в регистрe FLAGIZM,1 бит=0 то следующее пропустить
      goto      provml11            ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
      btfss      FLAGIZM,1            ;проверка в регистрe FLAGIZM,1 бит=1 то следующее пропустить
      goto      provml12            ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml12                           ;если FLAGIZM,1=0
      btfsc      FLAGIZM,3            ;проверка в регистрe FLAGIZM,3 бит=0 то следующее пропустить
      goto      xod11               ;если бит FLAGIZM,3=0 то выполнится код внутри
      goto      prodprov            ;не корректное поведение кнопки порверить снова
xod11                              ;
      btfss      FLAGIZM,3            ;проверка в регистрe FLAGIZM,3 бит=1 то следующее пропустить
      goto      xod12               ;если бит FLAGIZM,3=1 то выполнится код внутри
      goto      ciklzar               ; начало основного цикла заряда**************
xod12                              ;
      goto      oconizm11            ;
provml11                           ;если FLAGIZM,1=1
      btfsc      FLAGIZM,3            ;проверка в регистрe FLAGIZM,3 бит=0 то следующее пропустить
      goto      xod13               ;если бит FLAGIZM,3=0 то выполнится код внутри
      goto      ciklfon               ; начало основного цикла фонарика************
xod13                              ;
      btfss      FLAGIZM,3            ;проверка в регистрe FLAGIZM,3 бит=1 то следующее пропустить
      goto      xod14               ;если бит FLAGIZM,3=1 то выполнится код внутри
      goto      ciklfon               ; начало основного цикла фонарика************ пофиг всёравно включить
;      goto      prodprov            ;не корректное поведение кнопки порверить снова
xod14                              ;
oconizm11




;****************************************************************************************************************************************
ciklzar            ; начало основного цикла заряда
      clrwdt                        ; сброс сторожевго таймера и прдделителя
      clrf      FLAGIZM               ; обнулить все флаги измерения
      bcf         GPIO,GP2            ; выключение питания контроллера 0-включено т.к питание от зарядника
;программа включить заряд
      bsf         STATUS,RP0            ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
      bcf         TRISIO,GP5            ; GP5 на выход
      bcf         STATUS,RP0            ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
      bcf         GPIO,GP5            ;включить заряд 0-включено
;число 866 4.1в это число при котором устонавливается порог заряда батареи
;выше него выключится заряд
      movlw      b'00000011'   ;;;;;         
      movwf      UMAX_H               ; максимальное напряжение старший разряд
      movlw      b'01100010'
      movwf      UMAX_L               ; максимальное напряжение младший разряд
      clrwdt
      Call      DELAY_ADC            ;чтение результата преобразования АЦП
      Call      srav_napr            ;подпрограмма сравнения
;индикация результата сравнения
      btfsc      FLAGIZM,0            ;проверка в регистрe FLAGIZM бит=0 то следующее пропустить
      goto      jamp07               ;если бит =0 то выполнится код внутри
      Call      gp4_kr               ;0-й бит =0
;программа включить заряд
      bsf         STATUS,RP0            ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
      bcf         TRISIO,GP5            ; GP5 на выход
      bcf         STATUS,RP0            ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
      bcf         GPIO,GP5            ;включить заряд 0-включено
jamp07                              ;
      btfss      FLAGIZM,0            ;проверка в регистрe FLAGIZM бит=1 то следующее пропустить
      goto      jamp08               ;если бит =1 то выполнится код внутри
      Call      gp4_zel               ;0-й бит =1
;программа выключить заряд
      bsf         STATUS,RP0            ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
      bsf         TRISIO,GP5            ; GP5 на вход
      bcf         STATUS,RP0            ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)

;эта часть кода на сучай если зарядное осталоси поделюченым
podzarad
      clrwdt                        ; сброс сторожевго таймера и прдделителя
      clrf      FLAGIZM               ; обнулить все флаги измерения
;число 846 4.01в это число при котором устонавливается порог заряда батареи
;ниже него включится заряд
      movlw      b'00000011'   ;;;;;         
      movwf      UMAX_H               ; максимальное напряжение старший разряд
      movlw      b'01100010'
      movwf      UMAX_L               ; максимальное напряжение младший разряд
      clrwdt
      Call      DELAY_ADC            ;чтение результата преобразования АЦП
      Call      srav_napr            ;подпрограмма сравнения
;результат сравнения
      btfsc      FLAGIZM,0            ;проверка в регистрe FLAGIZM бит=0 то следующее пропустить
      goto      jamp09               ;если бит =0 то выполнится код внутри
      goto      ciklzar               ; начало основного цикла заряда**************
jamp09                              ;
      btfss      FLAGIZM,0            ;проверка в регистрe FLAGIZM бит=1 то следующее пропустить
      goto      jamp10               ;если бит =1 то выполнится код внутри
;моргнём зелёным
      Call      pause
      Call      gp4_0
      Call      pause
      Call      gp4_zel
      goto      podzarad
jamp10
jamp08
      goto      ciklzar               ; и переходить обратно для зацикливания
;****************************************************************************************************************************************
ciklfon            ; начало основного цикла фонарика
      clrwdt                        ; сброс сторожевго таймера и прдделителя
      clrf      FLAGIZM               ; обнулить все флаги измерения
      Call      knop2               ;подпрограмма проверка не нажатия кнопки
      btfss      FLAGIZM,3            ;проверка в регистрe FLAGIZM,3 бит=1 то следующее пропустить
      goto      ciklfon               ; кнопка не отпущена

ciklfonrab
      clrf      FLAGIZM               ; обнулить все флаги измерения
      clrwdt                        ; сброс сторожевго таймера и прдделителя
;программа выключить заряд
      bsf         STATUS,RP0            ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
      bsf         TRISIO,GP5            ; GP5 на вход
      bcf         STATUS,RP0            ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)

;обьявить переменные
      clrf      FLAGIZM               ; обнулить все флаги измерения
;число 612 3в это число при котором устонавливается порог разряда батареи
;ниже него фонарик просто выключится
      movlw      b'00000010'   ;;;;;         
      movwf      UMAX_H               ; максимальное напряжение старший разряд
      movlw      b'01100110'
      movwf      UMAX_L               ; максимальное напряжение младший разряд

      clrwdt
      Call      DELAY_ADC            ;чтение результата преобразования АЦП
      Call      srav_napr            ;подпрограмма сравнения
      bsf         FLAGIZM,2            ;2-й бит в 1 разрешение на включение фонаря
;индикация результата сравнения
      btfsc      FLAGIZM,0            ;проверка в регистрe FLAGIZM бит=0 то следующее пропустить
      goto      jamp03               ;если бит =0 то выполнится код внутри
      Call      gp4_kr               ;0-й бит =0
      bcf         FLAGIZM,2            ;2-й бит в 0 разрешение на выключение фонаря
jamp03                              ;
      btfss      FLAGIZM,0            ;проверка в регистрe FLAGIZM бит=1 то следующее пропустить
      goto      jamp04               ;если бит =1 то выполнится код внутри
      Call      gp4_zel               ;0-й бит =1
      bsf         FLAGIZM,2            ;2-й бит в 1 разрешение на включение фонаря
jamp04                              ;
;управление светом фонаря
      btfsc      FLAGIZM,2            ;проверка в регистрe FLAGIZM бит=0 то следующее пропустить
      goto      jamp05               ;если бит =0 то выполнится код внутри
      bcf         GPIO,GP1            ;управление светом фонаря 0-выключено
      bcf         GPIO,GP2            ; включение питания контроллера 0-выключено
jamp05                              ;
      btfss      FLAGIZM,2            ;проверка в регистрe FLAGIZM бит=1 то следующее пропустить
      goto      jamp06               ;если бит =1 то выполнится код внутри
      bsf         GPIO,GP1            ;управление светом фонаря 1-включено
jamp06   
      Call      knop1               ;подпрограмма проверка нажатия кнопки
;команда на выключение
      btfsc      FLAGIZM,1            ;проверка нажатия кнопки бит=0 то следующее пропустить
      goto      log01               ;если 1-й бит =0 выполняется это условие ниже
      nop
log01
      btfss      FLAGIZM,1            ;проверка нажатия кнопки бит=1 то следующее пропустить
      goto      log02               ;если 1-й бит =1 выполняется это условие ниже
      bcf         GPIO,GP2            ; включение питания контроллера 0-выключено, кнопка нажималась
      bcf         FLAGIZM,1            ;1-й бит в 0 сброс флага нажатия кнопки
      bcf         GPIO,GP1            ;управление светом фонаря 0-выключено
      bcf         FLAGIZM,2            ;2-й бит в 0 выключение фонаря
      goto      $-1                  ;отступить на шаг назад зависнуть навсегда
log02

      clrwdt                        ; сброс сторожевго таймера и прдделителя
      goto      ciklfonrab            ; и переходить обратно для зацикливания
;****************************************************************************************************************************************
;ПОДПРОГРАММЫ
;подпрограмма проверка нажатия кнопки
knop1   clrwdt                        ; сброс сторожевго таймера и прдделителя
      movlw      0ffh               ;загрузить 0ffh в регистр w
      movwf      var03               ;загрузить регистр w в var03
loop3   movlw      0ffh               ;загрузить 0ffh в регистр w
      movwf      var04               ;загрузить регистр w в var04
loop4   btfsc      GPIO,GP3            ;проверка нажатия кнопки бит=0 то следующее пропустить
      goto      next1               ;кнопка удерживается
      btfss      GPIO,GP3            ;проверка нажатия кнопки бит=1 то следующее пропустить
      goto      bad1               ;проверка удержанмя провал
next1   decfsz      var04,1               ;уменьшить на 1
      goto      loop4               ;и переходить обратно пока не станет =0
      decfsz      var03,1               ;уменьшить на 1
      goto      loop3               ;и переходить обратно пока не станет =0
      bsf         FLAGIZM,1            ;1-й бит в 1 флаг нажатия кнопки
      goto      endprov1            ;проверка удержанмя успешна
bad1   bcf         FLAGIZM,1            ;1-й бит в 0 флаг нажатия кнопки
endprov1
      return
;подпрограмма проверка не нажатия кнопки
knop2   clrwdt                        ; сброс сторожевго таймера и прдделителя
      movlw      0ffh               ;загрузить 0ffh в регистр w
      movwf      var03               ;загрузить регистр w в var03
loop5   movlw      0ffh               ;загрузить 0ffh в регистр w
      movwf      var04               ;загрузить регистр w в var04
loop6   btfss      GPIO,GP3            ;проверка нажатия кнопки бит=1 то следующее пропустить
      goto      next2               ;кнопка не нажималась
      btfsc      GPIO,GP3            ;проверка нажатия кнопки бит=0 то следующее пропустить
      goto      bad2               ;проверка нажатия провал
next2   decfsz      var04,1               ;уменьшить на 1
      goto      loop6               ;и переходить обратно пока не станет =0
      decfsz      var03,1               ;уменьшить на 1
      goto      loop5               ;и переходить обратно пока не станет =0
      bsf         FLAGIZM,3            ;3-й бит в 1 флаг не нажатия кнопки
      goto      endprov2            ;проверка удержанмя успешна
bad2   bcf         FLAGIZM,3            ;3-й бит в 0 флаг нажатия кнопки
endprov2
      return
;подпрограмма сравнения
srav_napr
;сравним два бита
      clrwdt                        ; сброс сторожевго таймера и прдделителя
;проверка в регистра 1 в _H
      btfsc      UMAX_H,1            ;проверка в регистрe UMAX_H ст разр бит=0 то следующее пропустить
      goto      provml11_H            ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
      btfss      UMAX_H,1            ;проверка в регистрe UMAX_H ст разр бит=1 то следующее пропустить
      goto      provml12_H            ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml12_H                           ;если UMAX_H=0
      btfsc      U_H,1               ;проверка в регистрe U_H мл разр бит=0 то следующее пропустить
      goto      xod11_H               ;если бит =0 то выполнится код внутри
      goto      per0_H               ;переход при условии биты равны если U_H=0
xod11_H                              ;
      btfss      U_H,1               ;проверка в регистрe U_H мл разр бит=1 то следующее пропустить
      goto      xod12_H               ;если бит =1 то выполнится код внутри
      bsf         FLAGIZM,0            ;0-й бит в 1 если U_H=1
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod12_H                              ;
      goto      oconizm11_H            ;
provml11_H                           ;если UMAX_H=1
      btfsc      U_H,1               ;проверка в регистрe U_H мл разр бит=0 то следующее пропустить
      goto      xod13_H               ;если бит =0 то выполнится код внутри
      bcf         FLAGIZM,0            ;0-й бит в 0 если U_H=0
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod13_H                              ;
      btfss      U_H,1               ;проверка в регистрe U_H мл разр бит=1 то следующее пропустить
      goto      xod14_H               ;если бит =1 то выполнится код внутри
      goto      per0_H               ;переход при условии биты равны если U_H=1
xod14_H                              ;
oconizm11_H
;проверка в регистра 0 в _H
per0_H
      btfsc      UMAX_H,0            ;проверка в регистрe UMAX_H ст разр бит=0 то следующее пропустить
      goto      provml01_H            ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
      btfss      UMAX_H,0            ;проверка в регистрe UMAX_H ст разр бит=1 то следующее пропустить
      goto      provml02_H            ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml02_H                           ;если UMAX_H=0
      btfsc      U_H,0               ;проверка в регистрe U_H мл разр бит=0 то следующее пропустить
      goto      xod01_H               ;если бит =0 то выполнится код внутри
      goto      per7_L               ;переход при условии биты равны если U_H=0
xod01_H                              ;
      btfss      U_H,0               ;проверка в регистрe U_H мл разр бит=1 то следующее пропустить
      goto      xod02_H               ;если бит =1 то выполнится код внутри
      bsf         FLAGIZM,0            ;0-й бит в 1 если U_H=1
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod02_H                              ;
      goto      oconizm01_H            ;
provml01_H                           ;если UMAX_H=1
      btfsc      U_H,0               ;проверка в регистрe U_H мл разр бит=0 то следующее пропустить
      goto      xod03_H               ;если бит =0 то выполнится код внутри
      bcf         FLAGIZM,0            ;0-й бит в 0 если U_H=0
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod03_H                              ;
      btfss      U_H,0               ;проверка в регистрe U_H мл разр бит=1 то следующее пропустить
      goto      xod04_H               ;если бит =1 то выполнится код внутри
      goto      per7_L               ;переход при условии биты равны если U_H=1
xod04_H                              ;
oconizm01_H
;проверка в регистра 7 в _L
per7_L
      btfsc      UMAX_L,7            ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить
      goto      provml71_L            ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
      btfss      UMAX_L,7            ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить
      goto      provml72_L            ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml72_L                           ;если UMAX_H=0
      btfsc      U_L,7               ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
      goto      xod71_L               ;если бит =0 то выполнится код внутри
      goto      per6_L               ;переход при условии биты равны если U_L=0
xod71_L                              ;
      btfss      U_L,7               ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
      goto      xod72_L               ;если бит =1 то выполнится код внутри
      bsf         FLAGIZM,0            ;0-й бит в 1 если U_L=1
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod72_L                              ;
      goto      oconizm71_L            ;
provml71_L                           ;если UMAX_L=1
      btfsc      U_L,7               ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
      goto      xod73_L               ;если бит =0 то выполнится код внутри
      bcf         FLAGIZM,0            ;0-й бит в 0 если U_L=0
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod73_L                              ;
      btfss      U_L,7               ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
      goto      xod74_L               ;если бит =1 то выполнится код внутри
      goto      per6_L               ;переход при условии биты равны если U_L=1
xod74_L                              ;
oconizm71_L
;проверка в регистра 6 в _L
per6_L
      btfsc      UMAX_L,6            ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить
      goto      provml61_L            ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
      btfss      UMAX_L,6            ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить
      goto      provml62_L            ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml62_L                           ;если UMAX_H=0
      btfsc      U_L,6               ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
      goto      xod61_L               ;если бит =0 то выполнится код внутри
      goto      per5_L               ;переход при условии биты равны если U_L=0
xod61_L                              ;
      btfss      U_L,6               ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
      goto      xod62_L               ;если бит =1 то выполнится код внутри
      bsf         FLAGIZM,0            ;0-й бит в 1 если U_L=1
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod62_L                              ;
      goto      oconizm61_L            ;
provml61_L                           ;если UMAX_L=1
      btfsc      U_L,6               ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
      goto      xod63_L               ;если бит =0 то выполнится код внутри
      bcf         FLAGIZM,0            ;0-й бит в 0 если U_L=0
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod63_L                              ;
      btfss      U_L,6               ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
      goto      xod64_L               ;если бит =1 то выполнится код внутри
      goto      per5_L               ;переход при условии биты равны если U_L=1
xod64_L                              ;
oconizm61_L
;проверка в регистра 5 в _L
per5_L
      btfsc      UMAX_L,5            ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить
      goto      provml51_L            ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
      btfss      UMAX_L,5            ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить
      goto      provml52_L            ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml52_L                           ;если UMAX_H=0
      btfsc      U_L,5               ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
      goto      xod51_L               ;если бит =0 то выполнится код внутри
      goto      per4_L               ;переход при условии биты равны если U_L=0
xod51_L                              ;
      btfss      U_L,5               ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
      goto      xod52_L               ;если бит =1 то выполнится код внутри
      bsf         FLAGIZM,0            ;0-й бит в 1 если U_L=1
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod52_L                              ;
      goto      oconizm51_L            ;
provml51_L                           ;если UMAX_L=1
      btfsc      U_L,5               ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
      goto      xod53_L               ;если бит =0 то выполнится код внутри
      bcf         FLAGIZM,0            ;0-й бит в 0 если U_L=0
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod53_L                              ;
      btfss      U_L,5               ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
      goto      xod54_L               ;если бит =1 то выполнится код внутри
      goto      per4_L               ;переход при условии биты равны если U_L=1
xod54_L                              ;
oconizm51_L
;проверка в регистра 4 в _L
per4_L
      btfsc      UMAX_L,4            ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить
      goto      provml41_L            ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
      btfss      UMAX_L,4            ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить
      goto      provml42_L            ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml42_L                           ;если UMAX_H=0
      btfsc      U_L,4               ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
      goto      xod41_L               ;если бит =0 то выполнится код внутри
      goto      per3_L               ;переход при условии биты равны если U_L=0
xod41_L                              ;
      btfss      U_L,4               ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
      goto      xod42_L               ;если бит =1 то выполнится код внутри
      bsf         FLAGIZM,0            ;0-й бит в 1 если U_L=1
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod42_L                              ;
      goto      oconizm41_L            ;
provml41_L                           ;если UMAX_L=1
      btfsc      U_L,4               ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
      goto      xod43_L               ;если бит =0 то выполнится код внутри
      bcf         FLAGIZM,0            ;0-й бит в 0 если U_L=0
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod43_L                              ;
      btfss      U_L,4               ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
      goto      xod44_L               ;если бит =1 то выполнится код внутри
      goto      per3_L               ;переход при условии биты равны если U_L=1
xod44_L                              ;
oconizm41_L
;проверка в регистра 3 в _L
per3_L
      btfsc      UMAX_L,3            ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить
      goto      provml31_L            ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
      btfss      UMAX_L,3            ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить
      goto      provml32_L            ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml32_L                           ;если UMAX_H=0
      btfsc      U_L,3               ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
      goto      xod31_L               ;если бит =0 то выполнится код внутри
      goto      per2_L               ;переход при условии биты равны если U_L=0
xod31_L                              ;
      btfss      U_L,3               ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
      goto      xod32_L               ;если бит =1 то выполнится код внутри
      bsf         FLAGIZM,0            ;0-й бит в 1 если U_L=1
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod32_L                              ;
      goto      oconizm31_L            ;
provml31_L                           ;если UMAX_L=1
      btfsc      U_L,3               ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
      goto      xod33_L               ;если бит =0 то выполнится код внутри
      bcf         FLAGIZM,0            ;0-й бит в 0 если U_L=0
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod33_L                              ;
      btfss      U_L,3               ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
      goto      xod34_L               ;если бит =1 то выполнится код внутри
      goto      per2_L               ;переход при условии биты равны если U_L=1
xod34_L                              ;
oconizm31_L
;проверка в регистра 2 в _L
per2_L
      btfsc      UMAX_L,2            ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить
      goto      provml21_L            ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
      btfss      UMAX_L,2            ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить
      goto      provml22_L            ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml22_L                           ;если UMAX_H=0
      btfsc      U_L,2               ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
      goto      xod21_L               ;если бит =0 то выполнится код внутри
      goto      per1_L               ;переход при условии биты равны если U_L=0
xod21_L                              ;
      btfss      U_L,2               ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
      goto      xod22_L               ;если бит =1 то выполнится код внутри
      bsf         FLAGIZM,0            ;0-й бит в 1 если U_L=1
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod22_L                              ;
      goto      oconizm21_L            ;
provml21_L                           ;если UMAX_L=1
      btfsc      U_L,2               ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
      goto      xod23_L               ;если бит =0 то выполнится код внутри
      bcf         FLAGIZM,0            ;0-й бит в 0 если U_L=0
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod23_L                              ;
      btfss      U_L,2               ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
      goto      xod24_L               ;если бит =1 то выполнится код внутри
      goto      per1_L               ;переход при условии биты равны если U_L=1
xod24_L                              ;
oconizm21_L
;проверка в регистра 1 в _L
per1_L
      btfsc      UMAX_L,1            ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить
      goto      provml11_L            ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
      btfss      UMAX_L,1            ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить
      goto      provml12_L            ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml12_L                           ;если UMAX_H=0
      btfsc      U_L,1               ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
      goto      xod11_L               ;если бит =0 то выполнится код внутри
      goto      per0_L               ;переход при условии биты равны если U_L=0
xod11_L                              ;
      btfss      U_L,1               ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
      goto      xod12_L               ;если бит =1 то выполнится код внутри
      bsf         FLAGIZM,0            ;0-й бит в 1 если U_L=1
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod12_L                              ;
      goto      oconizm11_L            ;
provml11_L                           ;если UMAX_L=1
      btfsc      U_L,1               ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
      goto      xod13_L               ;если бит =0 то выполнится код внутри
      bcf         FLAGIZM,0            ;0-й бит в 0 если U_L=0
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod13_L                              ;
      btfss      U_L,1               ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
      goto      xod14_L               ;если бит =1 то выполнится код внутри
      goto      per0_L               ;переход при условии биты равны если U_L=1
xod14_L                              ;
oconizm11_L
;проверка в регистра 0 в _L
per0_L
      btfsc      UMAX_L,0            ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить
      goto      provml01_L            ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
      btfss      UMAX_L,0            ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить
      goto      provml02_L            ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml02_L                           ;если UMAX_H=0
      btfsc      U_L,0               ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
      goto      xod01_L               ;если бит =0 то выполнится код внутри
      bcf         FLAGIZM,0            ;0-й бит в 0 если U_L=0
      goto      oconizm               ;переход при условии биты равны
xod01_L                              ;
      btfss      U_L,0               ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
      goto      xod02_L               ;если бит =1 то выполнится код внутри
      bsf         FLAGIZM,0            ;0-й бит в 1 если U_L=1
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod02_L                              ;
      goto      oconizm01_L            ;
provml01_L                           ;если UMAX_L=1
      btfsc      U_L,0               ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
      goto      xod03_L               ;если бит =0 то выполнится код внутри
      bcf         FLAGIZM,0            ;0-й бит в 0 если U_L=0
      goto      oconizm               ;запомнить результат сравнения и закончить сравнивание
xod03_L                              ;
      btfss      U_L,0               ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
      goto      xod04_L               ;если бит =1 то выполнится код внутри
      bcf         FLAGIZM,0            ;0-й бит в 0 если U_L=1
      goto      oconizm               ;переход при условии биты равны
xod04_L                              ;
oconizm01_L
oconizm
      return

;подпрограмма ожидания результата преобразования АЦП
DELAY_ADC
      goto      $+1                  ;задержка после выбора канала ацп, + два шага
      goto      $+1
      goto      $+1
      bsf         ADCON0,GO_DONE         ;разрешить преобразование АЦП (установить в 1 1-й бит регистра adcono)
      btfsc      ADCON0,GO_DONE         ;проверка окончания преобразование АЦП если GO=0 то следующее пропустить
      goto   $-1                     ;отступить на шаг назад
      bcf         INTCON,GIE            ;запретить прерывания (установить в 0 7-й бит регистра intcon)
      bsf         STATUS, RP0            ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
      movf      ADRESL,W            ;содержимое младшего разряда резултата АЦП в регистр w
      bcf         STATUS, RP0            ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
      bsf         INTCON,GIE            ;разрешить прерывания (установить в 1 7-й бит регистра intcon)
      movwf      U_L                  ;загрузить регистр w в U_L (напряжение младший разряд)
      movf      ADRESH,W            ;содержимое старшего разряда резултата АЦП в регистр w
      movwf      U_H                  ;загрузить регистр w в U_H (напряжение старший разряд)
      return
;подпрограмма индикации зажеч зелёный GP4 - 1 направление выход
gp4_zel
      bsf         STATUS,RP0            ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
      bcf         TRISIO,GP4            ; GP4 на выход
      bcf         STATUS,RP0            ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
      bcf         GPIO,GP4            ; включение диода индикации 0-зелёный
      return
;подпрограмма индикации зажеч красный GP4 - 0 направление выход
gp4_kr
      bsf         STATUS,RP0            ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
      bcf         TRISIO,GP4            ; GP4 на выход
      bcf         STATUS,RP0            ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
      bsf         GPIO,GP4            ; включение диода индикации 1-красный
      return
;подпрограмма индикации потушить индикацию GP4 направление вход
gp4_0
      bsf         STATUS,RP0            ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
      bsf         TRISIO,GP4            ; GP4 на вход
      bcf         STATUS,RP0            ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
      return

;подпорограмма паузы
pause   clrwdt                        ; сброс сторожевго таймера и прдделителя
      movlw   0ffh                  ;загрузить 0ffh в регистр w
      movwf   var01                  ;загрузить регистр w в var01
loop2   movlw   0ffh                  ;загрузить 0ffh в регистр w
      movwf   var02                  ;загрузить регистр w в var02
loop1   decfsz   var02,1                  ;уменьшить на 1
      goto   loop1                  ;и переходить обратно пока не станет =0
      decfsz   var01,1                  ;уменьшить на 1
      goto   loop2                  ;и переходить обратно пока не станет =0
      return                        ;выход из подпрограммы

;конец программы
         END


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: фонарик на контроллере PIC12F675
СообщениеДобавлено: Пт янв 01, 2016 19:18:46 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 10
Рейтинг сообщений: 163
Зарегистрирован: Вс янв 09, 2011 16:51:39
Сообщений: 2348
Откуда: Санкт-Ленинград
Рейтинг сообщения: 0
И в чём вопрос?

_________________
ICQ нет, и, в ближайшее время, не будет.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: фонарик на контроллере PIC12F675
СообщениеДобавлено: Пт янв 01, 2016 19:54:16 
Встал на лапы

Зарегистрирован: Вт дек 15, 2015 18:36:20
Сообщений: 111
Рейтинг сообщения: 0
просто здесь АЦП мерит напряжение и контроллер результат измерения сравнивает. этого добится было сложновато. в основном все с этим мк делают это на встроеном компараторе здесь АЦП и математика. сам фонарик банален.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: фонарик на контроллере PIC12F675
СообщениеДобавлено: Сб янв 02, 2016 21:19:53 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 10
Рейтинг сообщений: 163
Зарегистрирован: Вс янв 09, 2011 16:51:39
Сообщений: 2348
Откуда: Санкт-Ленинград
Рейтинг сообщения: 0
ivperev писал(а):
здесь АЦП и математика
И в чём прелесть такого решения?
Я, например, тоже стараюсь, по возможности, компаратор использовать вместо АЦП. Конечно, обычно встроенный ИОН имеет гораздо меньшую разрядность, но, часто этого бывает достаточно, а срабатывает он мгновенно.
P.S.: Когда вижу, что в программе нет ни одного обработчика прерывания. сразу как-то дальше смотреть уже не хочется.

_________________
ICQ нет, и, в ближайшее время, не будет.


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y