Portpins mit eigener IO-Init initialisieren

Gast #1796435
Lesenswert?

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
Angehängte Dateien:
Gast #1796447
Lesenswert?

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
#1796453
Lesenswert?

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
Gast #1796461
Lesenswert?

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ß
Gast #1796463
Lesenswert?

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
#1796464
Lesenswert?

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
Gast #1796467
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren