Initialisiertes Register einstellen

Gast #1747292
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...
Gast
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.
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
> 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.
Gast
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?!")
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
Moderator Persönliche Seite
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".
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.