реклама на сайте
подробности

 
 
> продолжить прерывание, atmega128 winavr
Mikron
сообщение Feb 9 2011, 14:07
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 82
Регистрация: 1-03-10
Пользователь №: 55 731



Добрый день

есть некоторый код
Код
void funс(void){
    cli();
    ...
    sei();
}
ISR(INT0_vect){
    ...}
ISR(USART1_RX_vect){
    ...}
ISR(USART1_TX_vect){
   ...
   func();
   ...}
ISR(USART1_UDRE_vect){
...  }
...

Функцию я вызываю из прерывания, во время её выполнения прерывания нужно запретить.
Когда я их снова разрешу, то могут возникнуть любые прерывания, а не продолжалось USART1_TX, так ведь?
Вопрос, как сделать так, что бы после разрешения прерываний разрешалось только USART1_TX

Спасибо за помощь
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 27)
Палыч
сообщение Feb 11 2011, 14:57
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(ILYAUL @ Feb 11 2011, 16:21) *
У Вас счётчик уже обнулился , зачем лишний обработчик прерывания
Ну, вроде ясно сказано:
Цитата(demiurg_spb @ Feb 11 2011, 14:40) *
Чтобы максимально быстро перевести драйвер RS485 в на приём и освободить линию после завершения передачи последнего байта.
Чтобы передатчик не выключить раньше, чем будут переданы данные...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 11 2011, 15:25
Сообщение #17


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Похоже Илья упускает момент буферирования регистра UDR (один байт выплёвываем, а ещё 2 ждут в очереди).
И может показаться что передача окончена - софтовый fifo опустошили, а на самом деле аппаратный fifo ещё содержит данные для передачи.
Так вот TXC скажет нам когда действительно всё отправлено.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 11 2011, 15:40
Сообщение #18


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(ILYAUL @ Feb 11 2011, 14:36) *
Причём здесь мнонгозадачность и DS18B20. Если Вы возьмёте листок бумаги и посчитаете поведение USART при использовании UDRE в качестве прерывания для обмена с DS , то увидите что , если не изменяет память, на 9 байте начинает лезть ошибка приема ответа DS .

Ничего не понимаю! Цель уарта при обмене с далласом - формировать точные времянки без отрыва МК от задачи. Причем тут вообще UDRE? Какое он отношение к времянкам имеет, если его основное назначение - помочь несчасному в обеспечении непрерывной передачи данных? cranky.gif
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 11 2011, 15:51
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(demiurg_spb @ Feb 11 2011, 18:25) *
...один байт выплёвываем, а ещё 2 ждут в очереди
А, разве не один "выплёвываем" (из регистра сдвига), а ещё один ждёт (в регистре данных)?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Feb 11 2011, 18:16
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(demiurg_spb @ Feb 11 2011, 18:25) *
Похоже Илья упускает момент буферирования регистра UDR (один байт выплёвываем, а ещё 2 ждут в очереди).
И может показаться что передача окончена - софтовый fifo опустошили, а на самом деле аппаратный fifo ещё содержит данные для передачи.
Так вот TXC скажет нам когда действительно всё отправлено.

Нет не упускаю, один в регистре сдвига , второй в UDR. И так ситуация , тот что в регисре сдвига - предпоследний байт. В UDR - последний, возражений нет, надеюсь.
Поехали, переходим к языку , который здесь понимают лучше чем русский . Кстати вот это "... буферирования регистра UDR ..." и мешает работать нормально с DS.

Код
USART1_UDRE:
                      push ....... не комментирую
                      ________  сам обработчик
                      dec   count; вычитаем счётчик количества передаваемых байт ( наш мвассив данных )
                      brne  END; проверяем всё передали, если нет всё уходим из обработчика
; Всё передали ---------------------------
                       ldi     temp,1<<RXCIE1|0<<UDRIE1|1<<RXEN1|1<<TXEN1; 0 - в UDRIE написал для наглядности-на самом деле его можно и не писать
                       sts    UCSR1B,temp  ; Изменили  режим работы USART
END:                pop  ......
                       reti


Мы изменили режим работы при передачи в UDR последнего байта массива. Он ещё "телепается" или в UDR или ,если повезло ему , в сдвиговом регистре , что очень мало вероятно.
Какое будет следующее прерывание- только прием, что там с передатчиком начхать. Пусть он себе передает дальше , но как только slave , захочет нам что-то передать , мы уже готовы.
Итог: Всё мы готовы принимать данные.

С вариантом TX: Даже страшновато писать , хоть и asm

Код
USART1_UDRE:
                      push ....... не комментирую
                      ________  сам обработчик
                      dec   count; вычитаем счётчик количества передаваемых байт ( наш мвассив данных )
                      brne  END; проверяем всё передали, если нет всё уходим из обработчика
; Всё передали ---------------------------
                       ldi     temp,0<<UDRIE1|1<<RXEN1|1<<TXEN1; 0 - в UDRIE написал для наглядности-на самом деле его можно и не писать
                       sts    UCSR1B,temp  ; Изменили  режим работы USART
END:                pop  ......
                       reti


MAIN: Торчим в Main и возможно чем-то заняты , если не в цикле rjmp main
И вот оно счастье

