Forum: Mikrocontroller und Digitale Elektronik @ Andreas: Frage zum Digitalen Funktionsgenerator DDS


von Björn W. (bwieck)


Lesenswert?

Hallo,

@Andreas:

Ich wollte mal den DDS aus dem Artikel 
http://www.mikrocontroller.net/articles/Digitaler_Funktionsgenerator
testen und bin beim Assemblieren darüber gefallen das einige Register
Im Quelltext neu definiert werden obwohl sie in der m8def.inc schon
vordefiniert sind...

Das ergibt natürlich Fehler bei der Assemblierung.
Hier mal auszüge der betreffenden Direktiven.

dds.asm:

.def        fbinL        = R26            ; binary value Low byte
.def        fbinH        = R27            ; binary value High byte

.def  z1 = R28        ; Dieses Registertripel enthält die Phasenposition
.def  z2 = R29        ; zu der die Register changeX bei der Phasenakk.
.def  z3 = R30        ; addiert werden




m8def.inc:

; ***** CPU REGISTER DEFINITIONS 
*****************************************
.def  XH  = r27
.def  XL  = r26
.def  YH  = r29
.def  YL  = r28
.def  ZH  = r31
.def  ZL  = r30


ausserdem werden im Quelltext die Register 21 und 22
gleich doppelt definiert:

.def   fbin2   = R21            ; binary value byte 2
.def   fbin3   = R22            ; binary value byte 3 (MSB)
.def   tBCD0   = R21            ; BCD value digits 1 and 0 (same as 
fbin2)
.def   tBCD1   = R22            ; BCD value digits 3 and 2 (same as 
fbin3)

soll das so sein ?
oder Hast Du eine andere m8def.inc benutzt

Grüße
Björn

von Björn W. (bwieck)


Lesenswert?

Einen habe ich noch:

Diese Zeile mag der Assembler auch nicht:

ldi temp1, 0b10000000|(((@0)-1)<<6)|((@1)-1)

Da bekomme ich eine Fehlermeldung:

DDS.asm(121): error: syntax error, unexpected ','

Merkwürdig... ich kann da nichts falsches dran finden..

Grüße
Björn

von Björn W. (bwieck)


Lesenswert?

Björn Wieck wrote:

> Diese Zeile mag der Assembler auch nicht:
>
> ldi temp1, 0b10000000|(((@0)-1)<<6)|((@1)-1)
>
> Da bekomme ich eine Fehlermeldung:
>
> DDS.asm(121): error: syntax error, unexpected ','


OK, den Fehler habe ich gefunden... lag am Assembler selbst.
mit Version 1 gehts dann, nur die Registerproblematik ist geblieben.

von Björn W. (bwieck)


Lesenswert?

Björn Wieck wrote:

> OK, den Fehler habe ich gefunden... lag am Assembler selbst.
> mit Version 1 gehts dann, nur die Registerproblematik ist geblieben.

Die restlichen Meldungen wegen der Registerdoppelbelegungen scheinen 
nicht
ins Gewicht zu fallen, das Prog läuft.

Da habe ich mich mal über den Schaltplan hergemacht und stelle 2 Fragen:

R19 ist ohne Wert, ich habe jetzt mal einfach 10-15k als passend 
angenommen weil es hier nur um die Kompensation geht.

R29 ist als 1k angegeben! Warum?? da gehen ja ständig 0,5W in Wärme weg.


Grüße
Björn

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

R19 kannst du im Zweifelsfall auch weglassen, der dient nur dazu den 
Einstellungsbereich etwas zu verkleinern um genauer einstellen zu 
können. Was ich da eingebaut habe weiß ich nicht mehr genau.

R29 ist zu klein, das stimmt. Allerdings ist wenn man ihn größer macht 
der Spannungsteiler nicht mehr als unbelastet zu betrachten, was das 
Ergebnis verfälschen könnte.

Ich habe die Hinweise im Artikel eingefügt.

von Björn W. (bwieck)


Lesenswert?

Andreas Schwarz wrote:
> R19 kannst du im Zweifelsfall auch weglassen, der dient nur dazu den
> Einstellungsbereich etwas zu verkleinern um genauer einstellen zu
> können. Was ich da eingebaut habe weiß ich nicht mehr genau.
>
> R29 ist zu klein, das stimmt. Allerdings ist wenn man ihn größer macht
> der Spannungsteiler nicht mehr als unbelastet zu betrachten, was das
> Ergebnis verfälschen könnte.
>
> Ich habe die Hinweise im Artikel eingefügt.

Hallo Andreas,

Ich würde jetzt mal R19 auf Verdacht bei 10k nehmen.

R29 würde ich auf 4k7 machen und dazu den R32 auf 33k machen.
R30 und 31 sollten dann auch 33k sein aber ich teste erstmal..

Tschüss
Björn

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Kleiner würde ich die Widerstände am OP nicht machen, sonst belastest du 
den Spannungsteiler nur noch mehr. Lass die 56k doch einfach.

von Björn W. (bwieck)


Angehängte Dateien:

Lesenswert?

Andreas Schwarz wrote:
> Kleiner würde ich die Widerstände am OP nicht machen, sonst belastest du
> den Spannungsteiler nur noch mehr. Lass die 56k doch einfach.

Sooo, getestet und für Gut befunden.

Dein DDS funktioniert hervorragend.

R19 habe ich jetzt mit 4k2 getestet und ist i. O.
Bei R29 komme ich mit 4k7 auf gute Einstellbarkeit.
Alle anderen Werte sind so geblieben.

Anstelle des R2R Netzwerkes habe allerdingsich einen DA Wandler ZN428 
genommen.

Grüße
Björn

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Schön! Mit dem Gehäuse hast du dir ja einige Mühe gegeben. Ich hab das 
Bild auf der Projektseite verlinkt.

von Björn W. (bwieck)


Angehängte Dateien:

Lesenswert?

Andreas Schwarz wrote:
> Schön! Mit dem Gehäuse hast du dir ja einige Mühe gegeben. Ich hab das
> Bild auf der Projektseite verlinkt.

Danke Andreas, Das Gehäuse hatte ich noch zu liegen...

Das Display und die Tastatur haben so gerade eben noch in dieser Höhe 
reingepasst.


Grüße
Björn

von C. E. (Gast)


Lesenswert?

Hallo Björn,

gefällt mir richtig gut deine Lösung.
Leider bin ich fachlich noch nicht so weit, dass eine solche Aufgabe 
ohne Hilfe stemmen kann.

Habe ich die Möglichkeit den Schaltplan von "Deiner Lösung" zu bekommen?
Evtl. würdest Du mir ja auch das Layout überlassen?

Habe noch eine Frage zum ASM-Code. Für die Anwendung des DA-Umsetzers 
ZN428 musstest Du den Code nicht anfassen?

Gruß aus Wolfsburg

Christian Engel

von kelli (Gast)


Lesenswert?

Hallo zusammen,

Als erstes muss ich sagen dass ich das ein sehr gutes Projekt finde!
Vielleicht werde ich es auch mal als "Inspiration" für ein eigenes 
Projekt benützen.
Ich habe aber noch eine Lösung für den R29: man muss einfach eine OP als 
Impedanzwandler dahinterschalten und dann kann man ein fast beliebiges 
Poti nehmen, zb. 50k.

Gruss kelli

von Jörg S. (mitchell)


Lesenswert?

>> Diese Zeile mag der Assembler auch nicht:
>>
>> ldi temp1, 0b10000000|(((@0)-1)<<6)|((@1)-1)
>>
>> Da bekomme ich eine Fehlermeldung:
>>
>> DDS.asm(121): error: syntax error, unexpected ','
>
> OK, den Fehler habe ich gefunden... lag am Assembler selbst.
> mit Version 1 gehts dann, nur die Registerproblematik ist geblieben.

Hallo,
ich habe gerade das selbe Problem.
Ich benutze AVR-Studie 4.13, wie kann ich das Problem da lösen?
Ich habe auch noch nicht so richtig verstanden welche Bitmanipulation da 
erfolgt. Kann mir das mal jemand erklären.

mfg
Jörg

von dixie (Gast)


Lesenswert?

>> Diese Zeile mag der Assembler auch nicht:
>>
>> ldi temp1, 0b10000000|(((@0)-1)<<6)|((@1)-1)
>>
>> Da bekomme ich eine Fehlermeldung:
>>
>> DDS.asm(121): error: syntax error, unexpected ','
>
> OK, den Fehler habe ich gefunden... lag am Assembler selbst.
> mit Version 1 gehts dann, nur die Registerproblematik ist geblieben.


Einstellung im AVR-Studio:
-> Project -> Assembler Options -> AVR Assembler -> Version 1
Ansonsten wir mit Fehlermeldung übersetzt.
Normal ist der AVR Assembler Version 2 aktiv. ( Standard Einstellung )

von hoax (Gast)


Lesenswert?

Das Projekt Wirklich feine Sache! Habe es gleich mal nachgebaut.
Die Idee statt eines R2R-Netzwerkes ein DAC zu nehmen war ein klasse 
Idee. Allerdings konnte ich den DA Wandler ZN428, den  Björn Wieck 
benutzt hate nicht finden. Dehalb habe ich den DAC 0800 genommen. 
Funktioniert ebenfalls gut und ist jederzeit bei Reichelt zu bekommen.

von Andreas A. (elw-2)


Lesenswert?

@ hoax
Hättest du evtl. den geänderten Schaltplan mit dem DAC 0800??

Wäre sehr net, und würde mir die Neuerfindung des Rades ersparen :)

von hoax (Gast)


Angehängte Dateien:

Lesenswert?

Hier der gewünschte Schaltplan. Ersichtlich ist nur die Beschaltung des 
DAC0800. Problem bei dieser Schaltung ist nur die Spannungsversorgung, 
um einen Signalverlauf von 0-10V hinbekommt (Habe noch nicht getestet 
was passiert wenn V- auf GND gelegt wird). Es wäre kein Problem auch 
Spannungen von -5V - 5V zu erzeugen (ohne Offsetkompensation mit OPs). 
Dazu nutzt man andere Referenzspannungen.

von Andreas A. (elw-2)


Lesenswert?

Hi!

Danke hoax!!

Hat es evtl. schon einer Probiert, ob man es einfach gegen GND schalten 
kann?

MFG
Andreas

von Jochen Oberreiter (Gast)


Lesenswert?

Hm.
Ich bin bei der Auslegung des Transformators etwas stutzig geworden, da 
mir die 10,5V eff etwas zu klein scheinen. Eine kurze überschlägige 
Rechnung gibt:

10,5V eff = 14,85 V Scheitel

Mit V_D = 0,7 V (Diodenspannung) und V_RIPPLE ~ 1,2 V (über den 
Kondensator), sowie V_LM317 = V_IN - V_OUT = ~ 5V würde das etwa

(14.85 - V_RIPPLE - V_D - V_LM317) = 7,9 V

ergeben, viel zu wenig und nicht annähernd an den gewünschten 11,3 V ...

Wenn ich den Trafo auslegen müßte, würde ich eher einen 15V eff 
verwenden. Welchen Trafo habt ihr real verbaut?


Jochen

von Andreas A. (elw-2)


Lesenswert?

Also ich würde real eine nehmen mit 13,4V, was ausreichen wäre, den 
13,4V*Wurzel²~18V sollte reichen :)

Aber ich weiß nochnet ob das mit dem AD Wandler klappt (siehe Oben)

von Jochen O. (joob)


Lesenswert?

Folgendes ist rein theoretisch, da ich noch keinen DAC0800 zum Testen 
habe:

Soweit ich aus dem Datenblatt zum DAC0800 rauslese, braucht der ein V- 
von <= -5V (d.h. -5V bis max. -18V). Zu sehen ist das in dem Diagramm 
"Power Supply Current vs. V-". Deshalb glaube ich nicht, dass es klappen 
wird da einfach zB +12V und GND anzuhängen.

Und zur Symmetrie des Ausgangssignals um +/- 5V:
Wenn man den Output des DAC0800 symmetrisch um den Nullpunkt haben will, 
so funktioniert das wie in Fig. 8 (Symmetrical Offset Binary Operation) 
mit einem dahintergehängten LM741.

