@ Andreas: Frage zum Digitalen Funktionsgenerator DDS

#660671
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
#660756
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.
#661632
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
Admin Persönliche Seite #661651
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.
#661656
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
#670244
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
Angehängte Dateien:
#670294
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
Angehängte Dateien:
Gast #717657
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
Gast #785104
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
#841134
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
Gast #1484155
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 )
Gast #1558275
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.
Gast #1567737
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.
Angehängte Dateien:
Gast #1761228
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
#1761364
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
#1761445
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
#1761658
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
Angehängte Dateien:
#1761667
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
Gast #3331523
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
Angehängte Dateien:
Gast #3331567
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
Gast #3331837
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
Gast #3334162
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
Admin Persönliche Seite #3334995
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.
Gast #4429582
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren