Forum: Compiler & IDEs Initialisiertes Register einstellen


von Neuling (Gast)


Lesenswert?

Hallo Leute,

ich hab letztens nen Problem in meinem Programm entdeckt und habe mich 
gefragt, wie ich das ganze lösen kann.

Ich stelle Register immer mit der ODER Verknüpfung + Bitmuster ein:

UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

Nun funktioniert das alles ja auch ganz wunderbar, allerdings möchte ich 
jetzt mal URSEL=0 setzen.

Da es aber mit 1 initialisiert ist und ich mit der ODER Verknüpfung 
immernoch ne 1 habe, mache ich das dann immer der Form:

UCSRC = 0b00000110;

So kann man aber nicht mehr erkenne welche Bits nun gesetzt sind und 
welche nicht.

Wie macht ihr sowas bei nem initialisierten Register? Mit 0 shiften???

Viele Grüße

P.S. Ich habe glaube ich noch nie gelesen, dass Register bei nem AVR 
auch nich 0x00 initialisiert sein können. Es wäre nett, wenn sowas mal 
als Dringendes Ausrufezeichen im AVR-GCC Tutorial auftauchen könnte. Ich 
bin voll in dieses Fettnäpfchen reingelatscht...

von XXXX (Gast)


Lesenswert?

Bitmanipulation in diversen Tutorials oben links??

Gruß
XXXX

von Martin (Gast)


Lesenswert?

UCSRC = (1<<UCSZ1)|(1<<UCSZ0) ;

Bei dieser Methode der Initialisierung sind alle Bits die nicht explizit 
erwähnt werden auf Null gesetzt. Also: einfach URSEL weglassen. Im 
Kommentar wird dann u. U. der Sachverhalt näher beschrieben.

von g457 (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Ob du ein spezielles Bit in einem speziellen Register setzt oder löscht, 
oder ob du eine LED ein/ausschaltest, ist genau dasselbe:

In einem 8-Bit Wert wird 1 Bit gezielt auf 0 oder auf 1 gesetzt.

   Register |=  ( 1 << Bit );   // auf 1 setzen
   Register &= ~( 1 << Bit );   // auf 0 setzen

von Stefan E. (sternst)


Lesenswert?

> allerdings möchte ich jetzt mal URSEL=0 setzen.

Von der eigentlichen Frage zur Bitmanipulation (die ja auch schon 
beantwortet wurde) abgesehen, empfehle ich dir dringend, nochmal im 
Datenblatt nachzuschauen, was URSEL überhaupt ist/macht. Denn das hast 
du anscheinend noch nicht verstanden.

von Neuling (Gast)


Lesenswert?

Ich habe gerade beim genauen durchlesen des Codes den Fehler gefunden.

Ich habe den Linksshift einfach vergessen und nicht geschrieben. Dadurch 
hatte ich natürlich ne ganz verrückte ODER Verknüpfung. Sorry Jungs. 
Manchmal sieht man den Shift vor lauter Register nicht -.-

Eine abschliessende Frage habe ich noch zu einer uc-Vokabel.

PORTB ist ein "Register"

Der/Die/Das darin enthaltene PB0 ist ein ???? ("Register...inhalt?!")

von Karl H. (kbuchegg)


Lesenswert?

Neuling schrieb:

> Ich habe den Linksshift einfach vergessen und nicht geschrieben.

Was lernen wir daraus:

Tippe niemals deinen Code ab, wenn du hier posten willst
1) ist das viel zu viel Arbeit
2) übernimmst du nicht unbedingt die tatsächlich in deinem
   Code gemachten Fehler
3) geht Copy&Paste auch viel schneller
4) werden dann hier auch nicht die Helfer sauer, wenn sie sich den
   Kopf über ein Problem zerbrochen haben, das so in deinem richtigen
   Code gar nicht existiert.

> Eine abschliessende Frage habe ich noch zu einer uc-Vokabel.
>
> PORTB ist ein "Register"
>
> Der/Die/Das darin enthaltene PB0 ist ein ???? ("Register...inhalt?!")

Bit

von Neuling (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Bit

logisch. :)


Danke an alle

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Neuling schrieb:
> UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

Ich weiß nicht, warum sich dieses Stück Code so hartnäckig überall
hält, aber es ist komplett überflüssig.  In allen AVR-UARTs ist das
Rahmenformat 8N1 standardmäßig voreingestellt, daher ist es komplett
unnötig, das UCSRC überhaupt anzufassen, wenn man nur dieses Format
haben will.  Da das auch in den jeweiligen Datenblättern dokumentiert
ist, kann man sich auch drauf verlassen.  Die anderen viele IO-Register,
die man in der jeweiligen Applikation allesamt nicht benutzt, fasst
man ja auch nicht extra an, "nur zur Sicherheit".

von Stefan E. (sternst)


Lesenswert?

Jörg Wunsch schrieb:
>> UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
>
> Ich weiß nicht, warum sich dieses Stück Code so hartnäckig überall
> hält, aber es ist komplett überflüssig.

Getoppt noch durch die (mindestens) ebenso häufig anzutreffende Zeile
> UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
wo also der Inhalt von UBRRH verodert und nach UCSRC geschrieben wird.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefan Ernst schrieb:

>> UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
> wo also der Inhalt von UBRRH verodert und nach UCSRC geschrieben wird.

Noch schlimmer: es wird der Inhalt von UBRRH gelesen, mit den
Werten verodert und nach UCSRC geschrieben.

von Stefan E. (sternst)


Lesenswert?

Jörg Wunsch schrieb:
> Stefan Ernst schrieb:
>
>>> UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
>> wo also der Inhalt von UBRRH verodert und nach UCSRC geschrieben wird.
>
> Noch schlimmer: es wird der Inhalt von UBRRH gelesen, mit den
> Werten verodert und nach UCSRC geschrieben.

Ähm, ist das nicht genau das, was ich auch geschrieben habe???

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefan Ernst schrieb:

> Ähm, ist das nicht genau das, was ich auch geschrieben habe???

Ist nicht mein Tag heute, man sollte wohl nicht zwischen Tür und
Angel posten. ;-)

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.