Перейти до змісту

Измерение / Расчет для Opel Omega RemoCon


Авторські права

© lanos.com.ua

З альбому:

Мультируль на Ланос

· 8 зображень
  • 8 зображень
  • 0 коментарів
  • 1 коментар

Інформація про фото Измерение / Расчет для Opel Omega RemoCon


Рекомендовані коментарі

Hamster

Опубліковано

;*******************************************************************************

; *

; Программа адаптера рулевого ДУ. *

; Версия 1.1. *

; *

; Автомобиль / руль: Опель Омега. *

; Протокол: Проводное управление Alpine. *

; Аппаратная ревизия адаптера: 1.x. *

; *

; Требуется файл P12F675.INC *

; *

;*******************************************************************************

; *

; История версий: *

; *

; 1.1 Оптимизация объема кода. *

; 1.0 Начальный релиз. *

; *

;*******************************************************************************

list p=12f675

#include <p12f675.inc>

errorlevel -302

__CONFIG _CP_OFF&_CPD_OFF&_BODEN_OFF&_MCLRE_ON&_WDT_OFF&_PWRTE_ON&_INTRC_OSC_NOCLKOUT

;*******************************************************************************

; Определение используемых портов контроллера.

#define WPort Port,GP1 ; Порт выхода на магнитолу.

#define CtlPort Port,GP2 ; Порт контрольного светодиода.

; Определение адреса ИК-протокола.

WAdrH EQU 0x72 ; Старший байт адреса протокола.

WAdrL EQU 0x86 ; Младший байт адреса протокола.

; Определение команд ИК-протокола.

WCmd0 EQU 0x15 ; Команда для кнопки Btn0 (Volume -).

WCmd1 EQU 0x14 ; Команда для кнопки Btn1 (Volume +).

WCmd2 EQU 0x16 ; Команда для кнопки Btn2 (Power/Mute).

WCmd3 EQU 0x12 ; Команда для кнопки Btn3 (Seek +).

WCmd4 EQU 0x16 ; Команда для кнопки Btn4 (Seek -).

WCmd5 EQU 0x0A ; Команда для кнопки Btn5 (Source).

; Определение соответствия значений АЦП кнопкам на пульте.

Btn0 EQU .31 ; Порог кнопки Vol-.

Btn1 EQU .52 ; Порог кнопки Vol+.

Btn2 EQU .77 ; Порог кнопки Mute.

Btn3 EQU .104 ; Порог кнопки Seek +.

Btn4 EQU .139 ; Порог кнопки Seek -.

Btn5 EQU .182 ; Порог кнопки Source.

; Определение регистров.

cblock 0x20

Port ; "Зеркало" GPIO

WCmd ; Байт команды протокола.

SendB ; Байт, посылаемый процедурой SendByte.

Btn ; Результат опроса кнопок

; (0-4 или 5 - не нажата).

BtnPrev ; Предыдущий результат опроса кнопок.

BtnTmp ; Временный результат опроса кнопок.

ADCRes ; Результат АЦП.

P1 ; Переменная цикла для процедур паузы.

P2 ; Переменная цикла для процедур паузы.

endc

;*******************************************************************************

; Макросы.

; Вывод в порт.

out macro

movf Port,W

movwf GPIO

endm

;*******************************************************************************

ORG 0x000 ; Вектор сброса.

goto Main ; Переход к началу программы.

;*******************************************************************************

; Пауза 560 us.

P560 movlw .185 ; Пауза 556 us

movwf P1 ; +2 us на вызвов этой процедуры

decfsz P1,F ; +2 us на возврат из нее.

goto $-1

return

;*******************************************************************************

; Стартовая посылка.

; Импульс 9 ms и пауза 4.5 ms.

WStart bsf WPort ; Включаем выход.

out ; Выдаем в порт.

movlw .175 ; Пауза 9 ms.

movwf P1

movlw .12

movwf P2

decfsz P1,F

goto $-1

decfsz P2,F

goto $-3

bcf WPort ; Выключаем выход.

out ; Выдаем в порт.

movlw .215 ; Пауза 4.5 ms.

movwf P1

movlw .6

movwf P2

decfsz P1,F

goto $-1

decfsz P2,F

goto $-3

return

;*******************************************************************************

; Посылка "1".

