Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: "Реальное время" и связь по UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
muravei
Делаю систему, кот. должна измерять в реальном времени и общаться по UARTу
Вопрос в след. : допустим принят байт -обработка(RX) его считала и разрешила прерывания (но сама подпрограмма обработки RX не завершена) , а тут " откуда не возмись" прерывание от таймера-пора мерять. Мерим и тупо ждем конца измерения(ну понятно разрешаем- запрещаем прерывания), но хотелось бы вернуться в прерванное (RX) доделать его .Надо как то извратиться со с стеком, может кто-то уже придумал подобное.
Dopler
Цитата(muravei @ Feb 20 2007, 19:08) *
Делаю систему, кот. должна измерять в реальном времени и общаться по UARTу
Вопрос в след. : допустим принят байт -обработка(RX) его считала и разрешила прерывания (но сама подпрограмма обработки RX не завершена) , а тут " откуда не возмись" прерывание от таймера-пора мерять. Мерим и тупо ждем конца измерения(ну понятно разрешаем- запрещаем прерывания), но хотелось бы вернуться в прерванное (RX) доделать его .Надо как то извратиться со с стеком, может кто-то уже придумал подобное.


Ничего не понятно, зачем извращаться то? После обработки таймера вы автоматом вернетесь в прерывание UART.
aleksey_g
Цитата(muravei @ Feb 20 2007, 18:08) *
Делаю систему, кот. должна измерять в реальном времени и общаться по UARTу
Вопрос в след. : допустим принят байт -обработка(RX) его считала и разрешила прерывания (но сама подпрограмма обработки RX не завершена) , а тут " откуда не возмись" прерывание от таймера-пора мерять. Мерим и тупо ждем конца измерения(ну понятно разрешаем- запрещаем прерывания), но хотелось бы вернуться в прерванное (RX) доделать его .Надо как то извратиться со с стеком, может кто-то уже придумал подобное.


Если Вам так критичны по времени (не можете дожидаться обработки RX) сами
моменты начала измерений, то тупо ждать конца измерения не логично. Лучше
запустить преобразование и заниматься чем-нибудь более полезным, или вернуться в обработку предыдущего прерывания (если в нем разрешали прерывания), или спать на худой конец.
Тут главное, чтобы на обработку таких вложеных прерываний хватило обьема стека. А если его хватит, то вернетесь туда, откуда Вас прервали, обязательно!
А по завершении измерения возникнет прерывание, в котором и воспользоваться
измеренной величиной. Просто соответствующим образом настроить АЦП.
muravei
Цитата(aleksey_g @ Feb 20 2007, 21:10) *
Лучше запустить преобразование и заниматься чем-нибудь более полезным,

Чем-нибудь полезным нельзя, для этого нужен результат измерения
Цитата(aleksey_g @ Feb 20 2007, 21:10) *
или вернуться в обработку предыдущего прерывания (если в нем разрешали прерывания)

В этом и вопрос.Я хочу из прерыв. по таймеру , на время измерения вернуться в предыдущее(RX) , а после него обратно в по таймеру. А значит после таймера, вернуться в то что было до (RX), т.к. RX будет завершено.
Dopler
Цитата(muravei @ Feb 20 2007, 21:37) *
В этом и вопрос.Я хочу из прерыв. по таймеру , на время измерения вернуться в предыдущее(RX) , а после него обратно в по таймеру. А значит после таймера, вернуться в то что было до (RX), т.к. RX будет завершено.


Я сначала не понял вопроса.

А почему бы не делать примитивно так:

Код
UART:

ldi  flag,  0

............

cpi  flag, 1
breq  TimerEnd    ; возвращаемся в Timer
reti


Timer:
;запустить преобразование

cpi flag,  1
breq  Timer_End

ret   ; возвращаемся в UART




Timer_End:

ldi  flag,  1
...............
reti



Конечно, громоздко, зато корректно.
SasaVitebsk
Цитата(muravei @ Feb 20 2007, 20:08) *
Делаю систему, кот. должна измерять в реальном времени и общаться по UARTу
Вопрос в след. : допустим принят байт -обработка(RX) его считала и разрешила прерывания (но сама подпрограмма обработки RX не завершена) , а тут " откуда не возмись" прерывание от таймера-пора мерять. Мерим и тупо ждем конца измерения(ну понятно разрешаем- запрещаем прерывания), но хотелось бы вернуться в прерванное (RX) доделать его .Надо как то извратиться со с стеком, может кто-то уже придумал подобное.


Посмотри мою прогу по многоуровневому прерыванию на nix-06.nm.ru

Нес чем извращаться не надо. Разрешил и всё! Если из под ASM, то нельзя использовать общие регистры. Если из под Си, то внимательно смотреть на общие переменные. Правильно написанная программа будет работать и так.
muravei
Цитата(Dopler @ Feb 20 2007, 21:54) *
Конечно, громоздко, зато корректно.

Но при этом стек трогать нельзя.
Цитата(SasaVitebsk @ Feb 20 2007, 22:44) *
Посмотри мою прогу по многоуровневому прерыванию на nix-06.nm.ru

