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...
Bitmanipulation in diversen Tutorials oben links?? Gruß XXXX
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.
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
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.
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.
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???
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.