Где-нибудь сказано, что CNT_INT1 - это обработчик прерывания INT1?
Terapefft
Dec 8 2006, 16:39
2 freux а разве это надо где нить прописывать???
я уже пробовал сразу сравнение убирать, он по идее тада должен сразу выключатся как тока датчик разомкнется, но не выключается
Wild007
Dec 8 2006, 16:48
Цитата(Terapefft @ Dec 8 2006, 15:39)

2 freux а разве это надо где нить прописывать???
я уже пробовал сразу сравнение убирать, он по идее тада должен сразу выключатся как тока датчик разомкнется, но не выключается

Так что выход на метку CNT_INT1 в векторах прерывания не
прописал????Я думал что это само собой разумеющееся

.
Terapefft
Dec 8 2006, 16:55
прописан естесвено
.org $002
; reti
rjmp CNT_INT1 ;
или нада как нить по другому???
Wild007
Dec 8 2006, 17:03
Мой вопрос возник из твоего ответа
freux, а так всё правильно сделано

.
Terapefft
Dec 8 2006, 17:11
я вот щас попробовал ногу вот так настроить
sbi ddrd,3
cbi portd,3
и он стал выключатся, просто после всего цикла, несмотря на то что я сравнивал cntdat с разными значениями, а отключение насоса тока в п/п обработки прерывания
Wild007
Dec 8 2006, 17:21
Но
Код
sbi ddrd,3
cbi portd,3
это порт на выход и в порту 0
Надо опять глятеть всю
НОВУЮ наваянную прогу, но это толко в понедельник.
Terapefft
Dec 8 2006, 17:30
вот исходник в котором все вроде правильно настроено, но насос не выключается
Alex_Pol
Dec 8 2006, 17:35
2Terapefft Выкладывай исходник. Опоздал.
Тяжело глядеть ассемблер, однако..
Не случается ли так, что прерывание от INT1 больше одного раза не происходит? Попробуйте прикрыть функциональность в обработчике прерывания, а вместо этого сделать реверс светодиоду, т.е, если не горит, то включить, если горит - выключить.
Terapefft
Dec 9 2006, 12:15
2 freux точнее сказать прерывание вобще не происходит, я пробовал отключать сравнение, а просто в обработке прерывания выключать насос - не работает
Terapefft
Dec 9 2006, 13:10
вот щас попробовал еще светодиод включать в п/п оработки прерывания, получается следующим образом:
сначала в первом цикле прерывание сразу срабатывает диод загорается, а во втором уже не срабатывает, а срабатывает только когда из цикла выйдешь...почему так??? вроде уж все просмотрел, прерывания нигде не запрещаются
Terapefft
Dec 9 2006, 13:30
причем когда выходишь из цикла (по нажатию "стоп"), замыкаеш датчик насос выключается (и загорается светодиод), а потом когда входиш в главный цикл (нажатие "пуск"), первый цикл насос не включается и светодиод продолжает гореть, только во втором цикле он срабатывает и диод гаснет.
Wild007
Dec 11 2006, 09:41
Я же предупреждал проверь CLI и SEI. Вот кусок к которому ты часто обращаешься:
Код
;--------------------------------------------------------------------
; Процедура включения требуемых устройств
;--------------------------------------------------------------------
decod:
cli ;
push radr1 ;
mov radr1,radr ;
ori radr,0b00110000 ; чтобы на время запретить Enable
out portb,radr1 ; выставить адрес дешифратора
nop ; ждем время выполнения
nop ;
nop ;
nop ;
nop ;
out portb,radr ; выставляем Enable
nop ;
nop ;
nop ;
nop ;
nop ;
pop radr1 ;
ret ;
В нем есть CLI но нет SEI!!!!!!
Terapefft
Dec 11 2006, 10:06
я уже пробовал отттуда cli убирать, и в главном цикле тоже поубирал все, все равно оно срабатывает только в первом цикле
Wild007
Dec 11 2006, 10:19
Цитата(Terapefft @ Dec 11 2006, 09:06)

