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: Today's spam: I'm a sad girl...
Leave a Reply