Forum: Mikrocontroller und Digitale Elektronik Portpins mit eigener IO-Init initialisieren


von Dennis (Gast)


Angehängte Dateien:

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

von TestX .. (xaos)


Lesenswert?

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);

von Dennis (Gast)


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

von Karl H. (kbuchegg)


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

von H.Joachim S. (crazyhorse)


Lesenswert?

Spielt keine Rolle.
Falls UART-Tx oder Rx freigegeben, werden die Portdefinitionen eh 
überschrieben.

von Jean Player (Gast)


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ß

von Dennis (Gast)


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

von TestX .. (xaos)


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

von Dennis (Gast)


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

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
Noch kein Account? Hier anmelden.