USART в PIC18

интерфейс usart

Некоторые устройства, такие как GPS, GSM, RFID, датчики и т. д., должны взаимодействовать с микроконтроллером PIC для передачи или получения информации. Для связи с микроконтроллером PIC используются несколько коммуникационных протоколов, таких как RS232, SPI, I2C, CAN и т. д.

По сути, протокол представляет собой набор правил, согласованных как отправителем, так и получателем, отвечающий на вопросы:

  • Как упаковываются данные?
  • Сколько битов составляет символ?
  • Когда данные начинаются и заканчиваются?

Рассмотрим протокол передачи данных USART на примере микроконтроллера PIC18F4550 при подключении его к компьютеру через RS232. Данный материал подойдет для всей серии PIC18.

PIC18F4550 имеет встроенный модуль USART, который полезен для последовательной связи. С его помощью мы можем отправлять/принимать данные на компьютер или другие устройства.

USART также используется для взаимодействия PIC с различными модулями, такими как Wi-Fi (ESP8266), Bluetooth, GPS, GSM и т. д.

Мы увидим, как устанавливается связь между микроконтроллером PIC и ПК через USART с использованием протокола RS232.

Мы также увидим, как взаимодействовать с ноутбуками, которые не имеют порта RS232 и вместо этого используют порт USB.

Начнем с последовательной связи с использованием PIC18F4550.

Асинхронная связь

PIC18F4550 имеет встроенный асинхронный приемник-передатчик. Асинхронность означает, что каждый символ (байт данных) помещается между стартовым и стоповым битами. Стартовый бит всегда равен 0 (низкий), а стоповый бит всегда равен 1 (высокий).

Передача байта USART в PIC
Рисунок 1. Асинхронная передача байта USART

Битрейт и скорость передачи

Битрейт передачи данных при последовательной передаче данных указывается в битах в секунду (bps). Другая широко используемая терминология для бит/с — скорость передачи (baud rate). Она означает количество изменений сигнала в секунду. Здесь сигнал в битах, поэтому битрейт = скорость передачи.

Интерфейс подключения

Для подключения устройств через USART можно использовать разъем DB9. Хотя в разъеме и много контактов, нам не нужны все. Мы используем только контакты RX, TX и GND.

Преобразование уровней USART

ПК имеет уровни RS232, тогда как микроконтроллер PIC имеет уровни TTL. RS232 имеет разные уровни напряжения для логического 0 и 1. Чтобы сделать его совместимым с уровнями напряжения PIC TTL, мы должны использовать микросхему MAX232 или ее аналоги.

Подключение MAX232 к микроконтроллеру PIC
Рисунок 2. Схема подключения микросхемы MAX232 к микроконтроллеру PIC18F4550

Расчет скорости передачи

Как рассчитать скорость передачи в PIC18F4550?

\[ \text{Desired Baud Rate}=\frac{F_{osc}}{64\times({X+1})}-1 \]

Значение, которое будет загружено в регистр SPBRG (16-разрядный) PIC18F4550 для получения желаемой скорости передачи данных.

Значение SPBRG для требуемой скорости передачи рассчитывается так:

\[SPBRG=\frac{F_{osc}}{64\times\text{Desired Baud Rate}}-1\]

Предположим, Fosc = 8 МГц и скорость передачи = 9600 бит/с.

Тогда \[SPBRG = \frac{8 МГц}{64 × 9600} — 1\]

Следовательно, \[SPBRG = 12\]

Приведенная выше формула зависит от бита BRGH в регистре TXSTA.

Регистр TXSTA

Давайте подробно рассмотрим регистр TXSTA, который используется для настройки передачи.

Регистр TXSTA PIC18
Рисунок 3. Регистр TXSTA

TXEN : бит разрешения передачи

  • 0 = отключить передачу
  • 1 = включить передачу

BRGH : бит выбора высокой скорости передачи данных

  • 0 = низкая скорость
  • 1 = высокая скорость

