mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Phasenschieber mit AVR


Autor: Besucher (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thread verschoben, nach vorne geholt

Autor: Besucher (Gast)
Datum:

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

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beschreibe doch mal deine Methode wie du es im Moment machst.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Besucher (Gast)
Datum:

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.