#include <avr/io.h> 
#include <util/delay.h> 
 
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
#define F_CPU 4000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
                         // Ohne ergeben sich unten Fehler in der Berechnung
#endif
 
#define BAUD 115200UL      // Baudrate
 
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
 
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif 
#include <util/setbaud.h>

uint8_t c = 0;
#define dc1 0x11
#define dc2 0x12
#define esc 0x1b
unsigned char bcc;



void uart_init(void)
{
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
UCSRB |= (1<<RXEN)|(1<<TXEN);  // UART RX, TX und RX Interrupt einschalten|(1<<RXCIE)
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1 
}




int uart_putc(unsigned char c)
{
while (!(UCSRA & (1<<UDRE)));  /* warten bis Senden moeglich */                         
UDR = c;                      /* sende Zeichen */
return 0;
}


void uart_puts (char *s)
{
while (*s)
{   			/* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
uart_putc(*s);
bcc = bcc + *s;
s++;
}
uart_putc(0);
}


/* Zeichen empfangen */
uint8_t uart_getc(void)
{
while (!(UCSRA & (1<<RXC))); // warten bis Zeichen verfuegbar
return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
}

void uart_gets( char* Buffer, uint8_t MaxLen )
{
uint8_t NextChar;
uint8_t StringLen = 0;
NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen 
                                  // Sammle solange Zeichen, bis:
                                  // * entweder das String Ende Zeichen kam
                                  // * oder das aufnehmende Array voll ist
while( NextChar != '\n' && StringLen < MaxLen - 1 ) 
{
*Buffer++ = NextChar;
StringLen++;
NextChar = uart_getc();
}
 
                                  // Noch ein '\0' anhängen um einen Standard
                                  // C-String daraus zu machen
  *Buffer = '\0';
}


void uart_test (void)
{
uint8_t x = 0;
x = uart_getc();
uart_putc(x);
}


void sendepuffer (void)
{
uart_putc (dc2);
uart_putc (1);
uart_putc ('S');
uart_putc (dc2 + 1 + 'S');
}



void cursor (unsigned char x)
{
uart_putc (0x11);
uart_putc (4);
uart_putc (0x1b);
uart_putc ('T');
uart_putc ('C');
uart_putc (x);
uart_putc (0x11+ 4+ 0x1b+ 'T'+ 'C' + x);
}


int main (void)
{
    DDRB = 0xFF;
    uart_init (); 
      while (1)
    {
     
    cursor(1);
    x=uart_getc();
    uart_putc (x);
    _delay_ms (500);
      }
}

