Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: tiny2313 & mega8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2, 3, 4, 5, 6
Wild007
Цитата
1. Можно ли как нибудь развязать эти команды и почему же все таки так получается?

Это и есть последовательность команд для твоего "дешифратора" smile.gif
Цитата
2. Если в начале цикла датчик в замкнутом состоянии то насос не включается, хотя в п/п я запрещаю прерывание, почему так происходит???

Привиди еще раз код инициализации INT1 и как включается прерывание, Может возникать ситуация, когда ты разрешаешь прерывание, а флаг в GIFR (INTF1) уже висит и сразу происходит прерывание и останавливается двигатель, поэтому можно, перед "включением" прерывания, прочитать регистр флагов и записать его обратно (сброс флагов производится ЗАПИСЬЮ 1 в соответствующий бит), и если бит установлен он "сам себя" сбросит smile.gif .
Terapefft
инициализация INT1:
CLR RIN
LDI rin,1<<ISC11
OUT MCUCR,RIN

потом в главном цикле:
ldi radr,doza_1 ; включить насос
rcall decod ;
cbr reg_flgs,0b00000001 ;

ldi rin,0b10000000
out gicr,rin
в прерывании :
clr rin ; запрет прерывания
out gicr,rin

А по поводу команд: раньше же когда упправлялось клапаном (там стояло два датчика), клапан же возвращался в исходное состояние при достижении нужного датчика, или эти команды так и будут выполнятся только последовательно??? разве нельзя ничего с этим поделать?
Wild007
Цитата
А по поводу команд: раньше же когда упправлялось клапаном (там стояло два датчика), клапан же возвращался в исходное состояние при достижении нужного датчика, или эти команды так и будут выполнятся только последовательно??? разве нельзя ничего с этим поделать?

Для ответа на этот вопрос надо знать, хотя бы, схему "дешифратора" или алгоритм его работы. Я не люблю гадать на кофейной гуще smile.gif . Ты же сам пишешь
Цитата
клапан же возвращался в исходное состояние при достижении нужного датчика,

и из этого текста я делаю вывод, что, так называемое "выключение двигателя", выполнялось с помощию "дешифратора", а не програмно. Теперь, не зная алгоритма работы "дешифратора", ты пытаешься управлять чем-то не зная чем smile.gif smile.gif . Кто-то же создавал этот "дешифратор"? Если его найти тяжело, то надо просто похерить эту разработку и создавать новую с нуля. Будет быстрее и ИМХО тебе в "мелких деталях" помогут на этом форуме.
Terapefft
я вот попробовал прочиттать состояния регистра gifr и записать его обратно:
in rin,gifr
out gifr,rin

ldi rin,0b10000000
out gicr,rin
но все равно при замкнутом датчике не включается насос sad.gif и функция сравнения почему то не выполняется, которая в прерывании, а просто при замыкании датчика сразу выключается.
На счет "переписать прогу": мне к сожалению не дадут времени для этого sad.gif такая вот у нас хреновая контора...я уже просил выделить мне время для этого - сказали что нифига...
Wild007
Цитата
но все равно при замкнутом датчике не включается насос и функция сравнения почему то не выполняется,

При "замыкании" датчика может возникнуть N мпульсов и количество может быть достаточно большим. Поэтому попробуй сравнение с 255.
А что на счет схемы "дешифратора"?
Terapefft
вот схема дешифратора (КР1533ИР30)

а вот таблица к нему, я вчера проверил, все вроде правильно
Terapefft
попробовал с 255 сравнивать, так при замкнутом датчике насос включается и тут же выключается, почему так?? ведь если я его замнкул и не размыкаю вроде никаких импульсов не должно поступать на контролер...
Wild007
Цитата
дешифратора (КР1533ИР30)

Это просто расширитель порта. И управление двигателем "доза" идет по ОТ1, туда пишется 0 или 1. И, если, там больше нет ни какой логики, то он должен включаться и выключаться без проблем.
Цитата
ведь если я его замнкул и не размыкаю вроде никаких импульсов не должно поступать на контролер...

