UART







Cod: 
#define F_CPU 8000000UL        
#include <avr/io.h>
#include <util/delay.h>               


void UART_Init(void){
// viteza de transmitere baud=9600
UBRRH=0;           //UBRR=f/(16*baud)-1,=>f=8000000/(16*9600)=52.08~51
UBRRL=51;         //regim normal dublu directi
// 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)))    //            1- cind registru este liber
                {}
                UDR = c;
}
//-----------------------------------------------------------------------------------
void send_Uart_str(unsigned char *s)//             trimitere string
{
                while (*s != 0) send_Uart(*s++);
}
//-----------------------------------------------------------------------------------

unsigned char getch_Uart(void)//          primire bait de oe UART
{
                while(!(UCSRA&(1<<RXC)))      
                {}
                return UDR;
}
//-----------------------------------------------------------------------------------
char CharTo7Seg(char c){
switch (c){
                               case '1' : {c=0b00000110;                             break;} //1
                               case '2' : {c=0b01011011;                             break;} //2
                               case '3' : {c=0b01001111;                             break;} //3
                               case '4' : {c=0b01100110;                             break;} //4
                              
                               case '5' : {c=0b01101101;                             break;} //5
                               case '6' : {c=0b01111101;                             break;} //6
                               case '7' : {c=0b00000111;                             break;}          //7
                               case '8' : {c=0b01111111;                             break;} //8
                              
                               case '9' : {c=0b01101111;                             break;} //9
                               case '0' : {c=0b01000000;                             break;} //0
               
                default :c=0x00;              
}
return c;
}
//-----------------------------------------------------------------------------------
void main(void)
{char k;
DDRA=0xFF;                      //  p/u 7 seg
PORTA=0x00;
                DDRC = 0xFF;     // LED
                PORTC=0x00;

                UART_Init();                                                                     //            Initializare  UART
                send_Uart_str("AVR Studio 4.0");                                      //            trimite un string
                send_Uart(13);                                                              
                send_Uart_str("UART");                                                                                           
                send_Uart(13);                        //            "apasare pe enter" - \n - trece din rind nou
    while(1)                                                                                        
    {
                if(UCSRA&(1<<RXC))                                    //            daca a venit "bait" pe uart
                               {k=UDR;
                               switch (k){
                               case '0':{PORTC^=0b11111111;    PORTA=CharTo7Seg('0');break;}
                               case '1':{PORTC^=0b00000001;    PORTA=CharTo7Seg('1'); break;}
                               case '2':{PORTC^=0b00000010;    PORTA=CharTo7Seg('2');break;}
                               case '3':{PORTC^=0b00000100;    PORTA=CharTo7Seg('3');break;}
                               case '4':{PORTC^=0b00001000;    PORTA=CharTo7Seg('4');break;}
                               case '5':{PORTC^=0b00010000;    PORTA=CharTo7Seg('5');break;}
                               case '6':{PORTC^=0b00100000;    PORTA=CharTo7Seg('6');break;}
                               case '7':{PORTC^=0b01000000;    PORTA=CharTo7Seg('7');break;}
                               case '8':{PORTC^=0b10000000;    PORTA=CharTo7Seg('8');break;}
                               }

                                
                                               _delay_ms(50);                           //            retinere 50ms
                                
                               }                             
    }
}