;--------------------------------------------------------------------------------------------------
;
; Файл: ignition.asm
;
; Версия: 2.0
;
; Дата: 05.12.2012, 16:45:30
;
; Описание: Программа управления электронным зажиганием.
;           Файл создан программой IgnitionMaster.
;
; Конфигурация: 
;           микроконтроллер - PIC16F628 и его модификации
;           
;           конфигурация шторки - АКТИВНЫЙ ЭЛЕМЕНТ - МЕТАЛЛИЧЕСКИЙ ЛЕПЕСТОК
;           
;           график по умолчанию - №8 ЯВА 638
;                   углы опережения - 10.1  18.1  22.9  26.3  27.3  27.9  27.5  28.6  28.2
;           
;           график 1 - №7 ЯВА 350
;                   углы опережения - 8.3  23.1  25.1  27.8  29.1  30.0  30.0  31.4  31.8
;           
;           график 2 - №6 ИЖ
;                   углы опережения - 7.6  12.3  15.3  17.6  18.2  19.3  20.0  20.0  21.2
;           
;           дополнительная функция 1 - ПРОГРЕВ СВЕЧЕЙ
;           
;           дополнительная функция 2 - ОГРАНИЧЕНИЕ ОБОРОТОВ 3500 ОБ/МИН
;           
;--------------------------------------------------------------------------------------------------




; Контроллер --------------------------------------------------------------------------------------

    LIST    p=16f628

#define PIC16F628




;--------------------------------------------------------------------------------------------------
;       Register Definitions
;--------------------------------------------------------------------------------------------------

W                            EQU     H'0000'
F                            EQU     H'0001'

;----- Register Files------------------------------------------------------------------------------

INDF                         EQU     H'0000'
TMR0                         EQU     H'0001'
PCL                          EQU     H'0002'
STATUS                       EQU     H'0003'
FSR                          EQU     H'0004'
PORTA                        EQU     H'0005'
PORTB                        EQU     H'0006'
PCLATH                       EQU     H'000A'
INTCON                       EQU     H'000B'
PIR1                         EQU     H'000C'
TMR1L                        EQU     H'000E'
TMR1H                        EQU     H'000F'
T1CON                        EQU     H'0010'
TMR2                         EQU     H'0011'
T2CON                        EQU     H'0012'
CCPR1L                       EQU     H'0015'
CCPR1H                       EQU     H'0016'
CCP1CON                      EQU     H'0017'
RCSTA                        EQU     H'0018'
TXREG                        EQU     H'0019'
RCREG                        EQU     H'001A'
CMCON                        EQU     H'001F'

OPTION_REG                   EQU     H'0081'
TRISA                        EQU     H'0085'
TRISB                        EQU     H'0086'
PIE1                         EQU     H'008C'
PCON                         EQU     H'008E'
PR2                          EQU     H'0092'
TXSTA                        EQU     H'0098'
SPBRG                        EQU     H'0099'
EEDATA                       EQU     H'009A'
EEADR                        EQU     H'009B'
EECON1                       EQU     H'009C'
EECON2                       EQU     H'009D'
VRCON                        EQU     H'009F'

;----- STATUS Bits --------------------------------------------------------------------------------

IRP                          EQU     H'0007'
RP1                          EQU     H'0006'
RP0                          EQU     H'0005'
NOT_TO                       EQU     H'0004'
NOT_PD                       EQU     H'0003'
Z                            EQU     H'0002'
DC                           EQU     H'0001'
C                            EQU     H'0000'

;----- INTCON Bits --------------------------------------------------------------------------------

GIE                          EQU     H'0007'
PEIE                         EQU     H'0006'
T0IE                         EQU     H'0005'
INTE                         EQU     H'0004'
RBIE                         EQU     H'0003'
T0IF                         EQU     H'0002'
INTF                         EQU     H'0001'
RBIF                         EQU     H'0000'

;----- PIR1 Bits ----------------------------------------------------------------------------------

EEIF                         EQU     H'0007'
CMIF                         EQU     H'0006'
RCIF                         EQU     H'0005'
TXIF                         EQU     H'0004'
CCP1IF                       EQU     H'0002'
TMR2IF                       EQU     H'0001'
TMR1IF                       EQU     H'0000'

;----- T1CON Bits ---------------------------------------------------------------------------------
T1CKPS1                      EQU     H'0005'
T1CKPS0                      EQU     H'0004'
T1OSCEN                      EQU     H'0003'
NOT_T1SYNC                   EQU     H'0002'
TMR1CS                       EQU     H'0001'
TMR1ON                       EQU     H'0000'

;----- T2CON Bits ---------------------------------------------------------------------------------
TOUTPS3                      EQU     H'0006'
TOUTPS2                      EQU     H'0005'
TOUTPS1                      EQU     H'0004'
TOUTPS0                      EQU     H'0003'
TMR2ON                       EQU     H'0002'
T2CKPS1                      EQU     H'0001'
T2CKPS0                      EQU     H'0000'

;----- CCP1CON Bits -------------------------------------------------------------------------------
CCP1X                        EQU     H'0005'
CCP1Y                        EQU     H'0004'
CCP1M3                       EQU     H'0003'
CCP1M2                       EQU     H'0002'
CCP1M1                       EQU     H'0001'
CCP1M0                       EQU     H'0000'

;----- RCSTA Bits ---------------------------------------------------------------------------------
SPEN                         EQU     H'0007'
RX9                          EQU     H'0006'
SREN                         EQU     H'0005'
CREN                         EQU     H'0004'
ADEN                         EQU     H'0003'
FERR                         EQU     H'0002'
OERR                         EQU     H'0001'
RX9D                         EQU     H'0000'

;----- CMCON Bits ---------------------------------------------------------------------------------

C2OUT                        EQU     H'0007'
C1OUT                        EQU     H'0006'
C2INV                        EQU     H'0005'
C1INV                        EQU     H'0004'
CIS                          EQU     H'0003'
CM2                          EQU     H'0002'
CM1                          EQU     H'0001'
CM0                          EQU     H'0000'

;----- OPTION Bits --------------------------------------------------------------------------------

NOT_RBPU                     EQU     H'0007'
INTEDG                       EQU     H'0006'
T0CS                         EQU     H'0005'
T0SE                         EQU     H'0004'
PSA                          EQU     H'0003'
PS2                          EQU     H'0002'
PS1                          EQU     H'0001'
PS0                          EQU     H'0000'

;----- PIE1 Bits ----------------------------------------------------------------------------------

EEIE                         EQU     H'0007'
CMIE                         EQU     H'0006'
RCIE                         EQU     H'0005'
TXIE                         EQU     H'0004'
CCP1IE                       EQU     H'0002'
TMR2IE                       EQU     H'0001'
TMR1IE                       EQU     H'0000'

;----- PCON Bits ----------------------------------------------------------------------------------

OSCF                         EQU     H'0003'
NOT_POR                      EQU     H'0001'
NOT_BO                       EQU     H'0000'
NOT_BOR                      EQU     H'0000'
NOT_BOD                      EQU     H'0000'

;----- TXSTA Bits ---------------------------------------------------------------------------------
CSRC                         EQU     H'0007'
TX9                          EQU     H'0006'
TXEN                         EQU     H'0005'
SYNC                         EQU     H'0004'
BRGH                         EQU     H'0002'
TRMT                         EQU     H'0001'
TX9D                         EQU     H'0000'