Бит CSRC не используется для асинхронной связи.

TX9 : бит разрешения 9-ти битной передачи

  • 0 = выбрать 8-битную передачу
  • 1 = выбрать 9-битную передачу

SYNC : бит выбора режима USART

  • 0 = асинхронный режим
  • 1 = синхронный режим

SENDB : бит символа разрыва отправки

  • 0 = передача Sync Break завершена
  • 1 = отправить Sync Break при следующей передаче (сбрасывается аппаратно после завершения)

TRMT : передача бита состояния сдвигового регистра

  • 0 = TSR заполнен
  • 1 = TSR пуст

TX9D : 9-й бит передачи данных

Может быть битом адреса/данных или битом четности.

Загрузите рассчитанное значение непосредственно в регистр SPBRG.

Регистр RCSTA

В PIC18F4550 регистр RCSTA используется для настроек приема последовательных данных.

Регистр RCSTA микроконтроллера PIC
Рисунок 4. RCSTA регистр управления приемом и состояния

SPEN : включение последовательного порта

  • 0 = отключить последовательный порт для связи
  • 1 = включить последовательный порт для связи

RX9 : бит разрешения 9-ти битного приема

  • 0 = включить 8-битный прием
  • 1 = включить 9-битный прием

Как правило, мы используем 8-битный прием

SREN : бит разрешения одиночного приема

Не используется

CREN : бит разрешения непрерывного приема

  • 0 = отключить приемник
  • 1 = включить приемник для непрерывного приема байта данных

ADDEN : бит разрешения определения адреса

При RX9 = 1

  • 0 = Отключение определения адреса, все байты принимаются, а девятый бит может использоваться как бит четности
  • 1 = включить обнаружение адреса, разрешить прерывание и загрузить буфер приема, когда установлен бит RSR

При RX9 = 0

Неважно 0 или 1

FERR : бит ошибки кадра

  • 0 = нет ошибки кадрирования
  • 1 = ошибка кадрирования (можно обновить, прочитав регистр RCREG и получив следующий допустимый байт)

OERR : бит ошибки переполнения

  • 0 = нет ошибки переполнения
  • 1 = ошибку переполнения можно сбросить, очистив бит CREN.

RX9D : 9-й бит принимаемых данных

Это может быть бит адреса/данных или бит четности, который должен вычисляться пользовательской прошивкой.

Буфер данных и флаг прерывания для последовательной связи

Для передачи данных и приема данных в PIC18F4550 выделены 8-битные регистры буферы данных TXREG и RCREG соответственно.

Рисунок 5. Регистры TXREG и RCREG
  • Когда нам нужно передать данные, мы напрямую копируем эти данные в регистр TXREG. После завершения передачи 8-битных данных генерируется флаг прерывания TXIF.
  • Этот TXIF (флаг прерывания передачи) находится в регистре PIR1. Флаг TXIF устанавливается при передаче 8-битных данных. Затем буфер готов принять другие данные для передачи.
  • Также в регистре PIR1 находится RCIF (флаг прерывания приема). Когда этот флаг установлен, это указывает, что полный байт данных получен регистром RCREG. Немедленно прочитайте регистр RCREG. Теперь регистр RCREG готов к приему других данных.
  • Когда флаг RCIF не установлен, микроконтроллеру PIC приходится ждать приема полного байта данных.

Шаги для программирования PIC18F4550 USART

Инициализация

  1. Инициализируйте скорость передачи, загрузив значение в регистр SPBRG.
  2. Затем установите бит SPEN в регистре RCSTA для включения последовательного порта.
  3. Затем установите бит BRGH в регистр TXSTA для низкой или высокой скорости.
  4. Также очистите бит SYNC в регистре TXSTA для асинхронной связи.
  5. Установите бит TXEN в регистре TXSTA, чтобы разрешить передачу.
  6. Установите бит CREN в регистре RCSTA, чтобы разрешить прием.
#define F_CPU 8000000/64

