Hallo, kann ich ein einziges Ausgangsbitt in GCC wie folgt setzten ? Das soll das Bit ACO des Analogkomparatorregisters auf Bit 0 des Portes B schreiben. PB0 = ACO; Ich möchte mir somit folgendes spare: if(ACO == 1) { PORTB |= (1<<PB0); } else { PORTB &= ~(1<<PB0); } Gibt es eventuell eine andere kürzere Alternative ? Grüße
Du könntest das Bit erst löschen und dann per OR mit dem ACO Wert füllen. Also so:
1 | PORTB = (PORTB & ~(1 << PB0)) | (ACO << PB0); |
Wenn du es häufiger brauchst kannste ja ein Macro daraus bauen.
Sebastian V. O. schrieb: > Also so:PORTB = (PORTB & ~(1 << PB0)) | (ACO << PB0); > > Wenn du es häufiger brauchst kannste ja ein Macro daraus bauen. Funktioniert nicht. ACSR muss da mindestens auch auftauchen.
Für mich hat sich die folgende Schreibweise bewährt (inkl. Tabstopps):
1 | if(ACSR & (1 << ACO)) PORTB |= (1<<PB0); |
2 | else PORTB &= ~(1<<PB0); |
Ich habe nur eine alternative Variante des Codes vom TE geliefert. Dort taucht auch kein ACSR auf. Keine Ahnung ob meine Variante oder die vom TE schneller ist/weniger Instructions braucht, aber so ist es etwas weniger Tipparbeit. Bzw. wenn man weiß, dass das Bit sowieso 0 ist kann man sich das löschen des Bits auch sparen.
Sebastian V. O. schrieb: > Ich habe nur eine alternative Variante des Codes vom TE geliefert. Dort > taucht auch kein ACSR auf. Keine Ahnung ob meine Variante oder die vom > TE schneller ist/weniger Instructions braucht, aber so ist es etwas > weniger Tipparbeit. Bzw. wenn man weiß, dass das Bit sowieso 0 ist kann > man sich das löschen des Bits auch sparen. Die Variante vom TE als auch deine funktionieren aber nicht. Project HC schrieb:
1 | > if(ACSR & (1 << ACO)) PORTB |= (1<<PB0); |
2 | > else PORTB &= ~(1<<PB0); |
so is richtig
Project HC schrieb: > Funktioniert nicht. ACSR muss da mindestens auch auftauchen. Sorry, verstehe ich gerade nicht. Warum ACSR? Gibt es ein solches Bit oder Register bei dem verwendeten Mikrocontroller? Der TE hat uns noch gar nicht verraten, um welchen Mikrocontroller es sich handelt...
vielleicht so PORTB = (PORTB & ~(1 << PB0)) | ((ACSR & (1 << ACO)) >> ACO) << PB0;
Markus Weber schrieb: > Sorry, verstehe ich gerade nicht. Warum ACSR? ich vermute dass das Bit AC0 im Register ACSR steht
Markus Weber schrieb: > Der TE hat uns noch gar nicht verraten, um welchen Mikrocontroller es > sich handelt... Offensichtlich um einen AVR
In Bascom schreibt man dafür einfach: PORTB.0 = ACO. Sieht halt nicht so elitär aus, wie ein "PORTB = (PORTB & ~(1 << PB0)) | ((ACSR & (1 << ACO)) >> ACO) << PB0;" Aber dafür macht es auch ohne 'Expertengremium' einfach das, was man hinschreibt, was ja auch der Sinn eines komfortablen Compilers ist.... :-)
da fehlt aber auch die abfrage des ACSR, oder bewerkstelligt bascom die auf magische weise von alleine? aber stimmt, der direkte zugriff auf einzelne bits macht es erheblich übersichtlicher
Simpel schrieb: > In Bascom schreibt man dafür einfach: PORTB.0 = ACO. das glaube ich jetzt mal nicht
Walter S. schrieb: > Simpel schrieb: >> In Bascom schreibt man dafür einfach: PORTB.0 = ACO. > > das glaube ich jetzt mal nicht Damit liegst du richtig! AC0 hat den Wert 4 entsprechend dem Bit-Platz in ACSR. Richtig muss es heißen: PORTB.0 = ACSR.AC0 Und das geht! Habe ich im Simulator getestet. Simpel schrieb: > Sieht halt nicht so elitär aus, wie ein > "PORTB = (PORTB & ~(1 << PB0)) | ((ACSR & (1 << ACO)) >> ACO) << PB0;" Damit hat er immer noch recht!!!!!
Eigentlich unterstützt doch jeder C Compiler Bitfelder. PORTB.0 = ACSR.AC0 funktioniert auch mit C. Warum wird immer noch diese !=&=<< Schreibweise benutzt?
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.