Autor Tema: pic16f877 ayuda por favor  (Leído 3951 veces)

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

Desconectado calopsia

  • PIC12
  • **
  • Mensajes: 50
pic16f877 ayuda por favor
« 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);

}




Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: pic16f877 ayuda por favor
« Respuesta #1 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado calopsia

  • PIC12
  • **
  • Mensajes: 50
Re: pic16f877 ayuda por favor
« Respuesta #2 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???



Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: pic16f877 ayuda por favor
« Respuesta #3 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
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado calopsia

  • PIC12
  • **
  • Mensajes: 50
Re: pic16f877 ayuda por favor
« Respuesta #4 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!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: pic16f877 ayuda por favor
« Respuesta #5 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado calopsia

  • PIC12
  • **
  • Mensajes: 50
Re: pic16f877 ayuda por favor
« Respuesta #6 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?

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: pic16f877 ayuda por favor
« Respuesta #7 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.
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado calopsia

  • PIC12
  • **
  • Mensajes: 50
Re: pic16f877 ayuda por favor
« Respuesta #8 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!!!!

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: pic16f877 ayuda por favor
« Respuesta #9 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:

"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado calopsia

  • PIC12
  • **
  • Mensajes: 50
Re: pic16f877 ayuda por favor
« Respuesta #10 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


 

anything