;----- EECON1 Bits --------------------------------------------------------------------------------
WRERR                        EQU     H'0003'
WREN                         EQU     H'0002'
WR                           EQU     H'0001'
RD                           EQU     H'0000'

;----- VRCON Bits ---------------------------------------------------------------------------------

VREN                         EQU     H'0007'
VROE                         EQU     H'0006'
VRR                          EQU     H'0005'
VR3                          EQU     H'0003'
VR2                          EQU     H'0002'
VR1                          EQU     H'0001'
VR0                          EQU     H'0000'

;--------------------------------------------------------------------------------------------------
;       RAM Definition
;--------------------------------------------------------------------------------------------------

    __MAXRAM H'01FF'
    __BADRAM H'07'-H'09', H'0D', H'13'-H'14', H'1B'-H'1E'
    __BADRAM H'87'-H'89', H'8D', H'8F'-H'91', H'93'-H'97', H'9E'
    __BADRAM H'105', H'107'-H'109', H'10C'-H'11F', H'150'-H'16F'
    __BADRAM H'185', H'187'-H'189', H'18C'-H'1EF'

;--------------------------------------------------------------------------------------------------
;       Configuration Bits
;--------------------------------------------------------------------------------------------------

_BODEN_ON                    EQU     H'3FFF'
_BODEN_OFF                   EQU     H'3FBF'
_CP_ALL                      EQU     H'03FF'
_CP_75                       EQU     H'17FF'
_CP_50                       EQU     H'2BFF'
_CP_OFF                      EQU     H'3FFF'
_DATA_CP_ON                  EQU     H'3EFF'
_DATA_CP_OFF                 EQU     H'3FFF'
_PWRTE_OFF                   EQU     H'3FFF'
_PWRTE_ON                    EQU     H'3FF7'
_WDT_ON                      EQU     H'3FFF'
_WDT_OFF                     EQU     H'3FFB'
_LVP_ON                      EQU     H'3FFF'
_LVP_OFF                     EQU     H'3F7F'
_MCLRE_ON                    EQU     H'3FFF'
_MCLRE_OFF                   EQU     H'3FDF'
_ER_OSC_CLKOUT               EQU     H'3FFF'
_ER_OSC_NOCLKOUT             EQU     H'3FFE'
_INTRC_OSC_CLKOUT            EQU     H'3FFD'
_INTRC_OSC_NOCLKOUT          EQU     H'3FFC'
_EXTCLK_OSC                  EQU     H'3FEF'
_LP_OSC                      EQU     H'3FEC'
_XT_OSC                      EQU     H'3FED'
_HS_OSC                      EQU     H'3FEE'




; Конфигурация ------------------------------------------------------------------------------------

    __CONFIG    _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC & _MCLRE_OFF & _LVP_OFF & _DATA_CP_OFF & _BODEN_OFF




; Параметры ---------------------------------------------------------------------------------------

#define TMR_VALUE               0xCE    ; Квантование таймера 60 мкс
#define COIL_OFF_VALUE          0x60    ; Отключение катушки через 4 секунды
#define MODUL_CONFIG_METAL              ; Конфигурация шторки-модулятора: МЕТАЛЛ
#define FUNC1_WARMING_SPARK             ; Дополнительная функция 1: ПРОГРЕВ СВЕЧЕЙ
#define WARMING_COIL_TIME       0x32    ; Таймер включения катушки при прогреве свечей
#define FUNC2_OVERRUN                   ; Дополнительная функция 2: ОГРАНИЧЕНИЕ ОБОРОТОВ
#define FUNC2_OVERRUN_LIMIT     .47     ; Частота вращения вала для ораничения оборотов 3500об/мин




; Назначение портов ввода/вывода ------------------------------------------------------------------

#define pLED_N              PORTA,2     ; Выход на светодиод
#define pSENSOR             PORTB,1     ; Вход датчика Холла
#define pCOIL               PORTB,2     ; Выход управления коммутатором
#define pCOIL_N             PORTB,3     ; Инвертированный выход управления коммутатором
#define pFUNC1_N            PORTB,4     ; Вход дополнительной функции 1
#define pFUNC2_N            PORTB,5     ; Вход дополнительной функции 2
#define pSELECT1_N          PORTB,6     ; Выбор таблицы УОЗ 1
#define pSELECT2_N          PORTB,7     ; Выбор таблицы УОЗ 2




; Маски портов ------------------------------------------------------------------------------------

#define SENSOR_MASK         0x02        ; Вход датчика Холла
#define FUNC1_MASK          0x10        ; Вход дополнительной функции 1
#define FUNC2_MASK          0x20        ; Вход дополнительной функции 2
#define SELECT1_MASK        0x40        ; Выбор таблицы УОЗ 1
#define SELECT2_MASK        0x80        ; Выбор таблицы УОЗ 2




; Направление работы портов ввода/вывода (0 - вывод, 1 - ввод) ------------------------------------

#define PORTA_IO            0x00        ; Порт A
#define PORTB_IO            0xF2        ; Порт B




; Сбросовые состояния портов ----------------------------------------------------------------------

#define PORTA_RESET         0x04        ; Порт A
#define PORTB_RESET         0x08        ; Порт B



; Память данных -----------------------------------------------------------------------------------

TmpW                    EQU 0x20        ; Состояние W
TmpSTATUS               EQU 0x21        ; Состояние STATUS
Flags                   EQU 0x22        ; Флаги состояния
Ports                   EQU 0x23        ; Состояние входных портов
SensCnt                 EQU 0x24        ; Счетчик фильтра датчика Холла
SectorCnt               EQU 0x25        ; Счетчик сектора
LastSectorCnt           EQU 0x26        ; Сохраненное значение счетчика сектора
SparkTime               EQU 0x27        ; Определяет момент искрообразования
CoilCnt_0               EQU 0x28        ; Двухбайтный счетчик включения катушки
CoilCnt_1               EQU 0x29
CoilOffCnt_0            EQU 0x2A        ; Двухбайтный счетчик отключения катушки при простое
CoilOffCnt_1            EQU 0x2B
Func1Cnt                EQU 0x2C        ; Счетчик фильтра на входе FUNC1
Func2Cnt                EQU 0x2D        ; Счетчик фильтра на входе FUNC2
Select1Cnt              EQU 0x2E        ; Счетчик фильтра на входе SELECT1
Select2Cnt              EQU 0x2F        ; Счетчик фильтра на входе SELECT2
WarmingCnt              EQU 0x30        ; Счетчик прогрева свечей




; Битовые переменные ------------------------------------------------------------------------------

#define bLastState          Flags,0     ; Последнее состояние сигнала датчика Холла
#define bOverflow           Flags,1     ; Переполнение счетчика
#define bCoilOff            Flags,2     ; Отключение катушки при простое
#define bEngineStop         Flags,3     ; Отключение двигателя
#define bOverrun1           Flags,4     ; Срабатывание ограничения оборотов по функции 1
#define bOverrun2           Flags,5     ; Срабатывание ограничения оборотов по функции 2

