PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC 18F4520 Assembler Variablen



kawa-fanatik
09.04.2007, 19:58
hallo zusammen mich würde mal interessieren wie man variablen eindeutig definiert das es keine probleme geben kann

bis jetzt mach ich das "irgendwie"(siehe code), es geht aber ich hab immer ein ungutes gefühl wenn was nicht geht :) darum würde ich gerne mal wissen wie man das richtig macht(bei welcher adresse man anfängt primär).


;Variable definitions

CBLOCK 0x0020
w_temp
s_temp
bsr_temp
loops
loops2
lcddaten
timerl
timerh
sec8
SE ;Sekunde Einerstelle
SZ ;Sekunde Zehnerstelle
ME
MZ
HE
HZ
neuezeit
ENDC

#define lcdport PORTB ;LCD Port
#define lcdtris TRISB ;LCD Port Tris register
#define neu neuezeit,1

Mobius
09.04.2007, 20:53
Hum, eigentlich finde ich, dass das so in ASM am Besten und vor alle am Übersichtlichsten geht Variablen zu definieren. Eine Andere Möglichkeit ist das "equ" wobei ich den wirklich nicht mag, da ich persönlich Variablen gruppieren möchte, also zB alle Variablen, die mit Datumsberechnung oder so zu tun haben, sind schön hintereinander aufgelistet (und bei cblock sind sie immer auch gleich im gleichen Memorybereich :) ).
Ein weiterer riesen Vorteil ist es, dass man im cblock sehr einfach Buffer generieren kann, also man kann sagen "recbuf:30" und damit belegt man einen Speicher von 30 Bytes. Das kann man dann natürlich wundervoll mit einem #define und indirekter adressierung verbinden und man hat pltzölich um einiges weniger Sorgen, wenn man zum Beispiel ganze Protokolle über die serielle Schnittstelle empfangen will (und vor allem, wenn sich dann während dem Programmieren die größe des Protokolls verändert ;) ).

Einziger riesengroßer Nachteil ist, dass man die Variablen durchzählen muss, ob man schon am Ende den gesamten Speicher aufgebraucht hat ;). Da hilft nur das Durchnummerieren in dem Kommentar.

Und wo du den CBLOCK nun hinlegen musst, das steht im Datenblatt, also von wo die GPR (General Purpose Register) anfangen. Natürlich wird der Code nicht gehen, wenn du ihn auf reservierte Register legst und da hilft dann auch eine Lösung mit "equ" nicht weiter ;).

Was man noch sehr schön machen kann ist, zwei Cblock "dynamisch" zu verbinden.

cblock 0x20
var1:20
var2
var3
loop_block
endc

cblock loop_block
loop1:2
loop2
irgendwas
endc
Und wenn sich nun zum Beispiel var1 verändert, so "rückt" das 2. cblock wieder nach ;).

MfG
Mobius

kawa-fanatik
09.04.2007, 21:13
danke schon mal für deine antwort, sie hat schon mal licht ins dunkele gebracht

ich habn im anhang mal die speicher aufteilung
wenn ich das jetzt richtig sehe kann also ich bei 080h anfangen 8-[