Перейти к содержанию

Приём И Обработка Команд От Компа (хост)


-=gga=-

Рекомендуемые сообщения

Есть задача принимать команды от компа и обрабатывать их в зависимости от того, какая команда, надо выполнить ту или иную функцию.)

Компилятор CVAVR

МК Atmega16

вот код который я сделал:

#include <mega16.h>

// Alphanumeric LCD Module functions
#asm
  .equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>

#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)

// USART Receiver buffer
#define RX_BUFFER_SIZE 200
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

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
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;
   }; 
};
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#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

void main(void)
{


PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;

// USART initialization
UCSRA=0x00;// Communication Parameters: 8 Data, 1 Stop, No Parity
UCSRB=0x98;// USART Receiver: On
UCSRC=0x86;// USART Transmitter: On
UBRRH=0x00;// USART Mode: Asynchronous
UBRRL=0x19;// USART Baud Rate: 9600  


// LCD module initialization
lcd_init(16);

// Global enable interrupts
#asm("sei")
while(1){

if(getchar() == 'R'){
lcd_clear();
lcd_putsf("R-OK");  //если получили символ R то выводим на дисплей "R-OK" 
                       }

if(getchar() == 'P'){
lcd_clear();
lcd_putsf("P-OK");  //если получили символ P то выводим на дисплей "Р-OK"
                       }
if(getchar() == 'T'){
lcd_clear();
lcd_putsf("T-OK");  //если получили символ T то выводим на дисплей "Т-OK"
}        

       }
}

Код работает, но для того чтобы у меня на дисплее появилось T-OK то мне надо отправить в МК символ "Т" три раза !

Как можно сделать чтобы при отправке символа выполнялась нужная команда, и символ постлать не 2-3 раза а один раз.

Я был механик, я есть механик, я буду механик

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

:) Ну ещё бы !!! Зачем 3 раза вызывать getchar()?????

Нужно один раз и в временную переменную... А уже её тестить... И вообще такого рода операция будет лучше через switch() case:.....

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Ну сделал как ты и сказал и заработало :) спасибо.

А можно поподробнее узнать что такое switch() case: и с чем его едят ?

Я был механик, я есть механик, я буду механик

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

насколько я помню, это аналог нескольких if подряд...

что-то вроде этого:

switch( i )

{

case: (вариант1) {код1} //если i равно "вариант1", то выполнить "код1", иначе сравнение дальше...

case: (вариант2) {код2} //если i равно "вариант2", то выполнить "код2", иначе сравнение дальше...

...

case: (вариантN) {кодN} //если i равно "вариантN", то выполнить "кодN", иначе выход из switch() без выполнения какого-либо кода...

}

но за точный синтаксис не уверен... поспрашивай хелп компилятора...

Изменено пользователем NebsteR

> Правила форума <

...из древних времен доходят до нас слухи о колдунах и волшебниках... - кто бы мог подумать, что так может начинаться дипломная работа по радиотехнике...

...это не дым от канифоли, нет... это души умерших транзисторов....

Первый закон Ома: никому не рассказывать про Ома!

Ну вот, а ты говорил ноль...

Ссылка на комментарий
Поделиться на другие сайты

Вот сделал так:

switch(temp2){

case:('R'){
lcd_clear();
lcd_putsf("R-OK");  
}

case:(P){
lcd_clear();
lcd_putsf("P-OK");  
}

И получил две ошибки. :( Компилатор про эту команду не знает, гугл вообще чёрт знает что дал...

Я был механик, я есть механик, я буду механик

Ссылка на комментарий
Поделиться на другие сайты

ща, погодь, спрошу у своего, ПИК, но думаю синтаксис этого должен быть одинаков...

вот че получил:

switch (cmd) {

case 0:printf("cmd 0");

	   break;

case 1:printf("cmd 1");

	   break;

default:printf("bad cmd");

		break; }

все просто и понятно, как я и говорил, в начале синтаксис не так написал, а смысл тот-же :rolleyes:

варианты через пробел после case, а по дефолту ставится код, если cmd не совпадает ни с одним из вариантов... :)

Изменено пользователем NebsteR

> Правила форума <

...из древних времен доходят до нас слухи о колдунах и волшебниках... - кто бы мог подумать, что так может начинаться дипломная работа по радиотехнике...

...это не дым от канифоли, нет... это души умерших транзисторов....

Первый закон Ома: никому не рассказывать про Ома!

Ну вот, а ты говорил ноль...

Ссылка на комментарий
Поделиться на другие сайты

Я чёто не понял, этоже немного (точнее много) другой код, он вроде чтото отправляет, а мне нужно как в твоём первом сообщении но чтобы работало :)

Я был механик, я есть механик, я буду механик

Ссылка на комментарий
Поделиться на другие сайты

не, здесь

printf("cmd 0");
break;

- это просто образец последовательности двух операторов, которая выполнится при удовлетворении выбора...

ЗЫ: если его написать, как мой, то выйдет:

switch( i )
{
case x1: оператор1; оператор1_2; оператор1_M; //если i равно x1, то выполнить все "операторы1", иначе сравнение дальше...
case x2: оператор2; оператор2_2; оператор2_M; //если i равно x2, то выполнить все "операторы2", иначе сравнение дальше...
...
case xN: операторN; операторN_2; операторN_M; //если i равно xN, то выполнить все "операторыN", иначе выбор default...
default: операторD; операторD_2; операторD_M; //если i равно ничему не равно,
//то выполнить все "операторыD",
//если-же без совпадения код выполнять не нужно,
//то просто вместо операторD пишем break;
}

Удачи! :)

Изменено пользователем NebsteR

> Правила форума <

...из древних времен доходят до нас слухи о колдунах и волшебниках... - кто бы мог подумать, что так может начинаться дипломная работа по радиотехнике...

...это не дым от канифоли, нет... это души умерших транзисторов....

Первый закон Ома: никому не рассказывать про Ома!

Ну вот, а ты говорил ноль...

Ссылка на комментарий
Поделиться на другие сайты

Вот сделал так:

И получил две ошибки...

Неудивительно. в кейсах здесь лучше не символ принятый сравнивать, а его код, поскольку в приемном буфере коды лежат. Например:

...
//Приняли некий символ, например "Z", что соответствует по таблице символов коду 0х7А. 
//Тогда сравниваем так:
...
//передаем в функцию принятое число
...
case 0x7A:
//что-то делаем...
break;
...

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

Во заработало :)

Сделал вот так:

switch (temp2){

case 0x7A: lcd_putsf("R-OK");  
break;
}

Тока один вопросец, где взять ту самую таблицу символов ?

Я был механик, я есть механик, я буду механик

Ссылка на комментарий
Поделиться на другие сайты

Тока один вопросец, где взять ту самую таблицу символов ?

У меня вот завалялась. Кодировка ASCII. Не всегда может совпадать с ANSI, поскольку существуют несколько модификаций последней - в зависимости от ПО компа. Но английские буквы точно совпадают...

ascii.pdf

Изменено пользователем Goodefine

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

если че, то вот: http://ascii.org - там много че еще есть по ASCII...

> Правила форума <

...из древних времен доходят до нас слухи о колдунах и волшебниках... - кто бы мог подумать, что так может начинаться дипломная работа по радиотехнике...

...это не дым от канифоли, нет... это души умерших транзисторов....

Первый закон Ома: никому не рассказывать про Ома!

Ну вот, а ты говорил ноль...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...