Hi!

ich möchte mir einen Funktionsgenerator mit einem ATmega8 und einem R2R-Netzwerk bauen.

Hier ist der Code, hoffentlich halbwegs verständlich kommentiert:

Code:
#include <avr\io.h>
#include <avr\interrupt.h>
#include <math.h>

#define F_CPU 8000000

#define round(x)    ((unsigned) ((x) + .5))


uint16_t frequenz;						//frequenz in Hz
uint8_t signalform;						//gewünschte signalform 0=sinus, 1=dreieck, 2=sägezahn, 3=rechteck

uint16_t interruptspersecond;			//anzahl der interrupts pro sekunde
uint8_t ausgang;						//Ausgangsport
float periodendauer;					//in S
uint16_t interruptsproperiode;			//anzahl der interrupts pro periode
double spg=0;							//Berechneter Spannungswert des Ausganges
uint16_t x;
double x2;
double x3;


void init()
{
	TIMSK=(1<<TOV0);					//Timer Overflow Interrupt einschalten
	TCNT0=0x00;							//Zähler-Startwert setzen
	TCCR0=(1<<CS00);					//vorteiler: 1
	sei();								//Interrupts einschalten
}



ISR(TIMER0_OVF_vect) 					//Interrupt-Routine
{
	interruptspersecond = F_CPU/256;
	periodendauer=1/frequenz;
	interruptsproperiode=periodendauer/interruptspersecond;
	
	if(x<=interruptsproperiode)
	{
		x++;							//x nimmt werte von 0-interruptsproperiode an
	}
	else
	{
		x=0;
	}

	x2=x/interruptsproperiode*2*M_PI;	//x2 nimmt werte von 0-2Pi an
	x3=x/interruptsproperiode;			//x3 nimmt werte von 0-1 an

	if(signalform==0)					//signalform=sinus	
	{
		spg=sin(x2);					//spannungsberechnung für sinus-signal mit sinus funktion
	}

	if(signalform==1)					//signalform=dreieck
	{
		if((0<=x3)&(x3<=0.25))
		{
			spg=x3*2+0.5;					//spannungsberechnung für dreieck-signal mit dreieck funktion
		}
		
		if((0.25<x3) &(x3<0.75))
		{
			spg=1-(x3-0.25)*2;
		}
		
		if((0.75<=x3)&(x3<=1))
		{
			spg=(x3-0.75)*2;
		}
	}

	if(signalform==2)					//signalform=sägezahn
	{
		spg=x3;							//spannungsberechnung für sägezahn-signal mit sägezahn funktion
	}

	if(signalform==3)					//signalform=rechteck
	{
		if(x3<0.5)						//spannungsberechnung für rechteck-signal mit rechteck funktion
		{
			spg=0;
		}
		else
		{
			spg=1;
		}
		//verstellbarer dutycicle wäre praktisch
	}

	spg=spg*255;						//vorher spg: 0-1, nacher spg: 0-255
	ausgang=round(spg);					//runden
	PORTD=ausgang;						//gerundeten wert auf port D (r2r-netzwerk angeschlossen) legen
}



int main(void) 
{

	DDRD=0b11111111;

	init();

	while (1)
	{
		frequenz=1000;
		//frequenz einstellen
		signalform=0;
		//signalform einstellen
	}

}
Der Code ist noch nicht optimiert!

Folgende Probleme habe ich jetzt:

1. Am Port D kommt nix an. nur 0V, an allen 8 Pins.
2.Die HEX-Datei ist 16kB groß, also eigentlich zu groß für den ATMega8. Wieso?
3. Der Compiler erstellt auch noch eine .eep-Datei. Warum? Hängt das mit dem zu großen Programm zusammen?

Ich hoffe Ihr könnt mir helfen.

Mit freundlichen Grüßen