ABER: Dann müssen wahrscheinlich auch die Bits vom AVR anders ausgegeben 
werden, da in dieser Verschaltung "alle Bits auf 0" nicht 0V 
Ausgangsspannung, sondern -V_Ref bedeutet (siehe Tabelle)!

Insofern ist es (denke ich) einfacher mit V+ = - V- = 11,3V, V+_Ref=+5V, 
V-_Ref = GND und der ursprünglichen Offsetkompensation zu arbeiten.


Jochen

von Jochen O. (joob)


Lesenswert?

Nö, moment mal, Denkfehler: die Bits sind dieselben ... könnte doch 
klappen mit der symmetrischen Ausgangsspannung.


Jochen

von Andreas A. (elw-2)


Lesenswert?

Ja, ok..?!?!

Jetzt bin ich verwirrt.

>Insofern ist es (denke ich) einfacher mit V+ = - V- = 11,3V,
>V+_Ref=+5V, V-_Ref = GND und der ursprünglichen Offsetkompensation zu >arbeiten.

Aber mal eine andere Frage, muss es den der IC sein??
Würde es nicht auch ein Widerstandsnetzwerk tunen?
Der Genauigkeit zugrunde dürfte das ja nicht viel machen, da der AVR ja 
auch mit Heißernadel gestrickt ist.

Andreas

von Jochen O. (joob)


Angehängte Dateien:

Lesenswert?

> Jetzt bin ich verwirrt.

Inwiefern?
Ich überlegte mir, dass  B1 ... B8 = 0 in der Originalschaltung 0V 
Ausgangsspannung bedeuten, beim DAC aber -V_Ref. Aber ich habe 
vergessen, dass die Offsetkompensation in der Originalschaltung aus B1 
... B8 = 0 dann auch -V_Ref (d.h. -2.5V) daraus macht.
Insofern ist es Ausgangsspannungsmäßig egal, ob da ein 
Widerstandsnetzwerk oder ein DAC dahinterhängt.
Die (ungetestete!) Beschaltung für ein symmetrisches Ausgangssignal (wie 
schon erwähnt, Fig. 8 aus dem DAC0800-Datenblatt) habe ich angehängt.

> Aber mal eine andere Frage, muss es den der IC sein??
> Würde es nicht auch ein Widerstandsnetzwerk tunen?
> Der Genauigkeit zugrunde dürfte das ja nicht viel machen, da der AVR ja
> auch mit Heißernadel gestrickt ist.

Sicher wirds das Widerstandsnetzwerk auch tun. Der DAC0800 ist ja im 
wesentlichen nichts anderes -- aber integrierte Widerstände liegen 
prozessbedingt in einem viel engeren Toleranzband, insofern sehe ich da 
schon einen Sinn darin.
Die "heiße Nadel" bedeutet ja meiner Meinung nicht, dass die Werte die 
der AVR ausgibt ungenau sind, sondern dass der Code noch optimiert 
werden könnte.


Jochen

von Jochen O. (joob)


Lesenswert?

Ergänzung zum obigen Schaltplan: +V_ref = 5V (Pin14) bedeutet eine 
Ausgangsspannung (= SIGNAL_UNFILTERED) von +/- 5V. Wer unbedingt +/- 
2.5V haben möchte, müsste da wahrscheinlich +V_Ref = 2.5V an den Pin 14 
dranhängen.

Ich werde die +/- 5V ausprobieren, wenn ich die Schaltung am 
Experimentierboard aufbaue (kann aber noch dauern).


Jochen

von Björn B. (elmo)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe mal ein Layout mit Kicad gemacht. Vielleicht kanns ja noch 
jemand anders gebrauchen. Passt gut in die Fischer KOH Gehäuse (2100 + 
6100).

Gruß
Björn

von Andreas A. (elw-2)


Lesenswert?

Hey,

DANKE!!! Du hast mir das ganze neuzeichen erspart :)

Sag einmal, könntest du evtl. noch eine Bibliothek "bjoern" hochladen??

MFG
Andreas

von Björn B. (elmo)


Angehängte Dateien:

Lesenswert?

Hi Andreas,

