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


von AVRli (Gast)


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...

von Thomas (Gast)


Lesenswert?


von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


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.

von Falk B. (falk)


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.
1
out    r16,ddrd     ; 1 Takt
2
sbi    ddrd,pd0     ; 2 Takte

MFG
Falk

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

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

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Will nicht meckern, aber:
1
out    r16,ddrd

müsste
1
out    ddrd,r16
lauten.

Aber ich denke @ Travel Rec. (travelrec) meint irgendwie sowas:
1
in     r16,ddrd ;1 Takt
2
ori    r16,0x01 ;1 Takt
3
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)

von Falk B. (falk)


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
1
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-Tutorial:_IO-Grundlagen#Stolperfalle_bei_Matrixtastaturen_etc.

MFG
Falk

von Hauke R. (lafkaschar) Benutzerseite


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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


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

von AVRli (Gast)


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...

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


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.

von Johannes M. (johnny-m)


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?

von AVRli (Gast)


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...

von Falk B. (falk)


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

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.