я уже пробовал отттуда cli убирать, и в главном цикле тоже поубирал все, все равно оно срабатывает только в первом цикле
Баланс CLI и SEI, скорее всего, нарушентся
НЕ в главном цикле, а в пп, на которые уходит программа по RCALL. Ведь даже
Код
; Индикация измеренного напряжения в непрерывном режиме
я вижу нарашение баланса при уходе на RCALL.
Цитата(Terapefft @ Dec 9 2006, 13:10)

сначала в первом цикле прерывание сразу срабатывает диод загорается, а во втором уже не срабатывает, а срабатывает только когда из цикла выйдешь...почему так???
Мне показалось, что в обработчике прерывание от INT1 запрещается, и более нигде не разрешается (за исключением первичной инициализации).
Terapefft
Dec 11 2006, 11:20
я щас просмотрел еще раз всю прогу, поубирал cli из п/п, все равно срабатывает только когда из цикла выхожу (нажатие "стоп")
2 freux в главном цикле после включения насоса стоит разрешение прерывания
Wild007
Dec 11 2006, 11:32
Попробуй после
Код
ldi count,0b10000000; разрешение прерывания INT1
out gicr,count
включать светодиод, а
Код
CNT_INT1:
in rin,sreg
push rin
inc cntdat
cpi cntdat,$02
brne NNN
Выключать.
Похоже на то, что прога где-то зацикливается и не выходит на разрешение прерывания.
Alex_Pol
Dec 11 2006, 11:43
В исходнике inddat.txt от 8.12. 23 штуки cli и 19 штук sei. Нарушен баланс. Ещё раз проверь внимательно.
Terapefft
Dec 11 2006, 12:07
пробовал со светодиодом, включал после насоса, а выключал в П/п, но он еще гаснет по нажатию "стоп", а насос все равно тока после того как из цикла выходиш выключается
Wild007
Dec 11 2006, 12:40
Цитата(Alex_Pol @ Dec 11 2006, 10:43)

В исходнике inddat.txt от 8.12. 23 штуки cli и 19 штук sei. Нарушен баланс. Ещё раз проверь внимательно.
Вот видишь
Alex_Pol за тебя посчитал
"Методом светодиода" можещь проверить и CLI с SEI: по CLI выключаешь светодиод, а по SEI -- включаешь. И видишь сразу включены прерывания или нет.
Terapefft
Dec 11 2006, 13:03
я вот щас сделал просто в п/п зажигать диод, из всех подпрограмм поубирал cli, диод зажигается тока когда я из цикла выхожу (после нажатия "стоп")....может там че нить с регистрами происходить? может такое быть?? как это можно определить?
Wild007
Dec 11 2006, 15:14
Цитата(Terapefft @ Dec 11 2006, 12:03)

я вот щас сделал просто в п/п зажигать диод, из всех подпрограмм поубирал cli, диод зажигается тока когда я из цикла выхожу (после нажатия "стоп")....может там че нить с регистрами происходить? может такое быть?? как это можно определить?
За "влет" в прерывание INT1 отвечают только два бита -- I в SREG и INT1 в GICR(GIMSK) и, если они установлены, то состояние регистров R0-R31 не имеет ни кокого значения
Terapefft
Dec 11 2006, 15:44
вот я щас сделал, диод зажигается

вначале проги порт так настроил:
clr rin ;
out ddrd,rin ;
out portd,rin ;
прерывание вроде работает, потом я попробовал в п/п выключать насос без сравнения с кол-вом импульсов, но почему то диод загорается сразу как происходит замыкание датчика, а насос тока в конце цикла выключается. почему такое может быть?
Wild007
Dec 11 2006, 15:55
А "дребезг" контактов учел? Когда коротишь отверткой получишь "тучу" импульсов. Кроме того -- на входах желательно иметь конденсаторы 20-50пФ.
Цитата(Terapefft @ Dec 11 2006, 15:44)

вот я щас сделал, диод зажигается