ok, hier ist sie. Ich muss allerdings vorwarnen, das ist meine erste 
Kicad Bibliothek und sie erhebt weder Anspruch auf Funktionsfähigkeit, 
noch auf strukturierte und sinnvolle Benennung ;-)

Gruß
Björn

von Christian (Gast)


Lesenswert?

Hallo Björn,

habe mir Dein Layout zwecks Nachbau angeschaut.
Ich finde leider keinen passenden Trafo.
Welchen hast Du verwandt?

Gruß

Christian

von Björn B. (elmo)


Lesenswert?


von Christian (Gast)


Lesenswert?

Hallo Björn,

danke, war ein zielführender Hinweis!

EI 30/15,5 109 :: Trafo 2VA, 9V, 222mA


Gruß

Christian

von Heinz R. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Björn B.,

ich habe mehrfach versucht das asm-File zu assemblieren. Habe dabei auch 
die beiden Einstellungen "AVR Simulator" und "AVR Simulator 2" 
angewendet. Im AVR Studio 4.19 bekomme ich immer den Syntaxfehler 
"D:\DDS\Dds.asm(121): error: syntax error, unexpected ','". Ich weiß 
nicht, was ich noch versuchen könnte! Wäre es möglich, mir das hex-File 
zukommen zu lassen bzw. hier zum Download bereit zu stellen?

Gruß, Heinz

von Spess53 (Gast)


Lesenswert?

Hi

>Im AVR Studio 4.19 bekomme ich immer den Syntaxfehler
>"D:\DDS\Dds.asm(121): error: syntax error, unexpected ','". Ich weiß
>nicht, was ich noch versuchen könnte!

Dann korrigiere mal die Aufrufe von locate in:
1
update:
2
        locate 1,1                  ; Signalform an Zeile 1, Pos. 1 ausgeben
3
        mov temp1, waveform
4
        rcall printstring
5
        locate 2,1

MfG Spess

: Bearbeitet durch Admin
von Heinz R. (Gast)


Lesenswert?

Danke Spess53,

mit Deiner Hilfe konnte ich die Hex-Datei erstellen. Ich werde morgen 
den Atmega8 damit beschreiben und hoffe, dass es dann gehen wird. 
Aufgebaut habe ich bis jetzt alles, ausser die Sache mit den TL072. Aber 
so sollte eigentlich die Steuerung mit den Atmega8 schon funktionieren.

Gruß, Heinz

von Heinz R. (Gast)


Lesenswert?

Hallo Spess53,

da bin ich nochmals! Das Assemblieren hat ja funktioniert. Das Programm 
im AT8 scheint aber nicht richtig zu laufen. Auf dem Display sind nur 
lauter P´s zu sehen. Am Pin19 ist ein wechselnder Pegel zu verzeichnen. 
Die Pin´s 14 bis 18 haben konstanten H-Pegel. An den Pin´s 2 bis 6 und 
11 bis 13 liegt konstant L-Pegel.

Wäre es nicht möglich, mir das fertige Hex-File zukommen zu lassen?

MfG Heinz

von eProfi (Gast)


Lesenswert?

Ein kleiner Fehler:
;;
;; Dieser Programmteil wird exakt 256000 Mal pro Sekunde       ;;
;; durch den Timer aufgerufen.

256000 ---> 6553600/(24+1)=262144


Habe ich hier schon mal erwähnt:
Beitrag "Re: atmega8, pwm, tongenerator ganz einfach"

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Hast du die .eep-Datei ins EEPROM geschrieben? Da sind die Strings für 
die Datstellung auf dem LCD abgelegt. Sie können während dem Betrieb 
nicht direkt aus dem Flash ausgelesen werden, weil man dafür den 
Z-Pointer ändern müsste, welcher für die DDS gebraucht wird.

Vorschlag für eine kleine Programmierübung: Strings im Flash ablegen, 
bei Programmstart ins RAM kopieren, und von dort ausgeben.

von annonymus (Gast)


Lesenswert?

Ich habe den Funktionsgenerator auch nachbegaut und möchte ihn nun 
programmieren. Kann mir bitte jemand sagen woher ich die EEprom datei 
bekomme? und die Fusebits?
Atmega8-16PU verwende ich
Danke im Vorraus

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.