Störungsfreie Ausgabe auf PIC10F

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:

Bildport

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,

Wollen Sie damit sagen, dass Sie den Code Zeile für Zeile im Simulator durchlaufen haben und die Anweisungen bsf GPIO, GP2und bcf GPIO, GP2keine Auswirkung auf das GPIO-Register haben, während TRISGPIO2 eine 1 ist?
@brhans Das ist richtig.
Dann sieht es für mich nach einem Fehler im Simulator aus.
@brhans Ich habe keine andere Wahl, als zu dem Schluss zu kommen, dass Sie Recht haben. Senden Sie eine Antwort, wenn Sie möchten.

Antworten (1)

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: -

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass der Ausgangstreiber von GP2 deaktiviert ist, wenn T0CSer hoch ist. T0CSist 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 T0CSBit 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 ANS1und ANS0in 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.

OPTION hatte ich bereits berücksichtigt; Ich hatte es nur nicht im Montageauszug gezeigt. Außerdem würde eine falsche Einrichtung des Optionsregisters nicht erklären, warum es im Schaltkreis, aber nicht im Simulator funktioniert.
"Eine falsche Einrichtung des Optionsregisters würde nicht erklären, warum es im Schaltkreis funktioniert, aber nicht im Simulator. " - Es könnte sein, dass ein anderer Code (den Sie uns nicht gezeigt haben) die Konfiguration geändert hat. Allerdings habe ich jetzt Ihren aktualisierten Code in MPLabX getestet und er schlägt fehl, was auf einen Fehler im Simulator hindeutet. Ich schlage vor, den Simulator in MPLab 8.92 zu verwenden, der korrekt funktioniert.