Сделал прием и отправку без использования прерываний, стало намного лучше, но все равно иногда теряются байты. Подскажите как можно реализовать два стоповых бита?
Зачем Вам нужны два стоповых бита? Если происходит потеря байтов, то есть два пути. 1 Выяснить причину и устранить ее. 2. Изменить верхний уровень протокола для компенсации этой проблемы. Второй путь не исключает первого и наоборот. Проверка целостности информации - стандартная фича любого вменяемого протокола.
Открыта удобная площадка с выгодными ценами, поставляющая весь ассортимент продукции, производимой компанией MEAN WELL – от завоевавших популярность и известных на рынке изделий до новинок. MEAN WELL.Market предоставляет гарантийную и сервисную поддержку, удобный подбор продукции, оперативную доставку по России.
На сайте интернет-магазина посетители смогут найти обзоры, интересные статьи о применении, максимальный объем технических сведений.
Продукция MOSO предназначена в основном для индустриальных приложений, использует инновационные решения на основе более 200 собственных патентов для силовой электроники и соответствует международным стандартам. LED-драйверы MOSO применяются в системах наружного освещения разных отраслей, включая промышленность, сельское хозяйство, транспорт и железную дорогу. В ряде серий реализована возможность дистанционного контроля и программирования работы по заданному сценарию. Разберем решения MOSO
подробнее>>
Всегда думал, что стоп-биты дают время для обработки принятого байта и впридачу позволяют обнаружить повреждение линии, когда в ней "зависает" ноль... А вот что они помогают победить рассинхронизацию, слышу впервые...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Стоп бит служит не целям синхронизации, а для детектирования ошибок по скорости приёма. Для синхронизации имеется стартовый бит, который запускает сдвиговый регистр и входной фильтр.
Подозреваю что у меня различные скорости, хоть и настраиваю по формуле из datashit. Первый контроллер от второго принимает все правильно. но вот второй принимает не те байты. Например передаю 0xAA а принимает 0xD5 и иногда 0x00.
Из приведенного кода совершенно непонятно какое значение предделителя установлено для CPU в конфиге (CPDIV) И вообще, нужно привести конфиг полностью. ЗЫ. На вскидку. SPBRG=12 (0x0C) Считаем рейт: 24000000/(4*(12+1))=24000000/52=461538 бит/с В каком месте тут 115200 ? (каламбур! ) При 24 МГц и рейте 115200 получается SPBRG=51 (0x33) При 19,44 МГц и рейте 115200 получается SPBRG=41 (0x29)
Из приведенного кода совершенно непонятно какое значение предделителя установлено для CPU в конфиге (CPDIV) И вообще, нужно привести конфиг полностью. ЗЫ. На вскидку. SPBRG=12 (0x0C) Считаем рейт: 24000000/(4*(12+1))=24000000/52=461538 бит/с В каком месте тут 115200 ? (каламбур! ) При 24 МГц и рейте 115200 получается SPBRG=51 (0x33) При 19,44 МГц и рейте 115200 получается SPBRG=41 (0x29)
Судя по даташиту данная формула справедлива для синхронного приемо передатчика, у меня же асинхронный поэтому формула выглядит так: Считаем рейт: 24000000/(16*(12+1))=24000000/208=115384 бит/с
Конфиг прикрепил
Понял, что скорость 115200 не подходит. для 19,44 погрешность больше 4 %. Пересчитал для скорость 57600 теперь передает и принимает не то что нужно
Вложения:
Комментарий к файлу: Config Config.png [41.1 KiB]
Скачиваний: 222
Судя по даташиту данная формула справедлива для синхронного приемо передатчика
Из даташита этого НЕ следует. Вы ошиблись с расчетом. Множитель для 16-разрядного хай спид - 4, а не 16. Откройте любой другой даташит на 18-ое семейство, где у таблицы есть рамка и убедитесь.
Приведенные мной коэффициенты рейта дают почти нулевую погрешность для обозначенных частот. Это во первых, а во вторых, для УАРТА допустима погрешность до 10%. И никаких ошибок в пределах этой погрешности не будет.
Да, у меня в даташите без таблицы. Настроил скорости исходя из новой формулы. Но почему то всеравно приходит не то что нужно. если на 19,44 при отправке не добавить задержку 40 us то передача не завершается.
Милостивый государь, сделайте одолжение, приведите схему связанную с этим каналом между двумя МК с указанием ног используемых на МК. А так же ОБА кода инициализации. Задержка Ваша никакого практического смысла не имеет. UART-у болт положить на задержки. Он начинает прием со старт-бита, далее квантуя сигнал с заданным рейтом. При передаче после загрузки байта немедленно начинается передача и остановить ее невозможно.
UART1_Write(0x15); //delay_us(500); end; i:=0; while (i <= 15) do begin if (UART1_Data_Ready = 1) then begin dataReadUart[i] := UART1_Read(); inc(i); PIR1.RC1IF:=0; end end;
прием данных procedure interrupt; begin if RC1IE_bit=1 then count:=0; while (count <= 7) do begin if (UART1_Data_Ready = 1) then begin pUART_Read[count] := UART1_Read(); inc(count); PIR1.RC1IF:=0; end end; WriteUart(); end;
отправляем:
procedure WriteUart(); var cmd: byte; begin pUART_Write := pUART_Read; PIR1.RC1IF:=0; PIE1.RC1IE:=0; GIE_bit := 0; INTCON.PEIE := 0;
И што мне с этими портянками делать? Лень нарисовать фрагмент связанный с обсуждаемым вопросом? И не надо ничего совмещать с SPI. Решите сначала проблему связи УАРТов, а потом будете пытаться что либо совмещать...
Цитата:
UART1_Write(0x15)
Где тело функции? Как обеспечивается зазор между загрузкой байт? Если у Вас не работает пакетный обмен, то за каким хреном Вы пытаетесь передавать пакеты? Чтобы все запутать?
я не схемотехник., в рисовании схем вообще не разбираюсь. Просто сначала проект была сделана часть проекта, теперь добавилось вторая часть с использованием UART с SPI все отлажено и работает без сбоев.
Уважаемый, если у Вас все работает без сбоев, то к чему вся эта головоломка? В конце концов, все можно посмотреть осциллографом. А если его нет, но можно написать фрагмент кода с обменом ОДНИМ БАЙТОМ, выяснив все вопросы по скорости и взаимодействию. При пакетном обмене необходимо обеспечивать время на передачу каждого байта, а так же на возможности принимающей части обработать принимаемый байт между приходом байт. Вы пытаетесь запустить некий комплексный механизм сразу оптом. Это несерьезно при Вашей схемотехнической подготовке. Дробите задачу.
Спасибо всем за подсказки и советы. Проблема решена. Оказалось виноватым железо. Контроллеры между собой соединены оптикой, и вот приемник PLR135/T6 не держит постоянную составляющую. В даташите по этому поводу ничего не сказано. Решением данной проблемы было передача 0 и 1 с помощью несущих частот.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения