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 – USART преобразователь
Alex_EXE | 04.12.2010 | Микроконтроллеры |
Глеб пишет 23.03.2013 в 11:19 #
В схеме RW дисплея нужно посадить на корпус иначе не работает.
Alex_EXE пишет 25.03.2013 в 09:33 #
Так и есть.
Извиняюсь, забыл его дорисовать.
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;
}
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;
}
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.