Forum: Mikrocontroller und Digitale Elektronik Ein Bit setzten


von Tim (Gast)


Lesenswert?

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

von Sebastian V. (sebi_s)


Lesenswert?

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.

von Project HC (Gast)


Lesenswert?

Nein

von Project HC (Gast)


Lesenswert?

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.

von Project HC (Gast)


Lesenswert?

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);

von Sebastian V. (sebi_s)


Lesenswert?

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.

von Ingo L. (corrtexx)


Lesenswert?

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

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

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...

von penner (Gast)


Lesenswert?

vielleicht so

PORTB = (PORTB & ~(1 << PB0)) | ((ACSR & (1 << ACO)) >> ACO) << PB0;

von Walter S. (avatar)


Lesenswert?

Markus Weber schrieb:
> Sorry, verstehe ich gerade nicht. Warum ACSR?

ich vermute dass das Bit AC0 im Register ACSR steht

von Ingo L. (corrtexx)


Lesenswert?

Markus Weber schrieb:
> Der TE hat uns noch gar nicht verraten, um welchen Mikrocontroller es
> sich handelt...
Offensichtlich um einen AVR

von Simpel (Gast)


Lesenswert?

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.... 
:-)

von penner (Gast)


Lesenswert?

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

von Walter S. (avatar)


Lesenswert?

Simpel schrieb:
> In Bascom schreibt man dafür einfach:  PORTB.0 = ACO.

das glaube ich jetzt mal nicht

von Hermann (Gast)


Lesenswert?

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!!!!!

von Noch einer (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.