Benötigen Sie Hilfe beim Verständnis von Ultra Low Power Wakeup auf PIC16F887

Ich versuche, die Funktion "Ultra Low Power Wake Up" in einem kleinen PIC-Projekt zu implementieren. Die Idee ist, dass der Chip schlafen geht und dann in Zukunft durch den ULPWU-Interrupt geweckt wird.

Die Idee hinter dem ULPWU ist, dass Sie einen Kondensator an diesen Pin anschließen, ihn aufladen und den Chip in den Ruhezustand versetzen. Wenn konfiguriert, entlädt der ULPWU-Pin den Kondensator langsam. Sobald die Spannung an der Kappe auf einen bestimmten Wert abfällt, wacht der Chip auf und erzeugt möglicherweise einen Interrupt.

Dieser Anwendungshinweis (PDF) von Microchip erklärt, wie die ULPWU programmiert und implementiert wird. Siehe Beispiel 2 und Abbildung 2 (unten).

Beispiel 2:

BANKSEL PORTA           ;
BSF PORTA, 0            ;Set RA0 data latch
BANKSEL ANSEL           ;
BCF ANSEL, 0            ;RA0 to digital I/O
BANKSEL TRISA           ;
BCF TRISA, 0            ;Output high to
CALL CapDelay           ;charge capacitor 
BANKSEL PIR2            ;
BCF PIR2, ULPWUIF       ;Clear flag
BANKSEL PCON            ;
BSF PCON, ULPWUE        ;Enable ULP Wake-up
BSF TRISA,  0           ;RAO to input
BSF PIE2, ULPWUIE       ;Enable interrupt
MOVLW B’11000000’       ;Enable peripheral
                        ;interrupt
MOVWF   INTCON          ;
SLEEP                   ;Wait for interrupt
NOP                     ;


Geben Sie hier die Bildbeschreibung ein

Ich habe dies durchgeführt, aber stecke mit einem seltsamen Problem fest.

Wenn der Chip schlafen geht, werden 5 V vom ULWU-Pin (RA0) geliefert. Wenn ich diesen Pin mit Masse verbinde, wacht der Chip auf und tut, was er tun soll.

Meine Frage ist, warum liegen an diesem Pin 5 V an, wenn es sich um einen Eingang handeln soll? Wenn ich diesen Pin an einen geladenen Kondensator angeschlossen habe, entlädt sich der Kondensator nie (die 5 V am Pin halten ihn geladen).

BEARBEITEN
Hier ist mein Testcode. Ich verwende in diesem Fall keinen Kondensator. Ich schalte einfach den RA0-Pin von High auf Low. Bleibt die Frage, warum ist RA0 High, wenn er eigentlich einen Kondensator entladen soll, um die Weckfunktion auszulösen?

INCLUDE registers.asm
__CONFIG 0x2EFF20E5
     ORG    0x00
    GOTO    MAIN
;***********************************************
;Interrupt Service Routine
;turn on an led and return
;*********************************************
    ORG 0X04
ISR
    BANKSEL PORTD
    BSF PORTD,7
RETFIE

MAIN
    CALL    SETUP
    CALL    SETUP_WU
    SLEEP
TRAP
    GOTO    TRAP

SETUP
    BANKSEL ANSELH
    CLRF    ANSELH      ;CONFIGURE ALL PINS FOR DIGITAL IO
    CLRF    ANSEL
    BANKSEL TRISD   ;PORTD IS OUTPUT
    CLRF    TRISD
    BANKSEL PORTD
    CLRF    PORTD
    RETURN

SETUP_WU
    BANKSEL PORTA
    BSF PORTA,0
    BANKSEL ANSEL
    CLRF    ANSEL
    BANKSEL TRISA
    BCF TRISA,0
    BANKSEL PIR2
    BCF PIR2,2
    BANKSEL PCON
    BSF PCON,5
    BSF TRISA,0
    BSF PIE2,2
    MOVLW   B'11000000'
    MOVWF   INTCON
    RETURN

END
An welchem ​​Kondensator ist der Pin angeschlossen?
@Oli Glaser Ich habe 100uF, 10uF und irgendwo im pF-Bereich ausprobiert.
Sie haben den Beispielcode gepostet, aber es kann hilfreich sein, wenn Sie den tatsächlichen Code posten, den Sie verwenden. Da könnte etwas nicht stimmen.
Sie löschen wahrscheinlich, anstatt das niedrigstwertige Bit von TRISA zu setzen. Es sollte " BSF TRISA, 0 " anstelle von "BCF TRISA, 0" sein.
@gmagno Das kann nicht stimmen. Wenn der Pin manuell mit Masse verbunden wird, wacht der Prozessor auf und es wird ein Interrupt generiert. Das würde anzeigen, dass die ULWU-Funktion funktioniert und der PORTA für die Eingabe eingestellt ist.
@Michael Tatsächlich würde ein starker externer Antrieb gegen Masse den ULPWU-Komparator auslösen, unabhängig davon, ob PORTA ein Eingang oder ein Ausgang ist. Testen Sie, wie stark das HIGH in PORTA ist, indem Sie einen Widerstand an Masse legen und seine Spannung messen.
@Michael Nur um weitere Klarstellungen aus dem Weg zu räumen: Was genau ist Ihr Testaufbau? Hast du die ganze Zeit ein Multimeter am Pin angeschlossen? Dies wird einen Strom injizieren und den Pin aufgeladen halten. Haben Sie den ULPWU mit nichts am Stift außer dem Kondensator ausprobiert (keine Testausrüstung)?
@justing Ich verwende ein Oszilloskop, um das Signal auf dem Pin zu lesen. Ich habe mir vorgenommen, keine Kappe zu verwenden und einfach den Stift von niedrig auf hoch zu schalten.

Antworten (2)

Sind Sie sicher, dass Sie ausreichend lange gewartet haben, bis sich der Kondensator entladen hat? Verwendung von Gleichung 2 im Anwendungshinweis:

Gleichung 2

und Ihre Kondensatorwerte, die Sie in Ihren Kommentaren angegeben haben (x pF, 10uF, 100uF), wären die Entladezeiten:

(5 V - 0,6 V) * 10 pF / 140 nA = 314 us

(5 V - 0,6 V) * 10 uF / 140 nA = 314 Sekunden ~ = 5 Minuten

(5 V - 0,6 V) * 100 uF / 140 nA = 3.143 Sekunden ~ = 52,3 Minuten

Vielleicht warten Sie nicht lange genug auf Ihre uF-Kondensatoren, und der pF-Kondensator ist zu klein und führt dazu, dass das Mikro in Ihrer Interrupt-Routine hängen bleibt (oder so, ohne IHREN Code anzugeben, ist es unmöglich, irgendeine Art von Codierungsfehler zu erraten). .

Ein guter Wert zum Ausprobieren könnte im Bereich von 100 nF liegen, der alle ~3 Sekunden aufwachen würde, was mit bloßem Auge leicht zu erkennen wäre, ob er funktioniert.

HINWEIS: Ich habe die Werte, die ich in Gleichung 2 verwendet habe, den Beispielwerten im Anwendungshinweis entnommen.

Guter Vorschlag. Ich kann jedoch mit einem Oszilloskop überprüfen, ob die Kappe aufgeladen wird. Und ich glaube nicht, dass dies die Frage beantwortet, warum der Pin mit 5 V hoch gesetzt wird, nachdem er als Eingang festgelegt wurde.
@Michael Sie sollten Ihren Code für weitere Hilfe posten. Das bloße Posten des Beispielcodes hilft uns nicht, Ihnen sehr zu helfen.
Ja, Sie haben recht und ich entschuldige mich. Diese Funktion ist Teil eines größeren Programms. Ich hätte wirklich versuchen sollen, dieses Subsystem eigenständig zum Laufen zu bringen, bevor ich es in ein größeres Programm einbaue. Ich muss diese Frage für eine Weile unterbrechen, damit ich etwas mehr Arbeit erledigen kann
Ich habe mein Programm wie gewünscht zur Frage hinzugefügt.

Es ist möglich, dass an diesem Pin ein interner Pull-up aktiviert ist.