mikrocontroller.net

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


Autor: HDW (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jangomat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!)?

Autor: HDW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: HDW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich danke dir.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.