Hallo! Ich versuche einen Funktionsgenerator mit einem ATmega16 und einem DAC0800 zu realisieren. Das Problem ist, dass ich momentan maximal 9,8 kHz bei 36 Einzelschritten pro Kurvenform schaffe. Da es mein erstes Projekt mit einem AVR ist weiß ich nicht ob es an mir liegt, dass ich keine höheren Frequenzen schaffe, oder ob es mit dieser Konfiguration einfach nicht möglich ist. Wäre dankbar für hilfreiche Tipps.
ja also ich habe das mal so pauschal überschlagen, wenn du es schaffst, dass du nur 10 zyklen für die ausgabe die sprünge und holen der daten brauchst müsstest du bei 36 samples und 16 Mhz 44 kHz an frequenz schaffen. soweit ich mich entsinne, hat der typ der den yamp (yet an other mp3 player) gebaut hat auch nen dds gebaut, und er hat in assembler es in glaube 9 zycklen geschafft die daten ranzuholen und auszugeben. du müsstest also ne assembler funktion schreiben die die schleife ersezt. MfG eugen d
Schau dir mal http://www.mikrocontroller.net/projects/dds/ an, ich verwende da einen Timerinterrupt der alle 25 Takte aufgerufen wird. Mit einer normalen Schleife ginge es schneller, aber dann wäre keine Zeit mehr für LCD & Taster.
Nun das ganze in Assembler (ist mein erstes Assembler-Programm). Das kleine Testprogramm schafft bei 51 Schritten ca. 44kHz - aber jetzt hab ich immer ein nettes Eck in der Kurve (siehe angehängtes Bild). Wie soll ich nun am besten die Frequenzeinstellung lösen? Mit einem Timer? Der Controller muss eigentlich nichts anderes machen als die Tabellen abzuarbeiten, da das LCD und die Eingabe von einem zweiten Controller übernommen wird. .include "m16def.inc" ser R16 out DDRA,R16 ldi r16,0x05 ldi ZL, low(sine*2) ldi ZH, HIGH(sine*2) loop: add zl, r16 lpm out PORTA,R0 rjmp loop sine: .db 0x80,0x82,0x85,0x88,0x8C,0x8F,0x92,0x95 .db 0x98,0x9B,0x9E,0xA1,0xA4,0xA7,0xAA,0xAD .db 0xB0,0xB3,0xB6,0xB9,0xBB,0xBE,0xC1,0xC3 .db 0xC6,0xC9,0xCB,0xCE,0xD0,0xD3,0xD5,0xD7 .db 0xDA,0xDC,0xDE,0xE0,0xE2,0xE4,0xE6,0xE8 .db 0xE9,0xEB,0xED,0xEE,0xF0,0xF1,0xF3,0xF4 .db 0xF5,0xF6,0xF8,0xF9,0xF9,0xFA,0xFB,0xFC .db 0xFD,0xFD,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF .db 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFD .db 0xFD,0xFC,0xFB,0xFA,0xF9,0xF9,0xF8,0xF6 .db 0xF5,0xF4,0xF3,0xF1,0xF0,0xEE,0xED,0xEB .db 0xE9,0xE8,0xE6,0xE4,0xE2,0xE0,0xDE,0xDC .db 0xDA,0xD7,0xD5,0xD3,0xD0,0xCE,0xCB,0xC9 .db 0xC6,0xC3,0xC1,0xBE,0xBB,0xB9,0xB6,0xB3 .db 0xB0,0xAD,0xAA,0xA7,0xA4,0xA1,0x9E,0x9B .db 0x98,0x95,0x92,0x8F,0x8C,0x88,0x85,0x82 .db 0x80,0x7D,0x7A,0x77,0x73,0x70,0x6D,0x6A .db 0x67,0x64,0x61,0x5E,0x5B,0x58,0x55,0x52 .db 0x4F,0x4C,0x49,0x46,0x44,0x41,0x3E,0x3C .db 0x39,0x36,0x34,0x31,0x2F,0x2C,0x2A,0x28 .db 0x25,0x23,0x21,0x1F,0x1D,0x1B,0x19,0x17 .db 0x16,0x14,0x12,0x11,0x0F,0x0E,0x0C,0x0B .db 0x0A,0x09,0x07,0x06,0x06,0x05,0x04,0x03 .db 0x02,0x02,0x01,0x01,0x01,0x00,0x00,0x00 .db 0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x02 .db 0x02,0x03,0x04,0x05,0x06,0x06,0x07,0x09 .db 0x0A,0x0B,0x0C,0x0E,0x0F,0x11,0x12,0x14 .db 0x16,0x17,0x19,0x1B,0x1D,0x1F,0x21,0x23 .db 0x25,0x28,0x2A,0x2C,0x2F,0x31,0x34,0x36 .db 0x39,0x3C,0x3E,0x41,0x44,0x46,0x49,0x4C .db 0x4F,0x52,0x55,0x58,0x5B,0x5E,0x61,0x64 .db 0x67,0x6A,0x6D,0x70,0x73,0x77,0x7A,0x7D
Du musst "sine" auf eine Adresse mit Low-Byte=0 legen, sonst musst du beim Addieren das Carry berücksichtigen und den Zähler am Ende der Tabelle wieder zurücksetzen. Zur Frequenzeinstellung: schau dir http://www.mikrocontroller.net/projects/dds/ an.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.