TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: calopsia en 31 de Enero de 2011, 11:39:58

Título: pic16f877 ayuda por favor
Publicado por: calopsia en 31 de Enero de 2011, 11:39:58
Buenas gente.. estoy probando un pic16f877 y no entiendo en realidad porque en proteus puedo simularlo como siempre hice con todos los pics,
mientras que con este al pasarlo a lo fisico no funciona...


lo raro es que no corre el codigo al parecer..


lo que quiero hacer ahora es parpadear un led en el puerto a, creo que el tema puede estar en que el puerto a es analogico..

en fin pongo el codigo... y la simulacion para que me puedan dar una mano...

y aclaro que esta puesta el MCLR a vdd con una resistencia de 10k



#include <16F877.h>
#device adc=10         //para que es esto??????????????????????????????????????????????????????????

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=GSM)

#int_RDA
void  RDA_isr(void)
{

}

#int_TIMER0
void  TIMER0_isr(void)
{

}



void main()
{

   port_b_pullups(TRUE);
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_ccp2(CCP_OFF);
   enable_interrupts(INT_RDA);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);

   // TODO: USER CODE!!
   do
   {
      output_low(pin_a1);
      output_low(pin_a5);
      delay_ms(1000);
      output_high(pin_a1);
      output_high(pin_a5);
      delay_ms(1000);
   }while(1);

}



Título: Re: pic16f877 ayuda por favor
Publicado por: AngelGris en 31 de Enero de 2011, 12:40:12
  Yo creo que lo que puede estar pasando es que entrás en alguna de las interrupciones, y como no borrás el flag correspondiente se queda allí colgado.
Título: Re: pic16f877 ayuda por favor
Publicado por: calopsia en 31 de Enero de 2011, 12:44:57
pero no tengo ninguna interrupcion...
ademas en proteus va bien.. eso es lo raro..

segun parece...

http://www.todopic.com.ar/foros/index.php?topic=22956.0

pero eso en css como se hace???


Título: Re: pic16f877 ayuda por favor
Publicado por: AngelGris en 31 de Enero de 2011, 13:01:19
pero no tengo ninguna interrupcion...
ademas en proteus va bien.. eso es lo raro..


  Sí que tenés las interrupciones activadas... Con esta parte del código es que se habilitan

Código: C
  1. enable_interrupts(INT_RDA);
  2.    enable_interrupts(INT_TIMER0);
  3.    enable_interrupts(GLOBAL);

  Y por otro lado, no siempre lo que funciona en Proteus funciona en lo real
Título: Re: pic16f877 ayuda por favor
Publicado por: calopsia en 31 de Enero de 2011, 13:07:28
ahh ok, pero me referia a que no habia nada en ejecucion dentro de eso, no deberia porque tildarse o quedarse ahi dentro, de hecho en un pic16f628 eso siempre lo he dejado activo y no pasa nada.. funciona perfecto... creo q se debe a alguna configuracion del puerto A de este pic, que es donde tiene el tema de los ADC, pero nose como cambiarlo.. ni como configurarlo y si es que se puede...

vos tenes idea???


saludos!
Título: Re: pic16f877 ayuda por favor
Publicado por: AngelGris en 31 de Enero de 2011, 13:15:07
ahh ok, pero me referia a que no habia nada en ejecucion dentro de eso, no deberia porque tildarse o quedarse ahi dentro, de hecho en un pic16f628 eso siempre lo he dejado activo y no pasa nada.. funciona perfecto... creo q se debe a alguna configuracion del puerto A de este pic, que es donde tiene el tema de los ADC, pero nose como cambiarlo.. ni como configurarlo y si es que se puede...

vos tenes idea???


saludos!

  Yo creo que si al dejarlo así te funcionó antes fue por casualidad.
  Tené en cuenta que estás habilitando la interrupción del timer 0. Cuando hay un overflow del registro del timer0 se activa el flag apropiado (T0IF) y eso hace que saltes al vector de interrupciones. Más allá que no hagas nada en la rutina de interrupción del timer0, sí tenés que borrar dicho flag, porque sino sigue activo y te reingresa constantemente.