void USART_Init(long baud_rate)
{
    float temp;
    TRISC6=0;        /* Сделайте вывод Tx выходным*/
    TRISC7=1;        /* Сделайте контакт Rx входным */
    /* Baud rate=9600, SPBRG = (F_CPU /(64*9600))-1*/
    temp= (( (float) (F_CPU) / (float) baud_rate ) - 1);     
    SPBRG = (int) temp;    
    TXSTA = 0x20;    /* включить передачу;*/
    RCSTA = 0x90;    /* Включение RX и последовательного порта */
}

Режим передачи

  1. Копируем данные, которые хотим передать в регистр TXREG.
  2. Следите за флагом TXIF, который устанавливается после завершения передачи.
Char USART_TransmitChar (char out)
{
   while (TXIF == 0);    /* Дождитесь флага прерывания передачи */
   TXREG = out;      /* Запись данных char для передачи регистра */    
}

Режим приема

  1. Следите за флагом RCIF, пока он не будет установлен в 1, что указывает на то, что в регистр RCREG принят полный 1 байт.
  2. Также проверьте наличие бита OERR. Если он установлен, отключите и включите бит CREN.
  3. Затем немедленно прочитайте регистр RCREG, чтобы избежать переполнения.
Char USART_ReceiveChar()
{
    while(RCIF==0);      /* дождитесь получения флага прерывания */
    if(RCSTAbits.OERR)
    {           
        CREN = 0;
        NOP();
        CREN=1;
    }
    return(RCREG);       /* получено в регистре RCREG и возвращено в основную программу */
}

Связь USART с использованием процедуры обслуживания прерываний (ISR)

Вышеупомянутая связь USART выполняется путем непрерывного опроса флага прерывания.

Однако опрос флага прерывания увеличивает энергопотребление микроконтроллера, а также он не может выполнять другие задачи, так как опрос прерывания выполняется непрерывно.

Подпрограмма обслуживания прерываний (ISR) выполняет код приложения всякий раз, когда происходит прерывание. И если прерывания не происходит, микроконтроллер может выполнять другие задачи.

Чтобы использовать USART ISR в PIC18F4550, необходимо включить GIE (разрешение глобальных прерываний), PEIE (разрешение периферийных прерываний) вместе с RCIE (разрешение прерывания приема) и TXIE (разрешение прерывания передачи).

Шаги для программирования PIC18F4550 USART с использованием прерывания

Инициализация с прерываниями

  1. Инициализируйте скорость передачи, загрузив значение в регистр SPBRG.
  2. Затем установите бит SPEN в RCSTA для включения последовательного порта.
  3. Затем установите бит BRGH в TXSTA для низкой или высокой скорости.
  4. Кроме того, очистите бит SYNC в регистре TXSTA для асинхронной связи.
  5. Установите бит TXEN в регистре TXSTA, чтобы разрешить передачу.
  6. Установите бит CREN в регистре RCSTA, чтобы разрешить прием.
  7. Включите GIE, PEIE, RCIE и TXIE для ISR.
#define F_CPU 8000000/64

void USART_Init(long baud_rate)
{   
    float temp;
    TRISC6=0;        /* Сделайте вывод Tx выходным*/
    TRISC7=1;        /* Сделайте контакт Rx входным */
    temp=(( (float) (F_CPU) / (float) baud_rate) - 1);     
    SPBRG = (int) temp;    /* Baud rate=9600 SPBRG=(F_CPU /(64*9600))-1*/
    TXSTA = 0x20;    /* включить передачу;*/
    RCSTA = 0x90;    /* Включение RX и последовательного порта */
    INTCONbits.GIE = 1;   /* Включить глобальное прерывание */
    INTCONbits.PEIE = 1;  /* Включить периферийное прерывание */
    PIE1bits.RCIE = 1;    /* Включить прерывание приема */
    PIE1bits.TXIE = 1;    /* Включить прерывание передачи */
}
5 1 голос
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии