mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Port Umschaltung Ein/Ausgang wie schnell geht das?


Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallihallo,

ich habe an einem ATmega 644 einen PIN am PORTC den ich als Ein- und 
Ausgang nutzen möchte. Das ganze Umschalten funktioniert in der 
Simulation ganz gut doch wenn es real auf dem µC läuft habe ich das 
Gefühl das die Umschaltung etwas hinkt.

Nun wollte ich nach dem Umschalten der Datenrichtug etwas warten, doch 
wie lange wartet man da? Ich habe mal 10ms genommen, das klappt doch wie 
weit kann man runter gehen das es immer zuverlässig funktioniert?

Viele Grüße, AVRli...

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nun wollte ich nach dem Umschalten der Datenrichtug etwas warten, doch
>wie lange wartet man da? Ich habe mal 10ms genommen, das klappt doch wie
>weit kann man runter gehen das es immer zuverlässig funktioniert?

Das kommt darauf an, was für Bausteine Du am anderen Ende dran hast und 
wie schnell diese schalten. Eine Portrichtungsumkehr am AVR dauert in 
ASM 2-4 Taktzyklen (je nach voherigem und zu erreichendem Zustand). Das 
sind 125 bis 250 Nanosekunden bei 16 Mhz.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Travel Rec. (travelrec)

>wie schnell diese schalten. Eine Portrichtungsumkehr am AVR dauert in
>ASM 2-4 Taktzyklen (je nach voherigem und zu erreichendem Zustand).

???
Das dauert im besten Fall 1 (einen) Takt.
out    r16,ddrd     ; 1 Takt
sbi    ddrd,pd0     ; 2 Takte

MFG
Falk

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau am Besten mal ins Datenblatt. Ich meine mich zu erinnern dass das 
dort genauer erlaeutert ist mit Zeitdiagramm...

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Will nicht meckern, aber:
out    r16,ddrd

müsste
out    ddrd,r16
lauten.

Aber ich denke @ Travel Rec. (travelrec) meint irgendwie sowas:
in     r16,ddrd ;1 Takt
ori    r16,0x01 ;1 Takt
out    ddrd,r16 ;1 Takt

So komme ich auf 3 Takte, wenn jetzt noch die Pullups umgeschaltet 
werden müssen wirds mindestens einer mehr (Wenn der Status aller Pullups 
auch dem DDR  register entspricht)

EDIT:

Achja nochwas: Beim Umschalten ist der pin nach dem Befehl auch wirklich 
schon input (also am ende vom OUT), beim Ausgeben auf einen port, steht 
das Signal erst einen takt später auch am Pin zur verfügung (irgend eine 
Synchronisation ist dafür verantwortlich, habs nich mehr soo genau im 
kopf)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Hauke Radtki (lafkaschar)

>müsste
>out    ddrd,r16
>lauten.

Ja ;-)

>Aber ich denke @ Travel Rec. (travelrec) meint irgendwie sowas:

>in     r16,ddrd ;1 Takt
>ori    r16,0x01 ;1 Takt
>out    ddrd,r16 ;1 Takt

>So komme ich auf 3 Takte, wenn jetzt noch die Pullups umgeschaltet

Sowas macht ein intelligenter Programmierer/Compiler aber mit
sbi  ddrd,1   ; 2 Takte

>werden müssen wirds mindestens einer mehr (Wenn der Status aller Pullups
>auch dem DDR  register entspricht)

Warum? Dein Sequenz oben ist nur nötig, wenn mehr als ein Bit sich 
ändern soll.

>Achja nochwas: Beim Umschalten ist der pin nach dem Befehl auch wirklich
>schon input (also am ende vom OUT), beim Ausgeben auf einen port, steht
>das Signal erst einen takt später auch am Pin zur verfügung (irgend eine
>Synchronisation ist dafür verantwortlich, habs nich mehr soo genau im
>kopf)

Nicht ganz. Auch ein out führt sofort zum Ändern des Ausgangspegels. Was 
du meinst ist

http://www.mikrocontroller.net/articles/AVR-Tutori....

MFG
Falk

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk:

Ah ok so war das, wusste doch, dass da die Synchronisierung mit 
reinspielt ;)

Und du hast recht, die Sequenz ist nur dann nötig, wenn mehrere Pins 
umgeschaltet werden sollen UND die anderen nicht beeinflusst werden 
dürfen.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Sowas macht ein intelligenter Programmierer/Compiler aber mit
>sbi  ddrd,1   ; 2 Takte

Haarspalterei an:

Bei großen AVRs funktioniert das bei den höheren Ports nicht, da geht 
nur lds und sts. Demzufolge muß man die Pins erst lesen, modifizieren, 
schreiben. Gleiches bei den Datenrichtungsregistern.

Haarspalterei aus

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

dank Euch für Eure Antworten.
Ich möchte an einem LCD Display das BUSY Flag abfragen und dafür muß man 
einen Ausgang als Eingang umschalten, abfragen und dann wieder auf 
Ausgang setzen.

Sollte also alles schnell genug gehen OHNE das man warten muß.
Muß ich mir meinen Quelltext wohl nochmal genauer ansehen warum es nicht 
will...

MfG AVRli...

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Display ist viiiiel langsamer, als der AVR. Du wirst also mit dem 
AVR auf das Display bzw. auf ein gültiges Busyflag warten müssen. Du 
kannst Dir den ganzen Zinnober auch sparen, auf die Auswertung des Busy 
verzichten und in zyklischen Abständen auf das Display schreiben.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau Dir mal das Timing im Datenblatt des LCD-Controllers an. Da ist 
der µC vermutlich viel zu schnell. Und Du willst es noch schneller 
machen?

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Danke für die Tip's, Timing Daten waren es.
Die Pegel müssen eine bestimmte Zeit anliegen und dann kann man das 
ENABLE triggern und anschließend auch das BUSY super abfragen.

Mit anderen Worten, die Ports vom Display überholte der ATMEL allemale. 
:-D

Rennt nun ganz ausgezeichnet. dance

Problem ist gelöst, ich danke Euch!

Gruß AVRli...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ AVRli (Gast)

>Danke für die Tip's, Timing Daten waren es.
>Die Pegel müssen eine bestimmte Zeit anliegen und dann kann man das
>ENABLE triggern und anschließend auch das BUSY super abfragen.

Ein Blink ins Datenblatt hätte dir das sofort sagen können.

MfG
Falk

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.