Ausgänge nur mit Pause schaltbar

Gast #2648574
Lesenswert?
• ▲
▼
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?
Gast #2648609
Lesenswert?
• ▲
▼
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
Gast #2648819
Lesenswert?
• ▲
▼
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?
#2648856
Lesenswert?
• ▲
▼
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
#2649067
Lesenswert?
• ▲
▼
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
#2651799
Lesenswert?
• ▲
▼
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.