Цитата(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 - уже второй передает. Посчитайте ,учитывая обработку приема - сколько тактов при Вашей частоте . И очень интересный материал: