Autor Tema: 24FJ64GA102, pines RB8, RB9, RB10, RB11, no responden  (Leído 1983 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jam

  • PIC10
  • *
  • Mensajes: 5
24FJ64GA102, pines RB8, RB9, RB10, RB11, no responden
« en: 13 de Junio de 2013, 11:26:26 »
Estoy utilizando 24FJ64GA102 de 28 pin.
Lo programo en CCS y en MPLAB XC16.

Cuando pongo los pin RB0...RB15 como salidas, los pines RB8, RB9, RB10, RB11,
no responden, todos los demas pin funcionan bien.

Con el siguiente codigo no responden y cambiando configuración fuses 1 por la 2
// *** CONFIGURACIÓN fuses 1 ***
//#fuses WINDIS, NOWDT, ICSP1, NODEBUG, NOWRT, NOPROTECT, NOJTAG
//#fuses I2C1SELD, NOIOL1WAY, NOIESO, NOWPFP, WUT_DEFAULT, NOWPDIS
//#fuses NOWPCFG, WPBEG, DSWDTCK_LPRC, RTCOSC_LPRC, NODSBOR, NODSWDT
//#fuses FRC, NOPR, OSCIO, SOSC_IO, NOCKSNOFSM

// *** CONFIGURACIÓN fuses 2 ***
#fuses FRC, NOWDT, NOPR

#use delay(clock=4M)

void main()
{

   set_tris_b(0x0000);

   do {

      output_b(0xFFFF);
   
   } while(TRUE);
}

El valor medido en los 4 pin con el polimetro es:
RB8, RB9, RB10 = 0.20V
RB11 = 2.80V
La tensión en RB8, RB9, RB10 es similar, cuando se declaran el puerto como entrada, pero esta como salida.
La tensión en RB11 es como si estuviera flotante, no es capaz de encender un LED.
En los demas pines del puerto b estan bien a 3.3V

Como los demas pin funcionan bien, le añado al programa UART para ver como se comporta TRISB.
// *** CONFIGURACIÓN fuses 1 ***
//#fuses WINDIS, NOWDT, ICSP1, NODEBUG, NOWRT, NOPROTECT, NOJTAG
//#fuses I2C1SELD, NOIOL1WAY, NOIESO, NOWPFP, WUT_DEFAULT, NOWPDIS
//#fuses NOWPCFG, WPBEG, DSWDTCK_LPRC, RTCOSC_LPRC, NODSBOR, NODSWDT
//#fuses FRC, NOPR, OSCIO, SOSC_IO, NOCKSNOFSM

// *** CONFIGURACIÓN fuses 2 ***
#fuses FRC, NOWDT, NOPR

#use delay(clock=4M)

#pin_select U1TX = PIN_B2
#pin_select U1RX = PIN_B3
#use rs232(baud=9600, UART1)

void main()
{
   delay_ms(300);

   do {

      printf("Sin nada = %lx \n\r", get_tris_b());
      delay_ms(1000);
   
   } while(TRUE);
}
get_tris_b() devuelve 0xF0FF
El puerto b esta como entrada menos RB8, RB9, RB10, RB11, que estan como salida.
Si añado set_tris_b(0xFFFF); el resultado de get_tris_b() es 0xF0FF, no cambia.
Si pongo set_tris_b(0x0000); el resultado de get_tris_b() es 0x0000
El valor medido en los 4 pines con ambos TRIS, es el puesto mas arriba, no cambia.

Los 4 pin RB8, RB9, RB10, RB11, no modifican su valor si añado:
output_high(PIN_B8); output_high(PIN_B9); output_high(PIN_B10); output_high(PIN_B11);
output_toggle(PIN_B8); ...;
output_float(PIN_B8); ...;
input(PIN_B8); ...;
bit_set(puertob, 1); ...;
Y con output_float() y input(), el tris de los 4 pines, no cambia como entrada, sigue como salida.

Cambie a MPLAB IDE XC16 por si fuera problema de CCS, pero no hay ningun cambio,
los puertos se comportan igual, no responden.

No se, si tendra algo que ver, que los 4 puertos correspondan a los pines de JTAG.

El chip lo tengo con una resistencia 10K del positivo a MCLR.
Condensador de 10uF de tantalo del pin20 a masa.
Pin19 DISVREG a masa.

Tambien, por si acaso he puesto setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF);
Pero estos puertos no tienen entrada analogica.
He probado con setup_pmp(PAR_DISABLE, ox00FF); setup_psp(PAR_DISABLE, 0x00FF);

Se que algo tengo que estar haciendo mal, pero no se me ocurre que pruebas
mas puedo hacer.

Desconectado jam

  • PIC10
  • *
  • Mensajes: 5
Re: 24FJ64GA102, pines RB8, RB9, RB10, RB11, no responden
« Respuesta #1 en: 13 de Junio de 2013, 16:52:47 »
Aqui esta el codigo en MPLAB XC16.

#include <P24FJ64GA102.h>

#define FCY 2000000UL
#include <libpic30.h>