; Импульс 560 us и пауза 1.68 ms.

W1 bsf WPort ; Включаем выход.

out ; Выдаем в порт.

call P560 ; Пауза 560 us.

bcf WPort ; Выключаем выход.

out ; Выдаем в порт.

call P560 ; Пауза 560 us.

call P560 ; Пауза 560 us.

call P560 ; Пауза 560 us.

return

;*******************************************************************************

; Посылка "0".

; Импульс 560 us и пауза 560 us.

W0 bsf WPort ; Включаем выход.

out ; Выдаем в порт.

call P560 ; Пауза 560 us.

bcf WPort ; Выключаем выход.

out ; Выдаем в порт.

call P560 ; Пауза 560 us.

return

;*******************************************************************************

; Посылка байта.

SendByte btfss SendB,0 ; Если бит "1",

call W0 ; не посылаем "0".

btfsc SendB,0 ; Если бит "0",

call W1 ; не посылаем "1".

btfss SendB,1

call W0

btfsc SendB,1

call W1

btfss SendB,2

call W0

btfsc SendB,2

call W1

btfss SendB,3

call W0

btfsc SendB,3

call W1

btfss SendB,4

call W0

btfsc SendB,4

call W1

btfss SendB,5

call W0

btfsc SendB,5

call W1

btfss SendB,6

call W0

btfsc SendB,6

call W1

btfss SendB,7

call W0

btfsc SendB,7

call W1

return

;*******************************************************************************

; Посылка команды.

; Стартовая посылка, WAdrL, WAdrH, WCmd, инвертированная WCmd, стоп-бит ("0").

SendCmd bcf CtlPort ; Выключаем контрольный светодиод.

out ; Выдаем в порт.

call WStart ; Стартовая посылка.

movlw WAdrL ; Берем нижний байт адреса протокола,

movwf SendB ; кладем в регистр для отправки

call SendByte ; и отправляем.

movlw WAdrH ; Берем верхний байт адреса протокола

movwf SendB ; и т.д.

call SendByte

movf WCmd,W ; Берем команду протокола и т.д.

movwf SendB

call SendByte

comf WCmd,W ; Инвертируем команду протокола и т.д.

movwf SendB

call SendByte

call W0 ; Стоп-бит.

bsf CtlPort ; Включаем контрольный светодиод.

out ; Выдаем в порт.

return

;*******************************************************************************

; АЦП и получение нажатой кнопки.

ADC2Btn bsf ADCON0,GO ; Начинаем преобразование.

btfsc ADCON0,GO ; Ожидаем, пока преобразование

goto $-1 ; не будет завершено.

movf ADRESH,W ; Берем верхний байт результата

movwf ADCRes ; преобразования и запомнинаем как

; результат ("загрубляем" до 8bit).

; Определение нажатой кнопки по результату преобразования.

clrf Btn ; Очищаем результат опроса кнопок.

movf ADCRes,W ; Берем результат АЦП.

sublw Btn0 ; Вычитаем из порога результат АЦП.

btfss STATUS,C ; Если не было заема - пропускаем,

incf Btn,F ; иначе увеличиваем значение результата.

movf ADCRes,W

sublw Btn1

btfss STATUS,C

incf Btn,F

movf ADCRes,W

sublw Btn2

btfss STATUS,C

incf Btn,F

movf ADCRes,W

sublw Btn3

btfss STATUS,C

incf Btn,F

movf ADCRes,W

sublw Btn4

btfss STATUS,C

incf Btn,F

movf ADCRes,W

sublw Btn5

btfss STATUS,C

incf Btn,F

return

;*******************************************************************************

; Опрос кнопок пульта.

GetBtn call ADC2Btn ; Получаем нажатую кнопку.

movf Btn,W ; Запоминаем полученную кнопку

movwf BtnTmp ; как временную.

movlw .251 ; Пауза 10 ms.

movwf P1

movlw .13

movwf P2

decfsz P1,F

goto $-1

decfsz P2,F

goto $-3

goto $+1

call ADC2Btn ; Повторно получаем нажатую кнопку.

; Проверка, на идентичность 2 запросов (Btn=BtnTemp?).

movf Btn,W ; Берем значение нажатой кнопки,

subwf BtnTmp,W ; и вычитаем его из временного.