Título: Re: pic16f877 ayuda por favor
Publicado por: calopsia en 31 de Enero de 2011, 13:22:55
ahhh bien,,, buen todos los dias se aprende algo... una pregunta mas asi lo pruebo al menos..

sabes como borro esos flags en css?
Título: Re: pic16f877 ayuda por favor
Publicado por: jhozate en 31 de Enero de 2011, 13:53:31
es mejor que habilites solo lo que vas a necesitar y siempre tener presente que es lo que viene configurado por defecto, en tu programa tiene configurado el conversor AD y no lo utilizas, la interrupción del timer y la int_RDA igual. No falta el ruido que puede que se te cole por alguno de los pines y haga saltar falsas interrupciones. Dentro de la carpeta devices de CCS, puedes encontrar el archivo 16f877a.h y veras como configurar los perifericos.
Los flags de interrupciones los maneja CCS directamente.
Título: Re: pic16f877 ayuda por favor
Publicado por: calopsia en 31 de Enero de 2011, 13:54:11
la solucion es una mezcla de cosas que nada que ver pero a veces uno las pasa por alto...


primero.. probe desabilitando las interrupciones y funciono perfecto... pero.. no me cirra deshabilitarlas porque las tengo que usar y eso siempre tiene que estas activo.. por otro lado..

tengo incluida la libreria del teclado...

donde me faltaba incluirle esta linea para que me use el puerto b y no el C que es donde esta el pin c6 y c7 (RS232)

#define use_portb_kbd = TRUE

eso es lo que me colgaba el pic

y por ultimo para poder usar el puerto a de este pic como i/o digital necesitaba hacer esta configuracion

#byte ADCON1 = 0x9F

...
void main()
{
             ADCON1= 0x07;
             ...
             ...
             ...
             etc.
}


el tema es que problema resuelto.. muchas gracias!!!!
Título: Re: pic16f877 ayuda por favor
Publicado por: firepic en 01 de Febrero de 2011, 09:11:50
Saludos y felicidades calopsia!   :-/

Con respecto a esto:
#device adc=10         //para que es esto??????????????????????????????????????????????????????????
Por si aún no lo tienes claro, eso es para decirle al compilador que vas a usar conversión A/D a 10bits (en tu caso puedes quitarlo, porque no vas a usar el ADC).

Por otro lado, esto:
para poder usar el puerto a de este pic como i/o digital necesitaba hacer esta configuracion
#byte ADCON1 = 0x9F
...
void main()
{
             ADCON1= 0x07;
             ...
             ...
             ...
             etc.
}

Así es la forma de hacerlo "a pie" o "manual"... pero CCS tiene funciones built-in para todas esas configuraciones.
Si mal no recuerdo, para declarar el PORTA como digital es:
Código: C
  1. setup_adc_ports(NO_ANALOGS);
Pero entonces deberías quitar estas dos líneas, ya que no vas a usar el ADC:
Código: C
  1. setup_adc_ports(AN0);
  2.    setup_adc(ADC_CLOCK_DIV_2);

Siempre consulta el manual de CCS, ahí están todas las instrucciones para todas las configuraciones...  ;-)
Y si te quedan dudas, para eso es el foro...  :lol:

Ok un cordial saludo, nos leemos!  :mrgreen:

Título: Re: pic16f877 ayuda por favor
Publicado por: calopsia en 03 de Febrero de 2011, 15:00:23
Excelente muchas gracias por el dato...

habia seleccionado el pueto a como digital.. en css con el wizad que te permite configurar al inicio..

pero no me daba pelota..

es la verdad..

incluso deshabilitando estas dos lineas no funcionaba

   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_DIV_2);

y si la lei un poco mas del adc y me quedo bastante claro..

muchas gracias de nuevo