probleme mit funktionsgenerator-programm
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