Страницы

Ярлыки

ДШИ-200 (1) КСВУ-6 (1) ЛЧМ (1) МДР-23 (1) микроконтроллер (1) перенаправление (1) С (1) структуры (1) учебный курс (1) AC/DC (1) ADC (1) ADS1248 (1) Altium (1) Altuim (1) Amolifer (1) ARM (1) assembler (2) Asynchronous (1) at command (3) at#eaddr (1) at#epassw (1) at#esmtp (1) at#euser (1) at#gprs (1) at#selint=2 (1) at#sgact (1) at#tcpatcmdseq (1) ATX (1) AVR (2) bit (1) boost (1) boot (2) bootlloader (1) C (6) C# (7) C++ (1) CMSIS (1) command (1) CP2101 (1) CSD (1) Danfoss (6) DBGMCU (1) debug (1) debug.ini (1) delegate (1) Discovery (1) DMA (1) DRV8805 (1) DWT (1) e-mail (1) email (1) Exel (1) exFAT (1) FC-051 (1) gl868-dual (2) gl868-dual cmux (1) GPIO (2) GSM (1) I2C (1) IAR (1) ID (1) Invoke (1) Keil (3) LabVIEW (1) Linux (1) LMP7721 (1) LoRa (3) mdmread (1) memory (1) MODBUS (1) Operation Amplifer (1) pack (1) printf (2) printf() (1) RCC (1) retargetting (1) RFM95/96/87/98(W) (1) RS232 (4) RS485 (1) RSAPI.DLL (1) RSS (1) RTC (2) send (2) SerialPort (1) Silabs (1) spl (1) standard peripherals library (1) startup (1) stepper (2) STlink (1) STlink/V2 (2) STM32 (10) stm32 stm32f10x (1) STM32DBG.IN (1) STM32F (19) STM32F103 (4) struct (1) Structure (1) system (1) SystemInit (1) Task (1) telit (5) thread (4) TIM (1) Type Cast (1) UART (1) uni-trend (1) USART (6) USB (1) UT61B (1) viewer (1)

четверг, 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;   
                  //обрабатываем нашу строку как хотим.
                }








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

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

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