Forum: Mikrocontroller und Digitale Elektronik Look-up Table nächsten Wert laden für 8051 Assembler


von Peter Rich (Gast)


Angehängte Dateien:

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

von Helmut H. (helmuth)


Lesenswert?

ISREX0:       mov dptr,#frequenzcode
    ...
    inc dptr

Das Initialisieren des dptr sollte ausserhalb der ISR erfolgen. Und es 
wäre nicht verkehrt, den dptr auf die Obergrenze zu prüfen.

von Sascha W. (sascha-w)


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 vom Autor gelöscht.
von Peter Rich (Gast)


Lesenswert?

Aber ich möchte ja mit Betätigen des Tasters den Wert wechseln, muss 
sich dann nicht alles in der ISR abspielen?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

: Bearbeitet durch User
von Peter Rich (Gast)


Angehängte Dateien:

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

: Bearbeitet durch User
von Peter Rich (Gast)


Angehängte Dateien:

Lesenswert?

Habs nochnmal überarbeitet und denke, dass es so vielleicht 
funktionieren könnte. Jedoch wird zwar der nächste Wert wieder geladen, 
aber schaffe es nicht, dass alle Frequenzen hineingeladen werden.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Also, ich verliere jetzt die Lust. Du hast immer noch keine Kommentare 
drin und bei oberflächlicher Betrachtung zumindest eine sinnlose 
Endlosschleife in 'TabelleInit'.

von Günni (Gast)


Angehängte Dateien:

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

von Bernd (Gast)


Lesenswert?

Günni schrieb:

>Hoffe auf eine baldige Antwort.

Besser wäre es dem µCNet eine strafbewehrte Frist für die Antwort zu 
setzen.

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Wenn man jedesmal den selben Code laden will:
ist
ISREX0: mov dptr,#frequenzcode       ;weise dptr freqenzcode zu
        mov A,#0x00                 ; 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
    reti

in der ISR sicher sinnvoll

von Günni (Gast)


Lesenswert?

Deswegen melde ich mich hier um nen Vorschlag oder ne Verbesserung zu 
erhalten, weil ich es nicht besser weiß und sonst wo nichts konkretes 
finde.

von Dennis H. (c-logic) Benutzerseite


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.

von GEKU (Gast)


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

von Dennis H. (c-logic) Benutzerseite


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

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ist ja irgendwie merkwürdig. Entweder sind die im gleichen Kurs oder es 
handelt sich um die gleiche Person:
Beitrag "Look-up Table nächsten Wert laden für 8051 Assembler"

Beitrag #5837862 wurde von einem Moderator gelöscht.
von Sherlock Holmes (Gast)


Lesenswert?

Matthias S. schrieb:
> Ist ja irgendwie merkwürdig.

Ja wenn jemand so daherkommt dann ist es zum Troll nicht weit.

von Rohrzange (Gast)


Lesenswert?

Du wirst wohl ein Programm schreiben müssen, welches das kann.

Dazu gibt es hier div. Artikel, deren Lektüre ich uneingeschränkt 
empfehlen kann.

von Günni (Gast)


Angehängte Dateien:

Lesenswert?

So habs jz so abgeändert, dass dptr ausserhalb initalisiert wird, weiß 
aber nicht wie beim Betätigen des Tasters es mit der ISR 
zusammmenspielt.

von Günni (Gast)


Lesenswert?

Günni schrieb:
> So habs jz so abgeändert, dass dptr ausserhalb initalisiert wird,
> weiß
> aber nicht wie beim Betätigen des Tasters es mit der ISR
> zusammmenspielt.

anstatt der #6, #10 eigtl wegen der Anzahl der Werte in der Tabelle

von GEKU (Gast)


Lesenswert?

Dennis H. schrieb:
> Ist ein klassischer Buffer-Overflow

Ist doch auch lehrreich, oder?

Man könnte 8 Werte nehmen und vor dem Rückschreiben der Variablen den 
Wert mit 7 maskieren. COUNT&=0x07;

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.