Forum: Mikrocontroller und Digitale Elektronik DDS Code AVR ----> 8051


von edi (Gast)


Lesenswert?

Hi,

nachdem ich mit ML2036 frequenzen bis 10KHz generiert habe moechte ich
nun einen AT89C2051 einsetzen.
Jesper Hansen hatte 2001 den Poor-mans DDS Synthesizer
vorgestellt,allerdings mit einem AT90S2313...

mein wunsch ist nun ein teil des programmes von AVR auf '51
umzuschreiben.

; main loop
;
;  r28,r29,r30 is the phase accumulator
;    r24,r25,r26 is the adder value determining frequency
;
;   add value to accumulator
;  load byte from current table in ROM
;  output byte to port
;  repeat
;
LOOP1:
    add    r28,r24      ; 1
    adc    r29,r25      ; 1
    adc    r30,r26      ; 1
    lpm            ; 3
    out    PORTB,r0    ; 1
    rjmp  LOOP1      ; 2 => 9 cycles


ich habe versucht einen '51 ersatz fuer '' lpm '' zu finden...
vermutlich ist es mit 'dptr' zu realisieren.
ich weiss,dass hier clevere leute sitzen und lesen...der eine oder
andere hat wohl lust und laune...?fuer eine uebersetzung?

die hardware laeuft schon und der erzeugte sinus ist sehr schoen.
mein problem ist nur der phasenakkumulator.

Andreas S. hat sich auch intensiv mit DDS beschaeftigt;schoene Arbeit.
Gruss
Edgar

von Matthias (Gast)


Lesenswert?

Hi

Ersatz für LPM ist MOVC A,@A+DPTR
add und adc sollten sich direkt übernehmen lassen wenn man die
entsprechenden Register anpasst. out wird ein mov und der rjmp entweder
ein sjmp oder ajmp. Wenn der Assembler halbwegs clever ist reicht auch
ein jmp.

Matthias

von edi (Gast)


Lesenswert?

vielen Dank Matthias,

....fuer die bestaetigung: dptr 16bit pointer .

es sind also die beiden hoechstwertigen bytes des phasenakkus,die
in den dptr geladen werden um einen wert aus der tabelle zuholen ?
je groesser der wert in r24..r26 desto hoeher die ausgangsfrequenz?

werde im simulator anschauen ,was da passiert.

Edgar

von Matthias Reiter (Gast)


Lesenswert?

Hallo Edgar,

Ersatz für LPM:

beim MCS51 geht´s z.B. so:

1. Tabellenanfang in den Datenpointer schreiben:
   MOV DPTR, #data16 (oder MOV DPTR, #Tabelle)

2. Tabellenplatz in a schreiben:
   MOV A, #Tabellenplatz

3. Byte aus einer Datentabelle im ROM lesen:
   (Move Code Byte)
   MOVC A, @A+DPTR

Anschliesend steht in A das adressierte Byte aus dem ROM.
Operation: PC <- PC+1
           (A) <- ((A) + (DPTR))


Ähnlich geht es auch mit MOVC A, @A+PC beim aufruf in Subroutinen.

Übrigends: ich bin Anfänger, falls mein Tipp nicht stimmt, frage
jemanden, der sich auskennt (Gelbe Seiten).

Tschüß Matthias

von edi (Gast)


Lesenswert?

hi,

funktioniert !

hier ist das spiel fuer 8051 familie.Hinter dem R2R wandler muss
ein filter sein, damit der ausgang einen SINUS liefern kann.


dedees:
         mov dptr,#Tabelle

         mov 28h,#0
         mov 29h,#0     ;phase accumulator
         mov 30h,#0

         mov 24h,#0ffh
         mov 25h,#0fah     ;adder wert ...frequenz
         mov 26h,#010h

loop2:   mov a,28h
         add a,24h
         mov 28h,a
         mov a,29h
         addc a,25h
         mov 29h,a
         mov a,30h
         addc a,26h
         mov 30h,a
         movc a,@a+dptr
         mov p1,a               ;ausgang R2R D/A wandler...sinus (etwa
4KHz - 11.059MHZ)
   cpl p3.5    ;W-dog..futter
         sjmp loop2


Edgar

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.