Посмотрю
muravei
Цитата(SasaVitebsk @ Feb 20 2007, 22:44) *
Посмотри мою прогу по многоуровневому прерыванию на nix-06.nm.ru

Нес чем извращаться не надо. Разрешил и всё!

Во-первых, что-то не нашел, а во-вторых , по-моему , я о другом.
SasaVitebsk
Цитата(muravei @ Feb 21 2007, 12:39) *
Цитата(SasaVitebsk @ Feb 20 2007, 22:44) *


Посмотри мою прогу по многоуровневому прерыванию на nix-06.nm.ru

Нес чем извращаться не надо. Разрешил и всё!

Во-первых, что-то не нашел, а во-вторых , по-моему , я о другом.


находится по той ссылке здесь:
Статьи/прерывания/приоритетность.

На сколько я понял именно об этом. О вложенных прерываниях. Если выложите текст обоих прерываний, то я поясню.
bodja74
Все решается гораздо проще smile.gif
Если Вы боитесь ,что не успеете обработать принятые данные из за измерений и обработки принятого пакета - просто задержите передачу smile.gif
Если общаетесь с компом - это сигнал CTS ,он аппаратно задерживает передачу.
Если межпроцессорный обмен - дайте ему знать ,дернув какой нибудь ногой ,а лучше для межпроцессорного перейти на TWI ,по протоколу слейв "растягивает" ACK если не успевает обработать данные.
muravei
Цитата(bodja74 @ Feb 21 2007, 12:38) *
Все решается гораздо проще smile.gif

Задерживать придется навсегда, лишних сигналов нет.
Цитата(SasaVitebsk @ Feb 21 2007, 11:56) *
Статьи/прерывания/приоритетность.
На сколько я понял именно об этом. О вложенных прерываниях.

Это я видел , так у меня сделано. Я о другом, думаю как наоборот вернуться в предыдущее прерываниеиз более приоритетного, что бы в нем не скучать , во время измерений.
В принципе Dopler ответил.
SasaVitebsk
Цитата(muravei @ Feb 21 2007, 16:50) *
Цитата(bodja74 @ Feb 21 2007, 12:38) *

Все решается гораздо проще smile.gif

Задерживать придется навсегда, лишних сигналов нет.
Цитата(SasaVitebsk @ Feb 21 2007, 11:56) *
Статьи/прерывания/приоритетность.
На сколько я понял именно об этом. О вложенных прерываниях.

Это я видел , так у меня сделано. Я о другом, думаю как наоборот вернуться в предыдущее прерываниеиз более приоритетного, что бы в нем не скучать , во время измерений.
В принципе Dopler ответил.


Dopler и у меня и у любого: после обработки прерывания возврат будет осуществлён в точку вызова. То есть в прерывание как вы и хотите. Просто увеличивается глубина вложенности (размер стека) и необходимо следить за общими ресурсами. Например нельзя модифицировать одну и ту же переменную в данных прерываниях.
Dopler
Цитата(SasaVitebsk @ Feb 21 2007, 16:49) *
Dopler и у меня и у любого: после обработки прерывания возврат будет осуществлён в точку вызова. То есть в прерывание как вы и хотите. Просто увеличивается глубина вложенности (размер стека) и необходимо следить за общими ресурсами. Например нельзя модифицировать одну и ту же переменную в данных прерываниях.


Вы неправильно поняли смысл вопроса, я его тоже с первого раза неправильно понял.
Вопрос не просто во вложенных прерываниях, здесь никаких проблем нет. Вопрос в следующем:

1. Есть 2 прерывания (1 - не критичное, 2 - критичное).
2. Когда мы в первом прерывании, срабатывает второе.
3. Переходим на второе, запускаем преобразование АЦП - длительное. Не хотим ждать его завершения (просто простаивать) и хотим вернуться к прерваному прерыванию. Важно - прерывание 2 не выполнено до конца!.
4. Каким-либо способом возвращаемся в прерывание 1.
5. Доделаем дела в 1 и переходим в 2.
6. Доделываем 2 (дожидаемся конца преобразования, наслаждаемся данными).
muravei
2 Dopler
По моему в UART, перед reti надо флаг в единицу.
SS85
Цитата(muravei @ Feb 21 2007, 19:26) *
2 Dopler
По моему в UART, перед reti надо флаг в единицу.


Не надо, сам установиться.
muravei
Цитата(SS85 @ Feb 21 2007, 18:51) *
Не надо, сам установиться.

Не факт, а если обработка прерывания UART не будет прервано таймером?
Dopler
Цитата(muravei @ Feb 21 2007, 18:54) *
Цитата(SS85 @ Feb 21 2007, 18:51) *

Не надо, сам установиться.

Не факт, а если обработка прерывания UART не будет прервано таймером?



Все зависит от частоты срабатывания тех и других прерываний. Я думаю, в UART перед выходом флаг лучше установить (хуже от этого точно не будет), тогда работать будет при любых раскладах. Еще начальное значение флага тоже 1.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.