|
"Реальное время" и связь по UART |
|
|
|
Feb 20 2007, 19:29
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Цитата(muravei @ Feb 20 2007, 19:08)  Делаю систему, кот. должна измерять в реальном времени и общаться по UARTу Вопрос в след. : допустим принят байт -обработка(RX) его считала и разрешила прерывания (но сама подпрограмма обработки RX не завершена) , а тут " откуда не возмись" прерывание от таймера-пора мерять. Мерим и тупо ждем конца измерения(ну понятно разрешаем- запрещаем прерывания), но хотелось бы вернуться в прерванное (RX) доделать его .Надо как то извратиться со с стеком, может кто-то уже придумал подобное. Ничего не понятно, зачем извращаться то? После обработки таймера вы автоматом вернетесь в прерывание UART.
|
|
|
|
|
Feb 20 2007, 21:10
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 11-01-06
Из: Украина Ровно
Пользователь №: 13 066

|
Цитата(muravei @ Feb 20 2007, 18:08)  Делаю систему, кот. должна измерять в реальном времени и общаться по UARTу Вопрос в след. : допустим принят байт -обработка(RX) его считала и разрешила прерывания (но сама подпрограмма обработки RX не завершена) , а тут " откуда не возмись" прерывание от таймера-пора мерять. Мерим и тупо ждем конца измерения(ну понятно разрешаем- запрещаем прерывания), но хотелось бы вернуться в прерванное (RX) доделать его .Надо как то извратиться со с стеком, может кто-то уже придумал подобное. Если Вам так критичны по времени (не можете дожидаться обработки RX) сами моменты начала измерений, то тупо ждать конца измерения не логично. Лучше запустить преобразование и заниматься чем-нибудь более полезным, или вернуться в обработку предыдущего прерывания (если в нем разрешали прерывания), или спать на худой конец. Тут главное, чтобы на обработку таких вложеных прерываний хватило обьема стека. А если его хватит, то вернетесь туда, откуда Вас прервали, обязательно! А по завершении измерения возникнет прерывание, в котором и воспользоваться измеренной величиной. Просто соответствующим образом настроить АЦП.
|
|
|
|
|
Feb 20 2007, 21:54
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Цитата(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 Конечно, громоздко, зато корректно.
|
|
|
|
|
Feb 20 2007, 22:44
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(muravei @ Feb 20 2007, 20:08)  Делаю систему, кот. должна измерять в реальном времени и общаться по UARTу Вопрос в след. : допустим принят байт -обработка(RX) его считала и разрешила прерывания (но сама подпрограмма обработки RX не завершена) , а тут " откуда не возмись" прерывание от таймера-пора мерять. Мерим и тупо ждем конца измерения(ну понятно разрешаем- запрещаем прерывания), но хотелось бы вернуться в прерванное (RX) доделать его .Надо как то извратиться со с стеком, может кто-то уже придумал подобное. Посмотри мою прогу по многоуровневому прерыванию на nix-06.nm.ru Нес чем извращаться не надо. Разрешил и всё! Если из под ASM, то нельзя использовать общие регистры. Если из под Си, то внимательно смотреть на общие переменные. Правильно написанная программа будет работать и так.
|
|
|
|
|
Feb 21 2007, 11:56
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(muravei @ Feb 21 2007, 12:39)  Цитата(SasaVitebsk @ Feb 20 2007, 22:44) 
Посмотри мою прогу по многоуровневому прерыванию на nix-06.nm.ru
Нес чем извращаться не надо. Разрешил и всё!
Во-первых, что-то не нашел, а во-вторых , по-моему , я о другом. находится по той ссылке здесь: Статьи/прерывания/приоритетность. На сколько я понял именно об этом. О вложенных прерываниях. Если выложите текст обоих прерываний, то я поясню.
|
|
|
|
|
Feb 21 2007, 16:49
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(muravei @ Feb 21 2007, 16:50)  Цитата(bodja74 @ Feb 21 2007, 12:38)  Все решается гораздо проще  Задерживать придется навсегда, лишних сигналов нет. Цитата(SasaVitebsk @ Feb 21 2007, 11:56)  Статьи/прерывания/приоритетность. На сколько я понял именно об этом. О вложенных прерываниях. Это я видел , так у меня сделано. Я о другом, думаю как наоборот вернуться в предыдущее прерываниеиз более приоритетного, что бы в нем не скучать , во время измерений. В принципе Dopler ответил. Dopler и у меня и у любого: после обработки прерывания возврат будет осуществлён в точку вызова. То есть в прерывание как вы и хотите. Просто увеличивается глубина вложенности (размер стека) и необходимо следить за общими ресурсами. Например нельзя модифицировать одну и ту же переменную в данных прерываниях.
|
|
|
|
|
Feb 21 2007, 18:21
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Цитата(SasaVitebsk @ Feb 21 2007, 16:49)  Dopler и у меня и у любого: после обработки прерывания возврат будет осуществлён в точку вызова. То есть в прерывание как вы и хотите. Просто увеличивается глубина вложенности (размер стека) и необходимо следить за общими ресурсами. Например нельзя модифицировать одну и ту же переменную в данных прерываниях. Вы неправильно поняли смысл вопроса, я его тоже с первого раза неправильно понял. Вопрос не просто во вложенных прерываниях, здесь никаких проблем нет. Вопрос в следующем: 1. Есть 2 прерывания (1 - не критичное, 2 - критичное). 2. Когда мы в первом прерывании, срабатывает второе. 3. Переходим на второе, запускаем преобразование АЦП - длительное. Не хотим ждать его завершения (просто простаивать) и хотим вернуться к прерваному прерыванию. Важно - прерывание 2 не выполнено до конца!. 4. Каким-либо способом возвращаемся в прерывание 1. 5. Доделаем дела в 1 и переходим в 2. 6. Доделываем 2 (дожидаемся конца преобразования, наслаждаемся данными).
|
|
|
|
|
Feb 21 2007, 18:51
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-03-06
Пользователь №: 15 230

|
Цитата(muravei @ Feb 21 2007, 19:26)  2 Dopler По моему в UART, перед reti надо флаг в единицу. Не надо, сам установиться.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|