Схема подключения твоя или переделал как я советовал?
Terapefft
управление насосом осуществляется по ОТ5, логики на плате больше нет никакой. Схема подключения через резистор (второй его конец на +5 В) и стабилитрон. Вы говорили еще про кондер, просто я не понял куда его вешать, на ногу контролера и на землю? А по поводу отключения насоса так и не понятно почему же он тогда выполняется после того как выполнятся некоторые команды?

а нет извините ошибся по поводу подключения: он такой как на рисунке, через резистор и стабилитрон (стабилитрон на землю)
Wild007
Да по ОТ5 я писал, но думал о своём smile.gif
Надо померять вольтметром уровни 0 и 1 на входе М/К с датчика. Возможно уровень "крутится" возле 2,5В. Если провода датчика проходят мимо силовых частей, возможна наводка на вход не "подпёртый" резистором пулап.
Terapefft
померил я напряжение: при "о" - 0,9 В; при "1" - 4,9 В
Wild007
Ну не знаю. Вот стоит (возле меня smile.gif )устройство работающее по примерно такому же принципу:
-- включил двигатель;
-- разрешил прерывания по INT;
-- пришёл сигнал с фотодатчика (прерывания по 0);
-- выставил флаг датчика;
-- запретил прерывания по INT;
-- вышел в главный цикл:
-- обработал флаг - выключил двигатель;
И всё жужжит без проблем.
Давай ещё раз текст программы буду смотреть smile.gif
Terapefft
я попробовал сравнивать например с "20" - эффект такой же как и с "255", включается и тут же выключается, вот исходник
Wild007
Я немного "модернизировал" твою програму для проверки, как работает INT1, в отладчике STUDIOAVR. Подсчет колчеств входа в п\п работает правильно. Прерывание по спадающему фронту -- тоже. Появление флага, в отсутствие разрешения прерывания, как я и говорил. Все работает "как доктор пропсал" smile.gif . Можешь погонять сам, я там коментарии оставил.
Terapefft
да прерывание работает верно, я даже на плату ставил и проверял, 3 раза замыкаю датчик и насос отключается. А в цикле таже фигня происходит как и было, я уже не знаю почему. Какая то хрень творится в delaу .... А без нее цикл не запускается. Может че нить с ней посоветуете сделать?
Wild007
Я бы сделал так -- (пишу алгоритм код напишешь сам):
-- когда надо включать двигатель выставляешь флаг;
-- в главном цикле проверяешь этот флаг ;
-- по флагу уходишь на п\п включения двигателя в которой (не изменять последователность!) :
---- снимаешь флаг ;
---- включаешь двигатель;
---- разрешаешь прерывания;
---- выходишь из п\п;
Ну а обработка прерывания у тебя работает. Удачи! smile.gif
Terapefft
я вот сделал в главном цикле:
cbr reg_flgs,0b00000001 ;
sbrc reg_flgs,1
rcall nasos
п/п включения насоса:

nasos:

sbr reg_flgs,0b00000001

ldi radr,doza_1
rcall decod


clr radr
sbr radr,1<<int1
out gicr,radr


sei
ret

и обработка прерывания таже. Все равно работает как и работал, не считает импульсы, просто при замыкании выключается и все тут. Как заколдованый блин....
Wild007
Я же написал, что ТОЛЬКО:
Цитата
-- когда надо включать двигатель выставляешь флаг;

А он у тебя постоянно сбрасывается
Код
cbr reg_flgs,0b00000001;

в главном цикле и прерывание постоянно включается. Ты же видел в моей "модернизации":
Код
    clr radr
    sbr radr,1<<int1
    out gicr,radr
    ldi    radr,doza_1; дозатор на всасывание
    rcall    decod    
start123:
    rjmp start123

