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
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
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.
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
Schau mal ins C Compiler User's Manual, im Kapitel B.8 assembler Macro Function.
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; }
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.
Danke für die Antworten. Hab den Vorschlag von Sepp aufgegriffen und probiert. Funktioniert einwandfrei. Vielen Dank nochmal Rudi
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
@ 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
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.