USART в PIC16F628A

Одна из самых больших вкусностей PIC16F628A – является последовательный порт. С его помощью контроллер можно сопрягать с компьютером, с другими контроллерами и различной периферией, его можно легко преобразовывать в другие интерфейсы RS-232/422/485. Его можно использовать как для постоянной связи с компьютером, так и только на стадии отладки. В данной статье рассмотрим простой пример связи микроконтроллера с компьютером.

Фото сопрягаемой платы

Фото сопрягаемой платы

В качестве простого примера мы подключим контроллер к компьютеру со скоростью 9600 бод в асинхронном режиме. Для отображения принимаемой информации будем использовать LCD знакогенерирующий дисплей, а для отправки сообщения в компьютер всего одну кнопку.

Схема

Схема

На схеме виден микроконтроллер PIC16F628A, преобразователь интерфейса USART-RS232, знакогенерирующий 16×2 LCD дисплей, кнопка и немного обвязки. Конденсаторы C1-C4 по спецификации должны быть на 1 мкф, хотя, вполне хватит и 0,1 мкф.

Теперь рассмотрим регистры, которые отвечают за работу модуля USART:

Схема

Схема

Скорость обмена зависит от частоты используемого кварца Fosc и режима скоростного режима BRGH, вычисляется и устанавливается в регистре SPBRG. Также на значение регистра SPBRG влияет выбранный режим: асинхронный или синхронный (рассмотрен не будет). Значение регистра SPBRG вычисляется по формулам приведённым:

Схема

Или можно воспользоваться готовыми расчётами, для некоторых случаев, из таблице приведённой ниже:

Схема

Таблица скоростей

Из всего перечисленного в большинстве случаев интересен выбор скорости. Обычно используется асинхронный 8 битной режим без проверки целостности, который будет рассмотрен, или 9 битный режим с программной проверкой чётности.

Перейдём к программе, начнём с инициализации:

void low_init()
{
CMCON=0x07;	//	отключение компаратора

TRISA=0x04; 		// 	кнопка подключена к RA2
TRISB  = 0x06; 	//	Биты 1 и 2 (RB1 и RB2), которые принадлежат Usart

//      76543210
// TXSTA : CSRC TX9  TXEN SYNC --- BRGH   TRMT   TX9D
TXSTA=0b00100000;		        // Asynch,8bits,tx enb

// RCSTA : SPEN RX9  SREN CREN ADEN FERR   OERR   RX9D
RCSTA=0b10010000;		        // Cont receive enb

SPBRG=32;	//	asinhron  BRGH=0 ->32;BRGH=1 ->129 for 9600
}

В данном примере используется 8 битная (TX9=0, RX9=0), асинхронная (SYNC=0), передача (TXEN=1) и приём (CREN=1) в низкоскоростном режиме (BRGH=0) со скоростью 9600 бод (SPBRG=32).


unsigned char getch_Usart(void)//	Получение байта
{
while(!RCIF)	//	Устанавливается, когда регистр не пуст.
continue;
return RCREG;
}

void send_Usart(unsigned char c) //	Отправка байта
{
while(TXIF!=1)	//	Устанавливается, когда регистр свободен
{}
TXREG = c;
}

Функция getch_Usart ожидает прихода байта в порт, по его приходу возвращает его значение. Функция send_Usart ожидает, когда освободиться порт, после чего передаёт байт, далее возвращает управление программе. Следует помнить, что эти функции не вернут управление, пока не будут выполнены, и если будет выполняться ещё какое-либо действие необходимо предварительно проверять бит RCIF или TXIF, что бы исключить зависания прошивки.

void main()
{
unsigned char c,var=0;
low_init();
InitLCD();
delay1000(250);
send_Usart('O');
send_Usart('k');
send_Usart(13);
while(1==1)
{
if(RCIF)
{
ShowChar(getch_Usart());
}
if(BUTTON==0)
{
send_Usart(var+'0');
var++;
if(var==10)var=0;
delay1000(250);
}
}
}

Вот основной код программы. В нём после инициализации контроллера и дисплея отправляется сообщение «Ok», далее прошивка зацикливается в главном цикле программы. В этом цикле отслеживаются всего два события: приход байта в USART с последующим выводом его на дисплей и нажатие кнопки, после которого контроллер отправляет цифру от 0 до 9, записанную в переменной var, после чего значение переменой увеличивается на единицу. Также для устранения дребезга кнопки и чтобы кнопка не заспамила порт добавлена задержка, примерно равная секунде.

Для отладки устройств на макетке или в устройствах, где штатно COM порт не предусмотрен, но есть USART – будет удобно применять отдельный RS232 – USART преобразователь.

RS232 – UART преобразователь

RS232 – USART преобразователь

Скачать проект в proteus 7.6 и исходный код на C

5 комментариев на « USART в PIC16F628A»

  1. Глеб пишет 23.03.2013 в 11:19 #

    В схеме RW дисплея нужно посадить на корпус иначе не работает.

  2. Alex_EXE пишет 25.03.2013 в 09:33 #

    Так и есть.
    Извиняюсь, забыл его дорисовать.

  3. Lex пишет 13.11.2016 в 19:54 #

    Проверка на переполнение буфера и кадра
    #byte RCSTA = getenv(«SFR:RCSTA»)
    #bit CREN = RCSTA.4

    if ((RCSTA & 0b00000110)!= 0)
    {
    CREN =0;
    delay_cycles( 1 );
    CREN =1;
    }

  4. Alex_EXE пишет 15.11.2016 в 01:55 #

    Для получения байта обычно пользуюсь следующей конструкцией, точнее раньше пользовался, когда пиками занимался.
    // Получение байта
    unsigned char getch_Usart(void)
    {
    unsigned char temp;
    if(OERR==1)
    {
    temp=RCREG;
    temp=RCREG;
    // temp=PSR;
    if(GIE) CARRY=1; // запоминаем, если были приревания
    GIE=0; // запрет приреваний
    TXSTA = 0;
    RCSTA = 0;

    // CREN=0;
    // SPEN=0;
    delay(10);
    Init_comms();
    if(CARRY) GIE=1; // разрешаем прерываня, если нужно
    }
    while(!RCIF) // Устанавливается, когда регистр не пуст.
    continue;
    temp=RCREG;
    return temp;
    }

  5. batir пишет 02.09.2018 в 10:51 #

    Dobroe vremya sutok . mojete skazat esli k PICy postupaet signal po uart «65 00 02 00 FF FF FF ili 65 00 01 00 FF FF FF » posle priema etoga koda vkluchil port RB1 ili kakoyta drugoy vihod.

Комментарии RSS

Оставьте отзыв