5.Unterprogramme(adc_init, adc)

Code:
float prozent_wert;					//Prozent wert nach ADC
//unsigned char kanal;			//Variable wird bei der Funktion adc(kanal) übergeben

//_______________________________________initialisieren der ADC Register____________________________________________

void adc_init(void)
	{
	ADMUX=0x00;							//Den AusgangsPin 0 zum vergleichen festgelegt, Vref ist turned off

	ADCSRA=(1<<ADEN);					//ADC  Enablen
	ADCSRA|=(1<<ADPS2)|(1<<ADPS1);		//Prescaler Quotient festgelgt: 64, damit die Frequenz: 125kHz ist
	
	SFIOR=0x00;							//für den Free Running Mode(die ersten 3 Bits =0), die anderen brauchen wir nicht						
	}
//__________________________________________________________________________________________________________________


//__________________________________________Free Running Mode_______________________________________________________

float adc (unsigned char kanal)
	{
	long int x;
	
	
	ADMUX |= kanal;						//Zum einstellen des Kanals(Vergleichs Pin an der Platine)

	ADCSRA|=(1<<ADSC);					//Vergleich starten
		
	while(ADCSRA&(1<<ADSC))			//Warten bis der Vergleich zu Ende ist, dann wird das ADSC wieder auf "0" gesetzt
		;
	
	x=ADCL+ADCH*256;					//Den wert des Hight und Low Registers in einer Variable zusammengefügt
	
	//return(x);				//Herauslesen der beiden Register, ADCH*256 weil man ja schon 8 Bits belegt hat
											//:4 weil man sonst 1024 als höchsten Wert hat, man möchte es aber auf die 
											//8 Leds ausgeben, deshalb 1024/4= 256(jetzt nicht mehr dabei, weil wir ja eine
											//10 Bit Auflösung haben wollen!!!
	
	prozent_wert=(x*100)/1024;		//prozent_sollwert/100= x/1024--> damit habe ich einfach die Prozent ausgerechnet
									
	return(prozent_wert);
	
	}
//__________________________________________________________________________________________________________________
6.Unterprogrammesenden, receive, uart_init)

Code:
#include "funktion.h"			//Header für meine eigen angelegten Funktionen


//_____________________________________Baudrate Berechnung____________________________________________________________________

#define F_CPU 8000000  			//CPu mit einen 8Mhz Taktfrequenz definiert
#define UART_BAUD_RATE 19200		// Baud Rate wie bei Serieller mit 9600 festgelegt

//____________________________________________________________________________________________________________________________

//Variabeln

unsigned char j;


//___________________________________________Initialiseren der UART Register__________________________________________________

void uart_init(void)
	{
	UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);		/*USART settings: Parity=disable(das wäre mit Bit UPM1:0=0), 
													  character size=8Bit(Mit UCSZ1:0)*/

    UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);				/*Transmitter enabled(TXEN) (zum Senden an den PC) und TRansmitter 
												   Data bit 8gesetzt ist (TXB8)*/
											/*Receiver enabled(RXEN) (zu empfangen vom PC) und Receiver Data Bit 8 
												  gesetzt ist (RXB8)*/
												 
												 //RXCIE Interrupt Enable
												  
	UBRRL=F_CPU/(UART_BAUD_RATE*16L)-1;		//Formel zum Berechnen der UART Bade Rate Register (Baudrate =51)
	//UBRRH=0;
	}
//____________________________________________________________________________________________________________________________



//______________________________________________________________________________________________________________________________

void receive(void)
	{
	pc_daten[j]=UDR;
	
	if(pc_daten[j-1]=='y')					//Wenn bei den Abgespeicherten Daten ein 'y' schon vorhanden ist,
		{									//ist die übertragung beendet, und die Variable uebert_beendet=1 gesetzt
		uebert_beendet=1;					//und die For Schleife wird verlassen
			
		if(pc_daten[j-2]=='b'&&pc_daten[j-3]=='x')
			{
			start_brenn=1;
			}
			
		if(pc_daten[j-2]=='a'&&pc_daten[j-3]=='x')
			{
			zeit_abfrage=1;
			}
		
		}	
		
	if(j>=60)
		j=0;
	
	if(uebert_beendet==1)
		j=0;
	else
		j++;
	}


