Seltsames Portverhalten (PIC24F)

Ich habe nur versucht, Port IO mit diesem Code zum Laufen zu bringen:

#include "p24Fxxxx.h" // This header will choose the right device header

#define FCY 16000000UL // Running at 16 MIPS = Fosc/2

#include <PIC24F_plib.h>
#include <libpic30.h>

// Configuration setup
_CONFIG1( FWDTEN_OFF & GWRP_OFF & GCP_OFF & JTAGEN_OFF & ICS_PGx3 )
_CONFIG2( FCKSM_CSDCMD & OSCIOFNC_ON & POSCMOD_HS & FNOSC_FRCPLL & I2C1SEL_PRI & PLL96MHZ_ON & PLLDIV_NODIV & IESO_OFF & IOL1WAY_OFF );
_CONFIG3( SOSCSEL_IO );

int main() {
    TRISB = 0;
    PORTB = 0;

    PORTBbits.RB0 = 1;
    PORTBbits.RB4 = 1;

    while(1) {
        __delay_ms( 200 );
    }
}

Also unterbreche ich die __delay_msAnweisung und werfe einen Blick auf die LATB-Register:

Geben Sie hier die Bildbeschreibung ein

(Wie abgebildet, LATB4ist nur eingeschaltet - mit Multimeter bestätigt)

Auch wenn ich die Zeile auskommentiere PORTBbits.RB4 = 1;, LATB0ist eingeschaltet (aber nicht LATB4)

Überschreibt der zweite Aufruf es irgendwie? Vielleicht, weil PORTB = 0b10001;alleine geht.

Ich verwende einen PIC24FJ64GB002, MPLAB X, C30 und ein PICkit 3. Mir ist klar, dass MPLAB X nicht 100% stabil ist - aber etwas so Einfaches sollte funktionieren.

Wenn ein PIC-Guru mich in die richtige Richtung weisen könnte, wäre das großartig.

Antworten (2)

PORTxbits.RBxVerwenden Sie stattdessen lieber LATxbits.LATx, wenn Sie Ihre Pins setzen/zurücksetzen, um dieses Problem zu vermeiden.

Ah, das ist es! Eindrucksvoll!
;)hatte selber vor einiger zeit das gleiche problem...

Das Schreiben in ein Element eines Bitfelds wird im Allgemeinen bewirken, dass eine Lese-Modifizier-Schreib-Operation durchgeführt wird. Insbesondere die Linie

PORTBbits.RB4 = 1;

wird das gleiche Verhalten haben wie

PORTB = PORTB | (1<<4);

Mein PIC ist etwas rostig, aber ich glaube, dass das Lesen PORTBden aktuellen Zustand der Pins zurückgibt und nicht den zuletzt geschriebenen Wert?

Das ist richtig. Wenn Sie also zwei Pins schnell hintereinander setzen, hat der erste Pin keine Zeit, über die Eingangsschwelle zu steigen. Da die zweite Operation den physikalischen Zustand des Pins zurückliest und der Pin seinen Zustand noch nicht geändert hat, schlägt daher die zweite Operation die erste durch.
Ah, jetzt verstehe ich es.