#define bSens               Ports,1     ; Состояние сигнала датчика Холла после программного фильтра
#define bFunc1_n            Ports,4     ; Включение дополнительной функции 1
#define bFunc2_n            Ports,5     ; Включение дополнительной функции 2
#define bSelect1_n          Ports,6     ; Выбор характеристики УОЗ 1
#define bSelect2_n          Ports,7     ; Выбор характеристики УОЗ 2




; Вектор сброса -----------------------------------------------------------------------------------

    ORG	0x0000

    clrwdt

    clrf    INTCON              ; Обнуляем регистр прерываний

    goto Start                  ; Переходим к началу программы




; Вектор прерываний -------------------------------------------------------------------------------

    ORG	0x0004


; Interrupt ---------------------------------------------------------------------------------------
;
; Описание: Прерывание от TMR0. Измерение времени прохода шторки по сигналу с датчика Холла. 
;           Своевременное включение и отключение катушки.
;--------------------------------------------------------------------------------------------------

Interrupt;

    clrwdt

    movwf   TmpW                ; Сохраняем состояние
    swapf   STATUS,W
    movwf   TmpSTATUS


    movlw   TMR_VALUE           ; Квантование таймера
    movwf   TMR0

    bcf     INTCON,T0IF         ; Сбрасываем флаг прерывания


    movf    PORTB,W             ; Программный фильтр по входу датчика Холла
    xorwf   Ports,W
    andlw   SENSOR_MASK
    btfsc   STATUS,Z
    clrf    SensCnt             ; Сбрасываем байт счетчика
    incf    SensCnt,F
    btfss   SensCnt,2           ; Досчитаем до 4
    goto $+.4
    movlw   SENSOR_MASK         ; Инвертируем состояние флага
    xorwf   Ports,F
    clrf    SensCnt


#ifdef MODUL_CONFIG_METAL

    btfss   bSens               ; Проверяем флаг датчика (1 - шторка в датчике, 0 - вне датчика)
    goto _Out

#else ; #ifdef MODUL_CONFIG_SPACE

    btfsc   bSens               ; Проверяем флаг датчика инверсно (0 - шторка в датчике, 1 - вне датчика)
    goto _Out

#endif


    btfsc   bLastState          ; Проверяем предидущее состояние датчика
    goto _SensorActive




_SensorIn                       ; Шторка вошла в датчик

    btfsc   bEngineStop         ; Если двигатель не остановлен
    goto $+.7
    btfsc   bOverrun1           ; Нет ограничения оборотов по функции 1
    goto $+.5
    btfsc   bOverrun2           ; Нет ограничения оборотов по функции 2
    goto $+.3
    bsf     pCOIL               ; Включаем катушку зажигания
    bcf     pCOIL_N


    movf    SectorCnt,W         ; Сохраняем счетчик оборотов
    movwf   LastSectorCnt

    bsf     bLastState          ; Обновляем данные о состоянии датчика
    clrf    SectorCnt           ; Сбрасываем счетчик
    bcf     bOverflow           ; Сбрасываем флаг переполнения

    clrf    CoilOffCnt_1        ; Обнуляем счетчик отключения катушки, двигатель работает
    bcf     bCoilOff            ; Снимаем флаг отключения катушки, двигатель работает

    goto _ExitInterrupt




_SensorActive                   ; Активный элемент шторки уже в датчике

    bcf     pLED_N              ; Включаем светодиод

    btfsc   bOverflow           ; Если счетчик был переполнен, не проверяем его на момент искрообразования
    goto _ExitInterrupt

    incf    SectorCnt,F         ; Продолжаем отсчитывать счетчик

    movf    SectorCnt,W         ; Проверяем счетчик на переполнение (максимум 239)
    xorlw   .239
    btfsc   STATUS,Z
    bsf     bOverflow           ; Счетчик переполнен, выставляем флаг

    movf    SparkTime,W         ; Проверяем счетчик на момент искрообразования, если он не равен 0 (т.е. при запуске)
    btfsc   STATUS,Z
    goto _ExitInterrupt         ; Происходит запуск, искра будет образована при выходе шторки из датчика
    xorwf   SectorCnt,W
    btfss   STATUS,Z
    goto _ExitInterrupt

    bcf     pCOIL               ; Инициируем искру
    bsf     pCOIL_N

    goto _ExitInterrupt




_Out                            ; Шторка вне датчика

    btfss   bLastState          ; Проверяем предидущее состояние датчика
    goto _SensorIdle




_SensorOut                      ; Шторка вышла из датчика

    bcf     pCOIL               ; Инициируем искру, если этого еще не произошло (запуск)
    bsf     pCOIL_N

    bcf     bLastState          ; Обновляем данные о состоянии датчика

    clrf    CoilCnt_0           ; Обнуляем время включения катушки
    clrf    CoilCnt_1


    movf    SparkTime,W         ; Скважность импульсов должна составлять ~70%
    btfsc   STATUS,Z
    movlw   .239
    addwf   SectorCnt,W
    movwf   CoilCnt_0
    rlf     CoilCnt_1,F

    call CalculateSparkTime     ; Вычисляем момент искрообразования
    movwf   SparkTime

    goto _ExitInterrupt




_SensorIdle                     ; Шторка уже вне датчика

    bsf     pLED_N              ; Отключаем светодиод

    decf    CoilCnt_0,F         ; Обновляем счетчик включения катушки
    btfss   STATUS,Z
    goto _ExitInterrupt
    movf    CoilCnt_1,W
    btfsc   STATUS,Z
    goto $+.3
    decf    CoilCnt_1,F
    goto _ExitInterrupt

    btfsc   bEngineStop         ; Если двигатель не остановлен
    goto $+.9
    btfsc   bCoilOff            ; Катушка не отключена при простое
    goto $+.7
    btfsc   bOverrun1           ; Нет ограничения оборотов по функции 1
    goto $+.5
    btfsc   bOverrun2           ; Нет ограничения оборотов по функции 2
    goto $+.3
    bsf     pCOIL               ; Включаем катушку зажигания
    bcf     pCOIL_N




_ExitInterrupt

    swapf   TmpSTATUS,W         ; Восстанавливаем состояние
    movwf   STATUS
    swapf   TmpW,F
    swapf   TmpW,W

    retfie




; Start -------------------------------------------------------------------------------------------
;
; Описание: Начало программы, инициализация контроллера и установка в начальное состояние, 
;           главный цикл программы.
;--------------------------------------------------------------------------------------------------

Start;


#ifdef PIC16F628

    movlw   0x07                ; Отключаем компаратор (только PIC16F628)
    movwf   CMCON

#endif


    bsf     STATUS,RP0          ; Выбор банка памяти 1


    clrf    EECON1              ; Очищаем регистр записи/чтения ЭППЗУ

    movlw   PORTA_IO            ; Устанавливаем направление портов (1 - ввод, 0 - вывод)
    movwf   TRISA
    movlw   PORTB_IO
    movwf   TRISB

    movlw   0x88                ; Резисторы на PB ВЫКЛючены, делитель на WDT
    movwf   OPTION_REG


    bcf     STATUS,RP0          ; Выбор банка памяти 0


    movlw   PORTA_RESET         ; Порты в сброс
    movwf   PORTA
    movlw   PORTB_RESET
    movwf   PORTB


    clrf    Flags               ; Сбрасываем регистры
    clrf    SectorCnt
    clrf    LastSectorCnt
    clrf    SparkTime
    clrf    CoilCnt_0
    clrf    CoilCnt_1
    clrf    CoilOffCnt_0
    clrf    CoilOffCnt_1


    movf    PORTB,W             ; Выставляем биты состояния портов
    andlw   SENSOR_MASK | FUNC1_MASK | FUNC2_MASK  | SELECT1_MASK | SELECT2_MASK
    movwf   Ports


