ATMega128 и USART

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

ATMega128 и USART

Сообщение alexey6522 »

Всем привет! Пишу микропрограмму для Мега128 у него есть USART0 и USART1, хочу сделать устройство на базе этого МК, третий день уже не сплю пытаюсь написать микропрограмму, нужно чтобы МК принимал сообщения и отправлял и делал все это с частотой в 200 мл. сек. Вся загвостка в том что данные накладываются друг на друга. Как сделать чтобы пока не принял сообщение, ничего не отправлять в порт и пока идет отправка ничего не принимать?

Код: Выделить всё


volatile unsigned char cRx = 0;
volatile unsigned char cnt = 0;
#define bytes 21
volatile unsigned char RecendMas[bytes];//<<<< полученная строка

// Процедура инициализации USART
void usart_ini()
{
	//установка двойной скорости
    UCSR0A = ( 1<<U2X); //Устанавливаем удвоение скорости	
	//прерывание по приёму данных
    UCSR0B=(1<<RXCIE)|(1<<RXEN)|(1<<TXCIE)|(1<<TXEN); //разр. прерыв при приеме, разр приема, разр передачи.	
	//Размер кадра данных 8 бит
	UCSR0C |= (1<<7) | (1<<1) | (1<<2);
	//Запись в UBRRH
	UBRR0H = 0x00;
	// Скорость обмена (19200)
	UBRR0L = 26;
}

ISR(USART0_RX_vect) //USART_RXC_vect, прием завершен для Atmega128
{
   if ((cnt == 0) || (RecendMas[0] == '<')) //Заполнить буффер если это первый символ и он равен "<"
   {   
    RecendMas[cnt] = UDR0;
	cnt++;
   }
   else
   {	
    cRx = 0;
	cnt = 0;
   }
  if ((cnt == bytes) && (RecendMas[0] == '<') && (RecendMas[20] == '>')){ //<<<<<<    Если принят 1 байт и первым стоит байт "<", то...
    cRx = 1; 	
  }
}
//-----------------------------

// Функция передачи символа в порт
unsigned char queueC, sendC;
unsigned char queue[21];

ISR(USART0_TX_vect)
{
if(queueC != sendC) 
  UDR0 = queue[sendC++];
_delay_loop_2(200);
}
//-----------------------------

void SendStr(char *data)
{
queueC = 0;
sendC = 1;
while (*data) queue[queueC++] = *data++;
if ((UCSR0A & (1<<UDRE)) != 0) {
UDR0 = queue[0];
}
}

int main(void)
{
usart_ini();
//
..
тут у меня настройка портов ввода вывода
..
//
sei();//устанавливаем бит глобального разрешения прерываний
while(1)//Бесконечный цикл
{
if (cRx) //Если при получении нет ошибок, отправить данные
  SendStr("<36027030011000-1800>"); //отправка данных "<>" означают начало и конец строки
}
}
Реклама
codenamehawk
Вымогатель припоя
Сообщения: 528
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: ATMega128 и USART

Сообщение codenamehawk »

alexey6522 писал(а): и делал все это с частотой в 200 мл. сек.
Обычно частоту измеряют в Герцах.
alexey6522 писал(а):
Вся загвостка в том что данные накладываются друг на друга. Как сделать чтобы пока не принял сообщение, ничего не отправлять в порт и пока идет отправка ничего не принимать?
Передача у вас включается после приема всей строки, ну так на время передачи запретите прием, в чем проблема?
Реклама
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Re: ATMega128 и USART

Сообщение alexey6522 »

Простите, я имел ввиду не частоту МК, а паузу между сообщениями. А как запретить прием на время передачи?
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: ATMega128 и USART

Сообщение Engineer_Keen »

В управляющих регистрах UART есть отдельные биты, отвечающие за включение приемника и передатчика (RXEN и TXEN).
Реклама
Эиком - электронные компоненты и радиодетали
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Re: ATMega128 и USART

Сообщение alexey6522 »

Спасибо, я думал можно просто обойтись задержкой, но этот вариант лучше с битом.
Еще вопросик! Есть ряд тумблеров подключенных к порту А микроконтроллера, сохраняю положение 8 тумблеров

Код: Выделить всё

DS = PINA;[code] в переменную DS, где получаю HEX значение, как мне конвертировать в двоичную систему?
Реклама
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: ATMega128 и USART

Сообщение Jack_A »

В переменной DS значение порта будет в самом натуральном двоичном виде, ибо это единственный вид , в котором циркулируют данные внутри МК. А уж как интерпретировать содержимое этого байта - как хекс, или как октальное число, или как десятичное, или как цвет пиксела - это уже имеет значение при выводе во внешний мир для общения с человеком. А внутри МК - все двоичное ( двоично-десятичную арифметику не рассматриваем ввиду ненужности ) .
Реклама
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Re: ATMega128 и USART

Сообщение alexey6522 »

Когда я включаю режим отладки в протеусе, то получаю из порта А значение 1111110, но в переменной DS оно хранится как 0xFE, как мне преобразовать его в строку "11111110"?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: ATMega128 и USART

Сообщение Мастер Ломастер »

alexey6522 писал(а):Когда я включаю режим отладки в протеусе, то получаю из порта А значение 1111110, но в переменной DS оно хранится как 0xFE, как мне преобразовать его в строку "11111110"?
функция itoa, если не ошибаюсь
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: ATMega128 и USART

Сообщение Jack_A »

alexey6522 писал(а):Когда я включаю режим отладки в протеусе, то получаю из порта А значение 1111110, но в переменной DS оно хранится как 0xFE, как мне преобразовать его в строку "11111110"?
В переменной DS оно находится в виде нулей/единиц, это Противнус для понимания ее человеком ( или программистом :) ) представляет ее в виде 0xFE, потому что большое количество нулей/единичек на глаз трудно воспринимается человеком . Это же содержимое может быть представлено как oct 376 или 254 десятичное, но это будет одно и то же содержимое DS ! Ну получите вы строку = двоичное представление этого байта - и что пот`ом с ней будете делать ? Выведете на экран в виде '11111110' ?

Если уж так жизненно необходимо вывести текстовое представление DS именно в таком виде, на ассемблере оно выглядит приблизительно так :
Вложения
FragTst.asm
(332 байт) 539 скачиваний
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»