Forum: Mikrocontroller und Digitale Elektronik Carry- bzw. Zero Flag unter C abfragen


von Rudi (Gast)


Lesenswert?

Hallo,

ich habe da eine Frage:

Ich arbeite mit der M16C29 Familie von Renesas und dem C30 Compiler.
Für verschiedene Operationen möchte ich das Carry- bzw. Zero-Flag
abfragen. Kann ich das direkt unter 'C' machen oder muss ich dazu auf
Assembler-Ebene wechseln?

Rudi

von Peter D. (peda)


Lesenswert?

In der Regel sind die Bits im Statusregister, daß sich ganz normal
auslesen läßt.

Schau mal ins *.h-File mit den Device-Definitionen, da sollte es drin
stehen.
Und dann ins Datenblatt, welche Bitposition diese Bits haben.


In der Regel fragt man diese Bits aber nicht direkt ab, denn dazu ist
ja der Compiler da.

Z.B. das Zerobit:
if( i == j )

das Carrybit:
if( i < j )

D.h. man benutzt einfach den Testbefehl, der diese Bits ändert.


Peter

von Johnny (Gast)


Lesenswert?

Den C30 Compiler kenne ich nicht, aber direkt kannst Du diese Bits
normalerweise nicht auslesen.

Aber warum möchtest Du das denn tun?

In C kannst Du ja schreiben:

if (variable == 0)
{
  // zero flag gesetzt
}
else
{
  // zero flag nicht gesetzt
}

Der Compiler erzeugt dann automatisch den richtigen code, welcher das
zero flag ausliest.

von sepp (Gast)


Lesenswert?

@Rudi: du meinst sicher den Compiler NC30 von Renesas?

von Rudi (Gast)


Lesenswert?

Vielen Dank für die schnellen Antworten.

Ich will ein Byte seriell aus einem Portpin herausschreiben.
Dazu schiebe ich das Byte 8 mal nach rechts. Dabei wollte ich dann das
Carry-Register abfragen (z. B. [if (Carry)] um bei einem gesetztem
'Carry' das Portbit zu setzen, bzw analog dazu zurückzusetzen. Somit
würde ich das Byte seriell in das Portbit schreiben. Oder ist das zu
umständlich gedacht?

Beste Grüße
Rudi

von Rudi (Gast)


Lesenswert?

@sepp

ja sorry, habe das 'N' vergessen...

von sepp (Gast)


Lesenswert?

Schau mal ins C Compiler User's Manual, im Kapitel B.8  assembler Macro
Function.

von Peter D. (peda)


Lesenswert?

Teste erst bit 0 und schiebe dann.


Peter

von sepp (Gast)


Lesenswert?

So müsste es funktionieren. Hab es aber nicht getestet!

byte mask = 0x01;
byte value = 0xAA;
byte count =8;

while(counter--)
{
  if (mask & value)
  {
    port_pin=1;
  }
  else
  {
    port_pin=0;
  }

  mask << 1;
}

von sepp (Gast)


Lesenswert?

sorry

mask <<=1;

von Johnny (Gast)


Lesenswert?

Ja so wie Sepp würde ich das auch machen. Du kannst statt der Maske auch
den Value jeweils um ein Bit schieben; kommt aber aufs selber raus.

Auf Makros und Assembler würde ich so weit als möglich verzichten, da
Du dann auch bei zukünftigen / anderen Projekten mit anderen
Controllern / Compiler wieder auf den C-Code zurückgreifen kannst und
ihn nicht anpassen musst.

von Rudi (Gast)


Lesenswert?

Danke für die Antworten.

Hab den Vorschlag von Sepp aufgegriffen und probiert. Funktioniert
einwandfrei.
Vielen Dank nochmal

Rudi

von Florian (Gast)


Lesenswert?

Also ich habe folgendes Prob. ich habe ein Byte in einem Register 
gespeichert und möcht nach und nach schauen ob ein Bit 1 oder 0 ist und 
diesen wert dann ausgeben wollte sie dazu in dem Register immer einen 
weiter schieben und dann das Carry auslesen. Kann ich Dann sowas wie 
if(Carry==1) schreiben oder hat jemand eine bessere idee zur auswertung?

Danke schonmal

von Falk B. (falk)


Lesenswert?

@  Florian (Gast)

>if(Carry==1) schreiben oder hat jemand eine bessere idee zur auswertung?

Ja. Erstmal ein Grundkurs in Netiquette und Satzbau

http://www.duden.de

Und dann VIELLEICHT was zum eigentlichen Thema, Bitmanipulation.


MFG
Falk

von Peter D. (peda)


Lesenswert?

@  Florian (Gast)

Oh, oh, oh, sich an einen Thread ranzuhängen, ohne ihn zu lesen.
Mehr Ignoranz geht ja nicht.

Die Antwort steht doch schon drin.


Peter

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.