;************************************************************ ; Running 4х3 по технологии диммер на плате с кнопками ; first programm = avtomat ;************************************************************ ; Filename : stager.asm ; Date : aprel 2007 ; Assembler : mpasm 3.20 ; Author : Bogdanov Andrew - bogdanov@tsrv.ru ;************************************************************ #include C:\PHYTON\MACROS\basMacro.mac ; макросы инициализации #include C:\PHYTON\MACROS\pic877.mac ; Processor: PIC16F877 ;************************************************************ ; Bit Definitions ;************************************************************ #define Ledupr1 PORTC,2 ; #define Ledupr2 PORTC,3 ; #define Ledupr3 PORTC,0 ; #define Ledupr4 PORTC,1 ; #define Ledout1 PORTD,1 ; #define Ledout2 PORTD,0 ; #define Ledout3 PORTD,3 ; #define Ledout4 PORTC,4 ; #define ButtHand PORTB,2 ; режим ручной регулировки #define ButtAvto PORTB,3 ; режим автомата #define ButtDir PORTB,7 ; направление #define ButtSoft PORTB,6 ; Плавно-резко #define ButtTip PORTB,5 ; тип программы #define ButtProg PORTB,4 ; ;#define Scrlcs PORTA,2 ; ;#define Scrlm PORTA,1 ; ;#define Scrl1 PORTA,5 ; ;#define Scrl2 PORTE,0 ; ;#define Scrl3 PORTE,1 ; ;#define Scrl4 PORTE,2 ; ;************************************************************ Flag equ 30h ; флаги * #define DirectRun Flag,1 ; направление бегушки mFaza equ 31h ; движущаяся фаза SpeedStep equ 32h ; cкорость бегушки * Step equ 34h ; шаг бегушки * DeltaBright equ 35h ; приращение яркости TabAdr equ 36h ; адрес вычисленный для таблицы TabTemp equ 37h ; ВРЕМ Acsel equ 38h ; ;-----------------------------------------------------------* Chanels equ 39h ; данные уровня условной яркости * level1 equ 3Ah ; данные уровня яркости 1 * level2 equ 3Bh ; данные уровня яркости 2 * level3 equ 3Ch ; данные уровня яркости 2 * level4 equ 3Dh ; данные уровня яркости 2 * ;-----------------------------------------------------------* CountKey equ 40h ; счетчик клавиатуры ;-----------------------------------------------------------* CountTemp equ 41h ; счетчик темпа переключения каналов CountLow equ 42h ; счетчик Acsel avtomata low CountHigh equ 43h ; счетчик Acsel avtomata Hi SpeedAcsel equ 44h ; Acsel SpeedAcsel2 equ 45h ; Acsel ;-----------------------------------------------------------* mScroll1 equ 48h ; данные уровня Фэйдера mScroll2 equ 49h ; данные уровня Фэйдера mScroll3 equ 4Ah ; данные уровня Фэйдера mScroll4 equ 4Bh ; данные уровня Фэйдера mScrollm equ 4Ch ; данные уровня Фэйдера mScrollsp equ 4Dh ; данные уровня Фэйдера mDividerADC equ 4Eh ; mDelayADC equ 4Fh ;-----------------------------------------------------------* mDirect equ 50h ; бит0= 0-влево 1-вправо mProgram equ 51h ; программы mAvtomat equ 52h ; тип таблицы mPlavno equ 53h ; бит=0 0-резко 1-плавно mHand equ 54h ; бит0= 0-ручной 1-автомат mLineDivid equ 55h ; ;-----------------------------------------------------------* CountSpeed equ 56h ; счетчик CountPred equ 57h ; счетчик \ CouPRKey equ 58h CountRise equ 59h CountLine equ 5Ah ;-----------------------------------------------------------* mLedmux1 equ 5Bh mLedmux2 equ 5Ch mLedmux3 equ 5Dh mLedmux4 equ 5Eh ;************************************************************ ORG 0 ;************************************************************ goto Start ;************************************************************ ORG 4 ;************************************************************ retfie ;************************************************************ ORG 0xE0 ;************************************************************* OprosScroll: ; все регуляторы вызывается 1/50 сек ;************************************************************* clrf PCLATH decf mDelayADC,f rnz mvi mDelayADC,.10 movlw 0x0F ; всего 16 значений andwf mDividerADC,w ; addwf PC,f goto Lgo ; 1 goto L1 ; 2 goto Lgo ; 3 goto L2 ; 4 goto Lgo ; 5 goto L3 ; 6 goto Lgo ; 7 goto Llast ; 8 goto L4 ; 1 goto Lgo ; 2 goto L5 ; 3 goto Lgo ; 4 goto L6 ; 5 goto Lconv ; 6 goto Llast ; 7 goto Llast ; 8 ;************************************************************ ; ORG 010 - Таблицы ; ORG 100 - Таблицы ;************************************************************ ORG 200H ;************************************************************ Start: ; Main Programm ;************************************************************ Init877 ; инициализация на случай забывчивости ;************************************************************ bsf STATUS,RP0 ; cтраница 1 movlw b'11111111' ; movwf TRISA ; movlw b'11111111' ; movwf TRISB ; movlw b'10100000' ; movwf TRISC ; movlw b'11110000' ; movwf TRISD ; movlw b'00000111' ; movwf TRISE ; ; movlw b'10000011' ; HS->Prescaler->Timer0, movlw b'00000000' ; HS->Prescaler->Timer0, movwf OPTIONR ; 1:2 ;----------------------------------------------------------- movlw b'00000000' ; все аналог movwf ADCON1 ; лев выравнивание ;----------------------------------------------------------- clrf STATUS ; cтраница 0 ; InitUsart9600_8 ; иницализация cкорости 9600 InitUsartdmxOut ; иницализация DMX на выдачу clrf INTCON ; прерывания ;************************************************************ #include C:\PHYTON\MODULS\ClsMem77.mdl ; очистка всей памяти ;************************************************************ mvi CountLow,1 mvi CountHigh,1 mvi Step,0x07 ; первый шаг будет 0 mvi Acsel,.12 ; mvi mProgram,0 ; тип огонька mvi mAvtomat,3 ; выбор mvi mHand,1 ; бит0= 0-ручной 1-автомат clrf mDirect ; бит0= 0-влево 1-вправо mvi mPlavno,1 ; бит=0 0-резко 1-плавно bsf Ledupr3 ;************************************************************ HandCuc: ; *** основная ******** ;************************************************************ btfsc mHand,0 ; бит0= 0-ручной 1-автомат goto AvtoCucU call OprosScroll ; =10= все регуляторы mvi level1,0xff mvi level2,0xff mvi level3,0xff mvi level4,0xff call OprosKeys ; =255+15= все кнопки с уст режимов call OutLevelLedsDmx; =0= уровни из памяти в светодиоды call OutLine ; =0= вся строка выдача кода в OUTER goto HandCuc ; проверка переключателей и ползунков ;************************************************************ AvtoCucU: ;************************************************************ ;************************************************************ AvtoCuc0: ;************************************************************ btfss mHand,0 ; бит0= 0-ручной 1-автомат goto HandCuc call OprosKeys ; =255+15= все кнопки с уст режимов call CHanToLevels ; =250= установка уровней с выбором плавности call OutLine ; =0= вся строка выдача кода в OUTER call OutLevelLedsDmx; =0= уровни из памяти в светодиоды call OprosScroll ; =10= все регуляторы ; speed avto 150+0-255 ;************************************************************ ; сначала проверяем выбор типа - acsel, tab1, tab2, или ручной выбор ;************************************************************ cpi mAvtomat,0 jz RunAcsel ; к программе ускорения ;------------------------------------------------------------- decf CountPred,f jnz AvtoCuc0 ; еще рано mvi CountPred,150 decf CountSpeed,f jnz AvtoCuc0 mov CountSpeed,SpeedStep ;------------------------------------------------------------- btfss Ledupr4 goto SetLed bcf Ledupr4 goto OutLedSet SetLed: bsf Ledupr4 OutLedSet: ;------------------------------------------------------------- cpi mAvtomat,1 jz RunTabl1 ; к перебору таблицы cpi mAvtomat,2 jz RunTabl2 ; к перебору таблицы goto RunHandUst ;************************************************************ RunTabl2: ; последовательный перебор всей таблицы 2 ;************************************************************ bsf Ledupr1 bcf Ledupr2 ;------------------------------------------------------------ incf TabAdr,f ; следующий шаг movlw 0x7F ; в таблице 128 значений andwf TabAdr,f movf TabAdr,w ; bsf PCLATH,2 ; bsf PCLATH,0 ; 500 h call TabAvto2 ; очередная картинка бегушки clrf PCLATH ; 000 h movwf Chanels ; goto AvtoCucU ; проверка переключателей и ползунков ;************************************************************ RunTabl1: ; последовательный перебор всей таблицы 1 ;************************************************************ bcf Ledupr1 bsf Ledupr2 ;------------------------------------------------------------ incf TabAdr,f ; следующий шаг movlw 0x7F ; в таблице 128 значений andwf TabAdr,f movf TabAdr,w ; bsf PCLATH,2 ; 400 h call TabAvto1 ; очередная картинка бегушки clrf PCLATH ; 000 h movwf Chanels ; goto AvtoCucU ; проверка переключателей и ползунков ;************************************************************ RunAcsel: ; --------- акселератор ---------------- ;************************************************************ decf CountPred,f bnz AvtoCuc0 ; еще рано mvi CountPred,250 ;------------------------------------------------------------ bcf Ledupr1 bcf Ledupr2 ;------------------------------------------------------------ incf CountLow,f ; акселератор cpi CountLow,.05 ; bnz AcselOut ; clrf CountLow ; incf CountHigh,f ; cкорость переключения cmp CountHigh,SpeedAcsel jc AcselOut ; зависит от ручки clrf CountHigh ; переменника ;------------------------------------------------------------ btfss Ledupr4 goto qSetLed bcf Ledupr4 goto qOutLedSet qSetLed: bsf Ledupr4 qOutLedSet: ;---------------------------------------------------------- btfss DirectRun ; направление бегущки акселератора goto DirSun ; DirNight: ; decf Acsel,f ; уменьшение скорости cpi Acsel,0 jnz DirJob ; bcf DirectRun ; изменить направление бегушки goto DirJob DirSun: incf Acsel,f ; cpi Acsel,.15 ; jnz DirJob ; bsf DirectRun ; изменить направление бегушки DirJob: movf Acsel,w ; в зависимости от andlw 0x0f ; переменной Acsel call TabSpeedB ; выставляются скорость movwf SpeedAcsel2 ; и время возгорания ламп ;---------------------------------------------------------- goto AvtoCuc0 ; проверка переключателей и ползунков ;---------------------------------------------------------- AcselOut: clrwdt ; сброс WDT таймера decf CountTemp,f ; cкорость шага jnz AvtoCuc0 ; еще рано mov CountTemp,SpeedAcsel2 ; отсчет скорости сначала ;---------------------------------------------------------- btfss DirectRun ; направление бегущки акселератора goto PlusAks ; decf Step,f ; следующий шаг goto ObxAcs ; PlusAks: ; incf Step,f ; следующий шаг ObxAcs: movlw 0x07 ; кол-во шагов = 8 andwf Step,f ; movf Step,w ; положение шага call TabAcsel ; очередная картинка бегушки movwf Chanels ; movf Acsel,w ; andlw 0x0f ; call TabDeltaB movwf DeltaBright goto AvtoCucU ; проверка переключателей и ползунков ;************************************************************ RunHandUst: ; 100h вычисление программы, режима и шага ;************************************************************ bsf Ledupr1 bsf Ledupr2 ;------------------------------------------------------------ cpi mProgram,7 ; блок защиты jnz noOverTab ; от переполнения cpi mDirect,3 ; потому что таблица jnz noOverTab ; имеет реальную длинну clrf mDirect ; меньше чем 256 значений noOverTab: ;------------------------------------------------------------ mov TabAdr,mProgram ; вычисление место в таблице swapf TabAdr,f ; rlf TabAdr,f ; три младшие это шаг бегушки movlw b'11100000' ; andwf TabAdr,f ;------------------------------------------------------------ mov TabTemp,mDirect rlf TabTemp,f ; rlf TabTemp,f ; rlf TabTemp,w ; andlw b'00011000' iorwf TabAdr,f RunMax: ;------------------------------------------------------------ incf Step,f ; следующий шаг movlw 0x07 ; кол-во шагов = 8 andwf Step,f ; movf Step,w ; положение шага addwf TabAdr,f ; место в таблице movf TabAdr,w ; bsf PCLATH,0 ; 100 h call Programs ; очередная картинка бегушки clrf PCLATH ; 000 h movwf Chanels ; goto AvtoCucU ; проверка переключателей и ползунков ;************************************************************* ;///////////////////////////////////////////////////////////// ;************************************************************* ORG 0x600 ;************************************************************* OprosKeys: ; клавиатура ;************************************************************* cDrebezg equ .100 ;************************************************************* decf CouPRKey,f ; 100\10=10 раз в секунду rnz ; ничего не нажато cpi CountKey,0 jz CheckKey decf CountKey,f ; 100\10=10 раз в секунду return ; ничего не нажато ;************************************************************* CheckKey: ;************************************************************* btfss ButtTip ; тип программы goto pressTip ; тип программы btfss ButtDir ; направление goto pressDir ; направление btfss ButtSoft ; Плавно-резко goto pressSoft ; Плавно-резко btfss ButtProg goto pressProg btfss ButtHand ; режим ручной регулировки goto pressHand ; режим ручной регулировки btfss ButtAvto ; режим автомата goto pressAvto ; режим автомата return ; ничего не нажато ;----------------------------------------------------------- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;----------------------------------------------------------- pressAvto: ; режим автомата ;----------------------------------------------------------- mvi CountKey,cDrebezg ; установка задержки 100-1sec clrf mHand ; бит0= 0-ручной 1-автомат bcf Ledupr4 return ;----------------------------------------------------------- pressHand: ; режим ручной регулировки ;----------------------------------------------------------- mvi CountKey,cDrebezg ; установка задержки 100-1sec mvi mHand,1 ; бит0= 0-ручной 1-автомат bsf Ledupr4 return ;----------------------------------------------------------- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;----------------------------------------------------------- ;----------------------------------------------------------- pressDir: ; направление ;----------------------------------------------------------- mvi CountKey,cDrebezg ; установка задержки 100-1sec incf mDirect,f ; бит0= 0-влево 1-вправо movlw 0x03 ; andwf mDirect,f ; 0-3 выбор типа напавления return ;----------------------------------------------------------- pressSoft: ; Плавно-резко ;----------------------------------------------------------- mvi CountKey,cDrebezg ; установка задержки 100-1sec incf mPlavno,f ; бит=0 0-резко 1-плавно return ;----------------------------------------------------------- pressTip: ; тип программы ;----------------------------------------------------------- mvi CountKey,cDrebezg ; установка задержки 100-1sec incf mAvtomat,f ; следующая программа movlw 0x03 ; andwf mAvtomat,f ; 0-3 выбор типа таблицы return ;----------------------------------------------------------- pressProg: ;----------------------------------------------------------- mvi CountKey,cDrebezg ; установка задержки 100-1sec incf mProgram,f ; следующая программа movlw 0x07 ; andwf mProgram,f return ;************************************************************* ;OprosScroll: ; все регуляторы вызывается 1/50 сек ;************************************************************* Lgo: incf mDividerADC,f bsf ADCON0,2 ; запуск = бит 2 return L1: btfsc ADCON0,2 ; проверка конца преобразования return incf mDividerADC,f mov mScroll4,ADRESH; считываем прежний movlw b'11001001' ; пускаем ADC вход = А1 movwf ADCON0 return L2: btfsc ADCON0,2 ; проверка конца преобразования return incf mDividerADC,f mov mScrollsp,ADRESH; считываем прежний movlw b'11010001' ; пускаем ADC вход = А2 movwf ADCON0 return L3: btfsc ADCON0,2 ; проверка конца преобразования return incf mDividerADC,f mov mScrollm,ADRESH; считываем прежний movlw b'11100001' ; пускаем ADC вход = А5 movwf ADCON0 return L4: btfsc ADCON0,2 ; проверка конца преобразования return incf mDividerADC,f mov mScroll1,ADRESH ; считываем прежний movlw b'11101001' ; пускаем ADC вход = E0 movwf ADCON0 return L5: btfsc ADCON0,2 ; проверка конца преобразования return incf mDividerADC,f mov mScroll2,ADRESH; считываем прежний movlw b'11110001' ; пускаем ADC вход E1 movwf ADCON0 return L6: btfsc ADCON0,2 ; проверка конца преобразования return incf mDividerADC,f mov mScroll3,ADRESH; считываем прежний movlw b'11111001' ; пускаем ADC вход E2 movwf ADCON0 return Lconv: incf mDividerADC,f mov SpeedAcsel,mScrollsp ; уровень скорости comf SpeedAcsel,f ; нормализация movlw b'00000011' ; iorwf SpeedAcsel,f ; swapf mScrollsp,w ; уровень скорости andlw 0x0f ; call TabSpeed ; логарифмическая таблица movwf SpeedStep ; swapf mScrollsp,w ; перенести уровень andlw 0x0f ; приращения яркости call TabDelta ; логарифмическая таблица movtof DeltaBright ; return Llast: incf mDividerADC,f return ;************************************************************* minLev equ .3 maxLev equ .250 ;************************************************************* CHanToLevels: ; установка уровней с выбором плавности ;************************************************************* decf CountRise,f rnz mvi CountRise,.250 ; 250 btfss mPlavno,0 ; бит=0 0-резко 1-плавно goto RezRun ; ;************************************************************* ; плавное включение ламп ;************************************************************* bcf Ledupr3 ;---------------------------------------------------------- btfsc Chanels,0 ; goto Ch1Rise ; Ch1Sit: cpi level1,minLev jc Ch1Out movtow DeltaBright subwf level1,f ; btfsc STATUS,CR ; 0=заем goto Ch1Out ; 1=no carry mvi level1,minLev jmp Ch1Out Ch1Rise: cpi level1,maxLev-3 jnc Ch1Out movtow DeltaBright addwf level1,f ; btfss STATUS,CR ; 0=заем goto Ch1Out ; 1=no carry mvi level1,maxLev Ch1Out: ;---------------------------------------------------------- btfsc Chanels,1 ; goto Ch2Rise ; Ch2Sit: cpi level2,minLev jc Ch2Out movtow DeltaBright subwf level2,f ; btfsc STATUS,CR ; 0=заем goto Ch2Out ; 1=no carry mvi level2,minLev jmp Ch2Out Ch2Rise: cpi level2,maxLev-3 jnc Ch2Out movtow DeltaBright addwf level2,f ; btfss STATUS,CR ; 0=заем goto Ch2Out ; 1=no carry mvi level2,maxLev Ch2Out: ;---------------------------------------------------------- btfsc Chanels,2 ; goto Ch3Rise ; Ch3Sit: cpi level3,minLev jc Ch3Out movtow DeltaBright subwf level3,f btfsc STATUS,CR ; 0=заем goto Ch3Out ; 1=no carry mvi level3,minLev jmp Ch3Out Ch3Rise: cpi level3,maxLev-3 jnc Ch3Out movtow DeltaBright addwf level3,f ; btfss STATUS,CR ; 0=заем goto Ch3Out ; 1=no carry mvi level3,maxLev Ch3Out: ;---------------------------------------------------------- btfsc Chanels,3 ; goto Ch4Rise ; Ch4Sit: cpi level4,minLev jc Ch4Out movtow DeltaBright subwf level4,f ; btfsc STATUS,CR ; 0=заем goto Ch4Out ; 1=no carry mvi level4,minLev jmp Ch4Out Ch4Rise: cpi level4,maxLev-3 jnc Ch4Out movtow DeltaBright addwf level4,f ; btfss STATUS,CR ; 0=заем goto Ch4Out ; 1=no carry mvi level4,maxLev Ch4Out: return ;************************************************************* RezRun: ; установки резких включений ;************************************************************* bsf Ledupr3 clrf level1 ; выключить канал btfsc Chanels,0 ; проверки разряда: горит-нет decf level1,f ; включить clrf level2 ; выключить канал btfsc Chanels,1 ; проверки разряда: горит-нет decf level2,f ; включить clrf level3 ; выключить канал btfsc Chanels,2 ; проверки разряда: горит-нет decf level3,f ; включить clrf level4 ; выключить канал btfsc Chanels,3 ; проверки разряда: горит-нет decf level4,f ; включить return ;************************************************************* OutLevelLedsDmx: ; уровни из памяти в светодиоды ;************************************************************* clrwdt decf mFaza,f ; двигаем фазу jz LedAllOff ; все светодиоды выключить ;-1--------------------------------------------- movf mFaza,w subwf mLedmux1,w btfsc STATUS,2 ; не сравнялась, ничего не делать bcf Ledout1 ; включить светодиод ;-2--------------------------------------------- movf mFaza,w subwf mLedmux2,w btfsc STATUS,2 ; не сравнялась, ничего не делать bcf Ledout2 ; включить светодиод ;-3--------------------------------------------- movf mFaza,w subwf mLedmux3,w btfsc STATUS,2 ; не сравнялась, ничего не делать bcf Ledout3 ; включить светодиод ;-4--------------------------------------------- movf mFaza,w subwf mLedmux4,w btfsc STATUS,2 ; не сравнялась, ничего не делать bcf Ledout4 ; включить светодиод ;----------------------------------------------- clrf STATUS return ;*********************************************************************** LedAllOff: ; все светодиоды выключить ;*********************************************************************** bsf Ledout1 ; выключить bsf Ledout2 ; выключить bsf Ledout3 ; выключить bsf Ledout4 ; выключить return ; ;************************************************************ OutLine: ; вся строка ;************************************************************ decf CountLine,f rnz ; sendDamp 0x20,0x5F ; отправляем часть памяти ; return ;************************************************************ incf mLineDivid,f call TxBusy ; проверка готовности TX cpi mLineDivid,1 jz sLine1 cpi mLineDivid,2 jz sLine2 cpi mLineDivid,3 jz sLine3 cpi mLineDivid,4 jz sLine4 cpi mLineDivid,5 jz sLineFF clrf mLineDivid return ;************************************************************ sLineFF: mvi TXREG,0xFF ; выдача Start Code return ;************************************************************ sLine1: mov mul1,level1 ; уровень от автоматики mov mul2,mScroll1 ; уровень ползунка call mul8x8 ; Перемножитель двух чисел mov mLedmux1,mulH goto TxSbor ; Перемножитель c мастером ;************************************************************ sLine2: mov mul1,level2 ; уровень от автоматики mov mul2,mScroll2 ; уровень ползунка call mul8x8 ; Перемножитель двух чисел mov mLedmux2,mulH goto TxSbor ; Перемножитель c мастером ;************************************************************ sLine3: mov mul1,level3 ; уровень от автоматики mov mul2,mScroll3 ; уровень ползунка call mul8x8 ; Перемножитель двух чисел mov mLedmux3,mulH goto TxSbor ; Перемножитель c мастером ;************************************************************ sLine4: mov mul1,level4 ; уровень от автоматики mov mul2,mScroll4 ; уровень ползунка call mul8x8 ; Перемножитель двух чисел mov mLedmux4,mulH goto TxSbor ; Перемножитель c мастером ;************************************************************ TxSbor: ; Перемножитель c мастером ;************************************************************ mov mul1,mulH ; уровень mov mul2,mScrollm ; Мастер call mul8x8 ; Перемножитель двух чисел cpi mulH,0xFF ; jnz NoCodeFF mvi TXREG,0xFE return NoCodeFF: mov TXREG,mulH ; готовый код return ;************************************************************ TxBusy: ; проверка готовности TX ;************************************************************ bsf STATUS,RP0 ; cтраница 1 DcucB: clrwdt ; сброс WDT таймера btfss TXSTA,1 ; передатчик свободен ? goto DcucB ; wait bcf STATUS,RP0 ; cтраница 0 return ;************************************************************** #include C:\PHYTON\MODULS\mul8x8.mdl ; инициализация столбика ;************************************************************** org 0x800 ;************************************************************** nop ;************************************************************** #include tableStager.run ; ORG 400 - Таблицы ;************************************************************** end ; BrSoft Copyright (C) 2007 Bogdanov Andrew ;**************************************************************