btfsc STATUS,Z ; Если результат ненулевой, идем дальше,

return ; иначе возврат.

movlw .5 ; Btn<>BtnTmp - считаем, что ничего

movwf Btn ; не нажато (Btn=5).

return

;*******************************************************************************

; Табличное соответствие кнопки и ИК-команды.

Btn2W addwf PCL,F ; Делаем вычисляемый переход.

retlw WCmd0 ; Команда для кнопки Btn0.

retlw WCmd1 ; Команда для кнопки Btn1.

retlw WCmd2 ; Команда для кнопки Btn2.

retlw WCmd3 ; Команда для кнопки Btn3.

retlw WCmd4 ; Команда для кнопки Btn4.

retlw WCmd5 ; Команда для кнопки Btn5.

;*******************************************************************************

; Основной модуль.

Main

; Калибровка внутреннего тактового RC-генератора.

call 0x3FF ; Берем значение заводской калибровки.

bsf STATUS,RP0 ; Банк 1.

movwf OSCCAL ; Загружаем значение калибровки.

bcf STATUS,RP0 ; Банк 0.

; Первоначальная настройка регистров.

clrf GPIO ; Обнуляем все порты.

bsf STATUS,RP0 ; Банк 1.

movlw b'010000' ; Значение для установки портов

movwf TRISIO ; загружаем в регистр.

bcf STATUS,RP0 ; Банк 0.

; Инициализация модуля АЦП.

bcf ADCON0,ADFM ; Левое выравнивание.

bcf ADCON0,VCFG ; Опорное напряжение Vdd.

bsf ADCON0,CHS1 ; Аналоговый

bsf ADCON0,CHS0 ; канал AN3.

bcf ADCON0,GO ; Преобразование не выполняется.

bsf ADCON0,ADON ; Включить модуль АЦП.

bsf STATUS,RP0 ; Банк 1.

bsf ANSEL,ADCS2 ; Выбраем источник

bcf ANSEL,ADCS1 ; тактового сигнала

bsf ANSEL,ADCS0 ; Fosc/16.

bsf ANSEL,ANS3 ; Определяем канал AN0 как аналоговый,

bcf ANSEL,ANS2 ; остальные

bcf ANSEL,ANS1 ; нам не

bcf ANSEL,ANS0 ; нужны.

bcf STATUS,RP0 ; Банк 0.

clrf Port ; Сбрасываем порт.

bsf CtlPort ; Включаем контрольный светодиод.

out ; Вывод в порт.

; Основной цикл.

MainLoop call GetBtn ; Опрос кнопок.

; Проверка, была ли нажата кнопка.

movf Btn,W ; Берем код нажатой кнопки,

sublw .5 ; проверяем не равен ли он 5.

btfsc STATUS,Z ; Если не равен 5, то идем дальше,

goto MainLoop ; иначе все с начала.

; Пауза 30 миллисекунд. Вместе с длиной посылки и остальными задержками дает

; паузу между посылками ~110 миллисекунд в соответствие с протоколом.

movlw .245

movwf P1

movlw .39

movwf P2

decfsz P1,F

goto $-1

decfsz P2,F

goto $-3

; Проверяем, новая это кнопка или повтор (Btn=BtnPrev?).

movf Btn,W ; Берем значение нажатой кнопки,

subwf BtnPrev,W ; и вычитаем его из предыдущей кнопки.

btfss STATUS,Z ; Если Btn=BtnTmp - к отправке повтора,

goto SendNewCmd ; иначе к отправке новой команды.

; Посылка повтора

call SendCmd ; Посылаем старую команду и

goto MainLoop ; переходим снова к циклу подтверждения.

; Посылка новой команды

SendNewCmd movf Btn,W ; Берем значение нажатой кнопки,

movwf BtnPrev ; запоминаем как предыдущее значение,

call Btn2W ; находим по таблице нужную команду ИК,

movwf WCmd ; готовим ее к посылке

call SendCmd ; и посылаем.

goto MainLoop ; Переходим снова к циклу подтверждения.

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

×
×
  • Створити...

Важлива інформація

Ми розмістили cookie-файлы на ваш пристрій, щоб допомогти зробити цей сайт кращим. Ви можете змінити налаштування cookie-файлів, або продовжити без зміни налаштувань.