Hallo, ich verwende einen Attiny2313 und möchte nun die Portpins mit meiner Funktion ioinit initialisieren. Die Pins habe ich im angehängten Bild markiert. Ich verwende folgende Pins: PD0 = RxD PD1 = TxD PD4 = ist ein Ausgang PD6 = ist ein Ausgang Ist dazu die folgende Funktion richtig? void ioinit (void) { DDRD = DDRD | 0b01010000; PORTD = 0b01010011; } Danke, Dennis
DDRx - damit definierst du was eingang und was ausgang ist PORTx - damit setzt du ausgänge auf low/high bzw. aktivierst pullups bei eingängen => http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Ausg.C3.A4nge DDRD = 0b01010010; bzw. DDRD = (1<<PD6)|(1<<PD4)|(1<<PD1);
Hallo, das Tut kenne ich! :D Andi D. schrieb: > DDRD = 0b01010010; Ich habe bewusst DDRD = DDRD | 0b01010000; geschrieben, damit die RxD- und TxD-Pins nicht beeinflusst werden. Und das Zuweisen von PORTD = 0b01010011; ist korrekt? Mir geht es hier um die Datenleitungen RxD und TxD. Da weiß ich nie, wie ich die internen Widerstände für Datenleitungen beschalten muss. Hoffentlich kann mir das jemand erklären, damit ich es auch dauerhaft in Erinnerung behalte?! Danke, Dennis
Dennis schrieb: > Ich habe bewusst > DDRD = DDRD | 0b01010000; > geschrieben, damit die RxD- und TxD-Pins nicht beeinflusst werden. Schreibs trotzdem besser so DDRD = DDRD | ( 1 << PD6 ) | ( 1 << PD4 ); oder so DDRD |= ( 1 << PD6 ) | ( 1 << PD4 ); dann brauchst du nicht stupide 0-en und 1-en zählen um zu wissen welche Pins auf 1 gehen und welche nicht. > > Und das Zuweisen von > PORTD = 0b01010011; > ist korrekt? Mir geht es hier um die Datenleitungen RxD und TxD. > Da weiß ich nie, wie ich die internen Widerstände für Datenleitungen > beschalten muss. Spielt keine Rolle. In dem Moment, in dem du von der UART entweder die Rx Stufe oder die Tx Stufe (oder beide) einschaltest, übernimmt die die Kontrolle über die Pins samt Datenrichtungsregister und Pullup Widerstände
Spielt keine Rolle. Falls UART-Tx oder Rx freigegeben, werden die Portdefinitionen eh überschrieben.
Hi, Lass das setzen von PD0 und PD1 sein. Wenn du den USART initialisierst, sind die Einstellungen von PD0 und PD1 überschrieben. Allerdings kann das setzen des Port-Pins TXD als StartBit erkannt werden, was sicher nicht in deinem Sinne ist. Also lieber:
1 | void ioinit (void) |
2 | {
|
3 | DDRD = DDRD | 0b01010000; //oder lesbarer --> DDRD |= (1<<PD6) | (1<<PD4); |
4 | PORTD = 0b01010011; //oder lesbarer --> PORTD |= (1<<PD6) | (1<<PD4); |
5 | }
|
Gruß
Danke euch beiden, also werde ich schreiben: DDRD |= ( 1 << PD6 ) | ( 1 << PD4 ); // beides Ausgänge PORTD |= ( 1 << PD6 ) | ( 1 << PD4 ); // beides einschalten Danke auch für die Erklärung, jetzt hab ich es auch verstanden! Nochmal am Rande gefragt: Mal sieht man PORTx |= ( 1 << Px0 ); und dann mal PORTx = ( 1 << Px0 ); Gibt es da Unterschiede? Gruß, Dennis
Dennis schrieb: > Danke euch beiden, > > also werde ich schreiben: > DDRD |= ( 1 << PD6 ) | ( 1 << PD4 ); // beides Ausgänge > PORTD |= ( 1 << PD6 ) | ( 1 << PD4 ); // beides einschalten > > Danke auch für die Erklärung, jetzt hab ich es auch verstanden! > > Nochmal am Rande gefragt: > Mal sieht man > PORTx |= ( 1 << Px0 ); > und dann mal > PORTx = ( 1 << Px0 ); > Gibt es da Unterschiede? > > Gruß, > Dennis ja lies dir mal das AVR GCC tutorial hier durch (link siehe oben) |= enspricht ODER GLEICH also PORTx = PORTx | ( 1 << Px0 ) dh. es werden nur zusätzliche bits gesetzt. bei = werden alle bits gesetzt
Andi D. schrieb: > |= enspricht ODER GLEICH also PORTx = PORTx | ( 1 << Px0 ) > > dh. es werden nur zusätzliche bits gesetzt. bei > > = werden alle bits gesetzt SUUUUUUUUUUUUUPER, vielen Dank!!!!!!!!!!!!!!! Ich habe das |= und = auf die Schnelle nicht vergleichen können! Übrigens, die ioinit funktioniert gut! Besten Dank, Dennis
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.