;Пространственная векторная модуляция title "Program 002" list R=DEC, p=18f4431, w=2 include "p18f4431.inc" __CONFIG _CONFIG1H, _OSC_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H __CONFIG _CONFIG2L, _PWRTEN_OFF_2L & _BOREN_OFF_2L __CONFIG _CONFIG2H, _WDTEN_OFF_2H & _WINEN_OFF_2H __CONFIG _CONFIG3L, _T1OSCMX_OFF_3L & _HPOL_LOW_3L & _LPOL_LOW_3L & _PWMPIN_ON_3L __CONFIG _CONFIG3H, _MCLRE_ON_3H & _PWM4MX_RB5_3H & _FLTAMX_RC1_3H __CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L __CONFIG _CONFIG6H, _WRTB_OFF_6H & _WRTC_OFF_6H & _WRTD_OFF_6H __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L __CONFIG _CONFIG7H, _EBTRB_OFF_7H ;Постоянные #DEFINE _DTCON 0x45 ;мёртвое время #DEFINE _PTPERH 0x0 ;период ШИМ #DEFINE _PTPERL 0xfa #DEFINE _TSMAXH 0x03 ;максимальный импульс #DEFINE _TSMAXL 0xe8 #DEFINE _CONST 0x0d ;Константа частоты #DEFINE CORR1 85 #DEFINE CORR2 170 #DEFINE t_off 100 ;температура ошибки ;Переменные idata _SPEEDM RES 1 ;Маскимальная частота,Гц _acc_up RES 1 ;ускорение _acc_down RES 1 ;торможение _ACC_COUNT_L RES 1 ;Ускорение COUNT _ACC_COUNT_H RES 1 udata_acs ISR_WREG RES 1 ISR_BSR RES 1 ISR_STATUS RES 1 ISR_PRODH RES 1 ISR_PRODL RES 1 TEMP_ISR_PWM RES 1 SET_MODULATION RES 1 STEP_H RES 1 STEP_L RES 1 SECTOR RES 1 Vector_L RES 1 Vector_H RES 1 sin1 RES 1 sin2 RES 1 sin3 RES 1 _PDC0H RES 1 _PDC0L RES 1 _PDC1H RES 1 _PDC1L RES 1 _PDC2H RES 1 _PDC2L RES 1 HL1 RES 1 ;переменная маски HL2 RES 1 HL3 RES 1 CYCLE RES 1 ;переменная цикла экрана FLAG RES 1 ;флаг работы D_TMR1 RES 1 ;переменная цикла TMR1 TEMP RES 1 hundreds RES 1 ;Сотни tens RES 1 ;Десятки ones RES 1 ;Единицы per_a RES 1 AC_LOOP RES 1 ;Переменная вывода параметров ACP0 RES 1 ;Переменная АЦП ACP1 RES 1 ACP2 RES 1 ACP3 RES 1 Speed_Hz RES 1 ;Скорость,Гц Speed_Hz_Temp RES 1 ;Скорость_temp,Гц ACC_COUNT_L RES 1 ;Ускорение ACC_COUNT_H RES 1 bl1:CODE 0x00 goto START bl2:CODE 0x08 goto ISR_HIGH bl3:CODE 0x18 goto ISR_LOW ;-----Программа определения маски числа----- maska: mullw 2 movf PROD,w andlw 0x1f addwf PCL retlw b'11111100' retlw b'01100000' retlw b'11011010' retlw b'11110010' retlw b'01100110' retlw b'10110110' retlw b'10111110' retlw b'11100000' retlw b'11111110' retlw b'11110110' retlw b'00000000' LOOP_SECTOR: movf SECTOR,w rlncf WREG addwf PCL BRA VECTOR_IN_SECTOR1 BRA VECTOR_IN_SECTOR2 BRA VECTOR_IN_SECTOR3 BRA VECTOR_IN_SECTOR4 BRA VECTOR_IN_SECTOR5 BRA VECTOR_IN_SECTOR6 bl4:CODE 0x50 START: movf PCL movlw 1 movwf AC_LOOP clrf CYCLE clrf FLAG call ini_EEPROM ;-----Инициализация прерываний----- CLRF INTCON CLRF INTCON2 CLRF INTCON3 CLRF PIE1 CLRF PIE2 CLRF PIE3 CLRF PIR1 CLRF PIR2 CLRF PIR3 CLRF IPR1 CLRF IPR2 CLRF IPR3 BSF PIE1,ADIE ;вкл прерывание ADC BSF PIE1,TMR1IE ;вкл прерывание TMR1 BSF PIE3,PTIE BSF IPR3,PTIP movlw 0x93 movwf RCON BSF INTCON,PEIE BSF INTCON,GIE ;-----Инициализация портов----- clrf TRISD clrf TRISE movlw b'00001111' movwf TRISC ;-----Инициализация таймера----- movlw b'10110001' ;Предделитель 1:8 movwf T1CON ;-----Инициализация АЦП----- movlw 0x10 movwf ADCON1 movlw 0x7a movwf ADCON2 movlw 0x80 movwf ADCON3 movlw b'00001111' movwf ANSEL0 clrf ANSEL1 movlw 0x00 movwf ADCHS movlw b'00010111' movwf ADCON0 ;-----Инициализация ШИМ----- CLRF OVDCONS CLRF OVDCOND MOVLW 0X80 MOVWF QEICON MOVLW 0X00 MOVWF PTCON0 MOVLW 0X47 MOVWF PWMCON0 MOVLW 0X01 MOVWF PWMCON1 movlw b'00110011' movf FLTCONFIG CLRF SEVTCMPL CLRF SEVTCMPH call STOP movlw _DTCON ;установка мёртвого времени movwf DTCON movlw _PTPERL ;установка периода ШИМ movwf PTPERL movlw _PTPERH movwf PTPERH movlw 0x80 movwf PTCON1 ;-----Основной цикл----- call init ;заставка setf TEMP bsf FLAG,7 St_loop_01: btfss PORTC,2 ;определяем бит ОШИБКА bra Err movlw t_off ;определяем ОШИБКА по температуре cpfslt ACP2 bra Err btfsc AC_LOOP,0 ;выбор скорость\АЦП call Speed btfss AC_LOOP,0 call ACP_OUT call mot_sp_cont btfsc PORTC,0 ;проверка "SB1"(START/STOP) bra st1 btfsc FLAG,7 bra St_loop_01 call key_debounce btfss FLAG,7 bra St_loop_01 btg FLAG,0 ;нажата SB1 btfsc FLAG,0 call RUN btfss FLAG,0 bsf FLAG,2 ;вкл торможение после стоп bra St_loop_01 st1: btfsc PORTC,1 ;проверка "SB2"(FOR/REV) bra st2 btfsc FLAG,7 bra St_loop_01 call key_debounce btfss FLAG,7 bra St_loop_01 btfsc FLAG,0 ;нажата SB2 bsf FLAG,3 btfss FLAG,0 btg FLAG,1 bra St_loop_01 st2: btfsc PORTC,3 ;проверка "SB3"(IND) bra st3 btfsc FLAG,7 bra St_loop_01 call key_debounce btfss FLAG,7 bra St_loop_01 call init rlncf AC_LOOP,f btfss AC_LOOP,4 bra st3 movlw 1 movwf AC_LOOP bra St_loop_01 st3: btfss FLAG,7 bra St_loop_01 bcf FLAG,7 goto St_loop_01 ;-----задержка нажатия клавиши----- key_debounce: decfsz TEMP,f return bsf FLAG,7 setf TEMP return ;-----Подпрограмма ОШИБКИ----- Err: clrf SET_MODULATION CLRF PDC0L CLRF PDC1L CLRF PDC2L CLRF PDC0H CLRF PDC1H CLRF PDC2H CLRF _PDC0L CLRF _PDC1L CLRF _PDC2L CLRF _PDC0H CLRF _PDC1H CLRF _PDC2H clrf Speed_Hz_Temp clrf Speed_Hz bcf FLAG,2 movlw 158 movwf HL1 movlw 10 movwf HL2 movlw 10 movwf HL3 err_goto: bra err_goto ;-----Программа "RUN"----- RUN: movlw 1 movwf D_TMR1 movlw 10 movwf HL1 movlw 56 movwf HL2 movlw 42 movwf HL3 run_01: movf D_TMR1 bnz run_01 CLRF Vector_H CLRF Vector_L clrf Speed_Hz movlw 5 movwf SECTOR return ;-----Программа "STOP"----- STOP: clrf SET_MODULATION CLRF PDC0L CLRF PDC1L CLRF PDC2L CLRF PDC0H CLRF PDC1H CLRF PDC2H CLRF _PDC0L CLRF _PDC1L CLRF _PDC2L CLRF _PDC0H CLRF _PDC1H CLRF _PDC2H clrf Speed_Hz_Temp clrf Speed_Hz bcf FLAG,2 movlw 1 movwf D_TMR1 movlw 2 movwf HL1 movwf HL2 movwf HL3 stop_01: movf D_TMR1 bnz stop_01 return ;-----Обработка прерываний HIGH----- ISR_HIGH: MOVFF PRODH,ISR_PRODH MOVFF PRODL,ISR_PRODL BTFSC PIR3,PTIF BRA ISR_PWM ISR_HIGH_RET: MOVF _PDC0L,W ;умножение табличных данных MULWF SET_MODULATION MOVFF PRODH,TEMP_ISR_PWM MOVF _PDC0H,W MULWF SET_MODULATION MOVF TEMP_ISR_PWM,W ADDWF PRODL,W MOVWF _PDC0L MOVLW 0 ADDWFC PRODH,W MOVWF _PDC0H MOVF _PDC1L,W ;умножение табличных данных MULWF SET_MODULATION MOVFF PRODH,TEMP_ISR_PWM MOVF _PDC1H,W MULWF SET_MODULATION MOVF TEMP_ISR_PWM,W ADDWF PRODL,W MOVWF _PDC1L MOVLW 0 ADDWFC PRODH,W MOVWF _PDC1H MOVF _PDC2L,W ;умножение табличных данных MULWF SET_MODULATION MOVFF PRODH,TEMP_ISR_PWM MOVF _PDC2H,W MULWF SET_MODULATION MOVF TEMP_ISR_PWM,W ADDWF PRODL,W MOVWF _PDC2L MOVLW 0 ADDWFC PRODH,W MOVWF _PDC2H MOVFF _PDC0L,PDC0L MOVFF _PDC0H,PDC0H MOVFF _PDC1L,PDC1L MOVFF _PDC1H,PDC1H MOVFF _PDC2L,PDC2L MOVFF _PDC2H,PDC2H MOVFF ISR_PRODH,PRODH MOVFF ISR_PRODL,PRODL retfie 1 ;-----Обработка прерываний LOW----- ISR_LOW: movwf ISR_WREG ;сохранение регистров movff BSR,ISR_BSR movff STATUS,ISR_STATUS btfsc PIR1,ADIF ;проверка прерывания ADC bra ISR_ADC ISR_LOW_ADC_RET: btfsc PIR1,TMR1IF ;проверка прерывания TMR1 bra ISR_TMR1 ISR_LOW_TMR_RET: movf ISR_WREG,w ;запись регистров movff ISR_BSR,BSR movff ISR_STATUS,STATUS retfie ;-----Прерывание TMR1----- ISR_TMR1: bcf PIR1,TMR1IF ;сброс бита прерывания TMR1 movlw 0xf3 ;установка времени TMR1 movwf TMR1H ;(20MHz/4)/8/(10000h-f3cbh)=200Hz=.005sec movlw 0xcb movwf TMR1L incf D_TMR1,f bcf STATUS,C ;обработка и вывод на индикатор rrcf CYCLE,f movf CYCLE,w bnz ISR_TMR1_01 movlw 0x04 movwf CYCLE ISR_TMR1_01: movff CYCLE,PORTE btfsc CYCLE,2 movff HL3,PORTD btfsc CYCLE,1 movff HL2,PORTD btfsc CYCLE,0 movff HL1,PORTD bra ISR_LOW_TMR_RET ;-----ЗАСТАВКА----- init movlw 128 movwf TEMP init_a movlw 248 ;Установка переменной цикла movwf D_TMR1 init_loop: movf D_TMR1 bnz init_loop movff TEMP,HL1 movff TEMP,HL2 movff TEMP,HL3 rrcf TEMP,f btfsc TEMP,0 return bra init_a ;-----Вывод частоты----- Speed: btfsc FLAG,1 ;Определение вывода вращения bra st_a01 movlw 142 ;Flag1=0 "FOR" movwf HL1 bra st_a02 st_a01: movlw 238 ;Flag=1 "REV" movwf HL1 st_a02: btfsc FLAG,0 bsf HL1,0 movf Speed_Hz_Temp,w btfsc FLAG,0 ;проверка 'START' movf Speed_Hz,w BTFSC FLAG,2 MOVF Speed_Hz,W call dec_cal movf tens,w call maska movwf HL2 movf ones,w call maska movwf HL3 return ;-----Программа преобразования числа в десятичную форму----- dec_cal: movwf per_a clrf hundreds clrf tens clrf ones HundredLoop: movlw d'100' subwf per_a,w btfss STATUS,C goto TensLoop movwf per_a incf hundreds,f goto HundredLoop TensLoop: movlw d'10' subwf per_a,w btfss STATUS,C goto DoOnes movwf per_a incf tens,f goto TensLoop DoOnes: movf per_a,w addwf ones,f movf hundreds,w ;гашение незначащих 0-ей iorwf hundreds,w btfss STATUS,Z return movlw d'10' movwf hundreds movf tens,w iorwf tens,w btfss STATUS,Z return movlw d'10' movwf tens return ;-----Прерывание ADC----- ISR_ADC: movff ADRESH,ACP0 ;Сохраняем значение АЦП movff ADRESH,ACP1 movff ADRESH,ACP2 movff ADRESH,ACP3 bcf PIR1,ADIF ;сброс прерывания АЦП bsf ADCON0,GO ;включение АЦП movlw 52 subwf ACP2,f bra ISR_LOW_ADC_RET ;-----Вывод АЦП----- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACP_OUT: btfsc AC_LOOP,1 ;Определение каналя АЦП movf ACP2,w btfsc AC_LOOP,2 movf ACP1,w btfsc AC_LOOP,3 movf SECTOR,w call dec_cal ;Перещёт и отображение movf hundreds,w call maska movwf HL1 movf tens,w call maska movwf HL2 movf ones,w call maska movwf HL3 return ;-----Обработка скорости----- mot_sp_cont: movff _SPEEDM,WREG ;МАКСИМАЛЬНАЯ ЧАСТОТА,Hz mulwf ACP0 ;ACP*макс.частоту rlcf PROD,f btfsc STATUS,C incf PRODH,f movff PRODH,Speed_Hz_Temp btfss FLAG,2 ;проверка на вкл. торможение BRA MOT_SP_1 movf Speed_Hz,w btfsc STATUS,Z bra STOP clrf Speed_Hz_Temp bra MOT_SP_2 MOT_SP_1: btfss FLAG,0 ;проверка 'START' return MOT_SP_2: btfss FLAG,3 ;проверка на вкл. РЕВЕРСА BRA MOT_SP_3 movf Speed_Hz,w btfsc STATUS,Z BTG FLAG,1 btfsc STATUS,Z BCF FLAG,3 clrf Speed_Hz_Temp MOT_SP_3: movff Speed_Hz_Temp,WREG;проверка ускорения subwf Speed_Hz,w btfsc STATUS,Z bra NO_ACCEL ;НЕТ УСКОРЕНИЯ decf ACC_COUNT_L,f bnz ACCEL setf ACC_COUNT_L decf ACC_COUNT_H,f bnz ACCEL movff _ACC_COUNT_L,ACC_COUNT_L movff _ACC_COUNT_H,ACC_COUNT_H movff Speed_Hz_Temp,WREG;проверка ускорения subwf Speed_Hz,w btfss STATUS,C bra UP_ACCEL ;УСКОРЕНИЕ MOVFF _acc_down,WREG SUBWF Speed_Hz,W BTFSS STATUS,C MOVLW 0 MOVWF Speed_Hz BRA ACCEL UP_ACCEL: movff _acc_up,WREG addwf Speed_Hz,W CPFSGT Speed_Hz_Temp MOVF Speed_Hz_Temp,w MOVWF Speed_Hz ACCEL: movlw _CONST ;Умножения на константу mulwf Speed_Hz movff PRODH,STEP_H ;Обновление векора movff PRODL,STEP_L movlw 4 MULWF Speed_Hz movff PRODL,SET_MODULATION return NO_ACCEL: movlw _CONST ;Умножения на константу mulwf Speed_Hz movff PRODH,STEP_H ;Обновление векора movff PRODL,STEP_L movff ACP0,SET_MODULATION return ;-----Прерывание ШИМ----- ISR_PWM: bcf PIR3,PTIF ;сброс бита прерывания btfsc FLAG,1 ;проверка реверса bra Find_Vector_Reverse movf STEP_L,w addwf Vector_L,f movf STEP_H,w addwfc Vector_H,f movlw 170 cpfsgt Vector_H bra Read_Time ADD_Sector: incf SECTOR,f clrf Vector_H bra Check_Sector Find_Vector_Reverse: movf STEP_L,w subwf Vector_L,f movf STEP_H,w subwfb Vector_H,f btfsc STATUS,C bc Read_Time movlw 170 cpfsgt Vector_H bra Check_Sector incf SECTOR,f movwf Vector_H Check_Sector: movlw 5 cpfsgt SECTOR bra Read_Time clrf SECTOR Read_Time: bra LOOP_SECTOR VECTOR_IN_SECTOR1: BTFSC FLAG,1 BRA SECTOR1_FOR_REVERSE SECTOR6_FOR_REVERSE: movlw b'00011010' movwf OVDCOND MOVLW UPPER(TABLE_L) ;Рост синуса MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL MOVF Vector_H,W ADDWF TBLPTRL,F movf TBLPTRL,w movwf sin1 TBLRD* MOVFF TABLAT,_PDC0L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL MOVF Vector_H,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC0H MOVLW UPPER(TABLE_L) ;Спад синуса MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL movlw CORR1 addwf Vector_H,w ADDWF TBLPTRL,F comf TBLPTRL,F movf TBLPTRL,w movwf sin2 TBLRD* MOVFF TABLAT,_PDC1L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL movlw CORR1 addwf Vector_H,w ADDWF TBLPTRL,F comf TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC1H movlw CORR2 ;верх синуса addwfc Vector_H,w bnc vvv1 comf WREG,w vvv1: movwf sin3 movwf TEMP_ISR_PWM MOVLW UPPER(TABLE_L) MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL MOVF TEMP_ISR_PWM,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC2L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL MOVF TEMP_ISR_PWM,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC2H BRA ISR_HIGH_RET VECTOR_IN_SECTOR2: BTFSC FLAG,1 BRA SECTOR2_FOR_REVERSE SECTOR5_FOR_REVERSE: movlw b'00010110' movwf OVDCOND MOVLW UPPER(TABLE_L) ;Рост синуса MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL MOVF Vector_H,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC1L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL MOVF Vector_H,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC1H MOVLW UPPER(TABLE_L) ;Спад синуса MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL movlw CORR1 addwf Vector_H,w ADDWF TBLPTRL,F comf TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC2L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL movlw CORR1 addwf Vector_H,w ADDWF TBLPTRL,F comf TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC2H movlw CORR2 ;верх синуса addwfc Vector_H,w bnc vvv2 comf WREG,w vvv2: movwf TEMP_ISR_PWM MOVLW UPPER(TABLE_L) MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL MOVF TEMP_ISR_PWM,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC0L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL MOVF TEMP_ISR_PWM,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC0H BRA ISR_HIGH_RET VECTOR_IN_SECTOR3: BTFSC FLAG,1 BRA SECTOR3_FOR_REVERSE SECTOR4_FOR_REVERSE: movlw b'00100110' movwf OVDCOND MOVLW UPPER(TABLE_L) ;Рост синуса MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL MOVF Vector_H,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC2L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL MOVF Vector_H,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC2H MOVLW UPPER(TABLE_L) ;Спад синуса MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL movlw CORR1 addwf Vector_H,w ADDWF TBLPTRL,F comf TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC0L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL movlw CORR1 addwf Vector_H,w ADDWF TBLPTRL,F comf TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC0H movlw CORR2 ;верх синуса addwfc Vector_H,w bnc vvv3 comf WREG,w vvv3: movwf TEMP_ISR_PWM MOVLW UPPER(TABLE_L) MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL MOVF TEMP_ISR_PWM,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC1L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL MOVF TEMP_ISR_PWM,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC1H BRA ISR_HIGH_RET VECTOR_IN_SECTOR4: BTFSC FLAG,1 BRA SECTOR4_FOR_REVERSE SECTOR3_FOR_REVERSE: movlw b'00100101' movwf OVDCOND MOVLW UPPER(TABLE_L) ;Рост синуса MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL MOVF Vector_H,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC0L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL MOVF Vector_H,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC0H MOVLW UPPER(TABLE_L) ;Спад синуса MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL movlw CORR1 addwf Vector_H,w ADDWF TBLPTRL,F comf TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC1L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL movlw CORR1 addwf Vector_H,w ADDWF TBLPTRL,F comf TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC1H movlw CORR2 ;верх синуса addwfc Vector_H,w bnc vvv4 comf WREG,w vvv4: movwf TEMP_ISR_PWM MOVLW UPPER(TABLE_L) MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL MOVF TEMP_ISR_PWM,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC2L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL MOVF TEMP_ISR_PWM,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC2H BRA ISR_HIGH_RET VECTOR_IN_SECTOR5: BTFSC FLAG,1 BRA SECTOR5_FOR_REVERSE SECTOR2_FOR_REVERSE: movlw b'00101001' movwf OVDCOND MOVLW UPPER(TABLE_L) ;Рост синуса MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL MOVF Vector_H,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC1L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL MOVF Vector_H,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC1H MOVLW UPPER(TABLE_L) ;Спад синуса MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL movlw CORR1 addwf Vector_H,w ADDWF TBLPTRL,F comf TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC2L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL movlw CORR1 addwf Vector_H,w ADDWF TBLPTRL,F comf TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC2H movlw CORR2 ;верх синуса addwfc Vector_H,w bnc vvv5 comf WREG,w vvv5: movwf TEMP_ISR_PWM MOVLW UPPER(TABLE_L) MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL MOVF TEMP_ISR_PWM,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC0L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL MOVF TEMP_ISR_PWM,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC0H BRA ISR_HIGH_RET VECTOR_IN_SECTOR6: BTFSC FLAG,1 BRA SECTOR6_FOR_REVERSE SECTOR1_FOR_REVERSE: movlw b'00011001' movwf OVDCOND MOVLW UPPER(TABLE_L) ;Рост синуса MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL MOVF Vector_H,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC2L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL MOVF Vector_H,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC2H MOVLW UPPER(TABLE_L) ;Спад синуса MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL movlw CORR1 addwf Vector_H,w ADDWF TBLPTRL,F comf TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC0L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL movlw CORR1 addwf Vector_H,w ADDWF TBLPTRL,F comf TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC0H movlw CORR2 ;верх синуса addwfc Vector_H,w bnc vvv6 comf WREG,w vvv6: movwf TEMP_ISR_PWM MOVLW UPPER(TABLE_L) MOVWF TBLPTRU MOVLW HIGH(TABLE_L) MOVWF TBLPTRH MOVLW LOW(TABLE_L) MOVWF TBLPTRL MOVF TEMP_ISR_PWM,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC1L MOVLW UPPER(TABLE_H) MOVWF TBLPTRU MOVLW HIGH(TABLE_H) MOVWF TBLPTRH MOVLW LOW(TABLE_H) MOVWF TBLPTRL MOVF TEMP_ISR_PWM,W ADDWF TBLPTRL,F TBLRD* MOVFF TABLAT,_PDC1H bra ISR_HIGH_RET ;----- ТАБЛИЦА ----- bl5:CODE 0X900 TABLE_L: DATA 0X0600 DATA 0X120C DATA 0X1F19 DATA 0X2B25 DATA 0X3731 DATA 0X443E DATA 0X504A DATA 0X5C56 DATA 0X6962 DATA 0X756F DATA 0X817B DATA 0X8D87 DATA 0X9993 DATA 0XA69F DATA 0XB2AC DATA 0XBEB8 DATA 0XCAC4 DATA 0XD6D0 DATA 0XE2DC DATA 0XEEE8 DATA 0XFAF4 DATA 0X0600 DATA 0X120C DATA 0X1D18 DATA 0X2923 DATA 0X352F DATA 0X413B DATA 0X4C47 DATA 0X5852 DATA 0X635E DATA 0X6F69 DATA 0X7A75 DATA 0X8680 DATA 0X918B DATA 0X9C97 DATA 0XA8A2 DATA 0XB3AD DATA 0XBEB8 DATA 0XC9C3 DATA 0XD4CE DATA 0XDFD9 DATA 0XE9E4 DATA 0XF4EF DATA 0XFFF9 DATA 0X0904 DATA 0X140E DATA 0X1E19 DATA 0X2823 DATA 0X332D DATA 0X3D38 DATA 0X4742 DATA 0X514C DATA 0X5B56 DATA 0X6460 DATA 0X6E69 DATA 0X7873 DATA 0X817C DATA 0X8B86 DATA 0X948F DATA 0X9D99 DATA 0XA6A2 DATA 0XAFAB DATA 0XB8B4 DATA 0XC1BD DATA 0XCAC5 DATA 0XD2CE DATA 0XDBD6 DATA 0XE3DF DATA 0XEBE7 DATA 0XF3EF DATA 0XFBF7 DATA 0X03FF DATA 0X0B07 DATA 0X130F DATA 0X1A17 DATA 0X221E DATA 0X2925 DATA 0X302D DATA 0X3734 DATA 0X3E3B DATA 0X4542 DATA 0X4C48 DATA 0X524F DATA 0X5955 DATA 0X5F5C DATA 0X6562 DATA 0X6B68 DATA 0X716E DATA 0X7774 DATA 0X7C7A DATA 0X827F DATA 0X8785 DATA 0X8C8A DATA 0X928F DATA 0X9694 DATA 0X9B99 DATA 0XA09E DATA 0XA4A2 DATA 0XA9A7 DATA 0XADAB DATA 0XB1AF DATA 0XB5B3 DATA 0XB9B7 DATA 0XBDBB DATA 0XC0BE DATA 0XC3C2 DATA 0XC7C5 DATA 0XCAC8 DATA 0XCDCB DATA 0XD0CE DATA 0XD2D1 DATA 0XD5D3 DATA 0XD7D6 DATA 0XD9D8 DATA 0XDBDA DATA 0XDDDC DATA 0XDFDE DATA 0XE0E0 DATA 0XE2E1 DATA 0XE3E3 DATA 0XE4E4 DATA 0XE5E5 DATA 0XE6E6 DATA 0XE7E6 DATA 0XE7E7 DATA 0XE8E8 DATA 0XE8E8 DATA 0XE8E8 TABLE_H: DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0000 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0101 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0202 DATA 0X0302 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 DATA 0X0303 ini_EEPROM: movlw 60 movwf _SPEEDM movlw 1 movwf _acc_up movwf _acc_down movlw 255 movwf _ACC_COUNT_L movlw 10 movwf _ACC_COUNT_H return end