#ifdef FUNC1_ENGINE_STOP        ; Функция отключения двигателя

    btfsc   bFunc1_n            ; Включена дополнительная функция
    goto $+.3
    bsf     bEngineStop         ; Отключаем двигатель
    goto $+.2
    bcf     bEngineStop         ; Включаем двигатель

#endif


#ifdef FUNC2_ENGINE_STOP        ; Функция отключения двигателя

    btfsc   bFunc2_n            ; Включена дополнительная функция
    goto $+.3
    bsf     bEngineStop         ; Отключаем двигатель
    goto $+.2
    bcf     bEngineStop         ; Включаем двигатель

#endif




#ifdef MODUL_CONFIG_METAL

    btfss   pSENSOR             ; Проверяем текущее состояние датчика
    goto $+.8

#else ; #ifdef MODUL_CONFIG_SPACE

    btfsc   pSENSOR             ; Проверяем текущее состояние датчика инверсно (fix 1.51)
    goto $+.8

#endif

                                ; Шторка в датчике
    bcf     pLED_N              ; Включаем светодиод
    bsf     bLastState          ; Обновляем флаг состояния датчика
    btfsc   bEngineStop         ; Если двигатель не остановлен
    goto $+.3
    bsf     pCOIL               ; Включаем катушку зажигания
    bcf     pCOIL_N
    goto $+.5
                                ; Шторка вне датчика
    bsf     pLED_N              ; Отключаем светодиод
    bcf     bLastState          ; Обновляем флаг состояния датчика
    bcf     pCOIL               ; Отключаем катушку зажигания
    bsf     pCOIL_N


    movlw   TMR_VALUE           ; Квантование таймера
    movwf   TMR0


    movlw   0xA0                ; Разрешаем прерывания от TMR0, и прерывания глобально, сбрасываем флаги прерываний
    movwf   INTCON




_MainLoop

    bsf     INTCON,T0IE         ; Разрешаем прерывания от TMR0
    bsf     INTCON,GIE          ; Разрешаем прерывания глобально


                                ; Счетчик отключения катушки при простое двигателя
    incf    CoilOffCnt_0,F
    btfsc   STATUS,Z
    incf    CoilOffCnt_1,F

    movf    CoilOffCnt_1,W      ; Проверяем счетчик и отключаем катушку
    xorlw   COIL_OFF_VALUE
    btfss   STATUS,Z
    goto $+.6
    bcf     INTCON,GIE          ; Запрещаем прерывания
    bcf     pCOIL               ; Отключаем катушку (fix 1.51)
    bsf     pCOIL_N
    clrf    CoilOffCnt_1        ; Сбрасываем счетчик отключения катушки
    bsf     bCoilOff            ; Выставляем флаг отключения катушки


                                ; Проверяем кнопку дополнительной функции 1
    movf    PORTB,W
    xorwf   Ports,W
    andlw   FUNC1_MASK
    btfsc   STATUS,Z
    clrf    Func1Cnt            ; Сбрасываем счетчик
    incf    Func1Cnt,F
    btfss   STATUS,Z            ; Досчитаем до 0
    goto $+.3
    movlw   FUNC1_MASK          ; Инвертируем состояние флага
    xorwf   Ports,F


                                ; Проверяем кнопку дополнительной функции 2
    movf    PORTB,W
    xorwf   Ports,W
    andlw   FUNC2_MASK
    btfsc   STATUS,Z
    clrf    Func2Cnt            ; Сбрасываем счетчик
    incf    Func2Cnt,F
    btfss   STATUS,Z            ; Досчитаем до 0
    goto $+.3
    movlw   FUNC2_MASK          ; Инвертируем состояние флага
    xorwf   Ports,F


                                ; Проверяем кнопку выбора УОЗ 1
    movf    PORTB,W
    xorwf   Ports,W
    andlw   SELECT1_MASK
    btfsc   STATUS,Z
    clrf    Select1Cnt          ; Сбрасываем счетчик
    incf    Select1Cnt,F
    btfss   STATUS,Z            ; Досчитаем до 0
    goto $+.3
    movlw   SELECT1_MASK        ; Инвертируем состояние флага
    xorwf   Ports,F


                                ; Проверяем кнопку выбора УОЗ 2
    movf    PORTB,W
    xorwf   Ports,W
    andlw   SELECT2_MASK
    btfsc   STATUS,Z
    clrf    Select2Cnt          ; Сбрасываем счетчик
    incf    Select2Cnt,F
    btfss   STATUS,Z            ; Досчитаем до 0
    goto $+.3
    movlw   SELECT2_MASK        ; Инвертируем состояние флага
    xorwf   Ports,F




#ifdef FUNC1_ENGINE_STOP        ; Функция отключения двигателя

    btfsc   bFunc1_n            ; Включена дополнительная функция
    goto $+.3
    bsf     bEngineStop         ; Отключаем двигатель
    goto $+.2
    bcf     bEngineStop         ; Включаем двигатель

#endif


#ifdef FUNC1_PROTECT            ; Функция защиты

    btfsc   bFunc1_n            ; Включена дополнительная функция
    goto $+.11
    movf    LastSectorCnt,W     ; Проверяем обороты вала, если LastSectorCnt > 0
    btfsc   STATUS,Z
    goto $+.8
    sublw   FUNC1_PROTECT_LIMIT ; При превышении предела оборотов
    btfss   STATUS,C            ; Результат положительный, С = 1 при W < FUNC1_PROTECT_LIMIT
    goto $+.5
    clrwdt                      ; Мёртвый цикл, ничего не обслуживаем
    bcf     INTCON,GIE          ; Запрещаем прерывания
    bcf     pLED_N              ; Включаем светодиод
    goto $-.3

#endif


#ifdef FUNC1_OVERRUN            ; Функция ограничения оборотов

    btfsc   bFunc1_n            ; Включена дополнительная функция
    goto $+.9
    movf    LastSectorCnt,W     ; Проверяем обороты вала, если LastSectorCnt > 0
    btfsc   STATUS,Z
    goto $+.7
    sublw   FUNC1_OVERRUN_LIMIT ; При превышении предела оборотов
    btfss   STATUS,C            ; Результат положительный, С = 1 при W < FUNC1_OVERRUN_LIMIT
    goto $+.3
    bsf     bOverrun1           ; Выставляем флаг превышения оборотов
    goto $+.2
    bcf     bOverrun1           ; Снимаем флаг превышения оборотов

#endif


