Hola....soy Carlos y yo tengo un problema similar.
tengo un 18f4520 y estoy haciendo un reloj para una materia, pero aunque configure el puerto B y le de la indicacion de que empiese en1 (PORTB=0xFF;) des pues de un tiempo se empuesan a poner todos los bits del puerto b en cero y asi se queda, en este puerto tengo los botones de ajuste y obviamente se quede en esta seccion del cpodigo.....intente cambiarlos a l puerto E pero me hace exactamente lo mismo....
con programas sencillos si responde a los botones el puerto b...pero con este ya no, tambien estoy manejando una interrupcion.
solicito su ayuda ya que apenas empiezo en esto de los pics y no ce que pueda ser....ya ley el data sheet y a mi poco conocimiento no pude encontrar una solucion a mi problema..Gracias!
aqui abajo pongo el código:
//******************************************************************************
// ; Programa de Apagado/Encendido
//
// *******************************************************************
/** C O N F I G U R A T I O N B I T S ******************************/
#pragma config OSC = HS // CONFIG1H
#pragma config PWRT = ON, BOREN = ON, BORV = 3 // CONFIG2L
#pragma config WDT = OFF, WDTPS = 32768 // CONFIG2H
#pragma config MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF, CCP2MX = PORTC // CONFIG3H
#pragma config STVREN = ON, LVP = OFF, XINST = OFF // CONFIG4L
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF // CONFIG5L
#pragma config CPB = OFF, CPD = OFF // CONFIG5H
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF // CONFIG6L
#pragma config WRTB = OFF, WRTC = OFF, WRTD = OFF // CONFIG6H
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF // CONFIG7L
#pragma config EBTRB = OFF // CONFIG7H
//** ************ Entradas Digitales *****************************************************/
//****************************************************************************************
//****************** DEFINICON DE ALGUNAS CONSTANTES *************************************
#define TIMER0L_VAL 0x77//0x02
#define TIMER0H_VAL 0xEC//0xD9
#define progra LATBbits.LATB0
#define ajuste LATBbits.LATB1
#define ajuste1 LATBbits.LATB2
//****************************************************************************************
/** I N C L U D E S **************************************************/
#include "p18f4520.h"
#include "delays.h"
/** V A R I A B L E S ********************************************************/
#pragma udata
unsigned int count;
unsigned int contL;
unsigned int contH;
unsigned int Useg;
unsigned int Dseg;
unsigned int Umin;
unsigned int Dmin;
unsigned int Uhora;
unsigned int Dhora;
unsigned int rcorr;
unsigned int pm;
unsigned int parpadeo;
#pragma romdata
unsigned char mynum[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xff};
unsigned char meridiano[]={0x88,0x8c};
/** D E C L A R A T I O N S ******************************************/
/************* DECLARACION DE LOS PROTOTIPOS *******************************/
//----------------------------------------------------------------------------
void main (void);
void InterruptHandlerHigh (void);
union
{
struct
{
unsigned Timeout:1; //flag to indicate a TMR0 timeout
unsigned None:1;
unsigned Ajuste:1;
unsigned Intie:1;
} Bit;
unsigned char Byte;
} Flags;
//----------------------------------------------------------------------------
// High priority interrupt vector
#pragma code InterruptVectorHigh = 0x08
void
InterruptVectorHigh (void)
{
_asm
goto InterruptHandlerHigh //jump to interrupt routine
_endasm
}
//----------------------------------------------------------------------------
// High priority interrupt routine
#pragma code
#pragma interrupt InterruptHandlerHigh
void
InterruptHandlerHigh ()
{
if (INTCONbits.TMR0IF)
{ //check for TMR0 overflow
TMR0H=TIMER0H_VAL;
TMR0L=TIMER0L_VAL;
INTCONbits.TMR0IF = 0; //clear interrupt flag
Flags.Bit.Timeout = 1; //indicate timeout
LATA=rcorr;
if (rcorr==0b11111110)
{rcorr=0b11111011;
PORTD=meridiano[pm];}
else if(rcorr==0b11111011)
{rcorr=0b11110111;
PORTD=mynum[Umin];}
else if (rcorr == 0b11110111)
{rcorr = 0b11101111;
PORTD=mynum[Dmin];}
else if (rcorr ==0b11101111)
{rcorr = 0b11011111;
PORTD=mynum[Uhora];}
else if (rcorr == 0b11011111)
{rcorr= 0b11111110;
PORTD=mynum[Dhora];}
// Delay1KTCYx(parpadeo);
}
}
//----------------------------------------------------------------------------
/************************ PROGRAMA PRINCIPAL *************************************/
/*********************************************************************************/
void main ()
{
//Configura PORTA como E/S digitales
PORTA = 0; //Inicializa PORTA borrando latches de salidas
LATA = 0; //Método Alternativo para borrar los latches de salidas
ADCON1 = 0x007; //Configura el A/D para entradas digitales
CMCON = 0x007; //Configura comparadores para entradas digitales
TRISA = 0x000; //Configura PUERTA A como salidas
//Configura PORTB como E/S digitales
PORTB=0x00; //Inicializa PORTB borrando latches de salidas
ADCON1=0x00A; //Puerto B como E/S digitales
TRISB = 0xFF;
INTCON2bits.RBPU=0; //PORT B PULL UP ACTIVADO
PORTB=0xFF;
//Configura PORTD como E/S digitales
PORTD= 0;
TRISD = 0; //Configura Puerto D todas salidas
Flags.Byte = 0;
INTCON = 0x20; //disable global and enable TMR0 interrupt
INTCON2 = 0x84; //TMR0 high priority
RCONbits.IPEN = 1; //enable priority levels
TMR0H = 0; //clear timer
TMR0L = 0; //clear timer
T0CON = 0x88; //set up timer0 - prescaler 1:8
INTCONbits.GIEH = 1; //enable interrupts
TRISC = 0;
LATC=0;
count=0;
// Coloca los valores iniciales 12:00 am
Useg = 0;
Dseg = 0;
Umin = 9;
Dmin = 5;
Uhora = 1;
Dhora = 1;
// Contador en 100
contL = 0x000;
rcorr = 0b11111110;
pm=1;
parpadeo=0;
Flags.Bit.None=0;
Flags.Bit.Ajuste=0;
// Prepara para iniciar a las 12:00 am
while (1)
{
if(progra==0){Flags.Bit.Ajuste=1;LATCbits.LATC1=1;parpadeo=500;}
while(Flags.Bit.Ajuste==1)
{
if(ajuste==0){Umin=Umin++;}
if(ajuste1==0){Uhora=Uhora++;}
if(pm==2){pm=0;}
if (Umin==10){Umin=0;Dmin=Dmin++;}
if(Dmin==6){Dmin=0;Uhora=Uhora++;}
if(Uhora==10){Uhora=1;Dhora=1;}
if (Dhora==1 && Uhora==2 && Flags.Bit.None==0)
{pm=pm++;Flags.Bit.None=1;}
if(Uhora==3 && Dhora==1){Uhora=1;Dhora=10;Flags.Bit.None=0;}
Delay10KTCYx(50);
if(progra==0 && Flags.Bit.Ajuste==1){Flags.Bit.Ajuste=0;LATCbits.LATC1=0;parpadeo=0;}
}
if (Flags.Bit.Timeout == 1) // Ve si pasaron 5 mseg.
{
Flags.Bit.Timeout = 0; //Borra bandera pasaron 5 ms
contL = contL++;}
if(contL==100){LATCbits.LATC0=0;LATCbits.LATC2=0;}
if(pm==2){pm=0;}
if (contL==200){contL=0;Useg=Useg++;LATCbits.LATC0=1;}
if (Useg==10){ Useg = 0;Dseg = Dseg ++;}
if (Dseg==6){Dseg = 0;Umin = Umin ++;}
if (Umin==10){Umin=0;Dmin=Dmin++;}
if(Dmin==6){Dmin=0;Uhora=Uhora++;LATCbits.LATC2=1;}
if(Uhora==10){Uhora=1;Dhora=1;}
if (Dhora==1 && Uhora==2 && Flags.Bit.None==0)
{pm=pm++;Flags.Bit.None=1;}
if(Uhora==3 && Dhora==1){Uhora=1;Dhora=10;Flags.Bit.None=0;}
//14090
}
}