//___________________________________________Programm von senden()____________________________________________________________

void senden(char sende_string_pc[])
	{
	
	for(unsigned char i=0;i<=20;i++)
		{
		while(!(UCSRA&(1<<UDRE)))					//zuerst muss ich warten bis das Daten Register leer ist, damit ich nichts überschreibe
			;
		
		if(sende_string_pc[i]=='\0')
			break;
		
		UDR=sende_string_pc[i];									//dann überschreibe ich ins Daten Register die zu sendenden Daten
	
		while(!(UCSRA&(1<<TXC)))					//dann warte ich wieder bis die Sendung komplett ist
			;
		
		}
		
	//return;										//Kein Rückgabe Wert
	}
//____________________________________________________________________________________________________________________________
7.Unterprogrammetimer8_init)

Code:

#include "funktion.h"					//Header für meine eigen angelegten Funktionen




//_______________________________________initialisieren des 8 Bit Timer Registers____________________________________________

void timer8_init(void)
	{
	
	TCCR0=(1<<CS02)|(1<<CS00);	//Takt: Im Timer ControlRegister den Takt für den Prescaler festlegen
								//wenn CS02&CS00=1 dann Oszillator Frequ./1024=7812,5
								//7812,5/256=30,51     t=1/30,51  
	TIMSK=(1<<TOIE0);			//Interrupt Enable

	}
//___________________________________________________________________________________________________________________________
8.Unterprogramme(regler_funct)

Code:
#include "funktion.h"

 float prozent_istwert;			//Nach ADC wandlung, auf Prozent*100 umgerechnet, Das ist der Istwert des Reglers
 float prozent_sollwert;		//Nach ADC wandlung, auf Prozent*100 umgerechnet, Das ist der Sollwert des Reglers
 float kp;						//die Reglerverstärkung
 float tn;						//die Nachstellzeit, für I-Anteil
	


int regler_funct (float istwert, float sollwert, float kp, float tn)
	{
	int hilf;
	float xd_k,xd_k1,ta;
	float y_k,y_k1;
	float b0, b1;
	int a0, a1;

	ta=1;										//angenommene Abtastzeit (wird bei uns später die Timer Zeit sein)
	xd_k=0;										//xd_k beim ersten Durchlauf auf 0 setzen, wird später berechnet
	y_k1=0;

	a0=1;
	a1=-1;
	b0=kp*(1+ta/(2*tn));
	b1=kp*(-1+ta/(2*tn));				//a0,b0,a1,b1 sind die Koeffizienten für einen PI Regler Algorithmus
	
	xd_k1=xd_k;							//xd_k1 ist die Differenze von Sollwert und Istwert vom letzten Durchlauf
	xd_k=sollwert-istwert;				//xd_k ist die derzeitige Differenz von Sollwert und IStwert
	y_k1=y_k;							//y_k1 ist der Stellwert vom letzten Durchlauf
	
	y_k=(b0*xd_k+b1*xd_k1-a1*y_k1)/a0; //Das ist die Formel für einen PI-Regel Algorithmus
	
		if(istwert<=sollwert)
			PORTC=0xFF;
		else
			PORTC=0x11;
	
		if(y_k<0)										//Wenn bei der Berechnung eine kleinere Stellgröße raus kommt als 0
			{										//dann soll die Stellgröße 0 sein
			y_k=0;
			}
	
		if(y_k>100)									//Wenn bei der Berechnung eine größere Stellgröße raus kommt als 100
			{										//dann soll die Stellgröße 0 sein
			y_k=100;
			}
	/*
								werte_schicken(y_k);
								senden(sende_string);
								sende_string[0]='\0';
*/
	//y_k=50;
	hilf=((y_k*1024.0)/100.0);								//Umrechnung von im Verhältnis von Prozent auf die 10 Bit
	//prozent_istwert=hilf;
	//hilf=512;
	
	
	return(hilf);
	}
Es ist jetzt vor allem das Problem, dass das PWM nicht mehr geht!!!!