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
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!)?
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.