Hi!
ich möchte mir einen Funktionsgenerator mit einem ATmega8 und einem R2R-Netzwerk bauen.
Hier ist der Code, hoffentlich halbwegs verständlich kommentiert:
Der Code ist noch nicht optimiert!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 } }
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







Zitieren

Lesezeichen