вначале проги порт так настроил:
clr rin ;
out ddrd,rin ;
out portd,rin ;
Ничего не понял. Светодиод на D? 0 --> в DDR порта, порт на вход.
Terapefft, может ну иго нафиг, программирование это. Может, будем людей лечить??
Terapefft
Dec 11 2006, 16:07
дребезг не учитывал....а как его учитывать? и на какие входы надо кондеры? а почему тогда диод сразу загорается???
2 freux светодиод не на D, он вобще на плате индикации находится, на D датчик подключен, просто в п/п обработки прерывания я диод включаю, чтоб посмотреть работает прерывание или нет
Wild007
Dec 11 2006, 16:10
Цитата(Terapefft @ Dec 11 2006, 15:04)

дребезг не учитывал....а как его учитывать? и на какие входы надо кондеры? а почему тогда диод сразу загорается???
Дребезг контактов можно убирать програмно или с помощью RS триггера -- аппаратно. Кондеры на пины МК которые
ВХОДЫ 
. А где вставлено зажигание "диода" -- выкладывай код.
Terapefft
Dec 11 2006, 16:31
вот исходник где диод зажигается. У меня на датчике 3 вывода: один 0 В, один +24 В и нагрузка (я его подключил через резистор и диод к ноге контроллера)
Цитата(Terapefft @ Dec 9 2006, 13:10)

сначала в первом цикле прерывание сразу срабатывает диод загорается, а во втором уже не срабатывает, а срабатывает только когда из цикла выйдешь...почему так???
Еще раз,
Прерывание от INT1 разрешается
ldi rin,0b10000000
out gicr,rin
в "массе" кода с коментариями:
..включить двигатель
..включить тормоз
..сводим губки
.. еще губки, и т.д.
больше нигде в GICR разрешение INT1 не заносится
Это так задуманно? Ведь в самом INT1 прерывании оно запрещается занесением в GICR нуля
Wild007
Dec 11 2006, 16:54
Вопрос по датчику: "нагрузка" это чё открытый коллектор?
Вопрос по "диоду": к какому порту(ножке) и как он подключен? И приводи только часть кода, где он включается\выключается.
Terapefft
Dec 11 2006, 17:12
Цитата(Wild007 @ Dec 11 2006, 16:54)

Вопрос по датчику: "нагрузка" это чё открытый коллектор?
Вопрос по "диоду": к какому порту(ножке) и как он подключен? И приводи только часть кода, где он включается\выключается.
да нагрузка это открытый ключ. При подключении использовал резистор на 10 кОм и стабилитрон КС156А.
Вот в п/п я включаю светодиод:
cnt_int1:
push rin
in rin1,sreg ; çàïîìíèòü ðåãèñòð ñîñòîÿíèÿ
push rin1
sbr svet,0b00010000 ; светить Т1
; inc cntdat
; cpi cntdat,$02
; brne NNN
ldi radr,doza_0; отключить насос
rcall decod
sbr reg_flgs,0b00000001 ;
clr cntdat
clr rin
out gicr,rin
;NNN:
pop rin1 ;
out sreg,rin1
pop rin
reti
только к ноге PD3 подсоединяется
Wild007
Dec 11 2006, 17:29
Ну дык если это открытый коллектор, то подключение должно быть: с "выхода" резистор на +5В и "выход" через 100-500 Ом на PD3 (для ограничения тока), плюс два диода для защиты входа.
Но твоя "конструкция":
Код
sbr svet,0b00010000; светить Т1
; inc cntdat
; cpi cntdat,$02
; brne NNN
ldi radr,doza_0; отключить насос
rcall decod
sbr reg_flgs,0b00000001;
clr cntdat
если загорелся "диод", то и насос должен выключиться:
Код
ldi radr,doza_0; отключить насос
Значит что-то неправильно с этим LDI
А в конце -- там полное выключение
Terapefft
Dec 11 2006, 17:42
просто у нас также индуктивный датчик двери подключался, поэтому я решил не парится и подключил его также

вот тока мне непонятно почему же все таки диод загорается а насос не выключается...
Wild007
Dec 12 2006, 09:43
Цитата(Terapefft @ Dec 11 2006, 16:42)

просто у нас также индуктивный датчик двери подключался, поэтому я решил не парится и подключил его также

