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