www.mikrocontroller.net

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


Autor: Rudi (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Johnny (Gast)
Datum:

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

Autor: sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rudi: du meinst sicher den Compiler NC30 von Renesas?

Autor: Rudi (Gast)
Datum:

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

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@sepp

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

Autor: sepp (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Teste erst bit 0 und schiebe dann.


Peter

Autor: sepp (Gast)
Datum:

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

Autor: sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry

mask <<=1;

Autor: Johnny (Gast)
Datum:

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

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten.

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

Rudi

Autor: Florian (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

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.