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_ms
Anweisung und werfe einen Blick auf die LATB-Register:
(Wie abgebildet, LATB4
ist nur eingeschaltet - mit Multimeter bestätigt)
Auch wenn ich die Zeile auskommentiere PORTBbits.RB4 = 1;
, LATB0
ist 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.
PORTxbits.RBx
Verwenden Sie stattdessen lieber LATxbits.LATx
, wenn Sie Ihre Pins setzen/zurücksetzen, um dieses Problem zu vermeiden.
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 PORTB
den aktuellen Zustand der Pins zurückgibt und nicht den zuletzt geschriebenen Wert?
Seb Holzapfel
Zähle Null
;)
hatte selber vor einiger zeit das gleiche problem...