Forum: Mikrocontroller und Digitale Elektronik Funktionsgenerator


von Bernhard Friedel (Gast)


Angehängte Dateien:

Lesenswert?

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.

von eugen d (Gast)


Lesenswert?

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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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.

von Bernhard Friedel (Gast)


Angehängte Dateien:

Lesenswert?

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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.