#ifdef FUNC1_WARMING_SPARK      ; Функция прогрева свечей (1.6)

    btfss   bFunc1_n            ; Включена дополнительная функция
    btfss   bCoilOff            ; Этот режим может работать только когда отключена катушка (двигатель остановлен)
    goto $+.13

    clrf    CoilOffCnt_1        ; Сбрасываем счетчик отключения катушки

    incf    WarmingCnt,F        ; Обновляем счётчик

    btfss   STATUS,Z            ; При 0 включаем катушку
    goto $+.3
    bsf     pCOIL               ; Включаем катушку зажигания
    bcf     pCOIL_N

    movf    WarmingCnt,W        ; Проверяем счётчик на отключение катушки
    sublw   WARMING_COIL_TIME
    btfss   STATUS,Z
    goto $+.3
    bcf     pCOIL               ; Отключаем катушку зажигания
    bsf     pCOIL_N
                                ; При завершении работы функции катушка будет автоматически отключена

#endif


#ifdef FUNC2_ENGINE_STOP        ; Функция отключения двигателя

    btfsc   bFunc2_n            ; Включена дополнительная функция
    goto $+.3
    bsf     bEngineStop         ; Отключаем двигатель
    goto $+.2
    bcf     bEngineStop         ; Включаем двигатель

#endif


#ifdef FUNC2_PROTECT            ; Функция защиты

    btfsc   bFunc2_n            ; Включена дополнительная функция
    goto $+.11
    movf    LastSectorCnt,W     ; Проверяем обороты вала, если LastSectorCnt > 0
    btfsc   STATUS,Z
    goto $+.8
    sublw   FUNC2_PROTECT_LIMIT ; При превышении предела оборотов
    btfss   STATUS,C            ; Результат положительный, С = 1 при W < FUNC2_PROTECT_LIMIT
    goto $+.5
    clrwdt                      ; Мёртвый цикл, ничего не обслуживаем
    bcf     INTCON,GIE          ; Запрещаем прерывания
    bcf     pLED_N              ; Включаем светодиод
    goto $-.3

#endif


#ifdef FUNC2_OVERRUN            ; Функция ограничения оборотов

    btfsc   bFunc2_n            ; Включена дополнительная функция
    goto $+.9
    movf    LastSectorCnt,W     ; Проверяем обороты вала, если LastSectorCnt > 0
    btfsc   STATUS,Z
    goto $+.7
    sublw   FUNC2_OVERRUN_LIMIT ; При превышении предела оборотов
    btfss   STATUS,C            ; Результат положительный, С = 1 при W < FUNC2_OVERRUN_LIMIT
    goto $+.3
    bsf     bOverrun2           ; Выставляем флаг превышения оборотов
    goto $+.2
    bcf     bOverrun2           ; Снимаем флаг превышения оборотов

#endif


#ifdef FUNC2_WARMING_SPARK      ; Функция прогрева свечей (1.6)

    btfss   bFunc2_n            ; Включена дополнительная функция
    btfss   bCoilOff            ; Этот режим может работать только когда отключена катушка (двигатель остановлен)
    goto $+.13

    clrf    CoilOffCnt_1        ; Сбрасываем счетчик отключения катушки

    incf    WarmingCnt,F        ; Обновляем счётчик

    btfss   STATUS,Z            ; При 0 включаем катушку
    goto $+.3
    bsf     pCOIL               ; Включаем катушку зажигания
    bcf     pCOIL_N

    movf    WarmingCnt,W        ; Проверяем счётчик на отключение катушки
    sublw   WARMING_COIL_TIME
    btfss   STATUS,Z
    goto $+.3
    bcf     pCOIL               ; Отключаем катушку зажигания
    bsf     pCOIL_N
                                ; При завершении работы функции катушка будет автоматически отключена

#endif


    goto _MainLoop




; CalculateSparkTime ------------------------------------------------------------------------------
;
; Описание: Вычисление момента искрообразования по таблице в соответствии с измеренным временем 
;           оборота распредвала.
; Входные параметры: SectorCnt - величина импульса от датчика Холла.
; Выходные параметры: W - момент зажигания от начала импульса в квантах времени.
;--------------------------------------------------------------------------------------------------

CalculateSparkTime;


    movf    SectorCnt,W         ; Проверяем счетчик на допустимые пределы (0 - 239)
    sublw   .239
    btfss   STATUS,C
    retlw   .0                  ; Счетчик больше 239, поздним зажигание (0 - не проверяем зажигание)

                                ; Теперь переходим к таблице с вычисляемым переходом
    btfsc   bSelect1_n
    goto $+.8

    movlw   HIGH Table1         ; Выбрана характеристика 1
    movwf   PCLATH
    movf    SectorCnt,W
    call Table1
    nop
    clrf    PCLATH
    return


    btfsc   bSelect2_n
    goto $+.8

    movlw   HIGH Table2         ; Выбрана характеристика 2
    movwf   PCLATH
    movf    SectorCnt,W
    call Table2
    nop
    clrf    PCLATH
    return


    movlw   HIGH TableDefault   ; Выбрана характеристика по умолчанию
    movwf   PCLATH
    movf    SectorCnt,W
    call TableDefault
    nop
    clrf    PCLATH
    return




; Таблица 1 ---------------------------------------------------------------------------------------
;
; Характеристика УОЗ 1. Выбирается при SELECT1 = 0 и SELECT2 = 1.
;--------------------------------------------------------------------------------------------------

    ORG	0x0100

Table1;

    addwf   PCL,F               ; Вычисляемый переход

    retlw   .000                ; 0
    retlw   .000                ; 1
    retlw   .000                ; 2
    retlw   .000                ; 3
    retlw   .000                ; 4
    retlw   .000                ; 5
    retlw   .000                ; 6
    retlw   .000                ; 7
    retlw   .000                ; 8
    retlw   .000                ; 9
    retlw   .000                ; 10
    retlw   .000                ; 11
    retlw   .000                ; 12
    retlw   .000                ; 13
    retlw   .000                ; 14
    retlw   .000                ; 15
    retlw   .004                ; 16
    retlw   .005                ; 17
    retlw   .005                ; 18
    retlw   .006                ; 19
    retlw   .006                ; 20
    retlw   .006                ; 21
    retlw   .007                ; 22
    retlw   .008                ; 23
    retlw   .008                ; 24
    retlw   .009                ; 25
    retlw   .009                ; 26
    retlw   .010                ; 27
    retlw   .010                ; 28
    retlw   .011                ; 29
    retlw   .012                ; 30
    retlw   .012                ; 31
    retlw   .013                ; 32
    retlw   .013                ; 33
    retlw   .014                ; 34
    retlw   .015                ; 35
    retlw   .015                ; 36
    retlw   .016                ; 37
    retlw   .017                ; 38
    retlw   .017                ; 39
    retlw   .018                ; 40
    retlw   .018                ; 41
    retlw   .019                ; 42
    retlw   .020                ; 43
    retlw   .021                ; 44
    retlw   .021                ; 45
    retlw   .022                ; 46
    retlw   .023                ; 47
    retlw   .023                ; 48
    retlw   .024                ; 49
    retlw   .025                ; 50
    retlw   .026                ; 51
    retlw   .026                ; 52
    retlw   .027                ; 53
    retlw   .028                ; 54
    retlw   .028                ; 55
    retlw   .029                ; 56
    retlw   .030                ; 57
    retlw   .031                ; 58
    retlw   .031                ; 59
    retlw   .032                ; 60
    retlw   .033                ; 61
    retlw   .033                ; 62
    retlw   .034                ; 63
    retlw   .035                ; 64
    retlw   .035                ; 65
    retlw   .036                ; 66
    retlw   .037                ; 67
    retlw   .037                ; 68
    retlw   .038                ; 69
    retlw   .039                ; 70
    retlw   .039                ; 71
    retlw   .040                ; 72
    retlw   .041                ; 73
    retlw   .041                ; 74
    retlw   .042                ; 75
    retlw   .043                ; 76
    retlw   .043                ; 77
    retlw   .044                ; 78
    retlw   .045                ; 79
    retlw   .045                ; 80
    retlw   .046                ; 81
    retlw   .047                ; 82
    retlw   .047                ; 83
    retlw   .049                ; 84
    retlw   .050                ; 85
    retlw   .051                ; 86
    retlw   .052                ; 87
    retlw   .053                ; 88
    retlw   .054                ; 89
    retlw   .055                ; 90
    retlw   .056                ; 91
    retlw   .057                ; 92
    retlw   .059                ; 93
    retlw   .060                ; 94
    retlw   .061                ; 95
    retlw   .062                ; 96
    retlw   .063                ; 97
    retlw   .064                ; 98
    retlw   .065                ; 99
    retlw   .066                ; 100
    retlw   .067                ; 101
    retlw   .069                ; 102
    retlw   .070                ; 103
    retlw   .071                ; 104
    retlw   .072                ; 105
    retlw   .073                ; 106
    retlw   .074                ; 107
    retlw   .075                ; 108
    retlw   .076                ; 109
    retlw   .077                ; 110
    retlw   .079                ; 111
    retlw   .080                ; 112
    retlw   .081                ; 113
    retlw   .082                ; 114
    retlw   .083                ; 115
    retlw   .084                ; 116
    retlw   .085                ; 117
    retlw   .086                ; 118
    retlw   .087                ; 119
    retlw   .089                ; 120
    retlw   .090                ; 121
    retlw   .091                ; 122
    retlw   .092                ; 123
    retlw   .093                ; 124
    retlw   .094                ; 125
    retlw   .095                ; 126
    retlw   .096                ; 127
    retlw   .097                ; 128
    retlw   .098                ; 129
    retlw   .100                ; 130
    retlw   .101                ; 131
    retlw   .102                ; 132
    retlw   .103                ; 133
    retlw   .104                ; 134
    retlw   .105                ; 135
    retlw   .106                ; 136
    retlw   .107                ; 137
    retlw   .108                ; 138
    retlw   .110                ; 139
    retlw   .111                ; 140
    retlw   .112                ; 141
    retlw   .113                ; 142
    retlw   .114                ; 143
    retlw   .115                ; 144
    retlw   .116                ; 145
    retlw   .117                ; 146
    retlw   .118                ; 147
    retlw   .120                ; 148
    retlw   .121                ; 149
    retlw   .122                ; 150
    retlw   .123                ; 151
    retlw   .124                ; 152
    retlw   .125                ; 153
    retlw   .126                ; 154
    retlw   .127                ; 155
    retlw   .128                ; 156
    retlw   .130                ; 157
    retlw   .131                ; 158
    retlw   .132                ; 159
    retlw   .133                ; 160
    retlw   .134                ; 161
    retlw   .135                ; 162
    retlw   .136                ; 163
    retlw   .137                ; 164
    retlw   .138                ; 165
    retlw   .139                ; 166
    retlw   .141                ; 167
    retlw   .142                ; 168
    retlw   .144                ; 169
    retlw   .145                ; 170
    retlw   .146                ; 171
    retlw   .148                ; 172
    retlw   .149                ; 173
    retlw   .150                ; 174
    retlw   .152                ; 175
    retlw   .153                ; 176
    retlw   .155                ; 177
    retlw   .156                ; 178
    retlw   .157                ; 179
    retlw   .159                ; 180
    retlw   .160                ; 181
    retlw   .161                ; 182
    retlw   .163                ; 183
    retlw   .164                ; 184
    retlw   .166                ; 185
    retlw   .167                ; 186
    retlw   .168                ; 187
    retlw   .170                ; 188
    retlw   .171                ; 189
    retlw   .172                ; 190
    retlw   .174                ; 191
    retlw   .175                ; 192
    retlw   .177                ; 193
    retlw   .178                ; 194
    retlw   .179                ; 195
    retlw   .181                ; 196
    retlw   .182                ; 197
    retlw   .183                ; 198
    retlw   .185                ; 199
    retlw   .186                ; 200
    retlw   .188                ; 201
    retlw   .189                ; 202
    retlw   .190                ; 203
    retlw   .192                ; 204
    retlw   .193                ; 205
    retlw   .194                ; 206
    retlw   .196                ; 207
    retlw   .197                ; 208
    retlw   .199                ; 209
    retlw   .200                ; 210
    retlw   .201                ; 211
    retlw   .203                ; 212
    retlw   .204                ; 213
    retlw   .205                ; 214
    retlw   .207                ; 215
    retlw   .208                ; 216
    retlw   .210                ; 217
    retlw   .211                ; 218
    retlw   .212                ; 219
    retlw   .214                ; 220
    retlw   .215                ; 221
    retlw   .216                ; 222
    retlw   .218                ; 223
    retlw   .219                ; 224
    retlw   .221                ; 225
    retlw   .222                ; 226
    retlw   .223                ; 227
    retlw   .225                ; 228
    retlw   .226                ; 229
    retlw   .227                ; 230
    retlw   .229                ; 231
    retlw   .230                ; 232
    retlw   .232                ; 233
    retlw   .233                ; 234
    retlw   .234                ; 235
    retlw   .236                ; 236
    retlw   .237                ; 237
    retlw   .238                ; 238
    retlw   .000                ; 239




; Таблица 2 ---------------------------------------------------------------------------------------
;
; Характеристика УОЗ 2. Выбирается при SELECT1 = X (не имеет значения) и SELECT2 = 0.
;--------------------------------------------------------------------------------------------------

    ORG	0x0200

