/** I N C L U D E S *******************************************/
#include <htc.h>
#include <pic18f23k22.h>
#include "Config.h"			//Konfigurationsbits


/** D E F I N E S *********************************************/
#define TASTER 		PORTBbits.RB0	//Taster liegt an Port B RB0
#define LED			LATAbits.LATA4	//LED liegt an Port A RA4

/** P R O T O T Y P E S ***************************************/
void 	interrupt isr_high(void);
void 	interrupt low_priority isr_low(void);
void 	delay( int ms );
void 	setupTouch(void);
int 	getKey( char key );
void 	setLED( short light );

/** I N T E R R U P T S ***************************************/
void interrupt isr_high(void) {

}

void interrupt low_priority isr_low(void) {

}

/** H A U P T P R O G R A M M *********************************/
void main(void)
{
	char button=0;
	volatile unsigned char sinus[40]={127,147,166,185,202,217,230,240,248,252,254,252,248,240,230,217,202,185,166,147,127,107,88,69,52,37,24,14,6,2,0,2,6,14,24,37,52,69,88,107}; //Array mit berechneten Sinuswerten
	volatile char a=1; 	//Zählervariable zum Auslesen des Arrays
	short sin_wert=0;

	//Port A
	LATA = 0x00;
	TRISA = 0x00;		//Alle Pins von Port A sind Ausgänge
	ANSELA = 0x00;		//Alle Pins von Port A sind digitale I/O's
	//Port B
	LATB = 0x00;
	TRISB = 0xFF;		//Alle Pins von Port B sind Eingänge		
	ANSELB = 0x00;		//Alle Pins von Port A sind digitale I/O's
	//Port C
	LATC = 0x00;
	TRISC = 0xB0;		//RC0..RC3 = Ausgänge, RC4..RC7 = Eingänge
	ANSELC = 0x30;		//nur RC4 und RC5 sind analoge Eingänge


	while(1) {					//Hauptschleife	
		if(a==40){
			sin_wert = sinus[40];
      		delay(10);
			a=1;
		}
		
		else{
			sin_wert = sinus[a];
      		delay(10);
			a++;
		}	
		setLED(sin_wert);
	}	
}

//Zeitverzögerung
void delay( int ms ) {
	int i=0;
	//1 ms = 4000 Befehlstakte (16 MHz Quarz / 4)
	for( i=0; i<ms; i++ ) {
		_delay(10);
	} 	
}

//Setzt die Helligkeit der LED über PWM
void setLED( short light ) {
	
	TRISAbits.TRISA4=1;		//als Eingang schalten
	CCPTMRS0 = 0x00;			//Timer 2 wird für die PWM verwendet
	CCPTMRS1 = 0x00;
	PR2 = 0x63;					//für PWM mit 10 kHz (T=100us)
	T2CON = 0x01;				//Prescaler 1:4

	CCP5CON = 0x0C | (light&0x03);	//PWM-Mode und untere
													//2 Bits der Pulsbreite
	CCPR5L = light >> 2;	//oberen 8 Bits der Pulsbreite
	//PIR4 = 0x00;
	T2CONbits.TMR2ON=1;			//Timer 2 starten
	//while(PIR4bits.CCP5IF);		//warten bis der Timer überläuft
	TRISAbits.TRISA4=0;			//als Ausgang schalten und
										//PWM freigeben
	return;
}