Страницы

четверг, 16 февраля 2012 г.

Atmega UART






int init_UART(void)
{
 // Установка скорости 9600
 UBRRH=0; // UBRR=f/(16*band)-1 f=8000000Гц band=9600, 
 UBRRL=51; // нормальный асинхронный двунаправленный режим работы
 
//   RXC   - завершение приёма
//   |TXC  - завершение передачи
//   ||UDRE   - отсутствие данных для отправки
//   |||FE  - ошибка кадра
//   ||||DOR  - ошибка переполнение буфера
//   |||||PE  - ошибка чётности
//   ||||||U2X - Двойная скорость
//   |||||||MPCM - Многопроцессорный режим
//   76543210
 UCSRA=0b00000000;

//   RXCIE  - прерывание при приёме данных
//   |TXCIE  - прерывание при завершение передачи
//   ||UDRIE  - прерывание отсутствие данных для отправки
//   |||RXEN  - разрешение приёма
//   ||||TXEN - разрешение передачи
//   |||||UCSZ2 - UCSZ0:2 размер кадра данных
//   ||||||RXB8 - 9 бит принятых данных
//   |||||||TXB8 - 9 бит переданных данных
//   76543210
 UCSRB=0b00011000; // разрешен приём и передача по UART

//   URSEL  - всегда 1
//   |UMSEL  - режим:1-синхронный 0-асинхронный
//   ||UPM1  - UPM0:1 чётность
//   |||UPM0  - UPM0:1 чётность
//   ||||USBS - топ биты: 0-1, 1-2
//   |||||UCSZ1 - UCSZ0:2 размер кадра данных
//   ||||||UCSZ0 - UCSZ0:2 размер кадра данных
//   |||||||UCPOL- в синхронном режиме - тактирование
//   76543210
 UCSRC=0b10000110; // 8-битовая посылка
}

// UART
void send_Uart(unsigned char c)// Отправка байта
{
 while(!(UCSRA&(1<<UDRE))) // Устанавливается, когда регистр свободен
 {}
 UDR = c;
}

void send_Uart_str(unsigned char *s)// Отправка строки
{
 while (*s != 0) send_Uart(*s++);
}

void send_int_Uart(unsigned int c)// Отправка числа от 0000 до 9999
{
 unsigned char temp;
 c=c%10000;
 temp=c/100;
 send_Uart(temp/10+'0');
 send_Uart(temp%10+'0');
 temp=c%100;
 send_Uart(temp/10+'0');
 send_Uart(temp%10+'0');
}

unsigned char getch_Uart(void)// Получение байта
{
 while(!(UCSRA&(1<<RXC))) // Устанавливается, когда регистр свободен
 {}
 return UDR;
}

int main(void)
{
 DDRC = 0b00000001;    // инициализация порта C, PC0 - выход
 init_UART();     // инициализация UART
 _delay_ms(1000);    // задержка 1c
 send_Uart_str("test print");                 // отправка строки
 send_Uart(13);     // перенос строки
 send_int_Uart(2013);           // отправка числа
 send_Uart(13);     // перенос строки
    while(1)      // бесконечный рабочий цикл
    {
  if(UCSRA&(1<<RXC))   // если пришёл байт по UART
  {
   send_Uart(getch_Uart()+1); // отвечаем увеличенным на 1 пришедшим байтом
   // LED on     // и мигнём диодом
   PORTC = 0b00000001;   // Включаем диод PC0 = 1 = Vcc
   _delay_ms(50);    // задержка 50мс
   // LED off
   PORTC = 0b00000000;   // Выключаем диод PC0 = 0 = Vcc
  }  
    }
}




#define RX_BUFFER   128    //длина нашего буфера, читай макс. длина строки

volatile unsigned char work=0;
volatile unsigned char rx_buffer[RX_BUFFER];

ISR(USART_RXC_vect)
   {
   unsigned char status,data;
   status=UCSRA;
   data=UDR;
   if ((status&((1<<FE)|(1<<PE)|(1<<DOR)))==0)
      {
      if (data==10) // CR
      {
         work=1;
      }
      else rx_buffer[rx_index]=data;

      if (++rx_index == RX_BUFFER) rx_index=0;
      
      }
   
   }
в майне:
   if (work) 
      {
      work=0;   
                  //обрабатываем нашу строку как хотим.
                }








Комментариев нет:

Отправить комментарий

ваше мнение...