я разрешил прерывания, включил двигатель и больше прерывания не включаю.
да и алгоритм
Цитата
---- снимаешь флаг ;
---- включаешь двигатель;
---- разрешаешь прерывания;
---- выходишь из п\п;

надо изменить
---- снимаешь флаг ;
---- включаешь двигатель;
---- сбросить "лишний" флаг прерывания;
---- разрешаешь прерывания;
---- выходишь из п\п;
я писал, а меня отвлекли smile.gif
Terapefft
так мне же и надо включать насос только в главном цикле, а выключатся он должен пока главный цикл не закончился. Я же так и сделал: сбросил флаг, по нему перешел в п/п включения насоса, выставил флаг, включил насос, разрешил прерывания, в прерывании опять сбросил, запретил прерывания. Или я что то не так понял? как понять сбросить "лишний" флаг?
p.s. извините за глупые вопросы, просто я совсем запутался...
Terapefft
я попробовал выставить флаг вне главного цикла (там где Вы модернизацию проводили), в главном цикле просто поставил:
sbrc reg_flgs,1
rcall nasos
в п/п включения насоса сбрасываю флаг, все равно также работает
Wild007
Цитата(Terapefft @ Dec 15 2006, 13:59) *
так мне же и надо включать насос только в главном цикле, а выключатся он должен пока главный цикл не закончился.

Насос включается после каких-то действий оператора машины? Или гланый цикл растянут по времени на все действия машины и повторение цикла это 30-40 минут ohmy.gif ?
Цитата
как понять сбросить "лишний" флаг?

Цитата
Может возникать ситуация, когда ты разрешаешь прерывание, а флаг в GIFR (INTF1) уже висит и сразу происходит прерывание и останавливается двигатель, поэтому можно, перед "включением" прерывания, прочитать регистр флагов и записать его обратно (сброс флагов производится ЗАПИСЬЮ 1 в соответствующий бит), и если бит установлен он "сам себя" сбросит .

Это и есть"лишний" флаг smile.gif
Terapefft
Работа автомата такова: после выбора всех необходимых параметров, нажимаешь кнопку "пуск", и начинается, сошлись продольные, поперечные губки, началась заварка, включился насос, налился литр, разошлись губки и насос отключился. Вот такой цикл в общих чертах. А сбросить лишний флаг таким образом :
in rin,gifr
out gifr,rin
Wild007
Цитата(Terapefft @ Dec 15 2006, 15:13) *
Вот такой цикл в общих чертах.

И сколько "такой" цикл длится, в смысле по времени?
Цитата
А сбросить лишний флаг таким образом :
in rin,gifr
out gifr,rin

Да.
Terapefft
примерно около 5 секунд. Пробовал я и лишний флаг сбрасывать, все равно нифига не работает...
Wild007
Цитата(Terapefft @ Dec 15 2006, 15:44) *
примерно около 5 секунд. Пробовал я и лишний флаг сбрасывать, все равно нифига не работает...

Ты сам понимаешь, что такой длинный цикл отладить в Студии практически нереально (особенно постороннему человеку smile.gif ). Может проблема возникать ещё и в том, что в:
Код
прерывания от INT1

используется регистр radr , но он не прячется в стек. Попробуй smile.gif .
А лишнй флаг надо сбрасывать для правильного подсчета количества "пребываний" в подпрограмме по прерыванию smile.gif
archi2000
Извините, что вмешиваюсь в ваш диалог.
Вот прерывание таймера1 из вложенной программы

timer1:
push zh ;
push zl ;
push rin ;
push rin1 ;
push rin2 ;
in rin1,sreg ; запомнить регистр состояния

wdr

ldi radr,npop_0 ; выключить нагрев
rcall decod
ldi radr,dater_0
rcall decod
ldi radr,nprod_0
rcall decod

sbrc reg_flgs,2 ; переход если это
rjmp mer5 ; окончание импульса
ldi rin,0b00001010 ;
; out wdtcr,rin ; установить WDT на 65мс.

ldi rin,$fc ; установить timer1 на 0.0005с.
out tcnt1h,rin ; FFFF-FC17=3E8=1000 тактов
ldi rin,$17 ;
out tcnt1l,rin ;

; ldi rin,$f8 ; установить timer1 на 0.001с. *
; out tcnt1h,rin ; FFFF-F82F=7d0=2000 тактов *
; ldi rin,$2f ; *
; out tcnt1l,rin ; *

sbr reg_flgs,0b00000100; на выдерж. 0,001с.

clr zh ;
ldi zl,NCHEAT ; прочитать канал нагрева
ld rin2,z ;
tst rin2 ; если ноль, то
brne mer1
ldi radr,npop_1 ; включить поперечный нагрев
rcall decod

mer3:
out sreg,rin1 ;
pop rin2 ;
pop rin1 ;
pop rin ;
pop zl ;
pop zh ;
reti ; Выход

Есть замечания
1. Регистр sreg прячется не в стек а в регист rin1
В тоже время из прерывания timer1 вызывается процедура decod в которой тоже используются регистры.
Лучше написать так

push rin1
in rin1, sreg
push rin1
(тело прерывания)
pop rin1
out sreg,rin1
pop rin1

Так у тебя написан этот код для Timer0

2. Прошелся поиском по файлу, где ты пишешь в регист TIMSK
Есть три места - в начале программы разешаем оба таймера 0 и 1,
В прерывании Timer1 идет запрет этого же прерывания
Есть еще судя по комментариям разрешение прерывания от Таймера1 в прерывании от компаратора?
Судя по симптомам работы прошивки где-то это прерывание в основной программе постоянно не разрешается и срабатывает только один раз и время для насоса не идет.
Terapefft
а может возникать неразбериха из за того что мк в некоторых п/п в режим sleep уходит, там же в регистр mcucr записывается
ldi rin,0b10010000 ;
out mcucr,rin ;
sleep
или это не играет роли??? Еще у меня возникла идея, можно ли как нить в главном цикле проследить состояние некоторых регистров, то есть по ходу выполнения в главном цикле уйти на п/п которая мне отобразит содержимое нужного мне регистра??? Просто не могу сообразить как эту п/п сделать.
Wild007
Зачем п\п? Просто читаешь и зажигаешь "диоды". И вставляешь код программы туда куда надо smile.gif
Terapefft
Цитата(Wild007 @ Dec 18 2006, 14:25) *
Зачем п\п? Просто читаешь и зажигаешь "диоды". И вставляешь код программы туда куда надо smile.gif

что то я не пойму никак...как так читаешь и зажигаешь??? Объяните пожалуста как это реализовать
Wild007
Типа:
Код
IN R16, GICR
SBRC R16,1<<INT1
ЗАЖЕЧЬ "ДИОД"
....

Дальше по програме.
А "диод" ты зажигать умеешь smile.gif
Terapefft
Я вот так сделал:
IN radr, GICR
SBRC radr,1<<INT1
sbr svet,0b00010000
а компилятор мне пишет:
C:\avr\datchik\dat.asm(694): error: Operand 2 out of range: 0x80
Wild007
Sorry:
SBRC radr,INT1
Terapefft
а как можно сделать так чтобы у меня в обработчике прерывания каждый раз когда происходит прерывание, диод инвертировался (т.е. если диод горел, то потухнет, если не горел, то загорится)???
Wild007
Вот так:
Код
sbrs svet, 0b00010000
rjmp BBB
sbr svet,0b00010000
rjmp AAA
BBB:
cbr svet,0b00010000
AAA:
......
Terapefft
я вот так сделал в прерывании от INT1:
sbrs svet,4
rjmp BBB
cbr svet,0b00010000
rjmp AAA
BBB:
sbr svet,0b00010000
AAA:
все нормально вроде моргает. В прерывании сравниваю с "5", диод моргает а насос не выключается. Вот если запустить цикл и после включения насоса нажать "стоп", то потом четко после пяти срабатываний насос отключается.
Terapefft
а когда я в п/п помимо отключения насоса помещаю еще вот эти команды :
ldi radr,dat_0 ; отключить датер
rcall decod ;
ldi radr,gprod_0 ; разводим продольные
rcall decod ;
ldi radr,gpop_0 ; разводим поперечные
rcall decod
ldi radr,torm_0 ; тормоз
rcall decod
ldi radr,pc1_0 ; счетчик
rcall decod
то все нормально считается и отключается
Wild007
Не понял. Ты же сам писал, что:
Цитата(Terapefft @ Dec 13 2006, 10:44) *
Я поставил все эти команды в п/п обработки прерывания INT1:
cnt_int1:
push rin
in rin1,sreg ; запомнить регистр
push rin1
; inc cntdat
; cpi cntdat,$01
; brne NNN
ldi radr,gpop_0 ; развести поперечные губки
rcall decod
ldi radr,gprod_0 ; развести продольные губки
rcall decod
ldi radr,torm_0 ; отпустить тормоз
rcall decod
ldi radr,pc1_0 ; выключить счетчик
rcall decod
ldi radr,doza_0;отключить насос
rcall decod
sbr reg_flgs,0b00000001 ;флаг насоса
; clr cntdat
sbr svet,0b00010000 ; светить Т1
clr rin ; запрет прерывания
out gicr,rin
;NNN:
pop rin1 ;
out sreg,rin1
pop rin
reti
и теперь насос отключается

И если после 5 "морганий" выполняется этот код, то насос должен выключаться?
Terapefft
сейчас у меня п/п такая:
cnt_int1:
push radr
push rin
in rin1,sreg ;
push rin1


sbrs svet,4
rjmp BBB
cbr svet,0b00010000
rjmp AAA
BBB:
sbr svet,0b00010000
AAA:



inc cntdat
cpi cntdat,5
brne NNN
ldi radr,dat_0 ;
rcall decod ;
ldi radr,gprod_0 ;
rcall decod ;
ldi radr,gpop_0 ;
rcall decod
ldi radr,torm_0 ;
rcall decod
ldi radr,pc1_0 ;
rcall decod
ldi radr,doza_0;
rcall decod


clr cntdat



; clr rin ; запрет прерывания INT1
; out gicr,rin

NNN:
pop rin1 ;
out sreg,rin1
pop rin
pop radr
reti
я специально не запрещал прерывания, пока насос не сработает, чтобы посмотреть после пяти импульсов выключится или нет. Сейчас то он нормально считает и выключает. Просто мне надо отвязатся от этих команд :
ldi radr,dat_0 ;
rcall decod ;
ldi radr,gprod_0 ;
rcall decod ;
ldi radr,gpop_0 ;
rcall decod
ldi radr,torm_0 ;
rcall decod
ldi radr,pc1_0 ;
rcall decod
Они выполняются в главном цикле, но без них насос почему то не отключается
Wild007
Цитата(Terapefft @ Dec 19 2006, 10:40) *
Просто мне надо отвязатся от этих команд :
ldi radr,dat_0 ;
rcall decod ;
ldi radr,gprod_0 ;
rcall decod ;
ldi radr,gpop_0 ;
rcall decod
ldi radr,torm_0 ;
rcall decod
ldi radr,pc1_0 ;
rcall decod
Они выполняются в главном цикле, но без них насос почему то не отключается

Т.е. ты хочешь заменить эту "кучку" smile.gif команд на одну?
Terapefft
нет, мне надо чтобы в п/п отключался только насос, а он не отключается пока не выполнятся эти команды, но они должны выполнятся только в главном цикле. т.е. между ними судя по всему существует какая то взаимосвязь, основаная непонятно на чем.
Wild007
Но насос управляется через КР1533ИР30 (я правильно понял?) по выводу 9 (ОТ5) и (по идее), если его "оторвать" от КР1533ИР30, то подавая на него 1(+5В) или 0 он должен включаться (1) и выключаться (0) не зависимо от состояния остальных ОТ. Или же там стоит ещё какая-то логика?
Terapefft
да верно насос управляется через КР1533ИР30, тока вот почему он так работает непонятно? логики там больше нету.. а как его оторвать то можно?
Wild007
Цитата(Terapefft @ Dec 19 2006, 11:47) *
а как его оторвать то можно?

Разрезать дорожку на плате, если это жгут проводов -- выпаять провод, если это разъём -- выдернуть провод и т. д. smile.gif
Terapefft
то есть, сделать разрыв дорожки ОТ5, и управлять насосом с отдельного вывода контролера? у меня просто есть свободная нога РС1.
Wild007
Нет просто подавать на "провод" идущий на управление насосом 1 или 0 вне зависимости от мк. Подключать его или к +5В или к земле.
Terapefft
Цитата(Wild007 @ Dec 19 2006, 13:29) *
Нет просто подавать на "провод" идущий на управление насосом 1 или 0 вне зависимости от мк. Подключать его или к +5В или к земле.

что то не пойму я какой провод тогда оторвать??? У меня же с портов РВ0-РВ2 идет код на выбор ноги на выходе(выходная нога ОТ5), и в нем "0" или "1" на включение или выключение насоса
Wild007
"Оторвать" вывод ОТ5 от "дешифратора" я предлагал для проверки как работает насос без М/К и схем связанных с М/К. Если двигатель насоса управляется 0 и 1 (т.е. выключается и включается без М/К ), то, если есть свободные выводы у М/К, подключить его напрямую к какому нибудь выводу и управлять насосом минуя "дешифратор". smile.gif
Terapefft
все вроде у меня заработало нормально smile.gif и без перерезания проводов. Импульсы считаются, насос выключается, вроде все как "доктор прописал" smile.gif) Теперь вот хочу сделать так чтобы кол-во импульсов с которыми происходит сравнение можно было с платы индикации вводить. Я вот выделил регистр r15 (cnt). В п/п прерывания сравнение сделал вот так:

inc cntdat
cp cntdat,cnt
brne NNN
Пункт меню тоже сделал по аналогии:

ob30:
clr cnres ;
ser ind
ldi rin,6 ; "6"
mov bd3,rin ; высветить "6LXX"
cbr reg_flgs,0b00100000; погасить флаг индикации дес. точки
ldi zl,CNT1 ; загрузить кол-во импульсов
ld rin,z
rcall bd_conv
obr1:
sbrs ind,PROG ; если нажата "прог"
rjmp obrab_key ; то на первый параметр

ob39:
sbrc reg_flgs,3 ; если нет режима программирования
rjmp init ; то выход отсюда без сохранения
sbrs ind,VVOD ;
rjmp key_up1 ;
sbrs ind,PLUS ;
rcall key_plus ;
sbrs ind,MINUS ;
rcall key_minus ;
rjmp obr1
и по нажатию "ввод " значение должно попасть в r15 :
key_up1:
clr r31
ldi r30,$77
lpm cnt,z
cbr svet,0b01110111 ;погасить лишние индикаторы
clr bd3 ;
clr bd2
sei
ret
Я где нибудь ошибся?? посмотрите пожалуста
Terapefft
проверил сейчас как это все дело работает, пункт в меню появился, все нормально меняется, но только сравнение происходит не с тем значением которое я ввожу, а фиг знает с каким....
Wild007
Во первых:
Код
inc cntdat
cp cntdat,cnt
brne NNN

Нужено обнуление cntdat после выключения двигателя.
Во вторых:
Что такое CNT1? На индикатор выводится значение CNT1? Меняется ли оно кнопками? Адрес CNT1 в SRAM имеет значение $77?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.