вот тока мне непонятно почему же все таки диод загорается а насос не выключается...
Если код
Код
ldi radr,doza_0; отключить насос
rcall decod
ты считаешь, что работает неправильно, то повесь светодиод на выход порта B, который управляет насосом, и посмотри -- он должен переключиться.
В п\п
decod опять есть CLI, но нет SEI.
Terapefft
Dec 12 2006, 10:57
из decod я убрал cli, сейчас попробовал просто без прерывания выключить насос пораньше в рабочем цикле, но он почему то все равно выключается после всего цикла, а включение я пробовал переставлять - получается нормально (в каком месте цикла поставлю, там и включаются). А вот выключение непонятно почему где его не ставь все равно выключается в конце, из за чего это происходить может???
Wild007
Dec 12 2006, 11:03
А на выходе порта B, который управляет насосом, чё происходит?
Terapefft
Dec 12 2006, 11:48
там видимо дело не в порте В, к нему подключен дешифратор, с порта В на него идет адреса, и включается нужный дешифратор. Дело видимо в том, что в программе предусмотрено отключение насоса если он не достигнет датчика, после некоторого времени . Раньше же эта прога управляла клапаном, а на нем было два датчика (на 0,5 и на 1 литр)
обработка сигналов с этих датчиков происходит видимо в п/п delay
Wild007
Dec 12 2006, 12:07
Я сейчас посмотрел в Студии п\п
delayЦитата
обработка сигналов с этих датчиков происходит видимо в п/п delay
не вдимо, а точно.
Цитата
там видимо дело не в порте В, к нему подключен дешифратор, с порта В на него идет адреса,
похоже что так. Надо разобраться с алгоритмом работы дешифратора и переписать
delay
Terapefft
Dec 12 2006, 13:59
тут вот еще проблема, если в п/п я отключаю насос, то у меня если я сразу вначале цикла замкну и не буду до конца размыкать то насос не включится, а это не есть гуд

как можно сделать штоб он по любому включался независимо от состояния датчика (ведь он при вращении насоса может остановится как на "дырке" так в замкнутом состоянии) ??? п/п delay нужно переделать штоб она опрашивала мой индуктивный датчик???
Wild007
Dec 12 2006, 14:29
Цитата(Terapefft @ Dec 12 2006, 12:59)

тут вот еще проблема, если в п/п я отключаю насос, то у меня если я сразу вначале цикла замкну и не буду до конца размыкать то насос не включится,
Как только мотор выключился, то надрбность в прерывании пропадает. Значит, сразу после команды остановки мотора, запрещаем прерывания до следующего включения двигателя, тогда
ОПЯТЬ разрешаем прерывание, остановили двигатель -- запретили и т.д.
Цитата
как можно сделать штоб он по любому включался независимо от состояния датчика (ведь он при вращении насоса может остановится как на "дырке" так в замкнутом состоянии) ???
А это настройка прерывания по фронтам или уровню.
Цитата
п/п delay нужно переделать штоб она опрашивала мой индуктивный датчик???
Я всё же думаю, что кроме п\п
delay надо переопределить таблицу:
Код
.equ dvig_1 =0b00101000;+ OT1 DD2
.equ torm_1 =0b00101011;+ OT4 DD2
.equ doza_1 =0b00101100;+ OT5 DD2
.equ dat_1 =0b00101101;+ OT6 DD2
.equ gprod_1 =0b00101110;+ OT7 DD2
.equ gpop_1 =0b00101111;+ OT8 DD2
.equ pc1_1 =0b00101001;+ OT2 DD2
.equ nprod_1 =0b00011100;+ OT13 DD3
.equ dater_1 =0b00011010;+-OT11 DD3 Ïðîãð, íî íå èñï
.equ npop_1 =0b00011011;+ OT12 DD3
.equ gotov_1 =0b00011001;- OT10 DD3
.equ ozon_1 =0b00011000;- OT9 DD3
.equ metka_0 =0b00011110;- OT14 DD3
;
.equ dvig_0 =0b00100000;+ OT1 DD2
.equ torm_0 =0b00100011;+ OT4 DD2
.equ doza_0 =0b00100100;+ OT5 DD2
.equ dat_0 =0b00100101;- OT6 DD2
.equ gprod_0 =0b00100110;+ OT7 DD2
.equ gpop_0 =0b00100111;+ OT8 DD2
.equ pc1_0 =0b00100001;+ OT2 DD2
.equ nprod_0 =0b00010100;+ OT13 DD3
.equ dater_0 =0b00010010;+-OT11 DD3 Ïðîãð, íî íå èñï
.equ npop_0 =0b00010011;+ OT12 DD3
.equ gotov_0 =0b00010001;- OT10 DD3
.equ ozon_0 =0b00010000;- OT9 DD3
.equ metka_1 =0b00010110;- OT14 DD3
Это таблица команд дешифратора и в ней присутствуют ничего не говорящие постороннему человеку символы типа ОТ9, ОТ14. Что они обозначают для меня загадка

. Но твоя проблема с включением и выключением двигателя скрыта (ИМХО) в этой таблице

.
Terapefft
Dec 12 2006, 14:44
от 9 и от14 не используются. А если у меня допустим в п/п загорается диод, я потом запрещаю прерывание, то он должен гаснуть? просто он у меня как загорится и горит потом постояно
у меня прерывание сейчас настроено по спадающему фронту
Wild007
Dec 12 2006, 14:48
Цитата(Terapefft @ Dec 12 2006, 13:44)

А если у меня допустим в п/п загорается диод, я потом запрещаю прерывание, то он должен гаснуть? просто он у меня как загорится и горит потом постояно
Для того чтобы "диод" выключился надо его, как минимум, выключить какой-то командой (или выключить питание

)
Terapefft
Dec 12 2006, 15:01
почему же тогда когда датчик постояно замкнут насос не включается хотя у меня стоит запрет прерывания после его отключения (хоть отключение происходит и не в тот момент когда мне надо)? причем если он постояно разомкнут то насос включится и выключатся не будет пока датчик не замкнешь
вот у меня в п/п стоит
ldi radr,doza_0;
rcall decod
sbr reg_flgs,0b00000001 ;
; clr cntdat
clr rin
out gicr,rin
Wild007
Dec 12 2006, 15:37
Инициализация INT1 должна быть:
Код
CLR RIN
LDI rin,1<<ISC11
OUT MCUCR,RIN
Такая форма записи позволяет
ТОЧНО и
ЛЮБОМУ контролировать, что ты пишешь в регистр, а у тебя:
Код
ldi rin,0b00000100
out mcucr,rin
настраивает на
Цитата
Any logical change on INT1 generates an interrupt request
Смотри
DS стр.66
Terapefft
Dec 12 2006, 16:22
ну это понятно, я уже пробовал всякие варианты, все равно если датчик замкнут то насос не включается
Terapefft
Dec 12 2006, 16:51
щас пробовал в обработчике включать насос, нормально включается как тока прерывание происходит он прям сразу включается, а вот выключатся в обработчике он упорно не хочет...
Wild007
Dec 12 2006, 17:07
Смотри таблицу
Код
;Выводы дешифратора:
;включение:
там
каката бяка и кроме тебя никто разобраться не сможет не имея перед глазами тот дешифратор каким управляет М/К
Terapefft
Dec 13 2006, 11:44
я просмотрел таблицу, вроде все правильно. Вот что я сейчас обнаружил: команда на выключение насоса выполняется только после того как выполнятся следующие команды
ldi radr,gpop_0 ; развести поперечные губки
rcall decod
ldi radr,gprod_0 ; развести продольные губки
rcall decod
ldi radr,torm_0 ; отпустить тормоз
rcall decod
ldi radr,pc1_0 ; выключить счетчик
rcall decod
они как раз и стоят в конце рабочего цикла. Я поставил все эти команды в п/п обработки прерывания 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
и теперь насос отключается сразу же как только я замкну датчик. У меня возникли следующие вопросы:
1. Можно ли как нибудь развязать эти команды и почему же все таки так получается?
2. Если в начале цикла датчик в замкнутом состоянии то насос не включается, хотя в п/п я запрещаю прерывание, почему так происходит???
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.