mikrocontroller.net

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


Autor: Dennis (Gast)
Datum:
Angehängte Dateien:

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

Autor: Andi ... (xaos)
Datum:

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

DDRD = 0b01010010;

bzw.

DDRD = (1<<PD6)|(1<<PD4)|(1<<PD1);

Autor: Dennis (Gast)
Datum:

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

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

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

Autor: H.Joachim Seifert (crazyhorse)
Datum:

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

Autor: Jean Player (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void ioinit (void)
{
  DDRD = DDRD | 0b01010000; //oder lesbarer --> DDRD |= (1<<PD6) | (1<<PD4);
  PORTD = 0b01010011;   //oder lesbarer --> PORTD |= (1<<PD6) | (1<<PD4);
}

Gruß

Autor: Dennis (Gast)
Datum:

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

Autor: Andi ... (xaos)
Datum:

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

Autor: Dennis (Gast)
Datum:

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

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.