Table2;

    addwf   PCL,F               ; Вычисляемый переход

    retlw   .000                ; 0
    retlw   .000                ; 1
    retlw   .000                ; 2
    retlw   .000                ; 3
    retlw   .000                ; 4
    retlw   .000                ; 5
    retlw   .000                ; 6
    retlw   .000                ; 7
    retlw   .000                ; 8
    retlw   .000                ; 9
    retlw   .000                ; 10
    retlw   .000                ; 11
    retlw   .000                ; 12
    retlw   .000                ; 13
    retlw   .000                ; 14
    retlw   .000                ; 15
    retlw   .007                ; 16
    retlw   .008                ; 17
    retlw   .009                ; 18
    retlw   .009                ; 19
    retlw   .010                ; 20
    retlw   .010                ; 21
    retlw   .011                ; 22
    retlw   .012                ; 23
    retlw   .012                ; 24
    retlw   .013                ; 25
    retlw   .014                ; 26
    retlw   .015                ; 27
    retlw   .015                ; 28
    retlw   .016                ; 29
    retlw   .017                ; 30
    retlw   .018                ; 31
    retlw   .019                ; 32
    retlw   .019                ; 33
    retlw   .020                ; 34
    retlw   .021                ; 35
    retlw   .022                ; 36
    retlw   .022                ; 37
    retlw   .023                ; 38
    retlw   .024                ; 39
    retlw   .025                ; 40
    retlw   .025                ; 41
    retlw   .026                ; 42
    retlw   .027                ; 43
    retlw   .028                ; 44
    retlw   .029                ; 45
    retlw   .030                ; 46
    retlw   .031                ; 47
    retlw   .031                ; 48
    retlw   .032                ; 49
    retlw   .033                ; 50
    retlw   .034                ; 51
    retlw   .035                ; 52
    retlw   .036                ; 53
    retlw   .037                ; 54
    retlw   .037                ; 55
    retlw   .038                ; 56
    retlw   .039                ; 57
    retlw   .040                ; 58
    retlw   .041                ; 59
    retlw   .042                ; 60
    retlw   .043                ; 61
    retlw   .044                ; 62
    retlw   .045                ; 63
    retlw   .046                ; 64
    retlw   .046                ; 65
    retlw   .047                ; 66
    retlw   .048                ; 67
    retlw   .049                ; 68
    retlw   .050                ; 69
    retlw   .051                ; 70
    retlw   .052                ; 71
    retlw   .053                ; 72
    retlw   .054                ; 73
    retlw   .054                ; 74
    retlw   .055                ; 75
    retlw   .056                ; 76
    retlw   .057                ; 77
    retlw   .058                ; 78
    retlw   .059                ; 79
    retlw   .060                ; 80
    retlw   .061                ; 81
    retlw   .062                ; 82
    retlw   .062                ; 83
    retlw   .063                ; 84
    retlw   .064                ; 85
    retlw   .065                ; 86
    retlw   .066                ; 87
    retlw   .067                ; 88
    retlw   .068                ; 89
    retlw   .069                ; 90
    retlw   .070                ; 91
    retlw   .071                ; 92
    retlw   .072                ; 93
    retlw   .073                ; 94
    retlw   .074                ; 95
    retlw   .075                ; 96
    retlw   .076                ; 97
    retlw   .077                ; 98
    retlw   .078                ; 99
    retlw   .079                ; 100
    retlw   .080                ; 101
    retlw   .081                ; 102
    retlw   .082                ; 103
    retlw   .082                ; 104
    retlw   .083                ; 105
    retlw   .084                ; 106
    retlw   .085                ; 107
    retlw   .086                ; 108
    retlw   .087                ; 109
    retlw   .088                ; 110
    retlw   .089                ; 111
    retlw   .090                ; 112
    retlw   .091                ; 113
    retlw   .092                ; 114
    retlw   .093                ; 115
    retlw   .094                ; 116
    retlw   .095                ; 117
    retlw   .096                ; 118
    retlw   .097                ; 119
    retlw   .098                ; 120
    retlw   .099                ; 121
    retlw   .100                ; 122
    retlw   .101                ; 123
    retlw   .102                ; 124
    retlw   .102                ; 125
    retlw   .103                ; 126
    retlw   .104                ; 127
    retlw   .105                ; 128
    retlw   .106                ; 129
    retlw   .107                ; 130
    retlw   .108                ; 131
    retlw   .109                ; 132
    retlw   .110                ; 133
    retlw   .111                ; 134
    retlw   .112                ; 135
    retlw   .113                ; 136
    retlw   .114                ; 137
    retlw   .115                ; 138
    retlw   .116                ; 139
    retlw   .117                ; 140
    retlw   .118                ; 141
    retlw   .119                ; 142
    retlw   .120                ; 143
    retlw   .121                ; 144
    retlw   .122                ; 145
    retlw   .122                ; 146
    retlw   .123                ; 147
    retlw   .124                ; 148
    retlw   .125                ; 149
    retlw   .126                ; 150
    retlw   .127                ; 151
    retlw   .128                ; 152
    retlw   .129                ; 153
    retlw   .130                ; 154
    retlw   .131                ; 155
    retlw   .132                ; 156
    retlw   .133                ; 157
    retlw   .134                ; 158
    retlw   .135                ; 159
    retlw   .136                ; 160
    retlw   .137                ; 161
    retlw   .138                ; 162
    retlw   .139                ; 163
    retlw   .140                ; 164
    retlw   .141                ; 165
    retlw   .141                ; 166
    retlw   .143                ; 167
    retlw   .144                ; 168
    retlw   .146                ; 169
    retlw   .147                ; 170
    retlw   .148                ; 171
    retlw   .150                ; 172
    retlw   .151                ; 173
    retlw   .152                ; 174
    retlw   .154                ; 175
    retlw   .155                ; 176
    retlw   .156                ; 177
    retlw   .158                ; 178
    retlw   .159                ; 179
    retlw   .160                ; 180
    retlw   .162                ; 181
    retlw   .163                ; 182
    retlw   .164                ; 183
    retlw   .166                ; 184
    retlw   .167                ; 185
    retlw   .168                ; 186
    retlw   .170                ; 187
    retlw   .171                ; 188
    retlw   .172                ; 189
    retlw   .174                ; 190
    retlw   .175                ; 191
    retlw   .177                ; 192
    retlw   .178                ; 193
    retlw   .179                ; 194
    retlw   .181                ; 195
    retlw   .182                ; 196
    retlw   .183                ; 197
    retlw   .185                ; 198
    retlw   .186                ; 199
    retlw   .187                ; 200
    retlw   .189                ; 201
    retlw   .190                ; 202
    retlw   .191                ; 203
    retlw   .193                ; 204
    retlw   .194                ; 205
    retlw   .195                ; 206
    retlw   .197                ; 207
    retlw   .198                ; 208
    retlw   .199                ; 209
    retlw   .201                ; 210
    retlw   .202                ; 211
    retlw   .203                ; 212
    retlw   .205                ; 213
    retlw   .206                ; 214
    retlw   .208                ; 215
    retlw   .209                ; 216
    retlw   .210                ; 217
    retlw   .212                ; 218
    retlw   .213                ; 219
    retlw   .214                ; 220
    retlw   .216                ; 221
    retlw   .217                ; 222
    retlw   .218                ; 223
    retlw   .220                ; 224
    retlw   .221                ; 225
    retlw   .222                ; 226
    retlw   .224                ; 227
    retlw   .225                ; 228
    retlw   .226                ; 229
    retlw   .228                ; 230
    retlw   .229                ; 231
    retlw   .230                ; 232
    retlw   .232                ; 233
    retlw   .233                ; 234
    retlw   .234                ; 235
    retlw   .236                ; 236
    retlw   .237                ; 237
    retlw   .238                ; 238
    retlw   .000                ; 239




; Таблица 3 ---------------------------------------------------------------------------------------
;
; Характеристика УОЗ по умолчанию. Выбирается при SELECT1 = 1 и SELECT2 = 1.
;--------------------------------------------------------------------------------------------------

    ORG	0x0300