_CONFIG1( WDTPS_PS1 & FWPSA_PR32 & WINDIS_OFF & FWDTEN_OFF & ICS_PGx1 & GWRP_OFF & JTAGEN_OFF );
_CONFIG2( POSCMOD_NONE & I2C1SEL_PRI & IOL1WAY_OFF & OSCIOFNC_OFF & FCKSM_CSDCMD & FNOSC_FRC & IESO_OFF );
_CONFIG3( WPFP_WPFP0 & SOSCSEL_IO & WUTSEL_LEG & WPDIS_WPDIS & WPCFG_WPCFGDIS & WPEND_WPSTARTMEM );
_CONFIG4( DSWDTPS_DSWDTPSF & DSWDTOSC_LPRC & RTCOSC_LPRC & DSBOREN_OFF & DSWDTEN_OFF );

int main(void)
{
   
   __delay_ms(1000);
   
   TRISB = 0;

   LATB = 0xFFFF;
   
   do {
      
   }while(1);
}

La primera prueba es sin TRISB y LATB, solo el main() y do while(), no se produce ningun cambio.
Añado el TRISB Y LATB, los 4 pines no responden y los demas se ponen en alto.
Le pongo UART al programa de arriba para ver TRISB.

#include <P24FJ64GA102.h>

#define FCY 2000000UL
#include <libpic30.h>
#include <uart.h>
#include <stdio.h>

_CONFIG1( WDTPS_PS1 & FWPSA_PR32 & WINDIS_OFF & FWDTEN_OFF & ICS_PGx1 & GWRP_OFF & JTAGEN_OFF );
_CONFIG2( POSCMOD_NONE & I2C1SEL_PRI & IOL1WAY_OFF & OSCIOFNC_ON & FCKSM_CSDCMD & FNOSC_FRC & IESO_OFF );
_CONFIG3( WPFP_WPFP0 & SOSCSEL_IO & WUTSEL_LEG & WPDIS_WPDIS & WPCFG_WPCFGDIS & WPEND_WPSTARTMEM );
_CONFIG4( DSWDTPS_DSWDTPSF & DSWDTOSC_LPRC & RTCOSC_LPRC & DSBOREN_OFF & DSWDTEN_OFF );

int main(void)
{
   
   __delay_ms(300);

   // Habilitamos escritura sobre registros RPINRx y RPORX.
   __builtin_write_OSCCONL(OSCCON & ~(0x40));
   RPINR18bits.U1RXR = 3; //Asignamos pin recepción UART1 a RP3.-
   RPOR1bits.RP2R = 0b00011; // Asignamos RP2 al pin de transmisión UART1.
   // Bloqueamos escritura sobre registros RPINRx y RPORX.
   __builtin_write_OSCCONL(OSCCON |0x40);

   U1MODEbits.USIDL=1; // Al pasar al modo Sleep, apagar modulo.
   U1MODEbits.IREN=0; // Codificacion/decodificacion IrDA deshabilitado.
   U1MODEbits.RTSMD=1; // RTS en modo simple.
   U1MODEbits.UEN=0b00; // Tx/Rx habilitado, CTS/RTS deshabilitados.
   U1MODEbits.WAKE=0; // Wake-up deshabilitado.
   U1MODEbits.LPBACK=0; // Modo LoopBack deshabilitado.
   U1MODEbits.ABAUD=0; // Auto-Baud rate deshabilitado.
   U1MODEbits.RXINV=0; // Modo normal de pin RX, en reposo = 1.
   U1MODEbits.BRGH=1;  //BRGHigh; // Mode seleccionado en define.-
   U1MODEbits.PDSEL=0b00; // 8 bits- sin paridad.
   U1MODEbits.STSEL=0; // 1 bit de Stop.

   U1STAbits.UTXISEL1=1; // Interrupcion por transimision no usada.
   U1STAbits.UTXISEL0=1; // Interrupcion por transimision no usada.
   U1STAbits.UTXINV=0; // Pin Tx en reposo igual a 1.
   U1STAbits.UTXBRK=0; // Break deshabilitado.
   U1STAbits.URXISEL=0b11; // Interrumpir cuando se recibe un caracter.
   U1STAbits.ADDEN=0; // Auto-Address deshabilitado.
   U1STAbits.OERR=0; // Borramos bits de error por overflow.
   
   U1BRG =51;  //BRGVAL;   // Baud Rate determinado en defines.

   IPC2bits.U1RXIP=0b01; // Fijamos nivel de prioridad.
   IFS0bits.U1RXIF=0; // Borramos flag.
   IEC0bits.U1RXIE=0; // habilitamos interrupcion por recepción.

   U1MODEbits.UARTEN=1;// Encendemos modulo.
   U1STAbits.UTXEN=1; // Transmision habilitada.
   

   //TRISB = 0xFFFF;
   TRISB = 0x0000;
   LATB  = 0xFFFF:

   do {      
      
      printf("TRISB = %x \n\r", TRISB);
      printf("PORTB = %x \n\r", PORTB);
      printf("LATB  = %x \n\r", LATB);
      printf("ODCB  = %x \n\r\n", ODCB);

      __delay_ms(1000);
      
   }while(1);
}

Cuando pongo TRISB = 0xFFFF; como entrada, sin LATB, devuelve TRISB=0xF0FF, PORTB=0, LATB=0, ODCB=0.
Cuando pongo TRISB = 0x0000; como salida, con LATB = 0xFFFF; devuelve TRISB=0; PORTB=F0; LATB=F0FF; ODCB=0.

Los pines RB8, RB9, RB10, RB11, no responden.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: 24FJ64GA102, pines RB8, RB9, RB10, RB11, no responden
« Respuesta #2 en: 13 de Junio de 2013, 21:29:41 »
hola, preciso hoy me pasó algo parecido con un 24FJ48GA004  y resultó que por defecto están los pines configurados como análogos, me tocó configurar el registro AD1PCFG para ponerlos como I/O digitales. Mira si de pronto por ahi es el problema.
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado jam

  • PIC10
  • *
  • Mensajes: 5
Re: 24FJ64GA102, pines RB8, RB9, RB10, RB11, no responden
« Respuesta #3 en: 14 de Junio de 2013, 05:10:50 »
Gracias por responder jhozate.

Lo habia probado en CCS, pero no en MPLAB, he puesto AD1PCFG pero no ha habido cambios.
RB8, RB9, RB10, RB11 no responden.

Los perifericos:
Pin 22: PGEC2/TMS/RP11/CN15/PMD1/RB11
Pin 21: PGED2/TDI/RP10/CN16/PMD2/RB10
Pin 18: TDO/RP9/SDA1/CN21/PMD3/RB9
Pin 17: TCK/RP8/SCL1/CN22/PMD4/RB8

He intentado poner UART entre RP8, RP9 y RP10, RP11, no ha funcionado ninguna de las dos combinaciones.
Como los 4 pines son la salida JTAG, he cambiado los fuses en CCS (JTAG, NOJTAG) y en MPLAB (JTAGEN_ON, JTAGEN_OFF),
sin producir ningun cambio en los 4 pines.

Desconectado jam

  • PIC10
  • *
  • Mensajes: 5
Re: 24FJ64GA102, pines RB8, RB9, RB10, RB11, no responden
« Respuesta #4 en: 15 de Junio de 2013, 03:52:29 »
La UART puse que no funciona, no es del todo cierto.
Los 4 pines no transmiten, U1TX no funciona en ninguno de ellos.
Pero si reciben, U1RX si funciona en los cuatro pines.

Tambien funciona la interrupción por cambio de estado CN15, CN16, CN21, CN22.

Los 4 pines no responden como salidas, pero si como entradas.

Desconectado jerc007

  • PIC10
  • *
  • Mensajes: 1
Re: 24FJ64GA102, pines RB8, RB9, RB10, RB11, no responden
« Respuesta #5 en: 23 de Julio de 2013, 19:24:41 »
Cuando los pines RB8, RB9, RB10, RB11 funcionan parcialmente, el otro posible factor es que se encuentre activada la funcion del debug JTAG, para deshabilitar la funcion de debug por hardware, se debe incluir en el codigo de la aplicacion la linea
DDPCONbits.JTAGEN = 0;
ó
DDPCON.JTAGEN = 0;
depende del compilador usado y la version.



Desconectado jam

  • PIC10
  • *
  • Mensajes: 5
Re: 24FJ64GA102, pines RB8, RB9, RB10, RB11, no responden
« Respuesta #6 en: 24 de Julio de 2013, 11:42:46 »
Gracias por responder jerc007.

Debug y JTAG siempre los pongo NODEBUG, NOJTAG en los fuses, desconozco si hay alguna instrucción que pueda activar o desactivar por software.

Los compiladores utilizados son CCS y MPLAB XC16.

He encontrado algunos fallos más, aparte de los 4 pines.

La interrupción EXT1, EXT2, funciona en los 4 pines.

Poner TRIS como entrada y poner input(), no funciona en ninguno de los 4 pines.

He puesto todo el puerto B, la resistencias internas con set_pullup(), y la tensión que dan los pines en buen estado, coincide con rb11, los otros 3 pines fallan.
El pin rb11 debe tener la resistencia interna conectada permanentemente.

El oscilador(reloj) esta fijo en FRCDIV, no se puede cambiar a ninguna otra configuración.
Ni en los fuses, ni por software. Aunque ponga un cristal externo no lo reconoce y siempre esta funcionado el interno.
El postscaler si funciona y se puede elegir cualquier división de frecuencias.

El RTC(reloj de tiempo real) solo funciona con reloj interno, no con el externo.

WDT aunque lo anule en los fuses, NOWDT, esta funcionando o activado porque produce un reset cada 2 minutos, 8 segundos. Si añado al codigo setup_wdt(WDT_OFF), no lo reconoce y sigue activado el wdt.
Si pongo en el codigo restart_wdt(), entonces ya no se produce el reset.