dsPIC33 y la mitad superior de PORTB

4

Estoy tratando de utilizar algunos de los pines IO de dsPIC33FJ128GP802 . Los pines en cuestión son RB8 a RB11.

He escrito un pequeño programa que lee el valor de entrada de uno de esos pines y lo envía al pin RA4.

Todo lo que obtengo es 0, cualquiera de los pines que use.

Si utilizo cualquier pin PORTB 7 desde abajo (es decir, el byte inferior del registro), funciona perfectamente.

He revisado la errata y no he encontrado nada que tenga relación con este problema.

¿Qué me estoy perdiendo?

Programa de prueba:

#include <p33Fxxxx.h>

_FWDT(FWDTEN_OFF)
_FOSCSEL(FNOSC_PRIPLL)
_FOSC(POSCMD_HS)

int main(void)
{
    unsigned int x=0;
    // Configure clock and PLL for 40 MIPS from 4MHz crystal
    CLKDIVbits.DOZE = 0;
    CLKDIVbits.DOZEN = 0;
    CLKDIVbits.FRCDIV = 0;
    CLKDIVbits.PLLPOST = 0;
    CLKDIVbits.PLLPRE = 0;
    PLLFBDbits.PLLDIV = 78;

    // Disable the CCP output pins as per a bug mentioned in the errata.
    // Should not apply to this case, but just to be sure...
    CMCONbits.C1OUTEN=0;
    CMCONbits.C2OUTEN=0;

    // Disable all ADC pins (make them digital)
    AD1PCFGL = 0xFFFF;

    // Configure IO pins
    TRISBbits.TRISB10=1;    // RB10 Input
    TRISAbits.TRISA4=0;     // RA4 Output

    while(1)
    {
        // Send input state to output pin
        LATAbits.LATA4 = PORTBbits.RB10;
    }
}

Otra información útil:

  

Microchip Language Tool Shell versión v3_30 (Fecha de creación: 21 de junio de 2011).

Las entradas están siendo controladas por un Arduino, pero usar eso, o cableado para \ $ V_ {LH} \ $ o \ $ V_ {LL} \ $ no hace ninguna diferencia.

P.S. No soy un novato en PIC, después de haber pasado muchas horas en PIC16s y PIC18s, así que no se moleste con las respuestas "obvias".

    
pregunta Majenko

2 respuestas

4

Bien, he recibido una respuesta en los foros de Microchip ...

Al parecer, los pines asociados con la mitad superior del registro PORTB se comparten con el sistema JTAG. La configuración predeterminada de JTAG está activada y se puede desactivar en los fusibles de configuración. En MPLAB C30 es:

_FICD(JTAGEN_OFF)

para deshabilitar JTAG.

Una vez hecho esto, todos los pines funcionan perfectamente.

    
respondido por el Majenko
0
  • No es obvio que las entradas de PORTB deban tener un estado definido (a menos que las esté conduciendo a un nivel alto y no nos haya dicho nada).

  • SI los pines no están controlados externamente y no tienen detectores internos, su estado es un capricho del diseñador de procesadores y no se puede confiar en él.

No estoy familiarizado con el DSPIC, pero no es obvio por qué debería esperar un nivel alto en las entradas a menos que las esté colocando a nivel externo y no nos haya proporcionado esa información.

La función CNU permite la programación de pullups débiles internos, pero estos deben ser programados específicamente. Como se encuentra su programa, parece que se inicializa PORTB como todas las entradas, pero no habilita las funciones de recuperación.

Si no se aplica un nivel alto externo a cada pin de entrada y SI no tiene un pullup interno, estará en un estado indefinido. En tales casos, no es infrecuente que el comportamiento cambie en un registro o medio límite de registro, aunque incluso si esto es consistente, no se puede confiar en que el fabricante puede cambiar el comportamiento en cualquier momento sin cambiar la hoja de datos.

.

    
respondido por el Russell McMahon

Lea otras preguntas en las etiquetas