PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MPLAB DB Anweisung



wolf***
27.12.2006, 16:54
Hallo an alle,
ich möchte mit der DB Assembler - Anweisung im Speicher des Pic´s ein Bitmuster ablegen. Es klappt einfach nicht. es befinden sich im speicher Daten die mit meinen keine Änlichkeit haben. Wer hat das schon mal probiert?
mfg
Wolf

kalledom
27.12.2006, 17:06
Hallo,
z.B. so:


TxtWerte de cr, lf
de "; WERTE --------", cr, lf
de "; Helligkeit ", 0 , " [%]", cr, lf
de "; Ist / Soll ", 0 , cr, lf
de "; Programm ", 0 , cr, lf, 0

de 18 ; Dezimal
de 0x18 ; Hexadezimal
de 00011000b ; Binär

wolf***
27.12.2006, 18:02
Hallo Karl Heinz
hast du das mal ausprobiert?
Die Syntax ist schon klar.
aber was ist im Speicher z.B. de 00011000b ; Binär ?
Du meintest bestimmt immer DB?
wfg
wolf

PICture
28.12.2006, 06:00
Hallo wolf***!

Du meinst bestimmt ein Flaschspeicher, oder?

MfG

kalledom
28.12.2006, 10:57
Hallo Wolf,
ich mache in all meinen Programmen nichts anderes, wie das, was ich oben geschrieben habe. Wie das wirklich im Flash-Speicher abgelegt wird, interessiert mich nicht wirklich, da es richtig ausgelesen wird. Die dazugehörigen Flash-Lese-Routinen findest Du hier (http://www.domnick-elektronik.de/picasm.htm) und hier (http://www.domnick-elektronik.de/picpwm.htm).
Ich schreibe auch 'de' für define eeprom-data-byte, nicht 'db' für define byte. Bei 'de' steht: "... evaluete to an 8-bit value. The upper bits of the program word are zeros".
Das steht bei 'db' nicht; was 'db' also wirklich macht, kann ich Dir nicht sagen, Flash-Memory hat nämlich 12...14 Bits !

PICture
28.12.2006, 16:06
Hallo wolf***!

Anstatt langer Erklärung ein Teil meines funktionierendes Programms. Das Programm ist auf dem PIC18F252 gelaufen. Da die PIC18FXXX Familie eine andere Organisation des Programmspeichers hat konnte ich sogar mit der Anweisung "dw" 16-bit Werte ablegen. Ich habe es mit den "kleinen" PIC`s (12F und 16F) nicht probiert, müsste aber genauso, bloss mit "db" und 8-bit Werten gehen.

MfG


ORG 0x7C00
RAMSave dw 0x0100
dw 0x0302
dw 0x0504
u.s.w.

kalledom
28.12.2006, 17:08
@PICture
Bei 16 Bit Datenbreite im Programm-Speicher wirst es sicher keine Probleme geben. Was passiert aber bei 1 mal DW bzw. 2 mal DB nacheinander, wenn der Flash-Speicher nur 12...14 Bit Datenbreite hat ? Für die ersten 8 Bit (= 1. Byte) Null Problemo, bleiben für das zweite DB noch 4...6 Bits ?; was passiert dann wirklich ?
Mit DE ist das laut MPASM User's Guide klar geregelt und funktioniert bei mir auch anstandslos bei PIC16F877 und PIC12F629:
Reserve Memory words with 8-bit data. Each <expr> must evaluate to an 8-bit value. The upper bits of the program word are zeroes. Each charachter in a string is stored in a separate word.
Wenn Word's verarbeitet werden sollen, kann
DE LOW(word)
DE HIGH(word)
verwendet werden.

PICture
28.12.2006, 17:26
Hallo kalledom!

Danke für Deine ausführliche Erklärung. Wenn ich einen Bedarf haben werde, werde ich das nutzen. Ich habe bisher bei den "kleinen" nur "retlw" fürs Ablegen von 8-bit Werten im Flasch benutzt.

Schönste Grüsse :)

Mobius
30.12.2006, 13:53
um lookup tabels zu erzeugen benutz einfach den Befehl "dt" das erzeugt dir einen Data-Table mit retlw befehlen. Ist aber wirklich nur zur Übersichtlichkeit gut, bzw. wenn man sehr viele Rückgabe-Werte hat (z.b.: Lookup-Table für einen Sinus) und es mit ein Haufen von retlw-Befehlen einfach zu groß werden würde. Wird genauso wie db, etc verwendet, also halt

jump:
codes zur Vektorerrechnung

table:
dt 1,2,3,4,5,6,...

MfG
Mobius

kalledom
30.12.2006, 14:18
Hallo Mobius,
richtig, dafür sind die 12...14 Bits Flash-Speicher-Datenbreite ausreichend, um die 8 Bits vom Datenbyte und die Bit-Konstellation für den RETLW-Befehl unter zu bringen.
Für einen Text-String oder andere Datenfolge ist diese Methode allerdings nicht besonders glücklich. Außerdem müssen einige Vorkehrungen getroffen werden, falls diese 'Ansammlung' auf einer 256-Byte-Grenze liegt.

Mobius
30.12.2006, 14:28
Jau, den Flash direkt auszulesen ist natürlich um einiges Elleganter, als ein Haufen von retlw Befehlen, doch leider fällt das bei mir meist flach, da ich mit solchen Chips arbeite, die keinen direkten Zugriff auf den Programmspeicher haben. Da bleibt einem nur der Umweg über einen computed-goto und dem retlw's ;).

Naja, das mit der Grenze stimmt schon, aber dafür gibt es eigentlich tonnen von vorgekautem Code, die man benutzten kann (das einfachste, die Tabelle mit einem org-Commando so zu legen, dass sie nicht auf die Grenze stößst). Ansonsten, ich benutzt generell diesen (http://www.piclist.com/techref/microchip/tables.htm?key=computed+goto&from=) Code für die Berechnung der Sprünge.

Mein Post bezog sich aber einfach nur auf deinen, dass man retlw's durch dt Befehler "ersetzten" kann, hab es nur vergessen hinzuschreiben :).
MfG
Mobius