Forum: Mikrocontroller und Digitale Elektronik physikalischen Zustand der Ausgänge lesen


von Alex (Gast)


Lesenswert?

Ich hätte eine kurze Frage zur Pinabfrage.

Benutze AVR studio.

Ich möchte einen PIN setzten und danach erst im Programm weiter gehen,
wenn er wirklich physikalisch gesetzt. Welches Register muss ich dazu
auslesen?
geht das überhaupt?


Danke, Alex

von Gabriel W. (gagosoft)


Lesenswert?

wie meinst Du das?
wenn Du einen Port mit einem Muster beschreibst ist der Ausgang 
spätestens in nächsten ClkCycle so wie Du ihn beschrieben hast (und 
davor kannst Du auch nicht im Programm weitergehen.

Oder meinst Du dass auf diesen Pin mehrere Ausgänge schreiben?

von Sven P. (Gast)


Lesenswert?

Brauchste garnich warten. Les doch einfach nach, wie das Timing des AVR 
ist.

Wenn du z.B. "sbi" machst, dauert diese Instruktion genau einen 
Prozessortakt. Und dann ist der Pin auch definitiv gesetzt...es sei 
denn, du hängst da riesige Kapazitäten dran...

Nochwas: PORTx und PINx-Register sind unabhängig. Wenn du einen Pin aus 
Ausgang einstellst (DDRx = 1), dann den Pin auf "High" ziehst (PORTx = 
1), und diesen Pin dann von außen auf "Low" zwingst (z.B. Kurzschluss 
nach Masse), dann ist PINx auch 0. Evtl. hastu das ja gemeint.

von Bruno (Gast)


Lesenswert?

Du mußt den Pin als Einganf setzen (DDRx) und dann zb in einer 
While-Schleife den Port bzw Pin abfragen. Wenn die Bedingung erfüllt 
ist, springst du aus der Schleife.

von Sven P. (Gast)


Lesenswert?

Bruno wrote:
> Du mußt den Pin als Einganf setzen (DDRx) und dann zb in einer
> While-Schleife den Port bzw Pin abfragen. Wenn die Bedingung erfüllt
> ist, springst du aus der Schleife.

Er will doch einen Pin setzen, also muss er wohl als Ausgang 
konfiguriert werden.

Ab wie Gabriel und ich schon sagten, das is Käse, weils ein genau 
definiertes Timing gibt.

von Alex (Gast)


Lesenswert?

ich möchte ein Pin kurz high low togglen. vom 8051 kenn ich noch das 
problem, das wenn man das port schreibt und sofort "weiterrennt" im 
Programm, dass man schon zwei zeilen weiter ist im Code, der Pin aber 
noch gar nicht tatsächlich highpedel hat.
also

PORTC = 0x01;
PORTC = 0x00;

würde nicht wirkich was bewirken, weil bei der zweiten komandozeile der 
PIn noch gar nicht auf High ist. Ist das beim Atmel auch so oder würde 
das so funktionieren nund eine Impuls am Ausgang erzeugen?

Alex

von Alexander S. (esko) Benutzerseite


Lesenswert?

Ja, das würde funktionieren.
Auf diese Weise kannst du also bis die Hälfte des Prozessortakts am 
Ausgang herausführen.

von Bruno (Gast)


Lesenswert?

Habe es erst vertanden als ich auf absenden gedrückt habe.
Aber dein Problem hatte ich mit nem 8515 auch schon. Habe dazwischen ne 
kleine Schleife laufen lassen

von Gabriel W. (gagosoft)


Lesenswert?

ich denke der GCC optimiert das nicht weg, da es in sfr_defs.h als 
volatile gekennzeichnet ist und meines wissen nach alle volatile aufrufe 
vorm wegoptimieren bewahrt werden.
Bitte verbessert mich, wenn ich hier daneben liege.

von Alex (Gast)


Lesenswert?

genau das möchte ich auch mach, nur weiß ich nicht, wei ich den 
tatsächlich status des pins rausbekomme

von Gabriel W. (gagosoft)


Lesenswert?

und ein wichtiger Unterschied zwischen AVR und 8051 ist der, das der AVR 
die meisten Operationn in einen Takt abhandel, was beim 8051 nun 
wirklcih nicht der Fall ist

von Gabriel W. (gagosoft)


Angehängte Dateien:

Lesenswert?

ok der tatsächliche Status ist (auch bei Ausgängen) am jeweiligen PIN 
abzufragen.

von Alex (Gast)


Lesenswert?

das mit den Takten wusste ich nicht, so fit bin ich noch nicht. Dann 
probier ich das mal mit Pin, Danke.

von Gabriel W. (gagosoft)


Lesenswert?

probiers doch einfach mal mit PORT und lass das mit dem Abfragen erst 
mal sein....
Du kannst ja auch eine andere Operation zwischen auf & abdrehen setzen, 
so quasi eine Angstoperation dann kann GCC die PORTx = Befhle nicht 
killen.

von Alex (Gast)


Lesenswert?

ich muss auf jeden fall warten zwischen EIN und AUS, weil sonst der Puls 
zu kurz wird. hab eben mal mit Oszi angeguckt. vielleicht einfach ein 
paar NOPs?

von yalu (Gast)


Lesenswert?

Wenn der Puls nur um wenige Taktzyklen gedehnt werden soll, sind NOPs
sicher die beste Lösung. Die möglich Zeitauflösung ist hier 1 Takt-
zyklus, der Speicherplatzbedarf soviele Worte, wie NOPs eingefügt
werden.

Wenn's mehr sein soll, kannst du auch _delay_us aus der AVR-Libc
verwenden. Damit lassen sich Verzögerungen ab 3 Taktzyklen
realisieren. Die Zeitauflösung beträgt (bei Verzögerungen von bis zu
768 Zyklen) 3 Taktzyklen, der Speicherplatzbedarf unahbhängig von der
Verzägerungszeit 3 Worte.

von Alex (Gast)


Lesenswert?

Vielen Dank an alle Ratgeber

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.