/*
 * RGB.c
 *
 * Created: 10.06.2015 09:31:02
 *  Author: maximilian.marinelli
 */ 

#define F_CPU 1000000UL																					// CPU Frequenz defienieren -> Fuses -> SUT_CKSEL
#include <avr/io.h>																						// Standardbinliotheke																						
#include <util/delay.h>																					// Wird benötigt um die _delay_ funktion zu benutzen
#include <avr/interrupt.h>

int poti, c=5, x=1,WERT;																		// interger Variablen initialisieren

int main()																								// Hauptprogramm
{
	DDRA  = 0b11111100;																					// Die Ein und Ausgände des Data Direction Register A festlegen
	PORTA = 0b00000011;																					// interner Pullup Widerstand für den Schalter																
	DDRC  = 0xff;	
	DDRB  = 0x00;
	PORTB = 0xff;																						// DDRC im Ausgangsbetrieb
	sei();																								// Globale Interrupts aktivieren
	c=5;																								// Variable deklarieren
	
    while(1)																							// Dauerschleife
    {	
		ADCW   |= 0;
		ADMUX  |= 1<<REFS1 | 1<<REFS0 | 0<<ADLAR | 0<<MUX4 | 0<<MUX3 | 0<<MUX2 | 0<<MUX1 | 0<<MUX0;		// REF = interne 2.56V referenz Spannung + externer Kondensator,MUX = 00000, PINA0 mit dem ADWandler verbunden
		ADCSRA |= 1<<ADEN  | 0<<ADATE | 0<<ADIF  | 0<<ADIE | 0<<ADPS2| 1<<ADPS1| 1<<ADPS0;				// ADSC = Starts a Conversion, wird automatisch 0 nach einer Wandlung,ADPS2 und ADPS1, stellen den Teilungsfaktor vom XTAL und dem Funktionsgenerator auf den Adc ein															
		SFIOR  |= 0;

		TCNT1  |= 0;
		TCCR1A |= 0<<WGM11 | 0<<WGM10 | 0<<COM1A1 | 1<<COM1A0 | 0<<COM1B1 | 1<<COM1B0; 																																																					
		TCCR1B |= 1<<CS02  | 1<<CS00  | 0<<WGM13  | 0<<WGM12;											// Prescaler von 8 und Betriebsart
		//TIMSK  |= 1<<TOIE1 | 1<<OCIE1B;																		// Interrupts erlauben
		OCR1AH  = 255;
		OCR1AL	= 255;
		//OCR1BH  = 255;
		//OCR1BL  = 255;
	
		
		
		ADCSRA |= (1<<ADSC);																			// A/D Start Conversion		
		while ( ADCSRA & (1<<ADSC) )																	// Wandlung findet stwatt,warten bis ADSC Bit geloescht wird
		{
			;
		}
		
		poti = ADCW;																					// Variable wird mit dem ADC-Wert beschrieben
			
	if(!(PINB & 0x01))																					// if anweisein () <- muss erfüllt sein
		{
			c=c+1;																						// Aufwärtszähler
		}
		
		switch(c)																						//switch case (variable)
		{
		
			//case 1:																						// case (Variablenwert) trifft ein sobald der Wert erreicht wird
			//{	
				//PORTA = poti;																			// PORTA wird der vardelaywert zugewiesen, ADCW der vom Poti gesteuert wird 																	
				//PORTC = poti;																				
				//_delay_ms(100);																			// verzögerung von 100 Millisekunden
				//PORTA = 0x00;																			// PORTA ausschalten
				//PORTC = 0x00;																			
				//_delay_ms(100);
			//}
			//break;																						// bricht die Switchcase-anweisung ab case 2 wird nicht mehr ausgeführt
			//
			//case 2:
			//{
				//PORTA = poti;
				//PORTC = poti;
				//_delay_ms(250);
				//PORTA = 0x00;
				//PORTC = 0x00;
				//_delay_ms(250);
			//}
			//break;
			
			//case 3:
			//{
				//PORTA = poti;
				//PORTC = poti;
				//_delay_ms(500);
				//PORTA = 0x00;
				//PORTC = 0x00;
				//_delay_ms(500);
			//}
			//break;
			//
			//case 4:
			//{
				//PORTA = poti;
				//PORTC = poti;
				//_delay_ms(1000);
				//PORTA = 0x00;
				//PORTC = 0x00;
				//_delay_ms(1000);
			//}
			//break;
		
			case 5:
			{
				int e=3;
				for (e>2; e>200; e=e++)
				{
					OCR1AL=e;
					_delay_ms(100);
				}
				e=0;
				
				PORTA =	TCNT1/20;
				//PORTA = TCNT1L;
				PORTC = TCNT1/20;
				//PORTC = TCNT1L;
				
			}
			break;
					
			default:				c=1;																// trifft ein wenn (Variable) nicht einer Casevariable entspricht  
					
			break;
			
			
		 }
	}
}

