Имею в наличие рабочую схему и исходник. Сейчас в целях экономии места решил задуматься об изменение исходника и порты B программно подтянуть к питанию. Поискав в интернете выяснил что за это отвечает регистр RBPU. Нашел в исходнике этот регистр и поставил значение 1, потом 0, потом тыкал от балды. Но в итоге порты так и не подтянулись не в протеусе не в железе. Может кто натолкнет на умную мысль где копать. Вот исходник. P.S. Это ФУОЗ Сарумана для опережения зажигания.
Исходник (таблица опережения вырезана для уменьшения текста). Вот печатный вариант для удобства http://rusfolder.com/39767674 Спойлер; Контроллер ----------
#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 .33 ; Частота вращения вала для ораничения оборотов 5000об/мин
; Назначение портов ввода/вывода ----------
#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
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
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
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 ---------- ; ; Описание: Начало программы, инициализация контроллера и установка в начальное состояние, ; главный цикл программы. ;----------
#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
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
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
Открыта удобная площадка с выгодными ценами, поставляющая весь ассортимент продукции, производимой компанией MEAN WELL – от завоевавших популярность и известных на рынке изделий до новинок. MEAN WELL.Market предоставляет гарантийную и сервисную поддержку, удобный подбор продукции, оперативную доставку по России.
На сайте интернет-магазина посетители смогут найти обзоры, интересные статьи о применении, максимальный объем технических сведений.
Продукция MOSO предназначена в основном для индустриальных приложений, использует инновационные решения на основе более 200 собственных патентов для силовой электроники и соответствует международным стандартам. LED-драйверы MOSO применяются в системах наружного освещения разных отраслей, включая промышленность, сельское хозяйство, транспорт и железную дорогу. В ряде серий реализована возможность дистанционного контроля и программирования работы по заданному сценарию. Разберем решения MOSO
подробнее>>
На кой вам лезть в саруманку, если такие вопросы задаете? И есть ещё куча минусов (конкретно фуоз саруман - зажигалка).
Разработайте свой фуоз - ряд вопросов отпадут, в тоже время фуоз будет соответствовать вашим требованиям. Именно так поступают правильные радиолюбители, а копировать чужое и выдавать за своё...
_________________ Разработал: -BLDC -ФУОЗ/МПСЗ -SMART BMS -ECU/EDC на STM32F4(43%)+CPLD(57%) -Моноинжектор на ATSAMD20G16 -контроллер эффектов для RGB LED ленты -умные часы/обратный счет/секундомер -устройство измерения емкости АКБ
Меня все устраивает. Кроме отключенной подтяжки. Программирование знаю только из школьного курса и то Pascal. Читал даташит и на 17 странице есть таблица про регистры спец. назначения. Да вот только ничего не понял. Кроме того что есть регистр RBPU и что бы его включить нужно его перевести в 0. Порылся в программе (почитал комментарии ) Попробовал дописать/изменить код на OPTION_REG_NRBPU = 0 в итоге программа даже не компилируется. Soir направили на изучение вот этих строчек.
movlw 0x88 ; Резисторы на PB Выключены, делитель на WDT movwf OPTION_REG От безысходности начал что попало тыкать, выяснил что эти строчки относятся к таймеру. Подтяжку эти строчки не трогают.
К каждому выводу PORTB подключен внутренний подтягивающий резистор (типовое значение тока≈200мкА). Бит-RBPU в регистре OPTION <7> определяет, подключены (-RBPU=0) или нет (-RBPU=1) подтягивающие резисторы. Подтягивающие резисторы автоматически отключаются, когда каналы порта настраиваются на выход и после сброса по включению питания POR.
Это было написано в даташите на 33 стр. Я правильно понял что резисторы отключаются от всех портов? Или только от портов вывода? (у меня порты 2 и3 выводы остальные порты ввода)
movlw 0x88 ; Резисторы на PB Выключены, делитель на WDT movwf OPTION_REG От безысходности начал что попало тыкать, выяснил что эти строчки относятся к таймеру. Подтяжку эти строчки не трогают.
Или недотыкали или недочитали даташит, хотя цитаты правильные: "К каждому выводу PORTB подключен внутренний подтягивающий резистор (типовое значение тока≈200мкА). Бит-RBPU в регистре OPTION <7> определяет, подключены (-RBPU=0) или нет (-RBPU=1) подтягивающие резисторы", тогда недопоняли... Для включения подтягивающих резисторов 7-ой бит OPTION_REG необходимо установить в 0. У Вас 0x88 то есть 0b10001000. Значит надо как... ?
ололошка писал(а):
...Я правильно понял что резисторы отключаются от всех портов? Или только от портов вывода?
Только от тех выводов PORTB, которые настроены как выход.
То есть нужно по таблице выбрать нужные биты и перевести их в 16-ти ричную сс. Изначально я имею (MOVLW 0x88 MOVWF OPTION_REG) то есть 88 в двоичной 10001000. Посмотрев таблицу я должен изменить седьмой бит на 0 и у меня должно получится 00001000 что равносильно 1000 в двоичной и 8 в шестнадцатеричной. Правильно?
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения