Wild007
Dec 13 2006, 12:01
Цитата
1. Можно ли как нибудь развязать эти команды и почему же все таки так получается?
Это и есть последовательность команд для твоего "дешифратора"
Цитата
2. Если в начале цикла датчик в замкнутом состоянии то насос не включается, хотя в п/п я запрещаю прерывание, почему так происходит???
Привиди еще раз код инициализации INT1 и как включается прерывание, Может возникать ситуация, когда ты разрешаешь прерывание, а флаг в GIFR (INTF1) уже висит и сразу происходит прерывание и останавливается двигатель, поэтому можно, перед "включением" прерывания, прочитать регистр флагов и записать его обратно (сброс флагов производится
ЗАПИСЬЮ 1 в соответствующий бит), и если бит установлен он
"сам себя" сбросит

.
Terapefft
Dec 13 2006, 12:49
инициализация 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
Dec 13 2006, 14:28
Цитата
А по поводу команд: раньше же когда упправлялось клапаном (там стояло два датчика), клапан же возвращался в исходное состояние при достижении нужного датчика, или эти команды так и будут выполнятся только последовательно??? разве нельзя ничего с этим поделать?
Для ответа на этот вопрос надо знать, хотя бы, схему "дешифратора" или алгоритм его работы. Я не люблю гадать на кофейной гуще

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

. Кто-то же создавал этот "дешифратор"? Если его найти тяжело, то надо просто похерить эту разработку и создавать новую с
нуля. Будет быстрее и ИМХО тебе в
"мелких деталях" помогут на этом форуме.
Terapefft
Dec 13 2006, 17:15
я вот попробовал прочиттать состояния регистра gifr и записать его обратно:
in rin,gifr
out gifr,rin
ldi rin,0b10000000
out gicr,rin
но все равно при замкнутом датчике не включается насос

и функция сравнения почему то не выполняется, которая в прерывании, а просто при замыкании датчика сразу выключается.
На счет "переписать прогу": мне к сожалению не дадут времени для этого

такая вот у нас хреновая контора...я уже просил выделить мне время для этого - сказали что нифига...
Wild007
Dec 14 2006, 09:19
Цитата
но все равно при замкнутом датчике не включается насос и функция сравнения почему то не выполняется,
При "замыкании" датчика может возникнуть N мпульсов и количество может быть достаточно большим. Поэтому попробуй сравнение с 255.
А что на счет схемы "дешифратора"?
Terapefft
Dec 14 2006, 09:37
вот схема дешифратора (КР1533ИР30)
а вот таблица к нему, я вчера проверил, все вроде правильно
Terapefft
Dec 14 2006, 09:57
попробовал с 255 сравнивать, так при замкнутом датчике насос включается и тут же выключается, почему так?? ведь если я его замнкул и не размыкаю вроде никаких импульсов не должно поступать на контролер...
Wild007
Dec 14 2006, 10:33
Цитата
дешифратора (КР1533ИР30)
Это просто расширитель порта. И управление двигателем "доза" идет по ОТ1, туда пишется 0 или 1. И, если, там больше нет ни какой логики, то он должен включаться и выключаться без проблем.
Цитата
ведь если я его замнкул и не размыкаю вроде никаких импульсов не должно поступать на контролер...
Схема подключения твоя или переделал как я советовал?
Terapefft
Dec 14 2006, 10:52
управление насосом осуществляется по ОТ5, логики на плате больше нет никакой. Схема подключения через резистор (второй его конец на +5 В) и стабилитрон. Вы говорили еще про кондер, просто я не понял куда его вешать, на ногу контролера и на землю? А по поводу отключения насоса так и не понятно почему же он тогда выполняется после того как выполнятся некоторые команды?
а нет извините ошибся по поводу подключения: он такой как на рисунке, через резистор и стабилитрон (стабилитрон на землю)
Wild007
Dec 14 2006, 11:01
Да по ОТ5 я писал, но думал о своём
Надо померять вольтметром уровни 0 и 1 на входе М/К с датчика. Возможно уровень "крутится" возле 2,5В. Если провода датчика проходят мимо силовых частей, возможна наводка на вход не "подпёртый" резистором пулап.
Terapefft
Dec 14 2006, 11:59
померил я напряжение: при "о" - 0,9 В; при "1" - 4,9 В
Wild007
Dec 14 2006, 15:36
Ну не знаю. Вот стоит (возле меня

)устройство работающее по примерно такому же принципу:
-- включил двигатель;
-- разрешил прерывания по INT;
-- пришёл сигнал с фотодатчика (прерывания по 0);
-- выставил флаг датчика;
-- запретил прерывания по INT;
-- вышел в главный цикл:
-- обработал флаг - выключил двигатель;
И всё жужжит без проблем.
Давай ещё раз текст программы буду смотреть
Terapefft
Dec 14 2006, 15:59
я попробовал сравнивать например с "20" - эффект такой же как и с "255", включается и тут же выключается, вот исходник
Wild007
Dec 15 2006, 09:31
Я немного "модернизировал" твою програму для проверки, как работает INT1, в отладчике STUDIOAVR. Подсчет колчеств входа в п\п работает правильно. Прерывание по спадающему фронту -- тоже. Появление флага, в отсутствие разрешения прерывания, как я и говорил. Все работает "как доктор пропсал"

. Можешь погонять сам, я там коментарии оставил.
Terapefft
Dec 15 2006, 11:00
да прерывание работает верно, я даже на плату ставил и проверял, 3 раза замыкаю датчик и насос отключается. А в цикле таже фигня происходит как и было, я уже не знаю почему. Какая то хрень творится в delaу .... А без нее цикл не запускается. Может че нить с ней посоветуете сделать?
Wild007
Dec 15 2006, 11:57
Я бы сделал так -- (пишу алгоритм код напишешь сам):
-- когда надо включать двигатель выставляешь флаг;
-- в главном цикле проверяешь этот флаг ;
-- по флагу уходишь на п\п включения двигателя в которой
(не изменять последователность!) :
---- снимаешь флаг ;
---- включаешь двигатель;
---- разрешаешь прерывания;
---- выходишь из п\п;
Ну а обработка прерывания у тебя работает. Удачи!
Terapefft
Dec 15 2006, 13:08
я вот сделал в главном цикле:
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
Dec 15 2006, 13:46
Я же написал, что
ТОЛЬКО:
Цитата
-- когда надо включать двигатель выставляешь флаг;
А он у тебя постоянно сбрасывается
Код
cbr reg_flgs,0b00000001;
в главном цикле и прерывание постоянно включается. Ты же видел в моей "модернизации":
Код
clr radr
sbr radr,1<<int1
out gicr,radr
ldi radr,doza_1; дозатор на всасывание
rcall decod
start123:
rjmp start123
я разрешил прерывания, включил двигатель и больше прерывания не включаю.
да и алгоритм
Цитата
---- снимаешь флаг ;
---- включаешь двигатель;
---- разрешаешь прерывания;
---- выходишь из п\п;
надо изменить
---- снимаешь флаг ;
---- включаешь двигатель;
---- сбросить "лишний" флаг прерывания;---- разрешаешь прерывания;
---- выходишь из п\п;
я писал, а меня отвлекли
Terapefft
Dec 15 2006, 14:59
так мне же и надо включать насос только в главном цикле, а выключатся он должен пока главный цикл не закончился. Я же так и сделал: сбросил флаг, по нему перешел в п/п включения насоса, выставил флаг, включил насос, разрешил прерывания, в прерывании опять сбросил, запретил прерывания. Или я что то не так понял? как понять сбросить "лишний" флаг?
p.s. извините за глупые вопросы, просто я совсем запутался...
Terapefft
Dec 15 2006, 15:29
я попробовал выставить флаг вне главного цикла (там где Вы модернизацию проводили), в главном цикле просто поставил:
sbrc reg_flgs,1
rcall nasos
в п/п включения насоса сбрасываю флаг, все равно также работает
Wild007
Dec 15 2006, 16:00
Цитата(Terapefft @ Dec 15 2006, 13:59)

так мне же и надо включать насос только в главном цикле, а выключатся он должен пока главный цикл не закончился.
Насос включается после каких-то действий оператора машины? Или гланый цикл растянут по времени на все действия машины и повторение цикла это 30-40 минут

?
Цитата
как понять сбросить "лишний" флаг?
Цитата
Может возникать ситуация, когда ты разрешаешь прерывание, а флаг в GIFR (INTF1) уже висит и сразу происходит прерывание и останавливается двигатель, поэтому можно, перед "включением" прерывания, прочитать регистр флагов и записать его обратно (сброс флагов производится ЗАПИСЬЮ 1 в соответствующий бит), и если бит установлен он "сам себя" сбросит .
Это и есть"лишний" флаг
Terapefft
Dec 15 2006, 16:13
Работа автомата такова: после выбора всех необходимых параметров, нажимаешь кнопку "пуск", и начинается, сошлись продольные, поперечные губки, началась заварка, включился насос, налился литр, разошлись губки и насос отключился. Вот такой цикл в общих чертах. А сбросить лишний флаг таким образом :
in rin,gifr
out gifr,rin
Wild007
Dec 15 2006, 16:27
Цитата(Terapefft @ Dec 15 2006, 15:13)

Вот такой цикл в общих чертах.
И сколько "такой" цикл длится, в смысле по времени?
Цитата
А сбросить лишний флаг таким образом :
in rin,gifr
out gifr,rin
Да.
Terapefft
Dec 15 2006, 16:44
примерно около 5 секунд. Пробовал я и лишний флаг сбрасывать, все равно нифига не работает...
Wild007
Dec 15 2006, 17:16
Цитата(Terapefft @ Dec 15 2006, 15:44)

примерно около 5 секунд. Пробовал я и лишний флаг сбрасывать, все равно нифига не работает...
Ты сам понимаешь, что такой длинный цикл отладить в Студии практически нереально (особенно постороннему человеку

). Может проблема возникать ещё и в том, что в:
Код
прерывания от INT1
используется регистр
radr , но он не прячется в стек. Попробуй

.
А лишнй флаг надо сбрасывать для правильного подсчета количества "пребываний" в подпрограмме по прерыванию
archi2000
Dec 17 2006, 00:08
Извините, что вмешиваюсь в ваш диалог.
Вот прерывание таймера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
Dec 18 2006, 14:15
а может возникать неразбериха из за того что мк в некоторых п/п в режим sleep уходит, там же в регистр mcucr записывается
ldi rin,0b10010000 ;
out mcucr,rin ;
sleep
или это не играет роли??? Еще у меня возникла идея, можно ли как нить в главном цикле проследить состояние некоторых регистров, то есть по ходу выполнения в главном цикле уйти на п/п которая мне отобразит содержимое нужного мне регистра??? Просто не могу сообразить как эту п/п сделать.
Wild007
Dec 18 2006, 14:25
Зачем п\п? Просто читаешь и зажигаешь "диоды". И вставляешь код программы туда куда надо
Terapefft
Dec 18 2006, 14:34
Цитата(Wild007 @ Dec 18 2006, 14:25)

Зачем п\п? Просто читаешь и зажигаешь "диоды". И вставляешь код программы туда куда надо

что то я не пойму никак...как так читаешь и зажигаешь??? Объяните пожалуста как это реализовать
Wild007
Dec 18 2006, 14:49
Типа:
Код
IN R16, GICR
SBRC R16,1<<INT1
ЗАЖЕЧЬ "ДИОД"
....
Дальше по програме.
А "диод" ты зажигать умеешь
Terapefft
Dec 18 2006, 15:20
Я вот так сделал:
IN radr, GICR
SBRC radr,1<<INT1
sbr svet,0b00010000
а компилятор мне пишет:
C:\avr\datchik\dat.asm(694): error: Operand 2 out of range: 0x80
Wild007
Dec 18 2006, 15:33
Sorry:
SBRC radr,INT1
Terapefft
Dec 18 2006, 16:26
а как можно сделать так чтобы у меня в обработчике прерывания каждый раз когда происходит прерывание, диод инвертировался (т.е. если диод горел, то потухнет, если не горел, то загорится)???
Wild007
Dec 18 2006, 16:48
Вот так:
Код
sbrs svet, 0b00010000
rjmp BBB
sbr svet,0b00010000
rjmp AAA
BBB:
cbr svet,0b00010000
AAA:
......
Terapefft
Dec 19 2006, 10:58
я вот так сделал в прерывании от INT1:
sbrs svet,4
rjmp BBB
cbr svet,0b00010000
rjmp AAA
BBB:
sbr svet,0b00010000
AAA:
все нормально вроде моргает. В прерывании сравниваю с "5", диод моргает а насос не выключается. Вот если запустить цикл и после включения насоса нажать "стоп", то потом четко после пяти срабатываний насос отключается.
Terapefft
Dec 19 2006, 11:17
а когда я в п/п помимо отключения насоса помещаю еще вот эти команды :
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
Dec 19 2006, 11:18
Не понял. Ты же сам писал, что:
Цитата(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
Dec 19 2006, 11:40
сейчас у меня п/п такая:
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
Dec 19 2006, 11:45
Цитата(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
Они выполняются в главном цикле, но без них насос почему то не отключается
Т.е. ты хочешь заменить эту "кучку"

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

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

Нет просто подавать на "провод" идущий на управление насосом 1 или 0 вне зависимости от мк. Подключать его или к +5В или к земле.
что то не пойму я какой провод тогда оторвать??? У меня же с портов РВ0-РВ2 идет код на выбор ноги на выходе(выходная нога ОТ5), и в нем "0" или "1" на включение или выключение насоса
Wild007
Dec 20 2006, 09:26
"Оторвать" вывод ОТ5 от "дешифратора" я предлагал для проверки как работает насос без М/К и схем связанных с М/К. Если двигатель насоса управляется 0 и 1 (т.е. выключается и включается без М/К ), то, если есть свободные выводы у М/К, подключить его напрямую к какому нибудь выводу и управлять насосом минуя "дешифратор".
Terapefft
Dec 20 2006, 10:05
все вроде у меня заработало нормально

и без перерезания проводов. Импульсы считаются, насос выключается, вроде все как "доктор прописал"

) Теперь вот хочу сделать так чтобы кол-во импульсов с которыми происходит сравнение можно было с платы индикации вводить. Я вот выделил регистр 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
Dec 20 2006, 11:08
проверил сейчас как это все дело работает, пункт в меню появился, все нормально меняется, но только сравнение происходит не с тем значением которое я ввожу, а фиг знает с каким....
Wild007
Dec 20 2006, 11:44
Во первых:
Код
inc cntdat
cp cntdat,cnt
brne NNN
Нужено обнуление
cntdat после выключения двигателя.
Во вторых:
Что такое CNT1? На индикатор выводится значение CNT1? Меняется ли оно кнопками? Адрес CNT1 в SRAM имеет значение $77?