З нами з: 02 жовтня 2011, 16:21 Повідомлень: 7128
Год выпуска:: 1987
Код мотора: GU 1,8
КПП: АКПП
Имя: Тарас
Звідки: Погребы (Броварской р-он)
Спаял схемку, прошил микроконтроллер .. 12f629 небыло взял 12f675.. Собственно нужно разобраться, почему микроконтроллер выдает ошибку термометра(мигает 5 раз).. Все остальное работает: режимы переключаются, компаратор работает, АЦП отключал(но не знаю, правильно ли?).. С микроконтроллерами дело имею впервые и не могу понять , где накосячил? Или в коде ошибка?
Вкладення:
Heater_s.jpg [ 25.78 Кіб | Переглянуто 2266 разів ]
Основной элемент схемы - доступный и недорогой микроконтроллер PIC12F629 фирмы Microchip.
Питание микроконтроллера осуществляется от стабилизатора DA1, напряжение на который поступает с реле выключателя печки через диод VD1. Это обеспечивает питание микроконтроллера при включении печки.
Резисторы R2 и R6 образуют делитель напряжения, необходимый для контроля уровня разряда аккумуляторной батареи (АКБ) автомобиля. Резистор R1 служит для питания цифрового датчика температуры, который включён по схеме паразитного питания. Резистор R4 обеспечивает подтяжку к плюсу вывода микроконтроллера, к которому подключена кнопка управления. Не смотря на то, что микропроцессор имеет возможность программой подтяжки входной линии к плюсу, в цепи согласования использован внешний резистор R4, что по некоторым сведениям улучшает помехозащищённость схемы, а в условиях импульсных помех при работе ДВС это крайне необходимо. Токоограничительные резисторы R3 и R5 ограничивают ток светодиода и транзистора VT1 соответственно.
В главном цикле программы микроконтроллера постоянно опрашивается состояние кнопки. В автоматическом режиме примерно каждые 5 секунд опрашивается датчик температуры. Интервал был выбран исходя из того, что более частый опрос датчика приводит к его саморазогреву с искажением показаний температуры. При падении температуры ниже определённого значения включается реле управления, при повышении этого значения с гистерезисом в 2 градуса, реле выключается. Температурным гистерезисом называется разность температур включения и выключения терморегулятора. От величины гистерезиса зависит точность поддержания температуры и частота включения-выключения реле. В исходных настройках температура выключения 20 градусов, температура включения реле – 18 градусов. Вход в режим изменения настроек позволяет оперативно изменять температуру срабатывания реле.
В режиме «постоянно включено» и в автоматическом режиме дополнительно измеряется уровень напряжения на АКБ. При снижении напряжения АКБ ниже 10 вольт реле управления отключается, а светодиод начинает быстро мигать. Для исключения многократного переключения реле под влиянием шумов и помех при граничной величине уровня напряжения на АКБ, включение реле осуществится при напряжении выше 11,3 вольта. Таким образом гистерезис составляет порядка 1,3 вольта.
По поведению свечения светодиода можно определить режим работы устройства.
режим состояние светодиода состояние устройства реле устройства
1 не горит не работает выключено
2 горит непрерывно постоянно включено включено
3 не горит, но периодически мигает автоматический режим (диапазон высокой температуры) выключено
3 горит и периодически мигает автоматический режим (диапазон низкой температуры) включено
3 не горит, но периодически мигает серией быстрых вспышек автоматический режим. Неисправен датчик температуры выключено
2, 3 непрерывно мигает постоянно включен или автоматический режим. Низкий заряд АКБ выключено
Изменение режима работы устройства производится путём нажатия и удержания (около 6 секунд) кнопки в нажатом состоянии. Переход к следующему режиму будет сигнализирован коротким однократным миганием светодиода, и кнопку можно отпустить, после чего светодиод мигнёт количество раз равное установленному режиму работы устройства. Смена режимов производится по кругу, от меньшего к большему. Выбранный режим сохраняется в памяти микроконтроллера и при следующем включении восстанавливается.
режим работы устройства количество миганий светодиода при выборе режима работы
не работает 1
постоянно включен 2
автоматический 3
В любом режиме работы устройства путём короткого нажатия на кнопку серией вспышек отобразится текущая измеренная температура окружающей среды. Следует отметить, что функция отображение температуры не проектировалась в качестве основной, поэтому данная функция была сведена до простого мигания светодиодом и для определения температуры по вспышкам светодиода требуется высокая степень концентрации внимания, а поэтому недопустимо пользоваться этой функцией во время управления автомобилем.
Алгоритм отображения температуры следующий: После кратковременного нажатия на кнопку светодиод должен потухнуть. Спустя некоторую паузу двумя сериями вспышек отобразиться измеренная температура: Первая серия вспышек, пауза, вторая серия вспышек. В первой серии вспышек отобразиться знак температуры (1 вспышка – положительная, 2 вспышки – отрицательная, 3 вспышки – нулевая температура). Второй серией вспышек отобразиться сама температура (по числу вспышек светодиода). После чего устройство перейдёт в обычный режим работы. При неисправности датчика температуры светодиод вспыхнет 5 раз одной серией вспышек.
В режиме изменения настроек микроконтроллера можно оперативно изменить температуру срабатывания реле. Вход в режим изменения настроек осуществляется следующим образом: нажать и удерживать кнопку устройства, включить печку. Устройство инициализируется и светодиод начнёт быстро мигать. Удерживать кнопку нужно в течение примерно 20 секунд. Всё это время светодиод будет быстро мигать. Как только светодиод потухнет, кнопку нужно отпустить. После небольшой задержки, серией вспышек светодиод покажет температуру включения реле (нижний порог температурного гистерезиса) запрограммированной в настоящий момент. Затем можно приступать к программированию. Необходимо нажать кнопку устройства количество раз соответствующее желаемой температуре включения реле. Каждое нажатие на кнопку сопровождается одной вспышкой светодиода. Значение может быть в предёлах от 1 до 30. После окончания ввода необходимо ожидать 20 секунд. Впоследствии произойдёт выход микроконтроллера из режима изменения настроек, чем светодиод серией вспышек отобразить новую температуру включения реле, а значение будет сохранено в энергонезависимой памяти микроконтроллера. После выхода из режима изменения настроек микроконтроллер переход в обычный режим работы. Если при входе в режим изменения настроек кнопку не нажимать, то через 20 секунд произойдёт выход из режима без изменения настроек.
Подключение устройства. Устройство запитывается от бортовой сети автомобиля +12 Вольт. Провод питаня подключается в салоне автомобиля к проводу питания вентилятора печки. Клемма массы закручивается под любой удобный болт соединённый с кузовом автомобиля. Реле управления – автомобильное 12-ти вольтовое с шунтирующим диодом (в колодке). Удобнее его монтировать в подкапотном пространстве в месте, максимально защищенном от действия влаги. Кнопка и светодиод выводятся в удобное место. Датчик температуры помещается в пластиковую (например, от авторучки) или термоусадочную трубку и приделывается в салоне автомобиля к месту, максимально защищённому от действий прямых солнечных лучей и обдува потоком воздуха из печки.
Правильно собранное устройство в настройке не нуждается и сразу работоспособно.
; значения EEPROM
ORG 0X00002100
DATA 0X02, .30 ;ПЕРВЫЙ БАЙТ - РЕЖИМ РАБОТЫ, ВТОРОЙ БАЙТ - ТЕМПЕРАТУРА СРАВНЕНИЯ (МАКСИМАЛЬНАЯ ПО ГИСТЕРЕЗИСУ)
; значения идентификатора ID
; ORG 0X00002000
; DATA 0X0,0X01, 0X0, 0X03
__IDLOCS H'0103'
; Переменные
MYFLAG EQU 20H ; ФЛАГОВЫЙ 0-TERMOMETR IS OK; 1-battary is ok
ZAD EQU 21H ; таймерный регистр (для определения задержек)
COUNTER equ 22h ; простой счётчик
TH EQU 23h ; Температура - старший байт
TL EQU 24h ; Температура - младший байт
CRCPIC EQU 25h ; Контрольная сумма, подсчитанная микроконтроллером
TRY EQU 26h ; Попытки чтения по 1-Wire
TEMP1 EQU 27h ;Ячейки для врЕменного
TEMP2 EQU 28h ; хранения данных
CONDIT_EEPROM EQU 29H ; СОХРАНЕНИЕ ЗНАЧЕНИЯ ПЕРВОЙ ЯЧЕЙКИ ПАМЯТИ EEPROM
TEMPER_EEPROM equ 2AH ; ТЕМПЕРАТУРА СРЕВНЕНИЯ (МАКСИМАЛЬНАЯ ПО ГИСТЕРЕЗИСУ)
ADR_EE EQU 2BH ; ДЛЯ ПЕРЕДАЧИ АДРЕСА ПРОГРАММИРУЕМОЙ ЯЧЕЙКИ ПАМЯТИ EEPROM
Reg_1 equ 2ch ; ячейки для
Reg_2 equ 2dh ; организации
Reg_3 equ 2eh ; задержки (пауза)
REGGPIO EQU 2FH ; СОСТОЯНИЕ ЗАЩЁЛОК ПОРТА
TEMP_W equ 30h ;для запоминания регистра W во время прерывания
TEMP_STATUS equ 31h ;для запоминания регистра флагов во время прерывания
;FLAG2 EQU 32H ; ДЛЯ ОТЛАДКИ
BUTCOUNT EQU 33H ; ПРОДОЛЖИТЕЛЬНОСТЬ УДЕРЖАНИЯ КНОПКИ
; МНЕМОНИЧЕСКОЕ ОБОЗНАЧЕНИЕ КОНСТАНТ
COUNT_TMR0 EQU .77 ; КОЛ-ВО ПРЕРЫВАНИЙ ТАЙМЕРА ДЛЯ ВЫДЕРЖКИ ИНТЕРВАЛА В 5 СЕКУНД
W equ 0 ; регистр аккумулятора
F EQU 1 ; ЛюбОЙ РЕГИСТР
Z EQU 2 ; бит ZERRO
PROGTIME EQU .229 ; КОЛ-ВО ПРЕРЫВАНИЙ ТАЙМЕРА ДЛЯ ВЫДЕРЖКИ ИНТЕРВАЛА В 15 СЕКУНД
COUNTBUTTON EQU .20 ; КОЛ-ВО ЦИКЛОВ УДЕРЖАНИЯ КНОПКИ ДЛЯ ПЕРЕХОДА В РЕЖИМ ОТОБРАЖЕНИЯ ТЕМПЕРАТУРЫ (40*0,125=5 СЕК.)
BTFSC INTCON, T0IF ; ОТ ПЕРЕПОЛНЕНИЯ TMR0 ?
GOTO INT_TMR0 ; ДА! ОТ ПЕРЕПОЛНЕНИЯ TMR0
; НЕТ. ОТ ДРУГОГО (не санкционированное прерывание)
GOTO $ ; зависаем, что бы сторожевой пёс инициализировал микропроц
INT_TMR0:
MOVF ZAD, F ; ПРОВЕРКА НА НОЛЬ
BTFSS STATUS, Z ; НОЛЬ?
DECF ZAD, F ; НЕ НОЛЬ, ПОЭТОМУ УМЕНЬШАЕМ СЧЁТЧИК
BCF INTCON, T0IF ;СБРОСИТЬ ФЛАГ T0IF В РЕГИСТРЕ INTCON (ПРЕРЫВАНИЕ ОТРАБОТАНО, ЖДЁМ СЛЕДУЮЩЕЕ)
;/\ /\ /\ /\ /\ /\ /\ /\ /\ /\
;_____________________________ КОНЕЦ ПРОЦЕДУРЫ ПРЕРЫВАНИЙ
SWAPF TEMP_STATUS,W ;СТАНДАРТНЫЕ ДЕЙСТВИЯ ПО ВОССТАНОВЛЕНИЮ ЗНАЧЕНИЙ_
MOVWF STATUS ;АККУМУЛЯТОРА И РЕГИСТРА STATUS_
SWAPF TEMP_W,F ;БЕЗ КАКИХ ЛИБО ВМЕШАТЕЛЬСТВ
SWAPF TEMP_W,W ;В ФЛАГОВЫЙ РЕГИСТР STATUS (КОМАНДА SWAPF НЕ ВЛИЯЕТ НА ФЛАГОВЫЙ РЕГИСТР В ОТЛИЧИЕ ОТ КОМАНДЫ MOVF)
RETFIE ;
;--------------------------------------------------------------------------
; ПОДПРОГРАММА ВХОДА В РЕЖИМ ИЗМЕНЕНИЯ НАСТРОЕК МК
PROGRAMMING:
CLRWDT
;проверка КНОПКИ
BTFSC GPIO, BUTTON ; ПРОВЕРЯЕМ BUTTON
RETURN ; НЕ НАЖАТА, ВЫХОДИМ
; НАЖАТА
MOVLW PROGTIME
MOVWF ZAD
METKA50: ;CLRWDT
BSF REGGPIO, LED ; LED ON
MOVF REGGPIO, W
MOVWF GPIO
CALL PAUSE125
BCF REGGPIO, LED ; LED OFF
MOVF REGGPIO, W
MOVWF GPIO
CALL PAUSE125
MOVF ZAD, F ; ПРОВЕРКА НА НОЛЬ
BTFSC STATUS, Z ; 1-->ZAD=0
goto METKA5A ; ИНТЕРВАЛ ВЫЖДАН, ВХОД В РЕЖИМ ПРОГРАММИРОВАНИЯ ПРОИЗВЕДЁН
BTFSC GPIO, BUTTON ; ПРОВЕРЯЕМ BUTTON
return ; НЕ НАЖАТА
GOTO METKA50 ; НАЖАТА, ЗАЦИКЛИМ
METKA5A:
CALL PAUSE025
CALL PAUSE025
CALL PAUSE025
CALL PAUSE025
MOVLW .02
SUBWF TEMPER_EEPROM, W
MOVWF COUNTER
METKA51:
BSF REGGPIO, LED ; LED ON
MOVF REGGPIO, W
MOVWF GPIO
CALL PAUSE025
BCF REGGPIO, LED ; LED OFF
MOVF REGGPIO, W
MOVWF GPIO
CALL PAUSE025
DECFSZ COUNTER, F
GOTO METKA51
MOVLW PROGTIME
MOVWF ZAD
CLRF COUNTER
METKA55:
CLRWDT
;проверка КНОПКИ
BTFSC GPIO, BUTTON ; ПРОВЕРЯЕМ BUTTON
GOTO BUTOFF2 ; НЕ НАЖАТА
; НАЖАТА
BSF REGGPIO, LED ; LED ON
MOVF REGGPIO, W
MOVWF GPIO
CALL PAUSE025 ; АНТИДРЕБЕЗГ
BCF REGGPIO, LED ; LED OFF
MOVF REGGPIO, W
MOVWF GPIO
CALL PAUSE025
INCF COUNTER, F
MOVLW PROGTIME
MOVWF ZAD
BUTOFF2: ; НЕ НАЖАТА
MOVF ZAD, F ; ПРОВЕРКА НА НОЛЬ
BTFSC STATUS, Z ; 1-->ZAD=0
GOTO PROGEXIT ; ЗАКОНЧИЛСЯ ПЕРИОД ПРОГРАММИРОВАНИЯ, ВЫХОДИМ
GOTO METKA55 ; ЗАЦИКЛИВАЕМ
PROGEXIT:
MOVF COUNTER, W ; ПРОВЕРКА НА НОЛЬ
BTFSC STATUS, Z ; 1-->COUNTER=0
GOTO NOCHANGE ; НУЛЕВОЙ РЕЗУЛЬТАТ, ВЫХОДИМ НИЧЕГО НЕ МЕНЯЯ
; ПРОВЕРКА НА > 30
MOVLW .30
SUBWF COUNTER, W ; COUNTER-W-->W
BTFSS STATUS, 0 ; 0-->COUNTER<W; 1-->COUNTER=>W
GOTO METKA60 ; COUNTER<W
MOVLW .30
MOVWF COUNTER
METKA60:
MOVLW .1
MOVWF ADR_EE ; ГОТОВИМ АДРЕС ЯЧЕЙКИ
MOVLW .2
ADDWF COUNTER, W
MOVWF TEMPER_EEPROM ; СОХРАНЯЕМ В ОПЕРАТИВКЕ
CALL WriteEE ; СОХРАНЯЕМ НОВОЕ ЗНАЧЕНИЕ
; MOVLW .02
; SUBWF COUNTER, F
METKA56:
BSF REGGPIO, LED ; LED ON
MOVF REGGPIO, W
MOVWF GPIO
CALL PAUSE025
BCF REGGPIO, LED ; LED OFF
MOVF REGGPIO, W
MOVWF GPIO
CALL PAUSE025
DECFSZ COUNTER, F
GOTO METKA56
CALL PAUSE025
CALL PAUSE025
CALL PAUSE025
CALL PAUSE025
NOCHANGE:
RETURN
; ПРОГРАММА НАСТРОЙКИ ПОСЛЕ СБРОСА
nachalo:
movlw B'00000000' ; ????????? ???
movwf ANSEL ;
BCF STATUS,RP0 ; БАНК 0
CLRF GPIO
CLRF REGGPIO ; ОБНУЛЯЕМ ПОРТ
MOVLW b'00000100' ;MOVLW b'00000100'
MOVWF CMCON ; канал GP1 - компаратор с внутренним ИОН без выхода. Остальные цифровые
CLRF INTCON ;ЗАПРЕЩАЕМ ВСЕ ПРЕРЫВАНИЯ
CLRWDT ; СБРАСЫВАЕМ СТОРОЖЕВОГО ПСА В НОЛЬ
BSF STATUS,RP0 ; БАНК 1
MOVLW b'10001000'
MOVWF VRCON ; ИОН включен, НИЖНИЙ диапазон, установка ИОН компаратора на 2.5V
bsf MYFLAG,1 ; ВЕРХНИЙ ДИАПАЗОН
MOVLW B'00000111'
MOVWF OPTION_REG ; КОНФИГУРИРОВАНИЕ РАБОТЫ МИКРОПРОЦЕССОРА
;bit 7=0 ВКЛюЧЕНИЕ РЕЗИСТОРОВ
;bit 5=0 ТАКТОВЫЙ СИГНАЛ ДЛЯ ТАЙМЕРА TMR0 - ВНУТРЕННИЙ
;bit 3=0 ПРЕДДЕЛИТЕЛЬ ПЕРЕД ТАЙМЕРОМ TMR0
;bits 2-0=111 УСТАНОВИТЬ ЗНАЧЕНИЕ ПРЕДДЕЛИТЕЛЯ 1:256
MOVLW b'00011110'
MOVWF TRISIO ; РАЗРЯДЫ 0 и 5 ПОРТА GPIO НАСТРОЕНЫ НА ВЫДАЧУ, А 1 - 3 И 4 НА ПРИЕМ (3 порт всегда на приём настроен)
MOVLW b'00010000'
MOVWF WPU ;включаем подтягивающий резистор на GP4
CALL 0X3FF ;считываем значение осцилятора
MOVWF OSCCAL ;корректируем значение регистра осцилятора полученным значением
BCF STATUS,RP0 ; БАНК 0
; КОРРЕКТИРОВКА ЗНАЧЕНИЯ ИОН КОМПАРАТОРА В ЗАВИСИМОСТИ ОТ СОСТОЯНИЯ АКБ
BTFSS CMCON, COUT ; 1- ИОН>COMPARATOR (ПЛОХО), 0-ИОН<COMAPARATOR (ХОРОШО)
GOTO PEREPRYG ; АККУМУЛЯТОР В ПОРЯДКЕ, КОРРЕКТИРОВКА ИОН КОМПАРАТОРА НЕ ТРЕБУЕТСЯ, ПЕРЕПРЫГИВАЕМ
BSF STATUS,RP0 ; БАНК 1
MOVLW b'10001010'
MOVWF VRCON ; ИОН включен, верхний диапазон, установка ИОН компаратора на 2.8V (ГИСТЕРЕЗИС)
BCF STATUS,RP0 ; БАНК 0
BSF MYFLAG, 1 ; ВЕРХНИЙ ДИАПАЗОН
PEREPRYG:
BSF INTCON, 7 ; ВКЛЮЧАЕМ ГЛОБАЛЬНЫЙ БИТ ПРЕРЫВАНИЙ (НО ПОКА НИОДНО ПРЕРЫВАНИЕ НЕ ВКЛЮЧЕНО)
BSF INTCON, 5 ; ВКЛЮЧАЕМ ПРЕРЫВАНИЯ ОТ ПЕРЕПОЛНЕНИЯ ТАЙМЕРА TMR0
; УСТАНОВКА ПЕРЕМЕННЫХ
BSF STATUS, RP0 ; Банк 1
; загрузка ИЗ EEPROM РЕЖИМА РАБОТЫ
CLRW ; нулевой адрес
MOVWF EEADR ; инициализируем адрес
BSF EECON1, RD ; включаем бит чтения
MOVF EEDATA, W ; считываем
MOVWF CONDIT_EEPROM ; сохраняем
; ЗАГРУЗКА_ИЗ_EEPROM_ЗНАЧЕНИЯ_ТЕМПЕРАТУРЫ СРАВНЕНИЯ
MOVLW 0X01 ; первая ячейка
MOVWF EEADR ; инициализируем адрес
BSF EECON1, RD ; включаем бит чтения
MOVF EEDATA, W ; считываем
MOVWF TEMPER_EEPROM ; сохраняем
BCF STATUS, RP0 ; БАНК 0
CALL PROGRAMMING ; ПРОВЕРКА И ВХОД В ПРОЦЕДУРУ ИЗМЕНЕНИЯ НАСТРОЕК МК
MOVLW COUNT_TMR0 ; КОЛИЧЕСТВО ПЕРЫВАНИЙ ДО ОБНУЛЕНИЯ СЧЁТЧИКА
MOVWF ZAD ; ИНИЦИАЛИЗАЦИЯ СЧЁТЧИКА
CLRF BUTCOUNT
;;;;;;;;;;;;;;;;;;;;;;;;;;; КОНЕЦ ИНИЦИАЛИЗАЦИИ
CALL PAUSE025
CALL PAUSE025
BCF STATUS, C ; СбРАСИВАЕМ бИТ ПЕРЕНОСА
RLF CONDIT_EEPROM, W ; РЕЖИМ
ADDLW .2 ; +1
CALL FLASHLED ; ОТОБРАЖАЕМ РЕЖИМ ПРИ ВКЛЮЧЕНИИ
CALL PAUSE025
CALL PAUSE025
MAINCYCL:
CLRWDT
;проверка КНОПКИ
BTFSC GPIO, BUTTON ; ПРОВЕРЯЕМ BUTTON
GOTO BUTOFF ; НЕ НАЖАТА
; НАЖАТА
MOVF BUTCOUNT, F ; ПРОВЕРКА НА НОЛЬ
BTFSS STATUS, Z ; 1--> BUTCOUNT=0
GOTO METKA71 ; БЫЛА НАЖАТА
; НАЖАТА ВПЕРВЫЕ
BTFSS REGGPIO, LED ; ПРОВЕРЯЕМ LED
GOTO METKA72 ; НЕ ГОРИТ
; ГОРИТ
BCF REGGPIO, LED ; ГАСИМ
MOVF REGGPIO,W
MOVWF GPIO
GOTO METKA71
METKA72:
BSF REGGPIO, LED ; ЗАЖИГАЕМ
MOVF REGGPIO,W
MOVWF GPIO
METKA71:
CALL PAUSE125 ; АНТИДРЕБЕЗГ
INCF BUTCOUNT, F
MOVLW COUNTBUTTON ; КОНСТАНТА-->W
SUBWF BUTCOUNT, W ; BUTCOUNT-W
BTFSS STATUS, 0 ; 1-->BUTCOUNT>=W (ПЕРЕХОД К РЕЖИМУ ОТОБРАЖЕНИЯ ТЕМПЕРАТУРЫ), 0-->BUTCOUNT<W
GOTO MAINCYCL ; ЗАЦИКЛИВАЕМ
;DYSPLAYTEMPER
; моргнём СВЕТОДИОДом
MOVLW LEDBYTE
XORWF REGGPIO, F
MOVF REGGPIO, W
MOVWF GPIO
CALL PAUSE125
MOVLW LEDBYTE
XORWF REGGPIO, F
MOVF REGGPIO, W
MOVWF GPIO
METKA73:
CLRWDT
;проверка КНОПКИ
BTFSS GPIO, BUTTON ; ПРОВЕРЯЕМ BUTTON
GOTO METKA73 ; НАЖАТА
; ОТПУСТИЛИ
CLRF BUTCOUNT
GOTO SMENA ; переходим на смену режима
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;-----------
;ЗАПОМИНАЕМ СОСТОЯНИЕ led
BCF MYFLAG, 7 ; СБРОС
BTFSS REGGPIO, LED ; ПРОВЕРКА
goto METKA91 ; не горит
BSF MYFLAG, 7 ; УСТАНОВКА, LED ГОРИТ
;ВЫКЛЮЧАЕМ LED
BCF REGGPIO, LED
MOVF REGGPIO, W
MOVWF GPIO
;ПАУЗА
CALL PAUSE025
CALL PAUSE025
METKA91:
;ЧТЕНИЕ ТЕМПЕРАТУРЫ
CALL READTEMPER ; СЧИТЫВАЕМ ТЕМПЕРАТУРУ
;ПРОВЕРКА НА ОШИБКУ
XORLW 0XFF ; ПРОВЕРКА НА ОШИБКУ
BTFSC STATUS, Z
GOTO MYRG5RAZ ; ОШИБКА СЧИТЫВАНИЯ ТЕМПЕРАТУРЫ, ПЕРЕХОДИМ
;____МОРГАЕМ 5 РАЗ ЕСЛИ ОШИБКА
;____МОРГАЕМ 1 РАЗ, ЕСЛИ ПОЛОЖИТЕЛЬНАЯ ТЕМПЕРАТУРА
;____МОРГАЕМ 2 РАЗА, ЕСЛИ ОТРИЦАТЕЛЬНАЯ ТЕМПЕРАТУРА
;____МОРГАЕМ 3 РАЗА, ЕСЛИ НОЛЬ
; ОТРИЦАТЕЛЬНАЯ?
btfsC TH,0 ;Температура отрицательная?
goto MYRG2RAZ ;ДА
; НОЛЬ?
MOVF TL, F
BTFSC STATUS, Z ; НУЛЕВАЯ?
goto MYRG3RAZ ;ДА
; МОРГАЕМ 1 РАЗ (ТЕМПЕР ПОЛОЖИТЕЛЬНЫЙ)
MOVLW .2
CALL FLASHLED
GOTO MYRGTEMPER
MYRG5RAZ: ; ОШИБКА
MOVLW .10
CALL FLASHLED
GOTO MYRGKONEC
MYRG2RAZ: ; ОТРИЦАТЕЛЬНАЯ
MOVLW .4
CALL FLASHLED
CALL PAUSE025
CALL PAUSE025
comf TL,F ;Преобразование для правильного
incf TL,F ;отображения отрицательных температур
; GOTO MYRGTEMPER
;МОРГАЕМ СОГЛАСНО ЦИФРЕ СЧИТАНОЙ ТЕМПЕРАТУРЫ (ПРЕДВАРИТЕЛЬНО ПЕРЕКОНВЕРТИРОВАВ ТЕМПЕР ПРИ ОТРИЦАЛОВКЕ)
movf TL, W
BTFSC TL, 0
DECF TL, W
CALL FLASHLED
GOTO MYRGKONEC
MYRG3RAZ: ; НОЛЬ
MOVLW .6
CALL FLASHLED
GOTO MYRGKONEC
MYRGTEMPER:
;ПАУЗА
CALL PAUSE025
CALL PAUSE025
;МОРГАЕМ СОГЛАСНО ЦИФРЕ СЧИТАНОЙ ТЕМПЕРАТУРЫ (ПРЕДВАРИТЕЛЬНО ПЕРЕКОНВЕРТИРОВАВ ТЕМПЕР ПРИ ОТРИЦАЛОВКЕ)
movf TL, W
BTFSC TL, 0
INCF TL, W
CALL FLASHLED
;ПАУЗА
MYRGKONEC:
CALL PAUSE025
CALL PAUSE025
CALL PAUSE025
CALL PAUSE025
;ВОССТАНАВЛИВАЕМ СОСТОЯНИЕ led
BCF REGGPIO, LED ; СБРОС
BTFSC MYFLAG, 7 ; ПРОВЕРКА
BSF REGGPIO, LED ; УСТАНОВКА, ЕСЛИ LED ГОРИТ
MOVF REGGPIO, W
MOVWF GPIO
GOTO MAINCYCL ;
;-----------
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SMENA:
INCF CONDIT_EEPROM, F ; СЛЕДУЮЩЕЙ РЕЖИМ
MOVF CONDIT_EEPROM, W
SUBLW 3 ; ПРОВЕРЯЕМ ЧТО Б НЕ БЫЛО БОЛЬШЕ 3 (3-W)
BTFSC STATUS, Z ; 1-CONDIT_EEPROM=3
CLRF CONDIT_EEPROM ; ПЕРЕВОД РЕЖИМА В НУЛЕВОЕ ЗНАЧЕНИЕ (OFF)
MOVF CONDIT_EEPROM, W
MOVWF COUNTER ; СЧЁТЧИК ВСПЫШЕК LED
INCF COUNTER, F ; +1
; ЗАПИСЬ
CLRW
MOVWF ADR_EE ; ГОТОВИМ АДРЕС ЯЧЕЙКИ
MOVF CONDIT_EEPROM, W ; ЗНАЧЕНИЕ
CALL WriteEE ; СОХРАНЯЕМ НОВОЕ ЗНАЧЕНИЕ
CALL PAUSE025 ; АНТИДРЕБЕЗГ
DECFSZ COUNTER, F ; ПОВТОРЯЕМ В СООТВЕТСТВИИ С РЕЖИМОМ
GOTO CYCL01
GOTO METKA00
LEDOFF: ; НЕ ГОРИТ
BSF REGGPIO, LED ; ЗАЖИГАЕМ
MOVF REGGPIO,W
MOVWF GPIO
CALL PAUSE025 ; АНТИДРЕБЕЗГ
DECFSZ COUNTER, F ; ПОВТОРЯЕМ В СООТВЕТСТВИИ С РЕЖИМОМ
GOTO LEDOFF
METKA00:
CALL PAUSE025 ; ПАУЗА
CALL PAUSE025 ; ПАУЗА
;CALL PAUSE025 ; ПАУЗА
;CALL PAUSE025 ; ПАУЗА
MOVF CONDIT_EEPROM, F ; ПРОВЕРКА РЕЖИМА НА НОЛЬ (НА OFF)
BTFSS STATUS, Z ; 1-РЕЖИМ OFF
GOTO METKA01
;ВЫКЛЮЧИТЬ LED (РЕжИМ OFF)
BCF REGGPIO, LED
MOVF REGGPIO,W
MOVWF GPIO
GOTO METKA02
METKA01: ; ВКЛЮЧИТЬ LED (РЕЖИМ ON/AUTO)
BSF REGGPIO, LED
MOVF REGGPIO,W
MOVWF GPIO
BUTOFFNEXT: ; НЕ НАЖАТА
MOVF CONDIT_EEPROM, F ; ПРОВЕРКА РЕЖИМА НА НОЛЬ (НА OFF)
BTFSC STATUS, Z ; 1-РЕЖИМ OFF
GOTO REZSHIMOFF ; РЕЖИМ OFF, переходим и ЗАЦИКЛИВАЕМ
; РЕЖИМ ON/AUTO
GOTO METKA03
;--------ЭТО ВООБЩЕ НАДО?-------------
REZSHIMOFF:
BTFSS REGGPIO, RELAY
GOTO METKA20
BCF REGGPIO, RELAY
MOVF REGGPIO, W
MOVWF GPIO
METKA20:
GOTO MAINCYCL
;--------ЭТО ВООБЩЕ НАДО?-------------
BTFSC MYFLAG,1 ; ВЕРХНИЙ ДИАПАЗОН?
GOTO MAINCYCL ; ДА, ИДЁМ НА ГЛАВНЫЙ ЦИКЛ
; НЕТ, УСТАНАВЛИВАЕМ РЕГИСТР КОМПАРАТОРА НА ВЕРХНИЙ ДИАПАЗОН
BSF STATUS,RP0 ; БАНК 1
MOVLW b'10001010'
MOVWF VRCON ; ИОН включен, верхний диапазон, установка ИОН компаратора на 2.8V (ГИСТЕРЕЗИС)
BCF STATUS,RP0 ; БАНК 0
BSF MYFLAG, 1 ; ВЕРХНИЙ ДИАПАЗОН
GOTO MAINCYCL ; ИДёМ НА ГЛАВНЫЙ ЦИКЛ
METKA04: ; АККУМУЛЯТОР В ПОРЯДКЕ, ИДЁМ ДАЛЬШЕ
BTFSS MYFLAG,1 ; НИЖНИЙ ДИАПАЗОН?
GOTO METKA04A ; ДА, ПЕРЕПРЫГИВАЕМ НЕМНОГО
; НЕТ, ВЫСТАВЛЯЕМ РЕГИСТР КОМПАРАТОРА
BSF STATUS,RP0 ; БАНК 1
MOVLW b'10001000'
MOVWF VRCON ; ИОН включен, НИЖНИЙ диапазон, установка ИОН компаратора на 2.5V
BCF STATUS,RP0 ; БАНК 0
BCF MYFLAG, 1 ; НИЖНИЙ ДИАПАЗОН
METKA04A:
; проверка режима ON или AUTO?
BTFSS CONDIT_EEPROM, 0 ; 1=ON
GOTO METKA06 ; РЕжИМ - AUTO, ПЕРЕХОДИМ
; РЕЖИМ on
BSF REGGPIO, RELAY ; ВКЛЮЧАЕМ ПОМПУ
BSF REGGPIO, LED ; ВКЛЮЧАЕМ СВЕТОДИОД
MOVF REGGPIO,W
MOVWF GPIO
GOTO MAINCYCL ; ЗАЦИКЛИВАЕМ
;--------------------------------------------------------------------------------------------------- ПОМПА
METKA06: ; РЕЖИМ AUTO
; ПРОВЕРКА ТАЙМЕРА
MOVF ZAD, F ; ПРОВЕРКА НА НОЛЬ
BTFSS STATUS, Z ; 1- ZAS=0
GOTO MAINCYCL ; СЧЁТЧИК НЕ ОБНУЛИЛСЯ, ПЕРЕХОДИМ В НАЧАЛО
;проверка помпы
BTFSS REGGPIO, RELAY ; 1-ВКЛЮЧЕНА
GOTO POMPAISOFF ; ПЕРЕХОД, ЕСЛИ ВЫКЛЮЧЕНА
;ВКЛЮЧЕНА
BCF REGGPIO, LED ; ВЫКЛЮЧИТЬ LED
MOVF REGGPIO,W
MOVWF GPIO
Pause clrwdt
movwf TEMP1 ;Длительность паузы задается числом в W (примерно в мс)
movf TEMP1,F ;Проверка на 0
btfsc STATUS,Z ;Если длительность не равна 0, то Z=0 и пропускаем return
return ;Если же длительность равна 0, то сразу возврат
clrw ;Очищаем W
P_label addlw 01h ;Внутренний цикл по W
jnz P_label
clrwdt
decfsz TEMP1,F ;Внешний цикл по TEMP1
goto P_label ;
clrwdt
return ;Конец подпрограммы паузы
decfsz COUNTER,F ;8 бит обработаны?
goto RWLoop ;Еще нет - переход
movf TEMP1,W ;Принятый байт в W
return ;Конец подпрограммы ввода/вывода по шине 1-Wire
;--------------------------------------------------------------------------------------------------
;Подпрограмма обновления CRC. Параметр в W. Используются ячейки TEMP1, TEMP2
NewCRC clrwdt
movwf TEMP2 ;Сохранить W
movlw 08h
movwf COUNTER ;8 --> COUNTER
movf TEMP2,W ;Восстановить значение W
CRC_label xorwf CRCPIC,W ;Исключ.ИЛИ CRCPIC и W, результат в W
movwf TEMP1 ;Скопировать результат в TEMP1
rrf TEMP1,W ;Сдвиг TEMP1 вправо на 1, результат в W, младший бит в С
movf CRCPIC,W ;CRCPIC --> W (бит С не изменился)
btfsc STATUS,0
xorlw 018h ;Если С=0, то эту инструкцию не выполнять
movwf TEMP1 ;Результат в TEMP1
rrf TEMP1,W ;Снова сдвиг, результат в W
movwf CRCPIC ;Сохранить результат в CRCPIC
bcf STATUS,0 ;0 --> C
rrf TEMP2,F ;Сдвиг TEMP2 вправо на 1
movf TEMP2,W ;И скопировать полученное значение в W
clrwdt
decfsz COUNTER,F
goto CRC_label
return ;Конец подпрограммы обновления CRC
;__________________________________________________________________________________________________
;
READTEMPER:
clrwdt ;Работа с термометром DS18B20
call TestDS ;Сброс и проверка термометра
xorlw 0FFh
jnz ERROREXIT ;Ошибка - переход на начало программы
Newtry_label clrwdt ;Начинаем чтение данных из DS18B20
call TestDS ;Сброс и проверка термометра
xorlw 0FFh
jnz ERROREXIT ;Ошибка - переход на начало программы
З нами з: 06 жовтня 2012, 19:18 Повідомлень: 4307
Год выпуска:: 2007
Код мотора: GF 1,3
КПП: АКПП
Имя: Вонни Пху
Звідки: Asgard: Yggdrasil
Чем собираешь код и шьешь? Или просто уже готовый дамп накатываешь?
Простой поиск в гугле говорит что это распостраненная проблема при переносе кода из 629 в 675. Раз и два.
З нами з: 06 жовтня 2012, 19:18 Повідомлень: 4307
Год выпуска:: 2007
Код мотора: GF 1,3
КПП: АКПП
Имя: Вонни Пху
Звідки: Asgard: Yggdrasil
Я только в универе с Atmega работал и программатор другой был (и я ASM не очень, я Си любил ).
629 искать необязательно. Cмотреть даташиты для 629 и 675. Особенно обратить внимание на разницу в регистрах, возможно тогда станет понятно что править в коде.
Цитата:
movlw B'00000000' ;
movwf ANSEL ;
Логика вроде верная. Ну если результата не будет, то я бы предложил попробовать вот так вместо этого куска:
Користувачі, які зараз переглядають цей форум: Немає зареєстрованих користувачів
Ви не можете створювати нові теми у цьому форумі Ви не можете відповідати на теми у цьому форумі Ви не можете редагувати ваші повідомлення у цьому форумі Ви не можете видаляти ваші повідомлення у цьому форумі Ви не можете додавати файли у цьому форумі