
// ******************************* Musterprogramm Versuch 2   2015 **************************


#include <avr/io.h>       
#include <stdint.h>
#include <avr/iom16.h>
#include <stdio.h>   
#include <stdlib.h>   
#include <avr/interrupt.h> 
#include <inttypes.h>
#include <string.h>



// Die ASCII Steuerzeichen
#define NUL 0x00
#define CR  0x0d
#define EOT 0x04
#define LF 	0x0a
#define ENQ 0x05
#define BEL 0x07
#define ETB 0x17
#define CAN 0x18
#define ACK 0x06
#define NAK 0x15
#define EM  0x19
#define SOH 0x01
#define NL  0x0a
#define DC1 0x11
#define DC2 0x12
#define BS  0x08
#define SP	0x20


 
uint8_t n, m, o, p;				// Einige globale Variable auf Vorrat

uint8_t received_byte;


								// ********************  DIE FUNKTIONEN *******************


void milli (void)				// Eine Millisekunde darstellen
{

	uint16_t x;
	x= 207;

	while (x) x-- ;

return ;
}


void millisecs (uint16_t ms) 	// ms Millisekunden darstellen
{

	while (ms)
	{
		milli();
		ms--;
	}

return;
}





void usart_init()				// die USART initialisieren
{

	UBRRL = 103; 				// 2400 Baud bei 4 MHz


	UCSRB = (1<<TXEN) | (1<<RXEN) | (1<<RXCIE); //UART RX, TX und RX Interrupt einschalten
												// Wir machen es mal so, auch wenn's scheusslich aussieht	 
}



void senden (uint8_t data)		// Ein Byte Senden
{


while ( !(UCSRA & (1<<UDRE))); 	// Darauf warten, daß UDRE => 1 wird 

UDR = data;						//	Das Datenbyte senden			

}

// *********************************** Der Interrupt-Handler zum empfangen *************************

//						***** Dienst nach Vorschrift -- es muß einfach so sein ******

ISR(USART_RXC_vect)				// Muß so heißen
{

received_byte = UDR;			// Das Byte abholen

senden (received_byte);			// Zurücksenden (Echo)

PORTC= ~received_byte;			// Auf Port C anzeigen (invertiert, weil die LEDs aktiv Low sind)

}



//******************************************************************************************




int main (void) 				// ******************** DAS HAUPTPROGRAMM ******************
{            

uint8_t sg[10];					// Siebensegmentanzeige

PORTA = 0xff;					// Alle Ports auf Ausgang
PORTB = 0b00000010;				// Das TX-:Signal auf 1
PORTC = 0xff;
PORTD = 0xff;
DDRA  = 0xff; 
DDRB  = 0xff;
DDRC  = 0xff;
DDRD  = 0xff;                


sg[0]=0xc0;						// Siebensegmentanzeige mit Werten füllen
sg[1]=0xf9;						
sg[2]=0xa4;
sg[3]=0xb0;
sg[4]=0x99;
sg[5]=0x92;
sg[6]=0x82;
sg[7]=0xf8;
sg[8]=0x80;
sg[9]=0x90;


//							******* Hierher kommt die Initialisierung *********


usart_init();					// Die UART initialisieren

asm volatile("sei"::);			// Interrupts zulassen. Das geht nur mit einem Assemblerbefehl.
								// daß dessen Syntax so schauderös aussieht, dafür können wir nichts...
								

senden (0x41);					// Zur Probe senden wir das Zeichen 'A'
	
								
while (1)						// Die allgemeine Endlosschleife
{





}


return 0;
} 								// ******************** DAS ENDE ***********************
