Необходимо самостоятельно сделать программу - сдвиг частоты: Если на входе X (Гц), то на выходе Y (Гц) 67>45 52>43 40>40 Цель - "обмануть" мозг сплит/системы ДЭО, там три ступени потока воздуха, которые почти ни отличаются, проц (ПО сплита таково, что) поддерживает кол.импульсов 40,43,45 (скорость)поступающих с датчика Холла с мотора вентилятора внутреннего блока, но этого очень мало, короче ДЭО накосячили. причём на другом сплите такая-же картина, так что проблема в ПО На данный момент, ради экспериманта, просто поставил "в разрыв" триггер на 155ТМ2, чисто пополам делит, но так лишь (ессно) максимальная скорость.
Вроде, как я частично программу оформил, но пока всё как-то разрозненно. Мне тяжело понять, как организовать ежесекундный (с выборкой в 1 сек, достаточно) учёт входящей частоты независимо от выходящей частоты? Может Таймер использовать? и каждую секунду считывать его и потом обнулять?
Я сейчас на уровне развития - 1часть Самоучителдя КЕА и всё. На практике (в "железе"), для тренировки написал программу динамической индикации со счётом нажатий на кнопки +1, -1, ну и ещё несколько работ в "железе" тоже для практики. Потому пока что весьма тяжко, маловато знаний.
Пост N: 26
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг:
0
Отправлено: 31.01.13 12:31. Заголовок: Мммда, вопросы тольк..
Мммда, вопросы только начинаются :-) И первый (хотя уже далеко не первый) вопрос: Уход в ПП прерываний происходит при: 1) перепаде на входе INT от 0 к 1, т.е. при фронте, в момент перепада (ессно, в регистрах всё установлено ) 2) наличии на INT лог 1, т.е. пока на INT лог 1, то ПП прерываний будет видеть лог 1 и всё время ходить по кругу
должно быть как бы 1)
Если бит TOIE (разрешить прерывания по переполнению Tmr0) в 0, т.е. прерывания по переполнению запрещены, то при переполнении таймера флаг TOIF поднимется? (пока писал, подумал, что этот вопрос можно в МПЛабе самому решить) т.е. 3) это флаг переполнения ТМР0 или 4) это флаг фактапрерывания по переполнению?
вроде как должно быть 3)
И про вопросы... по ходу дела.. надо научиться 1-Wire, т.е. хочу научиться связывать DS18B20 и МК, подскажите где узнать...
Отправлено: 31.01.13 18:02. Заголовок: я же писал org 0x..
я же писал org 0x04 ; вектор прерывания а расположить где угодно. компилятор видит что с 4-ой строчки в памяти программ
насчет флагов. откуда компилятору знать. надо включать прерывание или нет? насчет их сбросов я тоже писал Тут проблемы с отправкой файлов и рисунков. Можно перейти на чипмк. Там проще кидаться описанием на русском DS18B20
Пост N: 28
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг:
0
Отправлено: 31.01.13 19:01. Заголовок: MAZ пишет: Можно пе..
MAZ пишет:
цитата:
Можно перейти на чипмк
ОК! Эту программу тут добью и на чипмк... MAZ пишет:
цитата:
org 0x04 ; вектор прерывания
это я то вписал, вот только не догнал, что в этой 0х04 надо или начало программы прерываний ставить или переход на ПП прерываний, а я вверху Старт разместил.. Ничего, выстраданная ошибка крепче в память врезается. За пояснение про флаги спасибо
Пост N: 351
Зарегистрирован: 25.09.09
Откуда: г.Саратов
Рейтинг:
1
Отправлено: 31.01.13 19:07. Заголовок: fugi1 пишет: то ПП..
fugi1 пишет:
цитата:
то ПП прерываний будет видеть лог 1 и всё время ходить по кругу
Измените, долго не отслеживал ход. Что-то точно пропустил. Заметь, что есть в рг. OPTION_REG бит 6 (INTEDG). Он определяет, выбор активного фронта сигнала на входе внешнего прерывания INT. Им можешь задать, какой ФРОНТ будет ожидать программа обработки прерывания. Задай его в основной части или где. Главное - раньше, чем может прийти прерывание. Сам делал так: писал часть программы (макрос, ПП, как хочешь назови), она должна быть достаточно короткой (чтобы не пропустить следующее событие - прерывание). В начале макроса ( о сохранении данных в рг. W STATUS и их восстановлении надо позаботится отдельно) убеждался, что флаг ожидаемого прерывания установлен (это бит INTF регистра INTCON, запрещал прерывание местное (в данном случае надо сбросить в 0 разряд INTE регистра INTCON. Далее - собственно код обработки прерывания, сбрасываю флажок местного прерывания INTF, разрешал местное прерывание 1 в INTE. Не забывай в основной части программы разрешить глобальное прерывание (разряд GIE регистра INTCON) Может сумбурно, описал как умел. Сделай себе "рыбу" из команд для макроса прерывания с комментариями, чтобы не забыть чего. Сейчас от асм отпал, просто рефлексия. Удачи.
В моём случае выбор фронт/спад не важен, т.к. по совету СанСаныча, я сделал: прер>опрос Tmr0 > сохр результата>очистка Tmr0>выход (там-же опрос переполнения таймера) всё за один цикл. Прерывание "случайно" тоже не случиться, ибо после запуска сплита выдержка около 3-5 сек, а потом старт мотора
Всё, народ :-)))))))))))))) просто переместил вверх списка ПП прерывания и всё заработало. Так, что написанная вчера программа была рабочая (кроме 2-х ошибок с ветвлением)
Даже рассчётные частоты (прописанные в ВП) попал 1:1, чего хотел, то и получил. Всем огромное спасибо!!!
И ещё вопрос возник, как перевести МК на внутренний генератор, чтобы кварц не использовать, здесь такая точность не нужна.
Отправлено: 31.01.13 20:46. Заголовок: fugi1 пишет: я сде..
fugi1 пишет:
цитата:
я сделал: прер>опрос Tmr0 > сохр результата>очистка Tmr0>выход (там-же опрос переполнения таймера) всё за один цикл.
Здесь ключевое. от чего прерывание. Т.е. постоянно мерим между передними фронтами или задними. Таким образом просто мерим период. Можно и так, только долго ждать результата.
Пост N: 606
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг:
1
Отправлено: 01.02.13 00:41. Заголовок: MAZ пишет: Можно и ..
MAZ пишет:
цитата:
Можно и так, только долго ждать результата.
В железе будет видно, но что то мне подсказывает, что всё прокатит. Тем более 3 периода за оборот двигателя с его суперплавностью вращения. тут даже 1 раз в секунду замер пойдёт. Для других целей может и нет, но задача под кондишку. Я тут тоже проект заканчиваю, задачка попроще, но тоже многое для себя прояснил. Как будет готова, выложу.
Пост N: 30
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг:
0
Отправлено: 01.02.13 07:48. Заголовок: Уже прокатило :-) fu..
Уже прокатило :-) fugi1 пишет:
цитата:
Всё, народ :-)))))))))))))) просто переместил вверх списка ПП прерывания и всё заработало.
В этой задаче именно такой период (от фронта к фронту) и оказался удобен. Перед таймером - делитель 256, в таймере за 1 период лежит число, из которого диапазон от 57 до 140 используется для ВП Всем ещё раз спасибо!
; ******* Беглецов А.в. *** 31 января 2013г. *******
LIST p=16F84a ; выбираем МК __CONFIG 03FF5H ; Биты конфиг: Сторож вкл, XT осциллятор
;=============================================================================================== ; Определение положения регистров специального назначения. ;===============================================================================================
Tmr0 equ 01h ; Регистр TMR0. OptionR equ 01h PC equ 02h ; Счетчик команд. Status equ 03h ; Регистр Status. IntCon equ 0Bh TrisB equ 06h PortB equ 06h ; Регистр управления защелками порта В.
;=============================================================================================== ; Определение названия и положения регистров общего назачения. ;===============================================================================================
W_Temp equ 0Eh ; Регистр сохранения содержимого W при прерываниях. Stat_Temp equ 0Fh ; Регистр сохранения содержимого STATUS при прерываниях.
; Регистры промежуточных результатов Const_Y equ 10h ; Регистр результата в таймере Const_M equ 11h ; Регистр после возврата из ВП
W equ 0 ; Результат направить в аккумулятор. F equ 1 ; Результат направить в регистр. ;=============================================================================================== org 0 ; goto Start ; начать с команды Старт
org 4 ; Назначение вектора прерывания
;============================================================================================= ;================== ============ С Т А Р Т =============== ========================= ;============================================================================================= ;******************************************************************************************* ; ПП прерывания, очистка-считывание Таймера ;*******************************************************************************************
Int clrwdt ; Сброс WDT. movwf W_Temp ; Скопировать содержимое регистра W в регистр W_Temp. movf Status,W ; Скопировать содержимое регистра Status в регистр W. movwf Stat_Temp ; Скопировать содержимое регистра W в регистр Stat_Temp.
btfss IntCon,2 ; проверяем переполнение TMR0 goto NoPPT ; переполн. нет, уходим в НоуППТ
NoPPT movfw Tmr0 ; копируем содержимое таймера (сколько он там насчитал?) movwf Const_Y ; вписуем во временный регистр clrf Tmr0 ; обнуляем таймер
EndInt bcf IntCon,1 ; Сброс флага прерывания по INT.
movf Stat_Temp,W ; Скопировать содержимое регистра Stat_Temp в регистр W. movwf Status ; Скопировать содержимое регистра W в регистр Status. swapf W_Temp,F ; Поменять местами старший и младший полубайты регистра W_Temp ; с сохранением результата операции в нем же. swapf W_Temp,W ; Поменять местами старший и младший полубайты регистра W_Temp ; с сохранением результата операции в регистре W. retfie ; Возврат из прерывания по стеку.
Start clrf IntCon ; Запрет всех прерываний. bsf Status,5 ; банк 1
movlw b'01000111' ; Предделитель 256 перед TMR0 movwf OptionR ; внутренний такт CLKOUT ; прерывание INT по переднему фронту movlw b'00000001' movwf TrisB ; определение выходы и вход прерываний RNB0/INT
bcf Status,5 ; банк 0 movlw b'10010000' movwf IntCon ; разрешение прерываний по RB0/INT
movlw .141 movwf Const_Y ; предварительная запись "переполнения" таймера clrf Const_M ; для установки Ноль на выходе clrwdt ; Сброс WDT.
;************************************************************************** ; ; получение константы для задания частоты на выходе ; ;***************************************************************************
Cicle clrwdt ; Сброс WDT. bcf Status,0 ; в единицу бит С регистра Статус movlw .140 ; проверка, если ниже 400об/мин то выход - ноль subwf Const_Y,W btfsc Status,0 ; проверяем бит С, если 1, то след.строка goto NoSpeed
movlw .57 ; проверка, если выше 1360 об/мин, то PC+0 subwf Const_Y,W ; отнимаем константу и переход в ВП (выше 57 смысла нет)
btfss Status,0 ; проверяем бит С, если 0, то след.строка clrW ; очистка аккумулятора call Table ; переход в ВП
добавил сторожа, временные параметры не жёсткие, а перестраховка не помешает. fugi1 пишет:
цитата:
как перевести МК на внутренний генератор, чтобы кварц не использовать, здесь такая точность не нужна.
и ещё непонятка вылезла... если питаю МК от +5 вольт сплита, то упорно не работает, развязка на диоде+680мкф+0.1мкф не помогают, вот здесь чудеса какие-то
Все даты в формате GMT
3 час. Хитов сегодня: 13
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет