Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Закрытая тема
 
Опции темы Опции просмотра
Старый 25.12.2009, 13:58   #1
дмитрий626
Junior Member
 
Регистрация: 26.11.2009
Возраст: 41
Сообщений: 7
Вес репутации: 100/0
дмитрий626 will become famous soon enoughдмитрий626 will become famous soon enough
По умолчанию еще один вопрос по контроллеру опережения зажигания на pic 16f84a 4,0мгц

Проблема заключается в следующем,в asm файле я не могу изменить параметры портов ввода-вывода.Мне нужно чтобы с порта PORTB,2 выходил не инвертированный сигнал при выходе железа через датчик Холла,а из PORTB,3 также выходил не инвертированный сигнал при входе железа в датчик Холла(металлическая шторка 90 градусов металл/90 градусов пропуск/90 градусов металл /90 градусов пропуск,1 датчик Холла)
Код:
;--------------------------------------------------------------------------------------------------
;
; Файл: ignition.asm
;
; Версия: 1.51
;
; Дата: 24.12.2009, 13:49:02
;
; Описание: Программа управления электронным зажиганием.
;           Файл создан программой IgnitionMaster.
;
; Конфигурация:
;           микроконтроллер - PIC16F84 и его модификации
;           конфигурация шторки - МЕТАЛЛ 30 ГРАДУСОВ
;           график по умолчанию - СИНИЙ
;           график 1 - СИНИЙ
;           график 2 - СИНИЙ
;           дополнительная функция 1 - ОТСУТСТВУЕТ
;           дополнительная функция 2 - ОТСУТСТВУЕТ
;           
;--------------------------------------------------------------------------------------------------




; Контроллер --------------------------------------------------------------------------------------

    LIST    p=16f84

#define PIC16F84




;--------------------------------------------------------------------------------------------------
;       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'
EEDATA                       EQU     H'0008'
EEADR                        EQU     H'0009'
PCLATH                       EQU     H'000A'
INTCON                       EQU     H'000B'

OPTION_REG                   EQU     H'0081'
TRISA                        EQU     H'0085'
TRISB                        EQU     H'0086'
EECON1                       EQU     H'0088'
EECON2                       EQU     H'0089'

;----- 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'
EEIE                         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'

;----- 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'

;----- EECON1 Bits --------------------------------------------------------------------------------

EEIF                         EQU     H'0004'
WRERR                        EQU     H'0003'
WREN                         EQU     H'0002'
WR                           EQU     H'0001'
RD                           EQU     H'0000'

;--------------------------------------------------------------------------------------------------
;       RAM Definition
;--------------------------------------------------------------------------------------------------

        __MAXRAM H'CF'
        __BADRAM H'07', H'50'-H'7F', H'87'

;--------------------------------------------------------------------------------------------------
;       Configuration Bits
;--------------------------------------------------------------------------------------------------

_CP_ON                       EQU     H'000F'
_CP_OFF                      EQU     H'3FFF'
_PWRTE_ON                    EQU     H'3FF7'
_PWRTE_OFF                   EQU     H'3FFF'
_WDT_ON                      EQU     H'3FFF'
_WDT_OFF                     EQU     H'3FFB'
_LP_OSC                      EQU     H'3FFC'
_XT_OSC                      EQU     H'3FFD'
_HS_OSC                      EQU     H'3FFE'
_RC_OSC                      EQU     H'3FFF'




; Конфигурация ------------------------------------------------------------------------------------

    __CONFIG    _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC




; Параметры ---------------------------------------------------------------------------------------

#define TMR_VALUE               0xCE    ; Квантование таймера 60 мкс
#define COIL_OFF_VALUE          0x60    ; Отключение катушки через 4 секунды
#define MODUL_CONFIG_METAL              ; Конфигурация шторки-модулятора: МЕТАЛЛ




; Назначение портов ввода/вывода ------------------------------------------------------------------

#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 0x10        ; Состояние W
TmpSTATUS               EQU 0x11        ; Состояние STATUS
Flags                   EQU 0x12        ; Флаги состояния
Ports                   EQU 0x13        ; Состояние входных портов
SensCnt                 EQU 0x14        ; Счетчик фильтра датчика Холла
SectorCnt               EQU 0x15        ; Счетчик сектора
LastSectorCnt           EQU 0x16        ; Сохраненное значение счетчика сектора
SparkTime               EQU 0x17        ; Определяет момент искрообразования
CoilCnt_0               EQU 0x18        ; Двухбайтный счетчик включения катушки
CoilCnt_1               EQU 0x19
CoilOffCnt_0            EQU 0x1A        ; Двухбайтный счетчик отключения катушки при простое
CoilOffCnt_1            EQU 0x1B
Func1Cnt                EQU 0x1C        ; Счетчик фильтра на входе FUNC1
Func2Cnt                EQU 0x1D        ; Счетчик фильтра на входе FUNC2
Select1Cnt_0            EQU 0x1E        ; Двухбайтный счетчик фильтра на входе SELECT1
Select1Cnt_1            EQU 0x1F
Select2Cnt_0            EQU 0x20        ; Двухбайтный счетчик фильтра на входе SELECT2
Select2Cnt_1            EQU 0x21




; Битовые переменные ------------------------------------------------------------------------------

#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
    bsf     bCoilOff            ; Выставляем флаг отключения катушки
    clrf    SparkTime           ; Сбрасываем значение момента искрообразования


                                ; Проверяем кнопку дополнительной функции 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_1        ; Сбрасываем старший байт счетчика
    incf    Select1Cnt_0,F
    btfsc   STATUS,Z
    incf    Select1Cnt_1,F
    btfss   Select1Cnt_1,3      ; Досчитаем до 8
    goto $+.3
    movlw   SELECT1_MASK        ; Инвертируем состояние флага
    xorwf   Ports,F


                                ; Проверяем кнопку выбора УОЗ 2
    movf    PORTB,W
    xorwf   Ports,W
    andlw   SELECT2_MASK
    btfsc   STATUS,Z
    clrf    Select2Cnt_1        ; Сбрасываем старший байт счетчика
    incf    Select2Cnt_0,F
    btfsc   STATUS,Z
    incf    Select2Cnt_1,F
    btfss   Select2Cnt_1,3      ; Досчитаем до 8
    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 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


    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
дмитрий626 вне форума  
Старый 25.12.2009, 14:16   #2
SSH
Banned
 
Регистрация: 27.02.2007
Адрес: Красноярск
Возраст: 48
Сообщений: 2,387
Вес репутации: 950/0
SSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to behold
По умолчанию Re: еще один вопрос по контроллеру опережения зажигания на pic 16f84a 4,0мгц

В asm-файле ты можешь изменить всё, что хочешь. Убери из исходника всё лишнее, тогда кто-нибудь да и поможет, две трети приведенного тобой кода - на хрен не нужны.
Кодогенератор какой-то недоделаный. В начале файла пишет 16F84, а в коде :
Код:
#ifdef PIC16F628

    movlw   0x07                ; Отключаем компаратор (только PIC16F628)
    movwf   CMCON

#endif
Это так, что в глаза сразу бросилось. Определения FSR и битов STATUS - ф топку сразу, для этого есть #include. Ну а уж clrwdt на входе в обработчик прерываний - это вообще п...ц, дальше и смотреть не буду.

Последний раз редактировалось SSH; 25.12.2009 в 14:23.
SSH вне форума  
Старый 25.12.2009, 14:35   #3
дмитрий626
Junior Member
 
Регистрация: 26.11.2009
Возраст: 41
Сообщений: 7
Вес репутации: 100/0
дмитрий626 will become famous soon enoughдмитрий626 will become famous soon enough
По умолчанию Re: еще один вопрос по контроллеру опережения зажигания на pic 16f84a 4,0мгц

