Phasenschieber mit AVR

Gast #718721
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?
Angehängte Dateien:
Gast #719111
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ß
Gast #719249
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ß
Gast #719661
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
Gast #719728
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ß

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