Ich lerne, wie man einen PIC10F220 programmiert. Ich verwende einen PICkit 3-Programmierer und führe physikalische Experimente durch, sowie den Simulator in MPLABX.
Eine Sache, die ich tun möchte, ist, den richtigen Pegel für einen Port-Ausgangslatch einzustellen, bevor der Tristate (TRIS) in den Ausgangsmodus wechselt. Dieses Diagramm legt nahe, dass dies möglich sein sollte und dass die Eingangs- und Ausgangspfade trennbar sind:
Ich habe diesen Teil der Assembly geschrieben:
; !GPWU=0: enable wakeup on pin change
; !GPPU=0: enable weak pullup on GP0,1,3
; T0CS=0: timer 0 internally clocked
; T0SE=0: ignored
; PSA=0: prescaler assigned to timer 0
; PS=111: 1:256 prescaler
movlw b'111'
option
; ANS1=0: GP1 digital
; ANS0=1: GP0 analog in
; CHS=00: channel GP0/AN0
; GO=0: not converting yet
; ADON=1: ADC is enabled
movlw b'01000001'
movwf ADCON0
; We can write to the GP2 latch even if it's still in input mode;
; this ensures no glitch between clearing TRIS and sending the GP2 output.
; (but this doesn't work in the simulator)
btfsc GPIO, GP1 ; Check GP1 status (negative logic)
goto gp1_off
gp1_on: ; if it's clear, port 1 is on
bsf GPIO, GP2 ; turn GP2 on
goto gp2_done
gp1_off: ; if it's set, port 1 is off
bcf GPIO, GP2 ; turn GP2 off
gp2_done:
movlw b'1011' ; only GP2 output, others input
tris GPIO
Wie in den Kommentaren - im wirklichen Leben funktioniert das, aber im MPLABX-Simulator haben versuchte Modifikationen an GP2 keine Wirkung. Warum sollte das sein? Haben sie es versäumt, das Schreib-Latch als funktionsfähig zu modellieren, selbst wenn das entsprechende TRIS-Bit immer noch hoch ist (Eingang)?
Das scheint sachdienlich:
BIDIREKTIONALE E/A-PORTS
Einige Befehle arbeiten intern als Lese- gefolgt von Schreiboperationen. Die Anweisungen BCF und BSF lesen beispielsweise den gesamten Port in die CPU, führen die Bitoperation aus und schreiben das Ergebnis neu. Vorsicht ist geboten, wenn diese Anweisungen auf einen Port angewendet werden, an dem ein oder mehrere Pins als Ein-/Ausgänge verwendet werden. Beispielsweise bewirkt eine BSF-Operation auf Bit 2 von GPIO, dass alle acht Bits von GPIO in die CPU gelesen, Bit 2 gesetzt und der GPIO-Wert in die Ausgangslatches geschrieben wird. Wenn ein anderes Bit von GPIO als bidirektionaler E/A-Pin verwendet wird (z. B. Bit 0) und zu diesem Zeitpunkt als Eingang definiert ist, wird das am Pin selbst vorhandene Eingangssignal in die CPU eingelesen und in den Datenlatch umgeschrieben dieses bestimmten Pins, wobei der vorherige Inhalt überschrieben wird. Solange der Pin im Eingabemodus bleibt, tritt kein Problem auf. Jedoch,
Abbildung 5-1 ist etwas irreführend. Tatsächlich sieht keine der I/O-Pin-Schaltungen des PIC10F220 genau so aus. Hier ist die Schaltung für Pin 2: -
Beachten Sie, dass der Ausgangstreiber von GP2 deaktiviert ist, wenn T0CS
er hoch ist. T0CS
ist Bit 5 des OPTION-Registers, und wissen Sie was? Ja, es ist hoch beim Einschalten!
Um die digitale Ausgabe an Pin 2 zu aktivieren, müssen Sie das T0CS
Bit im Optionsregister wie folgt löschen:
movlw b'11011111' ; T0CS low, other option bits high
option
Wenn Sie GP0 oder GP1 als Ausgänge verwenden möchten, haben Sie ein ähnliches Problem. Diese Pins werden mit den analogen Eingängen AN0 und AN1 geteilt, die beim Einschalten aktiviert werden. Um ihre digitalen Ausgänge zu aktivieren, müssen Sie die Bits ANS1
und ANS0
in löschen ADCON0
.
BEARBEITEN:
Ihr aktualisierter Code wurde für mich in MPLab 8.92 korrekt simuliert, aber nicht in MPLabX 3.65, was auf einen Fehler im MPLabX-Simulator hindeutet.
brhans
bsf GPIO, GP2
undbcf GPIO, GP2
keine Auswirkung auf das GPIO-Register haben, während TRISGPIO2 eine 1 ist?Reinderien
brhans
Reinderien