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

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

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

Так что выход на метку CNT_INT1 в векторах прерывания не прописал????
Я думал что это само собой разумеющееся ohmy.gif ohmy.gif ohmy.gif .
Terapefft
прописан естесвено
.org $002
; reti
rjmp CNT_INT1 ;
или нада как нить по другому???
Wild007
Мой вопрос возник из твоего ответа freux, а так всё правильно сделано smile.gif .
Terapefft
я вот щас попробовал ногу вот так настроить

sbi ddrd,3
cbi portd,3
и он стал выключатся, просто после всего цикла, несмотря на то что я сравнивал cntdat с разными значениями, а отключение насоса тока в п/п обработки прерывания
Wild007
Но
Код
sbi ddrd,3
cbi portd,3

это порт на выход и в порту 0 wink.gif
Надо опять глятеть всю НОВУЮ наваянную прогу, но это толко в понедельник.
Terapefft
вот исходник в котором все вроде правильно настроено, но насос не выключается
Alex_Pol
2Terapefft Выкладывай исходник. Опоздал. smile.gif
freux
Тяжело глядеть ассемблер, однако..
Не случается ли так, что прерывание от INT1 больше одного раза не происходит? Попробуйте прикрыть функциональность в обработчике прерывания, а вместо этого сделать реверс светодиоду, т.е, если не горит, то включить, если горит - выключить.
Terapefft
2 freux точнее сказать прерывание вобще не происходит, я пробовал отключать сравнение, а просто в обработке прерывания выключать насос - не работает
Terapefft
вот щас попробовал еще светодиод включать в п/п оработки прерывания, получается следующим образом:
сначала в первом цикле прерывание сразу срабатывает диод загорается, а во втором уже не срабатывает, а срабатывает только когда из цикла выйдешь...почему так??? вроде уж все просмотрел, прерывания нигде не запрещаются
Terapefft
причем когда выходишь из цикла (по нажатию "стоп"), замыкаеш датчик насос выключается (и загорается светодиод), а потом когда входиш в главный цикл (нажатие "пуск"), первый цикл насос не включается и светодиод продолжает гореть, только во втором цикле он срабатывает и диод гаснет.
Wild007
Я же предупреждал проверь 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
я уже пробовал отттуда cli убирать, и в главном цикле тоже поубирал все, все равно оно срабатывает только в первом цикле
Wild007
Цитата(Terapefft @ Dec 11 2006, 09:06) *
я уже пробовал отттуда cli убирать, и в главном цикле тоже поубирал все, все равно оно срабатывает только в первом цикле

Баланс CLI и SEI, скорее всего, нарушентся НЕ в главном цикле, а в пп, на которые уходит программа по RCALL. Ведь даже
Код
; Индикация измеренного напряжения в непрерывном режиме

я вижу нарашение баланса при уходе на RCALL.
freux
Цитата(Terapefft @ Dec 9 2006, 13:10) *
сначала в первом цикле прерывание сразу срабатывает диод загорается, а во втором уже не срабатывает, а срабатывает только когда из цикла выйдешь...почему так???


Мне показалось, что в обработчике прерывание от INT1 запрещается, и более нигде не разрешается (за исключением первичной инициализации).
Terapefft
я щас просмотрел еще раз всю прогу, поубирал cli из п/п, все равно срабатывает только когда из цикла выхожу (нажатие "стоп")

2 freux в главном цикле после включения насоса стоит разрешение прерывания
Wild007
Попробуй после
Код
ldi count,0b10000000; разрешение прерывания INT1
    out gicr,count

включать светодиод, а
Код
CNT_INT1:
    in rin,sreg
    push rin

    inc cntdat
    cpi cntdat,$02
    brne NNN

Выключать.
Похоже на то, что прога где-то зацикливается и не выходит на разрешение прерывания.
Alex_Pol
В исходнике inddat.txt от 8.12. 23 штуки cli и 19 штук sei. Нарушен баланс. Ещё раз проверь внимательно.
Terapefft
пробовал со светодиодом, включал после насоса, а выключал в П/п, но он еще гаснет по нажатию "стоп", а насос все равно тока после того как из цикла выходиш выключается
Wild007
Цитата(Alex_Pol @ Dec 11 2006, 10:43) *
В исходнике inddat.txt от 8.12. 23 штуки cli и 19 штук sei. Нарушен баланс. Ещё раз проверь внимательно.

Вот видишь Alex_Pol за тебя посчитал smile.gif
"Методом светодиода" можещь проверить и CLI с SEI: по CLI выключаешь светодиод, а по SEI -- включаешь. И видишь сразу включены прерывания или нет.
Terapefft
я вот щас сделал просто в п/п зажигать диод, из всех подпрограмм поубирал cli, диод зажигается тока когда я из цикла выхожу (после нажатия "стоп")....может там че нить с регистрами происходить? может такое быть?? как это можно определить?
Wild007
Цитата(Terapefft @ Dec 11 2006, 12:03) *
я вот щас сделал просто в п/п зажигать диод, из всех подпрограмм поубирал cli, диод зажигается тока когда я из цикла выхожу (после нажатия "стоп")....может там че нить с регистрами происходить? может такое быть?? как это можно определить?

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

Ничего не понял. Светодиод на D? 0 --> в DDR порта, порт на вход.

Terapefft, может ну иго нафиг, программирование это. Может, будем людей лечить??
Terapefft
дребезг не учитывал....а как его учитывать? и на какие входы надо кондеры? а почему тогда диод сразу загорается???

