Forum: Mikrocontroller und Digitale Elektronik Phasenschieber mit AVR


von Besucher (Gast)


Angehängte Dateien:

Lesenswert?

Hallo allerseits,
ich bin Anfänger in Assembler. Habe vor, einen Sinusgenerator zu bauen 
mit zwei gleichfrequenten Sinussignalen aber einstellbarer 
Phasenunterschiede. Anbei mein  Programm. Leider kann ich nur die Phase 
zwischen 0 und 90 grad einstellen (etwa 4 grad-Schritte). Meine Idee war 
eine Einstellung von 0 bis 360 grad.
Hat jemand von euch eine Idee wie ich es besser machen kann?

von Karl H. (kbuchegg)


Lesenswert?

Thread verschoben, nach vorne geholt

von Besucher (Gast)


Lesenswert?

hallo Leute,
da jetzt mein Thread hierher verschoben wurde, kann vielleicht HIER 
jemand von euch auf meine Frage antworten?
Danke!

von Carsten (Gast)


Lesenswert?

Beschreibe doch mal deine Methode wie du es im Moment machst.

von Benedikt K. (benedikt)


Lesenswert?

Das Problem ist, dass du aus der Tabelle rausläufst. Versuch mal add 
statt addw, dann sollte es gehen (aber auch nur, da die Tabelle auf 
einer 256Byte Grenze liegt.)

von Besucher (Gast)


Lesenswert?

Der Befehl "ADIW" erlaubt nur einen K-Wert von 0 bis 63 und das 
entspricht in meinem Fall max. 90 Grad Phasendifferenz. Ich ergänze das 
"aus der Tabelle rauslaufen" mit dem Tabellenstück "Ergänzung" in der 
Tabelle selbst.
An PORTA und PORTB befinden sich D/A-Wandler (R-Netzwerk). So wie mein 
Programm geschrieben ist, kann ich die Phasenverschiebung von 0 bis 90 
Grad problemlos über "phase" einstellen (in Schritten von ca. 4 Grad).
Ich denke mir dass ich in der NCO-Schleife nach Ausgabe von PORTA einen 
offset einbauen muss, weiss allerdings nicht wie sowas gemacht wird...
Gruß

von Benedikt K. (benedikt)


Lesenswert?

Wie ich schon sagte: Nimm einfach add (bzw. subi), dann kannst du einen 
Wert bis 255 angeben, und wenn du den Überlauf ignorierst brauchst du 
auch die Ergänzung nicht.

von Besucher (Gast)


Lesenswert?

Was muss ich addieren?
z.B
        ldi r16,high(phase)
  add r30,r16
  ldi r16,low(phase)
  add r31,r16
  lpm
???

von Benedikt K. (benedikt)


Lesenswert?

Es reicht das Lowbyte zu addieren, da deine Tabelle ja nur 256Bytes groß 
ist.

von Besucher (Gast)


Lesenswert?

Leider läuft alles nicht so richtig!
Bevor ich weiterhin dumme Fragen stelle, lasse ich mir nochmal alles 
durch den Kopf gehen. Ich melde mich morgen wieder.
Auf jeden Fall, vielen Dank für die Antworten,
Gruß

von Besucher (Gast)


Lesenswert?

Hallo Benedikt,
so, nun habe ich das Problem im Griff. Die letzten Zeilen
lauten:


;Frequenzregister laden (default: 159,15 Hz)
  ldi    r17,0x7c
  ldi    r18,0x08
  ldi    r19,0x00

Haupt:
   add    r28,r17     ;1
   adc    r29,r18     ;1
   adc    r30,r19     ;1
   lpm        ;3
  out   PORTA,  r0    ;1

  addi  ZL,low(phase) ;1
    lpm               ;3
    out   PORTB,  r0  ;1

  subi  ZL,low(phase) ;1
  lpm                 ;3
  rjmp  Haupt         ;2 => 18 Takte

Danke für deine Tipps.
Grüße

von Benedikt K. (benedikt)


Lesenswert?

Wo hast du addi her ? Oder ist das ein Makro ? Den Befehl kennt ein AVR 
nämlich nicht.

von Besucher (Gast)


Lesenswert?

stimmt, habe ich total vergessen: "addi" ist ein Makro

.MACRO  addi
 subi  @0, -@1
.ENDM

Da dieser Befehl fehlt, wird er durch die Subtraktion der negativen 
Konstante ersetzt. @0 entspricht den 1. Operanden und @1 den 2. 
Operanden. zB.
addi  r16, 12 => wird ersetzt durch subi r16, -12

Gruß

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.