Hallöchen, ich spiele gerade mit einem PIC12 herum und habe ein merkwürdiges Problem bei einfachsten Anwendungen: Schreibe ich RA5=1; RA4=1; sind beide Ausgänge high. Schreibe ich aber RA4=1; RA5=1; ist nur RA5 high. Die Reihenfolge macht ist also entscheidend. Wenn ich eine kleine Warteschleife dazwischen schreibe funktioniert es auch. Also so: RA5=1; delay(1); //for-Schleife mit einem Durchlauf RA4=1; Woran kann das liegen? Ist das vielleicht sogar normal oder mache ich etwas falsch?
Ich bin jetzt bei den 12er PICs nicht sicher - aber der RA4 ist ein Open-Drain-Ausgang -> der wird nur dann H, wenn Du einen ext. Pull-Up dranhängst. Gruß TK
TK schrieb: > Ich bin jetzt bei den 12er PICs nicht sicher - aber der RA4 ist ein > Open-Drain-Ausgang -> der wird nur dann H, wenn Du einen ext. Pull-Up > dranhängst. Aber wäre er dann nicht immer LOW? Wenn ich eine kleine Verzögerung dazwischen habe funktioniert es ja. O.o
PIC Einsteiger schrieb im Beitrag #2648574: > ich spiele gerade mit einem PIC12 Mit welchem denn? Das solltest du uns schon verraten. Gruß Oliver
g532z25g schrieb: > Hast Du Dir ein parasitäres RC-Glied gebaut? Wie könnte das denn passieren? Meine Pins (RA4 und RA5) gehen auf BCR108 Transistoren, um LEDs zu schalten.
Also ich habe es mir nochmal im Debugger angesehen und verstehe es einfach nicht: Setze ich RA4, erscheint im LATA eine 1 für RA4 aber auch nach zwei NOP() nicht im PORTA. Setze ich dann RA5, erscheint im LATA eine 1 für RA5 aber RA4 erlischt aus unerfindlichen Gründen wieder. RA5 wird dann immerhin nach einem NOP() im PORTA angezeigt. War das halbwegs verständlich? Was ist denn da nur los?
RA4 ist also im LATA high und auch am Pin high aber im PORTA low. Das kann doch auch nicht sein, oder?
PIC Einsteiger schrieb im Beitrag #2648574: > Woran kann das liegen? Ist das vielleicht sogar normal oder mache ich > etwas falsch? Das Verhalten ist korrekt. Das ist ne PIC-Eigenart. Du liest das Eingangsregister, aber Du schreibst das Ausgangsregister. Folgen 2 solcher Read-Modify-Write aufeinander, ist der erste Wert noch nicht im Eingangsregister angekommen und geht damit verloren. Das Eingangsregister latcht erst mit dem nächsten CPU-Zyklus. Ein NOP dazwischen und es geht. Bei AVR oder 8051 gibt es das nicht, da wird immer das Ausgangsregister gelesen bei Read-Modify-Write. Peter
Hast Du die Entsprechenden Bits im ANSELA-Register auf 0 gesetzt? ----------------------------------------------------------------------- The state of the ANSELA bits has no affect on digital output functions. A pin with TRIS clear and ANSEL set will still operate as a digital output, but the Input mode will be analog. This can cause unexpected behavior when executing read-modify-write instructions on the affected port. Note: The ANSELA register must be initialized to configure an analog channel as a digital input. Pins configured as analog inputs will read ‘0’. ----------------------------------------------------------------------- Für solche Read-Modify-Write Befehle solltest Du LATA4=1; LATA5=1; benutzen, und nicht RA4=1; RA5=1; dann wird das Ausgangsregister gelesen bei Read-Modify-Write. John
Super, mit dem LATA Register Funktioniert es jetzt. Vielen Dank! :)
Die LATA-Zugriffe dauern aber länger, da dazu erst auf Bank 2 umgeschaltet werden muß. Man sollte sie trotzdem nehmen, da sie sicherer sind. Die RA-Zugriffe, haben nämlich noch weitere Seiteneffekte. In alle RA-Pins, die Eingänge sind, wird Mumpitz eingeschrieben. Wenn man sie dann auf Ausgang schaltet, haben sie Zufallswerte. Peter
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.