2 freux светодиод не на D, он вобще на плате индикации находится, на D датчик подключен, просто в п/п обработки прерывания я диод включаю, чтоб посмотреть работает прерывание или нет
Wild007
Цитата(Terapefft @ Dec 11 2006, 15:04) *
дребезг не учитывал....а как его учитывать? и на какие входы надо кондеры? а почему тогда диод сразу загорается???

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


Еще раз,
Прерывание от INT1 разрешается
ldi rin,0b10000000
out gicr,rin

в "массе" кода с коментариями:
..включить двигатель
..включить тормоз
..сводим губки
.. еще губки, и т.д.

больше нигде в GICR разрешение INT1 не заносится
Это так задуманно? Ведь в самом INT1 прерывании оно запрещается занесением в GICR нуля
Wild007
Вопрос по датчику: "нагрузка" это чё открытый коллектор?
Вопрос по "диоду": к какому порту(ножке) и как он подключен? И приводи только часть кода, где он включается\выключается.
Terapefft
Цитата(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
Ну дык если это открытый коллектор, то подключение должно быть: с "выхода" резистор на +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
А в конце -- там полное выключение smile.gif
Terapefft
просто у нас также индуктивный датчик двери подключался, поэтому я решил не парится и подключил его также smile.gif вот тока мне непонятно почему же все таки диод загорается а насос не выключается...
Wild007
Цитата(Terapefft @ Dec 11 2006, 16:42) *
просто у нас также индуктивный датчик двери подключался, поэтому я решил не парится и подключил его также smile.gif вот тока мне непонятно почему же все таки диод загорается а насос не выключается...

Если код
Код
ldi radr,doza_0; отключить насос
rcall decod

ты считаешь, что работает неправильно, то повесь светодиод на выход порта B, который управляет насосом, и посмотри -- он должен переключиться.
В п\п decod опять есть CLI, но нет SEI.
Terapefft
из decod я убрал cli, сейчас попробовал просто без прерывания выключить насос пораньше в рабочем цикле, но он почему то все равно выключается после всего цикла, а включение я пробовал переставлять - получается нормально (в каком месте цикла поставлю, там и включаются). А вот выключение непонятно почему где его не ставь все равно выключается в конце, из за чего это происходить может???
Wild007
А на выходе порта B, который управляет насосом, чё происходит?
Terapefft
там видимо дело не в порте В, к нему подключен дешифратор, с порта В на него идет адреса, и включается нужный дешифратор. Дело видимо в том, что в программе предусмотрено отключение насоса если он не достигнет датчика, после некоторого времени . Раньше же эта прога управляла клапаном, а на нем было два датчика (на 0,5 и на 1 литр)

обработка сигналов с этих датчиков происходит видимо в п/п delay
Wild007
Я сейчас посмотрел в Студии п\п delay
Цитата
обработка сигналов с этих датчиков происходит видимо в п/п delay

не вдимо, а точно.
Цитата
там видимо дело не в порте В, к нему подключен дешифратор, с порта В на него идет адреса,

похоже что так. Надо разобраться с алгоритмом работы дешифратора и переписать delay
Terapefft
тут вот еще проблема, если в п/п я отключаю насос, то у меня если я сразу вначале цикла замкну и не буду до конца размыкать то насос не включится, а это не есть гуд sad.gif как можно сделать штоб он по любому включался независимо от состояния датчика (ведь он при вращении насоса может остановится как на "дырке" так в замкнутом состоянии) ??? п/п delay нужно переделать штоб она опрашивала мой индуктивный датчик???
Wild007
Цитата(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. Что они обозначают для меня загадка smile.gif. Но твоя проблема с включением и выключением двигателя скрыта (ИМХО) в этой таблице smile.gif .
Terapefft
от 9 и от14 не используются. А если у меня допустим в п/п загорается диод, я потом запрещаю прерывание, то он должен гаснуть? просто он у меня как загорится и горит потом постояно

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

Для того чтобы "диод" выключился надо его, как минимум, выключить какой-то командой (или выключить питание smile.gif smile.gif smile.gif )
Terapefft
почему же тогда когда датчик постояно замкнут насос не включается хотя у меня стоит запрет прерывания после его отключения (хоть отключение происходит и не в тот момент когда мне надо)? причем если он постояно разомкнут то насос включится и выключатся не будет пока датчик не замкнешь

вот у меня в п/п стоит

ldi radr,doza_0;
rcall decod
sbr reg_flgs,0b00000001 ;
; clr cntdat

clr rin
out gicr,rin
Wild007
Инициализация 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
ну это понятно, я уже пробовал всякие варианты, все равно если датчик замкнут то насос не включается
Terapefft
щас пробовал в обработчике включать насос, нормально включается как тока прерывание происходит он прям сразу включается, а вот выключатся в обработчике он упорно не хочет...
Wild007
Смотри таблицу
Код
;Выводы дешифратора:
;включение:

там каката бяка и кроме тебя никто разобраться не сможет не имея перед глазами тот дешифратор каким управляет М/К smile.gif
Terapefft
я просмотрел таблицу, вроде все правильно. Вот что я сейчас обнаружил: команда на выключение насоса выполняется только после того как выполнятся следующие команды

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. Если в начале цикла датчик в замкнутом состоянии то насос не включается, хотя в п/п я запрещаю прерывание, почему так происходит???
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.