-
Hmm. Sicher sind das 2 Möglichkeiten. Doch das Grundproblem liegt ja außerhalb dieser logischen Verknüpfung. PORTC muß erst einmal gelesen werden. Der durch Ausgangstrom herunter gezogene Portpin wird nicht als "1", sondern als "0" gelesen und folglich als "0" zurück geschrieben, wenn er durch die Verknüpfung (BSF, IORWF...) nicht explizit gesetzt wiurde.
Wenn ich jedoch für den gesamten Port ein Schatten anlege, funktioniert das nicht, weil ja auch noch analoge Eingänge und das PWM-Signal sind. Dort blind hineinzuschreiben, dürfte ebenso kontraproduktiv sein. Beim Analogeingang wäre es ja nicht so tragisch. Aber was sagt der PWM-Ausgang dazu? Leider habe ich erst nächste Woche wieder Zugang zum Oszi. Eigentlich wollte ich bis dahin fertig sein.
Auf einen PIC18 wollte ich nun auch nicht mehr unbedingt umsteigen.
-
Hi,
Geht es nicht wenn Du ein paar NOPs zwischen den beiden unmittelbar folgenden Bitmanipulationen setzt?
Code:
PROGRAM_LOOP:
NOP
CALL LED_RC0_ON
NOP
NOP
NOP
CALL LED_RC1_ON
NOP
NOP
NOP
CALL PAUSE_1_SEK
CALL LED_RC0_OFF
NOP
NOP
NOP
CALL LED_RC1_OFF
NOP
NOP
NOP
CALL PAUSE_1_SEK
GOTO PROGRAM_LOOP
Ggf. musst Du selbst herausfinden wie viele NOPs nötig sind.
mfg
Benny
-
Nein, leider nicht. Selbst meine Sekundenschleife bringt keinen Effekt. Die Erklärung, die ich verlinkt habe, ist auch recht plausibel. Ich denke, dieses Problem wird Microchip veranlasst haben, im PIC18 das LAT einzusetzen.
Ich habe die I/O jetzt so organisiert, daß PortC nur das PWM, ein statisch gesetztes Bit und 6 analoge Eingänge besitzt.
Port B steuert die LEDs, wo ich alles über ein eigenes Register puffern kann.
An Port B tritt übrigens genau der gleiche Effekt auf. Das setzen/löschen einzelner Bits in PORTx ist also NICHT möglich, ohne andere Bits löschen. Es kann gut möglich sein, daß dieser Effekt nur ab einer bestimmten Ausgangstromstärke (gegen Vss) auftritt. Bei einer Belastung mit einer LED und Vorwiderstand von ca. 500Ohm passiert es jedenfalls.
Zu unterscheiden sind jedoch Ports, die auch als Analogeingang nutzbar sind. Ports OHNE Analogeingangsoption (RB6, RB7, RC4, RC5) werden NICHT durch die Bitmanipulationen beinflusst. Ansonsten gehen gesetzte Bits durch die Read-Modify-Write-Aktionen verloren.
Port A habe ich nicht mehr getestet. Ich hoffe, es hilft mal jemandem, der ebenfalls über dieses Problem stolpert.
-
Hallo!
Ich versuche es am Beispiel zu erklären.
Wir haben in einem "Register" unbekannte binäre Zahl (XXXXXXXXb) in der wir bestimmte Bits löschen/setzen wollen. Angenommen wir wollen Bits 3 und 2 löschen und Bits 1 und 0 setzen. Das geschieht mit sich im Code befindlicher ASM Befehlsfolge ohne Bits 7 bis 4 zu beeinflüssen.
MfG
Code:
movf Register,0 ; XXXXXXXXb, Register ins W-Register laden
andlw 0xF3 ; 11110011b, danach im W-Register ist XXXX00XXb
iorlw 3 ; 00000011b, danach im W-Register ist XXXX0011b
movwf Register ; XXXX0011b, W-Register ins Register schreiben
-
Wenn es deine Last erlaubt (dh. sie muss nur von 5V getrennt werden, nicht auf Masse gezogen), könntest du auch die TRIS-Bits benutzen um den Port aktiv oder hochohmig zu ziehen. Das sollte ganz gut klappen, ich habs bei den CCP-Pins benutzt um das PWM Signal an und auszuschalten.