Autor Tema: Problemas para hacer PORTA Y PORTE entradas digitales en un 18F4520  (Leído 3238 veces)

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

Desconectado fabian12

  • PIC10
  • *
  • Mensajes: 5
Estimados Picmaniaticos es grato saludarlos y su vez pedirles porfavor su apoyo en este pequeño impase pero que lamentablemente he probado de varias formas y nada. ademas,
he estado leyendo las consultas y respuestas sobre este tema, he aplicados varios de los consejos y no me ha resultado
para empezar utilizo un pic18f4520 Dip-40 , acabado de bajar el MPLAB 8.63(Supongo q el ultima version) y ademas el
compilador hitech lite : HI-TECH C PRO for the PIC18 MCU Family  V9.65
Copyright (C) 1984-2010 HI-TECH SOFTWARE. todo me compila bien sin errores he migrado a estas versiones porque el regisro CMCON y CVRCON, no era reconocido por mi compilador hitech de version anterior: v8.20PL4 , tambien he probado con el css que porlo q he visto es lo mas utilizado por la mayoria IDE VERSION 3.34  ,en fin he leido el datasheet del 18f4520 este tiene algunas diferencias con su anteceso 18f452 precisamente el las entradas analogas y comparadoes , recurro a ustedes porque no me quedan mas ideas al respecto a pesar que estoy configurando los registros involucrados para trabajar con entradas digitales ,
un abrazo y de antemano gracias por cooperacion

saludos

FABIAN12



Aca pego mi Codigo:



 #include <htc.h>
#include <stdio.h>
#include <stdlib.h>
#include<conio.h>
#include<string.h>

#include "series1.h"


#define led RC0      
#define ledx RC3      
      
/   
//#define Bit_High RA1   

//#byte CMCOM 0x07;

int contaxx;
//////////////////////////


#pragma interrupt_level 1



/* Serial initialization */
void interrupt ITTIMER0()
{



        if(TMR0IF)
   {    
       TMR0IF =0;
       led=!led;
         PORTB=~(PORTB);
      if (contaxx==4){contaxx=0;}
      else {contaxx++;}
 }


      
  

}


///////////////////////////USART//////////////////////////////////////
/* Serial initialization */
  void init_comms(void)
{
   SPBRG = DIVIDER;        
   TXSTA = (SPEED|NINE_BITS|0x26);
   RCSTA = (NINE_BITS|0x90);
   TRISC6=OUTPUT;
   TRISC7=INPUT;
}

void putch(unsigned char byte)
{
   /* output one byte */
   while(!TXIF)   /* set when register is empty */
      continue;
   TXREG = byte;
}


unsigned char getch() {
   /* retrieve one byte */
   while(!RCIF)   /* set when register is not empty */
      continue;
   return RCREG;   
}

void put_char(unsigned/////////////////////////////////////////////////////////////////////////////////////////



//////////////////////////////


 void main(void)
{
//double i;
 int i;
init_comms();
setup();

CMCON=0x07;                                   //DESHABILITA COMPARADORES ANALOGICOS
CVRCON=0x00;
                                //DESHABILITA VOLTAJE DE REFERENCIA
    
   ADCON1=0x0F;
ADCON0=0x00;

                                 /* Set first 2 bits to input to read DIP switch values */

    TRISA=0xff;                                    /* LED panel shows current frequency of TIMER2*/
   TRISE=0xff;   


while(1)
 
  {



if (  (RA5)==0x01  )

{


printf("%cONTADOR: %d  \n",13,contaxx);
for(i=0;i<500;i++);

ledx=1;
}      //LEDs: 0000 0001


else if ((RA4)==0x01 )

{

printf("%c CALLAO  \n",13);
ledx=1;

}   //NNE 0000 0011

else if ((RA5)==0x01  )
{

printf("%c HOLA PERU  \n",13);

ledx=1;
}   //NE 0000 0010
            
else if ((RA3)==0x01)

{

printf("%c R GOOD \n",13);

}   //ENE 0000 0110
      

else if ((RA2)==0x01)

{

printf("%c SENAL DEL LA E \n",13);
ledx=1;
}   //ENE 0000 0110
      

    else if ((PORTE)==0x02)

{
ledx=1;
printf("%c SENAL DOBLE E\n",13);

}   //ENE 0000 0110
      

else if ((PORTE)==0x03)

{

printf("%c SENAL TRIPLE EEE\n",13);

}   //ENE 0000 0110
      


 


}



}



¡Te he borrado lo referente a la procedencia del compilador, evitalo! (Pocher)
« Última modificación: 19 de Febrero de 2011, 05:09:54 por pocher »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problemas para hacer PORTA Y PORTE entradas digitales en un 18F4520
« Respuesta #1 en: 19 de Febrero de 2011, 12:26:54 »
  ¿Podrías mostrar como tenés conectados los pines del PORTA y PORTE a los DipSwitchs? ¿No te estarán faltando resistencias de pull-up o push-down, según sea el caso?
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problemas para hacer PORTA Y PORTE entradas digitales en un 18F4520
« Respuesta #2 en: 20 de Febrero de 2011, 01:17:44 »
Hola.

Los bits de configuración como están configurados?

Saludos
El papel lo aguanta todo

Desconectado fabian12

  • PIC10
  • *
  • Mensajes: 5
Re: Problemas para hacer PORTA Y PORTE entradas digitales en un 18F4520
« Respuesta #3 en: 22 de Febrero de 2011, 23:54:13 »

 En lo que respecta al hardware recibo senales del puerto B de un pic18f242, hacia el ptoB del pic18f452 




CMCON=0x07;                                   //DESHABILITA COMPARADORES ANALOGICOS
CVRCON=0x00;
                                //DESHABILITA VOLTAJE DE REFERENCIA
     
   ADCON1=0x0F;
ADCON0=0x00;

                                 /* Set first 2 bits to input to read DIP switch values */

    TRISA=0xff;                                    /* LED panel shows current frequency of TIMER2*/
   TRISE=0xff;   


Desconectado fabian12

  • PIC10
  • *
  • Mensajes: 5
Re: Problemas para hacer PORTA Y PORTE entradas digitales en un 18F4520
« Respuesta #4 en: 23 de Febrero de 2011, 00:14:21 »
En lo que respecta al hardware recibo senales del puerto B de un pic18f242, hacia el ptoB del pic18f4520(pic del problema) y de otro pic18f242 de su PTO B  hacia el ptoD del pic18f4520 anteriomente mencionado, lo he probado directamente sin resistencias y nada y no hay ningun problema recibe los datos sin problemas , justamente el PTOA lo quiero utilizar para control de los bits recibidos por el PTOB Y PTOD respectivamnete ..asi q estos pines PTOA, tambien  estan conectados  directamente de otros pines de los pics 18f242 ,   alguna sugerencia respecto a como conectar los puertos de dos pic's que intercambian datos ? , muestro como configuro registros y pines..




CMCON=0x07;                                   //DESHABILITA COMPARADORES ANALOGICOS
CVRCON=0x00;
                                //DESHABILITA VOLTAJE DE REFERENCIA
     
   ADCON1=0x0F;
ADCON0=0x00;

                                 /* Set first 2 bits to input to read DIP switch values */

    TRISA=0xff;                                    /* LED panel shows current frequency of TIMER2*/
   TRISE=0xff;   



Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problemas para hacer PORTA Y PORTE entradas digitales en un 18F4520
« Respuesta #5 en: 23 de Febrero de 2011, 10:32:56 »
  No sé que pueda estar pasando. Lo único que se me ocurre es que hagas un programa mas sencillo que solo lea los pines del puerto A y en refleje el estado de dicho puerto en el puerto B. Como para saber si está haciendo bien la lectura.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pepecharles

  • PIC10
  • *
  • Mensajes: 1
Re: Problemas para hacer PORTA Y PORTE entradas digitales en un 18F4520
« Respuesta #6 en: 22 de Febrero de 2012, 02:07:47 »
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
}
}