После приема восьми битов данных стоп-бит проверяется на равенство лог. 1. Если стоп-бит равен 0, значит, произошла ошибка кадрирования. Эта ситуация сигнализируется возвратом —1 в ERR. При использовании других, более развитых схем могут возвращаться сообщения об ошибках разных типов. Например, при использовании контроля четности может быть возвращена ошибка четности.
В качестве примера рассмотрим фрагмент кода, осуществляющий передачу 3-символьного сообщения «РIС». К счастью, ассемблер предоставляет программисту возможность вместо ASCII-кодов символов записывать сами символы в одинарных кавычках, как описано на стр. 267.
; Передадим строку "PIC"
movlw ’P’; Аналогично movlw h’50’ (ASCII-код символа «Р»)
movwf DATA_OUT; Помещаем в память данных
call PUTCHAR; Передаем
movlw ’I’; Аналогично movlw h’49’ (ASCII-код символа «I»)
movwf DATA_OUT; Помещаем в память данных
call PUTCHAR; Передаем
movlw ’C’; Аналогично movlw h’43’ (ASCII-код символа «С»)
movwf DATA_OUT; Помещаем в память данных
call PUTCHAR; Передаем
На самом деле такая реализация асинхронного обмена по последовательному каналу годится только в самых простых случаях. Например, если не отслеживать непрерывно состояние вывода RX, можно пропустить передачу или потерять синхронизацию. Кроме того, при таком подходе трудно реализовать дуплексную связь, не говоря уже о том, что большая часть вычислительной мощности микроконтроллера в данном случае тратится на выполнение циклов задержки. Эту ситуацию можно несколько улучшить, используя для формирования задержек внутренний таймер и работая по прерываниям. Однако в большинстве микроконтроллеров PIC, выпускающихся в «многовыводных» корпусах (более 28 контактов), для реализации асинхронного обмена данными имеется встроенный коммуникационный порт.
Одним из первых применений новых технологий производства БИС, появившихся в конце 60-х годов, было создание отдельной микросхемы асинхронного последовательного порта, называемого
Базовая структура микросхемы UART показана на Рис. 12.21. В любой подобной микросхеме можно выделить три основные части. Сдвиговый регистр передатчика преобразует исходные данные из параллельных в последовательные для выдачи через вывод ТХ, обрамляя их старт- и стоп-битами. С этим регистром связан буферный регистр, хранящий данные для последующей передачи. Регистр состояния содержит флаг (TBUF на рисунке), показывающий, что буфер пуст и готов для записи новых данных.
Рис. 12.21.
Сдвиговый регистр приемника удаляет из принятой посылки старт- и стоп-биты, перегружая принятые данные в тот или иной буферный регистр. Одновременно с этим устанавливается флаг (RBUF в нашем случае), благодаря чему программа может определить наличие новых данных. Эти данные необходимо прочитать из буферного регистра до сборки следующего пакета, в противном случае возникнет переполнение, и данные будут потеряны.
Прием и передача кадра не взаимосвязаны, т. е. могут перекрываться, однако скорости обмена обычно делаются одинаковыми.