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
Ja, das würde funktionieren. Auf diese Weise kannst du also bis die Hälfte des Prozessortakts am Ausgang herausführen.
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.
genau das möchte ich auch mach, nur weiß ich nicht, wei ich den tatsächlich status des pins rausbekomme
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
ok der tatsächliche Status ist (auch bei Ausgängen) am jeweiligen PIN abzufragen.
das mit den Takten wusste ich nicht, so fit bin ich noch nicht. Dann probier ich das mal mit Pin, Danke.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.