Forum: Mikrocontroller und Digitale Elektronik Register lesen in C


von Hitz Andres (Gast)


Lesenswert?

Halo
Programmiere einen PIC18F4680 mit einem CCS compiler. Nun möchte ich
gerne ein Register lesen. Wie lese ich das Register? Mit welchem Befehl
arbeite ich da am besten? Benötige unbedingt Hilfe.

Falls ich das mit dem Registerlesen dann mal verstanden haben, möchte
ich das Register PIR2 lesen. Dort hat es ein Bit das angibt ob die
Versorgungsspannung unter der Sollspannung ist. Diese möchte ich
lesen.

Würde mich über eine schnelle Antwort freuen.

von Hitz Andres (Gast)


Lesenswert?

Hab mir da mal die Hilfe vom CCS compiler gekrallt. Aber verstehen tu
ich das nicht. Wie kann ich eine Speicherzelle/Register lesen. Sollte
es doch einen einfachen Befehl dafür geben.


How do I directly read/write to internal registers?

A hardware register may be mapped to a C variable to allow direct read
and write capability to the register.  The following is an example
using the TIMER0 register:

#BYTE timer0 = 0x01

timer0= 128; //set timer0 to 128

while (timer0 ! = 200); // wait for timer0 to reach 200



Bits in registers may also be mapped as follows:

#BIT T0IF = 0x0B.2

.

.

.

while (!T0IF); //wait for timer0 interrupt



Registers may be indirectly addressed as shown in the following
example:

printf ("enter address:");

a = gethex ();

printf  ("\r\n value is %x\r\n", *a);



The compiler has a large set of built-in functions that will allow one
to perform the most common tasks with C function calls.  When possible,
it is best to use the built-in functions rather than directly write to
registers.  Register locations change between chips and some register
operations require a specific algorithm to be performed when a register
value is changed.  The compiler also takes into account known chip
errata in the implementation of the built-in functions.  For example,
it is better to do set_tris_A(0); rather than *0x85=0;

von Karl heinz B. (kbucheg)


Lesenswert?

> Aber verstehen tu ich das nicht.

Was gibt es daran nicht zu verstehen?

Jedes Register hat auch eine Nummer.
Mittels
#BYTE irgendwas = nummer

Teilst du den Compiler mit, dass du gedenkst das Register
mit der Nummer 'nummer' über den Namen 'irgendwas' anzusprechen.

In weiterer Folge benutzt du 'irgendwas' als ob es eine Variable
wäre.

Willst du das noch weiter aufdröseln, dann kannst du dem Compiler
auch sagen, dass du dem Bit 'x' im Register mit der Nummer
'nummer'
jetzt einen Namen 'so_nenn_ich_dich' gibst.

#BIT so_nenn_ich_dich = nummer.x

und wiederrum benutzt du dann so_nenn_ich_dich als ob es eine
einfache Variable wäre.

Jetzt musst du halt nur noch rauskriegen, wie denn die Nummern für
die dich interessierenden Register sind. Diese Info muesste sich
aber im Datenblatt des µC finden.

von Hitz Andres (Gast)


Lesenswert?

Danke hat nun geklappt mit dem lesen. Hat jemand schon einmal mit dem
Comparator interupt gearbeitet? Mit diesem Interupt kann eine sinkende
Versorgungsspannung detektiert werden.

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.