Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
05.10.2014, 11:28
|
|
Прописка
Регистрация: 07.09.2014
Сообщений: 136
Сказал спасибо: 18
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: uart и rs232
пульт китайского телека на несколько кнопок даёт один код
2A 00 01
часть 2A 00 всегда одинакова, крайний байт иногда меняется
__________________
Самое главное умение - умение радоваться жизни.
|
|
|
|
05.10.2014, 11:36
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: uart и rs232
Я в предыдущем сообщении добавил, что если смотреть твою же ссылку на устройство, то можно понять, что первый байт со значением 2А - это просто ASCII-код символа *, не имеющего отношения к реальным кодам с пульта. Это замена, по которой можно опознать, что принимаемые по UART коды будут являться кодами управления с пульта.
Тот, кто придумал это устройство, че-то там понаписал такого, в чем сам толком не разобрался, видимо.
Попробуй ту прошивку, которая выдает на UART выдает только один байт, соответствующий коду нажатой кнопки.
Если на несколько кнопок выдается один код, значит, у того пульта, возможно, другой протокол, или меняется адрес, который не выводится на UART
Последний раз редактировалось NewWriter; 05.10.2014 в 11:49.
|
|
|
|
05.10.2014, 15:20
|
|
Прописка
Регистрация: 07.09.2014
Сообщений: 136
Сказал спасибо: 18
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: uart и rs232
сделал, теперь отображается только третий байт из таблицы кодов
https://kazus.ru/forums/showpost.php...32&postcount=6
__________________
Самое главное умение - умение радоваться жизни.
|
|
|
|
05.10.2014, 16:33
|
|
Прописка
Регистрация: 07.09.2014
Сообщений: 136
Сказал спасибо: 18
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: uart и rs232
а как обрабатывать приходящие данные?
так не выводятся
а код из урока http://avr-start.ru/?p=550 вешает эмулятор
Код:
|
#include ‹mega8.h›
char uart_data[5];
int i=0,j=0;
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1‹‹FE)
#define PARITY_ERROR (1‹‹UPE)
#define DATA_OVERRUN (1‹‹OVR)
#define DATA_REGISTER_EMPTY (1‹‹UDRE)
#define RX_COMPLETE (1‹‹RXC)
#define RX_BUFFER_SIZE 32
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE‹256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
bit rx_buffer_overflow;
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
uart_data[i]=data;
i++;
if(i›4)
{
i=0;
}
}
#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
#include ‹stdio.h›
void main(void)
{
UCSRA=0x00;
UCSRB=0x90;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
#asm("sei")
PORTB=0x00;
DDRB=0xFF;
PORTD=0x00;
DDRD=0x00;
while (1)
{
while(j==D5)
{
PORTB=0xFF;
}
while(j==C5)
{
PORTB=0x00;
}
};
} |
__________________
Самое главное умение - умение радоваться жизни.
|
|
|
|
05.10.2014, 16:34
|
|
Прописка
Регистрация: 07.09.2014
Сообщений: 136
Сказал спасибо: 18
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: uart и rs232
просто портом управлять
D5 включить C5 выключить
__________________
Самое главное умение - умение радоваться жизни.
|
|
|
|
05.10.2014, 18:14
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: uart и rs232
Как обрабатывать входящие данные? А вот так: принятый по UART байт (для однобайтного кода кнопки) сравнивается с таблицей действий. В этой таблице прописано, какому значению байта какое действие соответствует.
Например:
- байт принят?
- если да, то...
- ...значение принятого байта = D5 ?
- если да, то на порт подать "1" (включить) и ждать приема по UART другого байта,
- значение принятого байта = С5 ?
- если да, то на порт подать "0" (выключить) и ждать приема по UART другого байта,
- иначе, если принят байт с другим значением, то не делать ничего и ждать приема по UART.
Если обрабатывать трехбайтный код, как в той таблице, то действия немного другие.
- байт принят?
- если да, то...
- ...его значение равно 2A ?
- если да, то ждем приема следующего (второго) байта, иначе (если нет), то либо ошибка приема по UART, либо принимаемые байты не являются кодами от конвертера, либо первый байт со значением 2А был пропущен и надо снова ждать прихода значения 2А.
- следующий (второй) байт принят?
- если да, то сохраняем его где-то во временном месте и ждем следующего байта
- следующий (третий) байт принят?
- если да, то инвертируем его и сравниваем с ранее сохраненным байтом.
- эти байты равны?
- если да, то всё норм и переходим к определению действия по значению сохраненного (второго) байта
- если нет, то принятый по ИК код был ошибочным или нестандартным (не Nec и не Samsung протокола).
Последний раз редактировалось NewWriter; 05.10.2014 в 18:34.
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
05.10.2014, 18:45
|
|
Прописка
Регистрация: 07.09.2014
Сообщений: 136
Сказал спасибо: 18
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: uart и rs232
прошивка 1 байтная
Код:
|
#include ‹mega8.h›
#include ‹stdio.h›
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char data;
data=UDR;
if (data=='D7') PORTC=0b00000001;
if (data=='15') PORTC=0b00000010;
if (data=='7D') PORTC=0b00000100;
if (data=='9D') PORTC=0b00001000;
if (data=='6F') PORTC=0b00010000;
if (data=='47') PORTC=0b00100000;
}
void main(void)
{
// Port C initialization
DDRC=0b11111111;
PORTC=0b00000000;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: Off
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x90;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
// Global enable interrupts
#asm("sei")
while (1)
{
};
} |
проблема в
if (data=='D7') PORTC=0b00000001;
if (data=='15') PORTC=0b00000010;
if (data=='7D') PORTC=0b00000100;
if (data=='9D') PORTC=0b00001000;
if (data=='6F') PORTC=0b00010000;
if (data=='47') PORTC=0b00100000;
если вместо 16ричных значений стоит 0 или 1 всё работает
а если коды пульта - ошибку пишет
__________________
Самое главное умение - умение радоваться жизни.
|
|
|
|
05.10.2014, 20:01
|
|
Прописка
Регистрация: 07.09.2014
Сообщений: 136
Сказал спасибо: 18
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: uart и rs232
#include ‹mega8.h›
#include ‹stdio.h›
#include ‹delay.h›
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char data;
int data1;
data=UDR;
int data1;
char data;
data = (char) data1;
if (data1=='D5') PORTC.0=1;
if (data1=='C5') PORTC.0=0;
/*
PORTC.3=1;
delay_ms(100);
PORTC.3=0; */
}
void main(void)
{
// Port C initialization
PORTC=0x00;
DDRC=0x01;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: Off
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x90;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
// Global enable interrupts
#asm("sei")
while (1)
{
};
}
преобразование типа не работает
__________________
Самое главное умение - умение радоваться жизни.
Последний раз редактировалось AVRkin; 05.10.2014 в 20:13.
|
|
|
|
05.10.2014, 21:24
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,928
Сказал спасибо: 2,544
Сказали Спасибо 11,827 раз(а) в 5,929 сообщении(ях)
|
Re: uart и rs232
Сообщение от AVRkin
|
преобразование типа не работает
|
С чего такой вывод? Даже без явного преобразования в "чар" роместится только младший байт "инта".
Сообщение от AVRkin
|
если вместо 16ричных значений стоит 0 или 1 всё работает
а если коды пульта - ошибку пишет
|
Код будет не 'D7', а 0xD7
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
05.10.2014, 23:32
|
|
Прописка
Регистрация: 07.09.2014
Сообщений: 136
Сказал спасибо: 18
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: uart и rs232
Сообщение от akegor
|
Код будет не 'D7', а 0xD7
|
уже пробовал ![Одобряю](images/smilies/icon_true.gif)
ошибку писал
__________________
Самое главное умение - умение радоваться жизни.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
AVR, UART и режим IDLE
|
anpaza |
Микроконтроллеры, АЦП, память и т.д |
14 |
25.07.2011 03:04 |
ATMEGA простой UART (RS232) без max232
|
EXIS |
Микроконтроллеры, АЦП, память и т.д |
39 |
09.12.2010 18:51 |
Нужно 2 UART на мк , как быть?
|
Zemlyanov |
Микроконтроллеры, АЦП, память и т.д |
77 |
04.05.2010 19:26 |
Подключение передатчика CAN и RS232 к одному UART
|
Haster |
Микроконтроллеры, АЦП, память и т.д |
9 |
16.04.2009 21:24 |
Помогите разобраться с UART
|
masterpc |
Микроконтроллеры, АЦП, память и т.д |
10 |
13.02.2007 17:49 |
Часовой пояс GMT +4, время: 21:30.
|
|