Код
USART1_TXC:
                      push  ...........
; Естественно SREG - а куда же без него , туда же
                       ldi     temp,1<<RXCIE1|0<<UDRIE1|1<<RXEN1|1<<TXEN1
                       sts    UCSR1B,temp  ; Опять изменили  режим работы USART
                       pop ..............
                       reti


И итог: Всё мы готовы принимать данные.
И что , мы в той же точке т.к. пока мы не изменим режим USART, о каком приёме может идти речь. Вот оно того стоило ждать этот USART1_TXC

Цитата
Ничего не понимаю! Цель уарта при обмене с далласом - формировать точные времянки без отрыва МК от задачи. Причем тут вообще UDRE? Какое он отношение к времянкам имеет, если его основное назначение - помочь несчасному в обеспечении непрерывной передачи данных?

Времянки от нас никуда не денутся- мы байт передали (1) или (0) и тут же должны вернуть его в массив данных,если работаете с SRAM, особенно при чтении температуры , когда каждый байт (Чтение 1) - возвращает значение или 0 или 1 и "выстрел" сразу все единиц через UDRE к чему приведёт? RX-то неуспевает - там ведь где-то ещё ответ только от первого байта принимается, а TX - уже второй передает. Посчитайте ,учитывая обработку приема - сколько тактов при Вашей частоте . И очень интересный материал:


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 11 2011, 19:01
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(ILYAUL @ Feb 11 2011, 21:16) *
Итог: Всё мы готовы принимать данные.
Да, USART готов принимать данные. Но, за USART'ом, обычно, стоит некая микросхема-драйвер, которая как раз может быть и не готовой для приёма, и нужно дождаться окончания передачи и переключить её на приём...
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Feb 11 2011, 21:40
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Палыч @ Feb 11 2011, 22:01) *
Да, USART готов принимать данные. Но, за USART'ом, обычно, стоит некая микросхема-драйвер, которая как раз может быть и не готовой для приёма, и нужно дождаться окончания передачи и переключить её на приём...

Классная получается тема, сейчас мы USART, разберём по косточкам и при возникновении тем на эту тематику будем давать ссылку. smile3046.gif
Давайте рассуждать - эта некая микросхема состоит из двух буферов - один на прием , второй передача и имеют один управляющий вход , который в зависимости , логический 0 или 1 , переключается в передача -приём. Не ошибся? Вариантов нет - случай 2. Но это всё абстракция, в любом случае при разработке системы учитываешь и такие вещи.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 11 2011, 22:22
Сообщение #23


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(ILYAUL @ Feb 12 2011, 00:40) *
Но это всё абстракция

Эта абстрация называется RS-485...
А вот насчет далласа на уарте - ну настолько несимпатичная реализация... На одном пине TxD- включаем уарт, отправляем 0х30 для скорости 1,875мкс/бит, по TXC отключаем уарт и читаем состояние пина(пин на ввод). Остальные элементы - не проблема.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 12 2011, 08:25
Сообщение #24


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Палыч @ Feb 11 2011, 18:51) *
А, разве не один "выплёвываем" (из регистра сдвига), а ещё один ждёт (в регистре данных)?
Возможно и так, но мне что-то помнится циферка 2.
Вот глянул DS на mega128:
Цитата
In addition to the recovery units, the receiver includes a parity checker, control logic, a Shift Register and a two level receive buffer (UDR).
Не уверен отлична-ли глубина буфера регистра UDR при передаче... Но на приём сдвиговый регистр + ещё 2 уровня буфера.
Посмотрел картиночку с блок-схемой UARTa - на передачу похоже действительно лишь один уровень буферизации.
Вы похоже правы.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Feb 12 2011, 11:17
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(_Pasha @ Feb 12 2011, 01:22) *
Эта абстрация называется RS-485...

Вот имено такой ответ и называется- абстракция.
А моя не абстракция называется MAX232xxx ,4332....Вы что считаете я не найду буфер RS485, который не надо переключать? Давайте всё таки придерживатся предмета спора и уважать мнение друг друга. Мы не говорили об "обвязки" AVR .Мы говорили , как он работает.
P/S/ Я выложил не тот материал, есть пример работы с DS18B20 от производителя , Там собственнно есть всё - вплоть до написанных функций на Си, но я поменял комп и он в стадии разбора -куды и чё. Но я не забуду и обязательно выложу пример и протокол , как работать used USART и c DS18B20 - Application.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 12 2011, 11:43
Сообщение #26


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(ILYAUL @ Feb 12 2011, 15:17) *
Вот имено такой ответ и называется- абстракция.

sad.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 12 2011, 13:05
Сообщение #27


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ILYAUL @ Feb 12 2011, 14:17) *
Давайте всё таки придерживатся предмета спора
Я уже потерял нить...
Напомните за что мы тут спорим? :-)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Feb 13 2011, 04:45
Сообщение #28


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(demiurg_spb @ Feb 12 2011, 16:05) *
Напомните за что мы тут спорим? :-)

Да ни о чём , так просто smile3009.gif , что бы мозги не застаивались biggrin.gif


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 10:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01464 секунд с 7
ELECTRONIX ©2004-2016