Look-up Table nächsten Wert laden für 8051 Assembler

Gast #5836409
Lesenswert?

Hallo zusammen,
habe ein Problem. Und zwar fällt mir nicht ein wie ich(Siehe 
Dateianhang) den nächsten Wert in der Tabelle in den Akkumulator 
bekomme. Habe schon versucht den dptr zu erhöhen, ohne Erfolg. Hoffe auf 
eine baldige Antwort.
Gruß Peter
Angehängte Dateien:
#5836430
Lesenswert?

Hallo,

3 Möglichkeiten
dptr initialisieren, in der isr nur erhöhen; schlecht wenn du den wo 
anders noch brauchst

akt. Adresse der Tabelle wo anders zwischenspeichern; in der ISR von 
dort holen und nach inc wieder abspeichern

in einem Register die Tabellenposition mitzählen und in der ISR die akt. 
Adresse aus Tabellenstartadresse und Zählregister berechnen

An ein Zurücksetzen der Adresse am Ende der Tabelle solltest du auch 
noch denken.

Sascha
Beitrag #5836434 wurde von einem Moderator gelöscht.
(Firma: matzetronics) #5836508
Lesenswert?

Im Moment noch nicht wichtig, aber du solltest bedenken, das deine ISR 
sowohl den Akku als auch den DPTR zerstört.
Wenn du eines von beidem mal im Hauptprogramm verwendest, gibts 
Probleme.
Am sinnvollsten ist vermutlich, ein Pointerbyte zu erhöhen und das in 
den Akku zu laden. Dann funktioniert 'MOVC A,@DPTR+A' richtig.
Achtung, Bereichscheck ist wichtig. Wenn der Pointer grösser als 8 wird, 
hast du lustige Klänge, aber keinen Ton mehr.
Gast #5836531
Lesenswert?

Hab jz mal versucht es so zu lösen, aber jetzt wird nicht mal der erste 
Wert reingeladen. Bin leider noch etwas unerfahren mit Assembler, daher 
wird mir das ganze noch nicht ganze schlüssig. Wäre schon wenn ich 
vielleicht ein Beispiel sehen könnte, wie es funktioniert.
Gruß Peter
Angehängte Dateien:
(Firma: matzetronics) #5836543
Lesenswert?

Du reihst da eigentlich nur wahllos irgendwelche Mnemonics aneinander. 
Es wäre sicher sinnvoll, mal zu kommentieren, was du erreichen willst 
und was du vermutest, was der Code tut.
Überlege doch mal, was der Code in der ISR tut:
1
 ISREX0: mov dptr,#frequenzcode
2
        jmp TabelleInit
3
    mov A,#TabelleInit
4
    mov TL0,A
5
    mov TH0,A
6
    reti
Der jmp Befehl z.B. ist völlig sinnlos. Auch das Laden von #TabelleInit 
ist Quark.
Gast #5837802
Lesenswert?

Ahoi,
Habe ein Problem und zwar verstehe ich nich bzw. habe überhaupt keine 
Ahnung habe, wie ich es schaffe, das mit jedem Betätigen des Tasters, 
also mit Auslösen des Externen Interrupts, der nächste Wert aus der 
Tabelle in den Timer geladen wird. Hoffe auf eine baldige Antwort.
Gruß Günni
Angehängte Dateien:
Persönliche Seite #5837823
Lesenswert?

Bist du dir sicher, daß Assembler die Programmiersprache der Wahl ist ?

Wenn man immer das gleiche macht und unterschiedliche Ergebnisse bei 
einem deterministischen System wie dem Mikrocontroller erwartet ist da 
schon das grundlegende Verständnis mangelhaft.

Ich will dir hier keinen Vorwurf stricken, aber dir fehlt da das 
Verständnis was da passiert.

Statische Variable (kann auch bei der Einfachheit ein Register sein) und 
ein Hochzählen (Überlauf abfangen) wäre für den Anfang nicht schlecht.
Die zählste dann natürlich in der ISR hoch bis zu einem maximalen Wert 
und bei max wieder von vorn.
Gast #5837825
Lesenswert?

Dennis H. schrieb:
> mov A,#0x00                 ; gib Akkumulator die Adresse des

Statt das Register A immer mit 0 zu laden, wurde ich eine globale 
Variable laden und diese vom Verlassen der Interruptroutine 
inkrementieren.

ISREX0: mov dptr,#frequenzcode       ;weise dptr freqenzcode zu
        mov A,COUNT                 ; gib Akkumulator die Adresse des
frequencodes
    movc A,@A+dptr              ; Hole die Konstante die abgespeichert
ist
    mov TL0,A                   ; in TL0 laden
    mov TH0,A                   ; in TH0 laden

    mov A,COUNT
    add A,#1
    mov COUNT,A

    reti
Persönliche Seite #5837843
Lesenswert?

GEKU schrieb:
> Dennis H. schrieb:
>> mov A,#0x00                 ; gib Akkumulator die Adresse des
>
> Statt das Register A immer mit 0 zu laden, wurde ich eine globale
> Variable laden und diese vom Verlassen der Interruptroutine
> inkrementieren.
>
> ISREX0: mov dptr,#frequenzcode       ;weise dptr freqenzcode zu
>         mov A,COUNT                 ; gib Akkumulator die Adresse des
> frequencodes
>     movc A,@A+dptr              ; Hole die Konstante die abgespeichert
> ist
>     mov TL0,A                   ; in TL0 laden
>     mov TH0,A                   ; in TH0 laden
>
>     mov A,COUNT
>     add A,#1
>     mov COUNT,A
>
>     reti

Problematisch wirds bei Überschreiten der Array-Größe.
Definiert ist nur 0-6. Ab sieben liest er dann dahinter weiter. Kann gut 
gehen. Gibt aber sicher nicht die passenden Töne wieder.
Ist ein klassischer Buffer-Overflow.

http://www.keil.com/support/man/docs/is51/is51_cjne.htm
Beitrag #5837862 wurde von einem Moderator gelöscht.

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