mikrocontroller.net

Forum: Compiler & IDEs Initialisiertes Register einstellen


Autor: Neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: XXXX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitmanipulation in diversen Tutorials oben links??

Gruß
XXXX

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!")

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Bit

logisch. :)


Danke an alle

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.