Labinskiy 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба В даташите написано что флаг нужно сбрасывать записью в него единицы. Можно так делать: /* Процедура одиночной передачи байта in : reg_data */ USART_send: sbis UCSR1A,UDRE1 ; ожидание очистки буфера передатчика rjmp USART_send out UDR1,reg_data ; Загрузить байт данных в буфер, начать передачу sbi UCSR1A,TXC1 ; очитска TXC ret // USART_send ? или нужно сначала прочитать регистр, установить этот бит в 1 и записать обратно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба Так делать можно, но 1. Сбрасываете TXC, а контролтруете UDRE 2. Сброс TXC осуществляется после загрузки данных в UDR, и, если приведенная процедура выполняется при открытых прерываниях, то возможно длительное по времени прерывание после записи в UDR. И, возможно, Вы сбросите выставленный (и нужный Вам) флаг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mse 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба Читай даташыт. Если пищешь в УДР по УДРЕ, то ТХЦ не устанавливается. Он установится, если передача текущего завершена, а УДРЕ установлен, т.е. передан последний байт посылки. Т.е. во входном буфере ничего нет, а передача завершена. ТхЦ, в натуре... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Labinskiy 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба Что-то не совсем понял... Там написано что этот флаг сбрасывает аппаратно при заходе в прерывание по окончания передачи(если это пр-е включено) или его можно сбрасывать вручную записью в него 1. у меня прерывание по окончанию передачи выключено поэтому при каждой записи в UDR я флаг сбрасываю а по окончанию передачи флаг взводится сам. Т.е. из другой части программы я по этому флагу могу определить передаются ли сейчас какие-либо данные по usart-у.. я все правильно понял? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mse 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба я все правильно понял? В прерывании(или при поллинге) по УДРЕ, флаг ТхС просто не подымется, если подбрасываешь байтики, как только вскочил УДРЕ. Зачем при этом ТхС сбрасывать - не знаю, бо он вскочит при пустом буфере и пустом передатчике. Если ты его вообще не анализируешь и не пользуешься(а смысл есть только при работе по РС-485, например, для переключения приёмо-передаччика на туда-сюда), то не парься и забей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба UDRE это флаг "от лукавого", выигрыш в скорости - никакой, а проблем в обслуживании масса. Например, тот факт что UDRE меняет состояние до того как кадр был фактически отправлен, не дает возможности использовать его в качестве сигнала для смены направления RS485. В своей практике, я использую исключительно TXC. По прерыванию TXC переключаю драйвер 485 (если есть) на прием, далее проверяю есть ли что еще отправить, и отправляю следующий байт данных (если есть) вместе со сменой направления 485-го на передачу. Не забочусь о чтении/сбросе UDRE/TXC т.к. по прерыванию TXC сбрасывается сам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Labinskiy 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба Зачем при этом ТхС сбрасывать - не знаю, бо он вскочит при пустом буфере и пустом передатчике. Да, это мне и нужно, я жду когда _все_ данные(из буфера и сдвигового регистра) передадутся и после этого перевожу контроллер в Suspend режим. Просто вопрос изначально был про использование команды sbi. В Евстифееве(МК семейств Tiny и Mega фирмы Atmel) на 247 странице написано что сбрасывать один флаг в EIFR этой командой нельзя... Вот я и уточнил ;) ой, не Suspend а Standby )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mse 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба Просто вопрос изначально был про использование команды sbi. В Евстифееве(МК семейств Tiny и Mega фирмы Atmel) на 247 странице написано что сбрасывать один флаг в EIFR этой командой нельзя... Вот я и уточнил ;) Читай не Ефстифеева или кого там ещё, а ДШ на кристалл. UDRE это флаг "от лукавого", выигрыш в скорости - никакой, а проблем в обслуживании масса. Например, тот факт что UDRE меняет состояние до того как кадр был фактически отправлен, не дает возможности использовать его в качестве сигнала для смены направления RS485. Нормальный флаг. Позволяет тупо накачивать данные в УАРТ в прерывании УДРЕ. А направление менять, опять-же, тупо по факту входа в ТхС. Чего здесь "лукавого"? Читай ДШ, думай, делай... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба Нормальный флаг. Позволяет тупо накачивать данные в УАРТ в прерывании УДРЕ. А направление менять, опять-же, тупо по факту входа в ТхС. Чего здесь "лукавого"? Читай ДШ, думай, делай... Лукавого тут - зачем обслуживать 2 прерывания там где хватает одного. 2 прерывания использовать там где хватает одного - это будет так как вы и сказали - "тупо". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mse 0 2 июля, 2007 Опубликовано 2 июля, 2007 · Жалоба Лукавого тут - зачем обслуживать 2 прерывания там где хватает одного. 2 прерывания использовать там где хватает одного - это будет так как вы и сказали - "тупо". Чё за проблема, обслуживайте одно. Остро. ТхС в руки. Можно ещё сделать один обработчик по приёму и передаче, бо особо одарённым хватило бы и одного флага. А ещё можно на один обрабоччик свалить все события в МК... Я-ж держусь ламерского подхода - если изготовитель заложил ресурс, позволяющий "тупо" разруливать ситуаццыю, то я предпочитаю не кривляться, а упростить и упорядочить себе жизнь, даже по мелочи. ;О) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ae_ 2 3 июля, 2007 Опубликовано 3 июля, 2007 · Жалоба ... Просто вопрос изначально был про использование команды sbi. В Евстифееве(МК семейств Tiny и Mega фирмы Atmel) на 247 странице написано что сбрасывать один флаг в EIFR этой командой нельзя... Вот я и уточнил ;) ... Наверное опечатка, не EIFR а ETIFR. И вот две причины, по которым нельзя пользоваться инструкцией SBI: "Some of the Status Flags are cleared by writing a logical one to them. Note that the CBI and SBI instructions will operate on all bits in the I/O Register, writing a one back into any flag read as set, thus clearing the flag. The CBI and SBI instructions work with registers 0x00 to 0x1F only." Т.е. по SBI перезаписываются все биты, а не только указанный. Тем самым, остальные биты, которые были=1 будут сброшены, если они тоже сбрасываются записью в них 1. И второе, SBI/CBI работает только с адресами в/в от 0 до 0x1F. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 3 июля, 2007 Опубликовано 3 июля, 2007 · Жалоба то я предпочитаю не кривляться, а упростить и упорядочить себе жизнь, даже по мелочи. ;О) Событие TXC означает: 1. что передача окончена. 2. можно слать сл. символ. С ним не надо "кривляться". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Labinskiy 0 3 июля, 2007 Опубликовано 3 июля, 2007 · Жалоба Всем спасибо, вопрос решен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mse 0 4 июля, 2007 Опубликовано 4 июля, 2007 · Жалоба Событие TXC означает: 1. что передача окончена. 2. можно слать сл. символ. С ним не надо "кривляться". Прально. ;О) А у тупых пацанов УДРЕ говорит, что можно слать следующий символ. А ТхС, что передача окончена. И тупой пацан в прерывании ТхС не занимается самоанализом: кончилась у него строка или нет, а тупо переключает дриверок 485, например, на приём: .org $xxx SBI(CBI) portN,pinN RETI Примитивщина, кароче. Никакого полёта мысли. И инициация передачи строки выглядит тоже тупо: подготовил строку и установил УДРИЕ. Фсё. Конечно, сознаю, что это не круто, ну, блин, не создан я для высокохудожественного программирования. ;О) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 4 июля, 2007 Опубликовано 4 июля, 2007 · Жалоба Прально. ;О) А у тупых пацанов УДРЕ говорит, что можно слать следующий символ. А ТхС, что передача окончена. И тупой пацан в прерывании ТхС не занимается самоанализом: кончилась у него строка или нет, а тупо переключает дриверок 485, например, на приём: Дык, какая разница где проверять кончилась строка или не кончилась - все равно проверять-то надо.. По TXC код у меня такой же как у вас в точности, на толстых мегах он прямо в таблице векторов помещается. Я чтобы латентность прерываний сократить вычитку "строк" (у меня буфер кольцевой) в основном цикле программы делаю часто. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться