Kaptain.
Telegram /
LinkedIn /
Email /
GIT /
RSS /
GPG /

№ 3120 В разделах:
Electronics
Programming
от July 17th, 2011,
В подшивках: Arduino, Displays
Когда-то давно я замутил себе вот такую вот штуку.
Настроил lcd4linux, показывал погоду, все дела… А теперь я увлекаюсь электроникой гораздо больше, чем раньше и делаю штуки еще прикольнее. Но как-то так случилось, что китайский шнурок с PL2303, через который я смотрел UART с отлаживаемых МК сгорел. Конечно же, я полез в инет найти чем быстро можно заменить его и сделал вот такой вот UART адаптер на mega8, дерзко отодрав кварц от горелого китайского переходника. Сделал и заработало. А потом до меня дошло, что у меня уже есть аналогичное устройство! Теже принципы работы с компом (CDC), но в обратную сторону – вывод информации с компа. А почему бы не сделать на МК вход с UART и трансляцию на ЖКИ и комп через USB? Да легко!
Сначала прилепим кнопку по схеме ниже

А потом добавляем в код старого проекта несколько функций, дополнительное условие и еще чуть чуть кода
//устанавливаем скорость UART
//устанавливается 1 раз при прошивке. потом ее изменить нельзя!
//все ваши отлаживаемые устройства должны делать вывод информации именно на этой скорости
#define BAUD 9600
#include <util/setbaud.h>
//говорим где висит кнопка
#define BUTTON_SEL 5
#define BUTTON_DDR DDRC
#define BUTTON_PIN PINC
//пара нужных штук, чтобы хардварный UART заработал
void UART_Init(void)
{
UBRR0L = UBRRL_VALUE;
UBRR0H = 0;
UCSR0B = (1 << RXEN0);
}
//тут мы принимаем байтик
uint8_t USART_vReceiveByte()
{
while((UCSR0A&(1<<RXC0)) == 0);
return UDR0;
}
int main(void)
{
...
UART_Init();
...
//немножко говнокодим
while(1) {
if (((BUTTON_PIN & (1 << BUTTON_SEL)) == 0)) {
_delay_ms(500);
switch(use_uart) {
case 0:
use_uart=1;
break;
case 1:
use_uart=0;
break;
}
}
usbuartPoll();
if (use_uart==0) {
while(usbuartRx(&data)) {
if(data == '\r') {
cursor &= ~(LCD_LINE_WIDTH-1);
lcdCommand(LCD_SET_CURSOR(cursor));
}
else if(data == '\n') {
cursor += LCD_LINE_WIDTH;
lcdCommand(LCD_SET_CURSOR(cursor));
}
else {
if(data >= 0x80)
data = pgm_read_byte(encoding+data-0x80);
lcdWriteData(data);
cursor++;
}
}
} else {
udata = USART_vReceiveByte();
if(udata == '\r') {
cursor &= ~(LCD_LINE_WIDTH-1);
lcdCommand(LCD_SET_CURSOR(cursor));
}
else if(udata == '\n') {
usbuartTx(udata);
usbuartTx('\r');
cursor += LCD_LINE_WIDTH;
lcdCommand(LCD_SET_CURSOR(cursor));
} else {
if(udata >= 0x80)
udata = pgm_read_byte(encoding+udata-0x80);
usbuartTx(udata);
lcdWriteData(udata);
cursor++;
}
}
}
...
}
И вуаля! теперь по нажатию кнопки ваш ЖКИ, выводящий всякую хрень типа температуры процессора превращается в клевый отладочный инструмент с выводом на компьютер и на ЖКИ, если компа под рукой нет (хотя 5 вольт для питания таки надо 🙂 ). Скачать проект и обновленную прошивку можно тут.
Вот так все это выглядит
А вот так выглядит работающая консолька c UART
ЗЫ Кстати, это отличная штука для работы с I2C устройствами. Можно собрать специальный адаптер для программирования\изучения некоторых устройств на компьютере, а потом подключения их к МК. Например, так можно запрограммировать часики DS1307 или поработать с термометром LM75AD. Но об этом подумаю в следующий раз.
Ссылки:
Эта статья на freehabr.ru
ЖКИ через USB
UART адаптер на mega8
Использование UART для отладки микроконтроллера Atmega + библиотека
Fortune cookie: There was a young man of Cape Horn Who wished he had never been born, And he wouldn't have been If his father had seen That the end of the rubber was torn.
Leave a Reply