TableDefault;

    addwf   PCL,F               ; Вычисляемый переход

    retlw   .000                ; 0
    retlw   .000                ; 1
    retlw   .000                ; 2
    retlw   .000                ; 3
    retlw   .000                ; 4
    retlw   .000                ; 5
    retlw   .000                ; 6
    retlw   .000                ; 7
    retlw   .000                ; 8
    retlw   .000                ; 9
    retlw   .000                ; 10
    retlw   .000                ; 11
    retlw   .000                ; 12
    retlw   .000                ; 13
    retlw   .000                ; 14
    retlw   .000                ; 15
    retlw   .005                ; 16
    retlw   .006                ; 17
    retlw   .006                ; 18
    retlw   .007                ; 19
    retlw   .007                ; 20
    retlw   .007                ; 21
    retlw   .008                ; 22
    retlw   .009                ; 23
    retlw   .009                ; 24
    retlw   .010                ; 25
    retlw   .010                ; 26
    retlw   .011                ; 27
    retlw   .011                ; 28
    retlw   .012                ; 29
    retlw   .013                ; 30
    retlw   .013                ; 31
    retlw   .014                ; 32
    retlw   .014                ; 33
    retlw   .015                ; 34
    retlw   .016                ; 35
    retlw   .016                ; 36
    retlw   .017                ; 37
    retlw   .018                ; 38
    retlw   .018                ; 39
    retlw   .019                ; 40
    retlw   .019                ; 41
    retlw   .020                ; 42
    retlw   .021                ; 43
    retlw   .022                ; 44
    retlw   .023                ; 45
    retlw   .023                ; 46
    retlw   .024                ; 47
    retlw   .025                ; 48
    retlw   .026                ; 49
    retlw   .027                ; 50
    retlw   .027                ; 51
    retlw   .028                ; 52
    retlw   .029                ; 53
    retlw   .030                ; 54
    retlw   .030                ; 55
    retlw   .031                ; 56
    retlw   .032                ; 57
    retlw   .033                ; 58
    retlw   .034                ; 59
    retlw   .035                ; 60
    retlw   .036                ; 61
    retlw   .036                ; 62
    retlw   .037                ; 63
    retlw   .038                ; 64
    retlw   .039                ; 65
    retlw   .040                ; 66
    retlw   .041                ; 67
    retlw   .042                ; 68
    retlw   .042                ; 69
    retlw   .043                ; 70
    retlw   .044                ; 71
    retlw   .045                ; 72
    retlw   .046                ; 73
    retlw   .047                ; 74
    retlw   .048                ; 75
    retlw   .048                ; 76
    retlw   .049                ; 77
    retlw   .050                ; 78
    retlw   .051                ; 79
    retlw   .052                ; 80
    retlw   .053                ; 81
    retlw   .054                ; 82
    retlw   .054                ; 83
    retlw   .055                ; 84
    retlw   .056                ; 85
    retlw   .057                ; 86
    retlw   .058                ; 87
    retlw   .059                ; 88
    retlw   .060                ; 89
    retlw   .061                ; 90
    retlw   .062                ; 91
    retlw   .063                ; 92
    retlw   .064                ; 93
    retlw   .065                ; 94
    retlw   .066                ; 95
    retlw   .067                ; 96
    retlw   .068                ; 97
    retlw   .069                ; 98
    retlw   .070                ; 99
    retlw   .071                ; 100
    retlw   .072                ; 101
    retlw   .073                ; 102
    retlw   .074                ; 103
    retlw   .075                ; 104
    retlw   .076                ; 105
    retlw   .077                ; 106
    retlw   .078                ; 107
    retlw   .079                ; 108
    retlw   .080                ; 109
    retlw   .081                ; 110
    retlw   .081                ; 111
    retlw   .082                ; 112
    retlw   .083                ; 113
    retlw   .084                ; 114
    retlw   .085                ; 115
    retlw   .086                ; 116
    retlw   .087                ; 117
    retlw   .088                ; 118
    retlw   .089                ; 119
    retlw   .090                ; 120
    retlw   .091                ; 121
    retlw   .092                ; 122
    retlw   .093                ; 123
    retlw   .094                ; 124
    retlw   .095                ; 125
    retlw   .096                ; 126
    retlw   .097                ; 127
    retlw   .098                ; 128
    retlw   .099                ; 129
    retlw   .100                ; 130
    retlw   .101                ; 131
    retlw   .102                ; 132
    retlw   .103                ; 133
    retlw   .104                ; 134
    retlw   .105                ; 135
    retlw   .106                ; 136
    retlw   .107                ; 137
    retlw   .108                ; 138
    retlw   .108                ; 139
    retlw   .109                ; 140
    retlw   .110                ; 141
    retlw   .111                ; 142
    retlw   .112                ; 143
    retlw   .113                ; 144
    retlw   .114                ; 145
    retlw   .115                ; 146
    retlw   .116                ; 147
    retlw   .117                ; 148
    retlw   .118                ; 149
    retlw   .119                ; 150
    retlw   .120                ; 151
    retlw   .121                ; 152
    retlw   .122                ; 153
    retlw   .123                ; 154
    retlw   .124                ; 155
    retlw   .125                ; 156
    retlw   .126                ; 157
    retlw   .127                ; 158
    retlw   .128                ; 159
    retlw   .129                ; 160
    retlw   .130                ; 161
    retlw   .131                ; 162
    retlw   .132                ; 163
    retlw   .133                ; 164
    retlw   .134                ; 165
    retlw   .134                ; 166
    retlw   .136                ; 167
    retlw   .137                ; 168
    retlw   .139                ; 169
    retlw   .140                ; 170
    retlw   .142                ; 171
    retlw   .143                ; 172
    retlw   .145                ; 173
    retlw   .146                ; 174
    retlw   .147                ; 175
    retlw   .149                ; 176
    retlw   .150                ; 177
    retlw   .152                ; 178
    retlw   .153                ; 179
    retlw   .155                ; 180
    retlw   .156                ; 181
    retlw   .158                ; 182
    retlw   .159                ; 183
    retlw   .160                ; 184
    retlw   .162                ; 185
    retlw   .163                ; 186
    retlw   .165                ; 187
    retlw   .166                ; 188
    retlw   .168                ; 189
    retlw   .169                ; 190
    retlw   .171                ; 191
    retlw   .172                ; 192
    retlw   .173                ; 193
    retlw   .175                ; 194
    retlw   .176                ; 195
    retlw   .178                ; 196
    retlw   .179                ; 197
    retlw   .181                ; 198
    retlw   .182                ; 199
    retlw   .184                ; 200
    retlw   .185                ; 201
    retlw   .186                ; 202
    retlw   .188                ; 203
    retlw   .189                ; 204
    retlw   .191                ; 205
    retlw   .192                ; 206
    retlw   .194                ; 207
    retlw   .195                ; 208
    retlw   .197                ; 209
    retlw   .198                ; 210
    retlw   .199                ; 211
    retlw   .201                ; 212
    retlw   .202                ; 213
    retlw   .204                ; 214
    retlw   .205                ; 215
    retlw   .207                ; 216
    retlw   .208                ; 217
    retlw   .210                ; 218
    retlw   .211                ; 219
    retlw   .212                ; 220
    retlw   .214                ; 221
    retlw   .215                ; 222
    retlw   .217                ; 223
    retlw   .218                ; 224
    retlw   .220                ; 225
    retlw   .221                ; 226
    retlw   .223                ; 227
    retlw   .224                ; 228
    retlw   .225                ; 229
    retlw   .227                ; 230
    retlw   .228                ; 231
    retlw   .230                ; 232
    retlw   .231                ; 233
    retlw   .233                ; 234
    retlw   .234                ; 235
    retlw   .236                ; 236
    retlw   .237                ; 237
    retlw   .238                ; 238
    retlw   .000                ; 239



    END