Программа создающая asm файл работает как с pic16f84a так и с pic 16f628,поэтому он и указан в программе.Хотелось бы только изменить параметры вывода, но сам я не силен (только начал учиться),как не пробовал не выходит,поэтому и обращаюсь за помощью к более опытным людям.
дмитрий626 вне форума  
Старый 25.12.2009, 14:43   #4
SSH
Banned
 
Регистрация: 27.02.2007
Адрес: Красноярск
Возраст: 48
Сообщений: 2,387
Вес репутации: 950/0
SSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to behold
По умолчанию Re: еще один вопрос по контроллеру опережения зажигания на pic 16f84a 4,0мгц

Я понял, но раз эта программа начинает что-то генерить именно для PIC16F84, то почему-бы ей и не забыть про 628-й? Хреновая, видать, программа. Это первое. Второе. Если ты хочешь что-то в программе изменить осознанно, то ты должен хорошо представлять, что ты делаешь. Ты просишь, чтобы кто-то, просто нашел в программе место, которое тебя не устраивает и сделал так, как нужно тебе, причем за "спасибо". Здесь такие номера прокатывают нечасто и не из-за вредности форумчан, а исключительно из педагогических соображений. Начни разбираться в программе сам, хотя-бы изобрази попытки что-то сделать, тогда помогут однозначно. Или здесь есть ещё раздел "Работа для эмбеддера", там помогут точно.
SSH вне форума  
Старый 25.12.2009, 14:56   #5
дмитрий626
Junior Member
 
Регистрация: 26.11.2009
Возраст: 41
Сообщений: 7
Вес репутации: 100/0
дмитрий626 will become famous soon enoughдмитрий626 will become famous soon enough
По умолчанию Re: еще один вопрос по контроллеру опережения зажигания на pic 16f84a 4,0мгц

Я не заставляю никого решать за меня мои проблемы,и я решил эту проблему на аппаратном уровне путем установки инвертора,теперь хотелось бы понять это на програмном уровне.Я не прошу готового текста программы,я прошу помощи у того кто хорошо понимает процесс,ведь все когдато с чего нибудь начинали.
дмитрий626 вне форума  
Старый 25.12.2009, 15:30   #6
SSH
Banned
 
Регистрация: 27.02.2007
Адрес: Красноярск
Возраст: 48
Сообщений: 2,387
Вес репутации: 950/0
SSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to behold
По умолчанию Re: еще один вопрос по контроллеру опережения зажигания на pic 16f84a 4,0мгц

Да, начинали все, но все по-разному. Вот сам подумай, что тебе можно ответить на твой вопрос? Разобрать километр левого кода, чтобы найти место, где вместо bcf написать bsf, или наоборот? Хочется понять? Так думай! Пытайся понять. Спрашивай. На детальные вопросы, получишь конкретные ответы.
SSH вне форума  
Старый 26.12.2009, 09:08   #7
дмитрий626
Junior Member
 
Регистрация: 26.11.2009
Возраст: 41
Сообщений: 7
Вес репутации: 100/0
дмитрий626 will become famous soon enoughдмитрий626 will become famous soon enough
По умолчанию Re: еще один вопрос по контроллеру опережения зажигания на pic 16f84a 4,0мгц

Спасибо ,разобрался.
дмитрий626 вне форума  
Закрытая тема


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чем/как отлаживать код написаный на Си в WinAVR Yokel Микроконтроллеры других производителей 49 30.09.2014 09:48
Присоветуйте тип и способ управления MOSFETом "верхнего" плеча dr_Sash Источники питания и силовая электроника 37 08.09.2012 18:50
подключение магнитолы Sergey1 Общетехнические вопросы 10 27.12.2007 22:39
Вопрос по PIC контроллерам. vlad_er Продукция MICROCHIP 12 18.05.2007 10:15


Часовой пояс GMT +3, время: 21:42.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot