Forum: Mikrocontroller und Digitale Elektronik PIC, flags mit Befehl "equ" declarieren


von HDW (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich habe ein Verständnisproblem bei der Zuweisung von Flags in General 
Purpose Registern, also im frei verfügbaren Datenbreich des PIC.

Normalerweise wird mit dem "equ"-Befehl eine Variable (z.B. "Std") einem 
General Purpose Register wie z.B. 0x0D zugewiesen.
--> Std equ 0x0D

Soweit ok. Die Register mit noch kleinereren Adressen sind dann den 
Special Funktion Registern zugeordnet, z.B. FSR auf 0x04, STATUS auf 
0x03.

Jetzt habe ich aber schon oft gesehen, dass eigene Flags , also einzelne 
"1-Bit-Variablen" definiert werden.
Das sieht dann so aus:

minf  equ  0x02    ; minute flag
hourf  equ  0x03    ; hour flag
dayf  equ  0x04            ; day flag

Zugegriffen wird darauf so:

bsf  timef,hourf

timef ist vorher als Register für die Flags definiert worden..

Also ist "hourf" ein neu definiertes Flag, und wie ein Bit im Register 
anzsprechen.

Mein Problem: Wie kann man mit dem "equ"-Befehl eine Variable (z.B. Std) 
einem File-Register (z.B. 0x0D) zuordnen und gleichzeitig demselben 
Befehl ein Flag definieren?

"dayf" wurde so z.B. auf Adresse 0x04 im File-Register "gelegt".
FSR liegt aber auch auf 0x04 im File-Register. Wie kann das gehen?

Woher weiss der PIC, dass ich mit z.B. "msecf equ 0x03" ein Flag 
definieren will und nicht das Status-Register meine?
Woher weiss der PIC, dass ich ein Register und nicht ein Flag definieren 
will? oder umgekehrt.


Kann mir jemand mal das Sytem erklären?


Einen Quellcode von einer Uhr habe ich mal angehängt. Dort wird diese 
Art von Variablen bzw. Flag-Zuweisung verwendet.


mfg  Wolfram Hildebrandt

von Jangomat (Gast)


Lesenswert?

EQU ist eine reine Assemblerdirektive, welche als Substitution der 
vorigen Festlegung dient. Es macht nur Dein Programm leserlicher.

In Deinem Beispiel wird die Assemblerzeile
  bsf timef,hourf

bei voriger Festlegung:
timef equ 0x4A ; flag register
hourf equ 0x03 ; hour flag


vom Compiler umgewandelt in
  bsf 0x4A,3 ;

Der Compiler setzt einfach stur Deine Definitionen ein und überprüft 
lediglich den Wertebereich und würde schimpfen, falls man vorher 
geschrieben hätte
hourf equ 0x30
da er beim "bsf-Befehl" für den zweiten Operand nur einen Wertebereich 
von 0..7 erwartet.

War das verständlich (bin kein guter Didakt!)?

von HDW (Gast)


Lesenswert?

Hallo

Folgender Code soll ein neues Flag im Register 0x0C "erstellen".

Std equ 0x0C

Flag1 equ 0x05

Das erstellte Flag wird gesetzt:

bsf Std, Flag1

Bit 5 im Register 0x0C wird also gesetzt. 0x05 ist also keine Adresse, 
sondern eher eine Zahl.

man könnte doch auch schreiben:

bsf Std, 5


Ist das so richtig?

von Reiner (Gast)


Lesenswert?

ja

Ich würde es auch vermeiden es so anzugeben

Flag1 equ 0x05

da es ja keine HEX-Zahl ist, es könnte ja dazu verleiten auch mal 0x50 
einzugeben, was nicht geht

Flags besser 0..7 angeben, so wie Du es dann auch erkannt hast

Eindeutigkeit hilft beim Wiedereintritt in die source, wenn Du eine 
Zeitlang Dich nicht mehr damit beschäftigt hast.


---------------
Flag1 equ  5


bsf Std,Flag1
---------------

Reiner







Reiner

von HDW (Gast)


Lesenswert?

Ich danke dir.

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.