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?
hallo Leute, da jetzt mein Thread hierher verschoben wurde, kann vielleicht HIER jemand von euch auf meine Frage antworten? Danke!
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.)
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ß
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.
Was muss ich addieren? z.B ldi r16,high(phase) add r30,r16 ldi r16,low(phase) add r31,r16 lpm ???
Es reicht das Lowbyte zu addieren, da deine Tabelle ja nur 256Bytes groß ist.
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ß
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.