TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: f-traxx en 24 de Marzo de 2011, 07:54:16

Título: Problema 12F1822
Publicado por: f-traxx en 24 de Marzo de 2011, 07:54:16
Hola buenas, mi problema es que no consigo que el PIC 12F1822, me funcione como yo quiero, lo unico que estoy probando es de programar el PIC para que me haga parpadear un LED conectado a RA0, y lo que me hace el pic quando doy tension es encender el LED y no volver a apagarlo, aqui adjunto el codigo en CCS por si alguien me quiere ayudar.
Por cierto, alguien lo ha usado alguna vez?? le ha funcionado??

Saludos f-traxx
Título: Re: Problema 12F1822
Publicado por: bmb en 24 de Marzo de 2011, 08:33:48
Hola f-traxx, veo que haces la definición de pines para comunicación con RS232 asi:

Citar
#use rs232(baud=9600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8)

luego defines el LED asi:

Citar
#define LED PIN_A0   // ya usaste el pin A0 con #use rs232

y más adelante defines un pin análogo así:

Citar
setup_adc_ports(sAN1|VSS_VDD);   // ya usaste el pin A1 con #use rs232

Si defines los pines A0 y A1 para ser usados en la comunicación RS232, no los puedes usar luego para el LED y para entrada análoga al mismo tiempo. Debes usar pines diferentes para cada función.

Saludos!
Título: Re: Problema 12F1822
Publicado por: jeremylf en 26 de Marzo de 2011, 14:39:19
Con con que programador lo estas quemando? Que yo sepa su tensión de VPP es diferente en estos PICs.
Título: Re: Problema 12F1822
Publicado por: f-traxx en 28 de Marzo de 2011, 03:34:05
He probado lo que me ha dicho bmb y no tiene nada que ver, sigue igual.

Respecto a lo que me ha dicho jeremylf lo estoy haciendo con el pickit2 clone, pero es culpa de algo del compliador, he descartado la posibilidad de que sea del programador, porque me pasaron un hex. de pardadear un LED hecho con asm. y funcionó perfectamente, en cambio quando yo hago lo mismo con los mismos fuses, pero con CCS version 4.114 no me funciona...

Gracias por el comentario

Saludos f-traxx
Título: Re: Problema 12F1822
Publicado por: bmb en 28 de Marzo de 2011, 09:13:42
He probado lo que me ha dicho bmb y no tiene nada que ver, sigue igual.

Hola f-traxx, por el hecho de que aún no funciona el programa no quiere decir que lo que te he dicho no tenga nada que ver.  Puedes estar seguro que los pines que usas para un LED y una entrada análoga, no puedes usarlos a la vez con la comunicación serial.
De la versión que estás usando de CCS, si te puedo decir que está llena de problemas.  Trata de actualizarla o reinstala una versión anterior.
Puedes subir el código con los cambios?

Saludos!
Título: Re: Problema 12F1822
Publicado por: f-traxx en 28 de Marzo de 2011, 12:54:44
Este es el codigo con los cambios:
Código: C
  1. #include <12F1822.h>
  2.  
  3. #FUSES NOWDT                    //No Watch Dog Timer
  4. #FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
  5. #FUSES NOCPD                    //No EE protection
  6. #FUSES NOPROTECT                //Code not protected from reading
  7. #FUSES NOMCLR                   //Master Clear pin used for I/O
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES NOIESO                   //Internal External Switch Over mode disabled
  10. #FUSES NOFCMEN                  //Fail-safe clock monitor disabled
  11. #FUSES NODEBUG                  //No Debug mode for ICD
  12. #FUSES WDT_NOSL              
  13. #FUSES NOWRT                    //Program memory not write protected
  14. #FUSES PLL                  
  15. #FUSES NOSTVREN                 //Stack full/underflow will not cause reset
  16. #FUSES BORV19                
  17. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  18. #FUSES PUT                      //Power Up Timer
  19. #FUSES NOCLKOUT              
  20.  
  21. #use delay(int=4000000)
  22.  
  23. #define LED PIN_A0
  24.  
  25.  
  26. void main()
  27. {
  28.    setup_oscillator(osc_4mhz);
  29.    setup_adc_ports(NO_ANALOGS);
  30.    setup_adc(ADC_CLOCK_INTERNAL);
  31.    setup_spi(SPI_SS_DISABLED);
  32.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  33.    setup_timer_1(T1_DISABLED);
  34.    setup_timer_2(T2_DISABLED,0,1);
  35.    setup_ccp1(CCP_OFF);
  36.    setup_comparator(NC_NC);
  37.  
  38.  
  39.     while(true)
  40.     {
  41.     output_low(LED);
  42.     delay_ms(1000);
  43.     output_high(LED);
  44.     delay_ms(1000);
  45.     }
  46. }

Saludos f-traxx
Título: Re: Problema 12F1822
Publicado por: KALLITOS en 28 de Marzo de 2011, 13:02:47
Hola, te falta colocar el pin como salida.

saludos
Título: Re: Problema 12F1822
Publicado por: f-traxx en 28 de Marzo de 2011, 13:31:28
con este codigo hace lo mismo:

Código: C
  1. #include <12F1822.h>
  2. #device adc=8
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
  6. #FUSES NOCPD                    //No EE protection
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOMCLR                   //Master Clear pin used for I/O
  9. #FUSES NOBROWNOUT               //No brownout reset
  10. #FUSES NOIESO                   //Internal External Switch Over mode disabled
  11. #FUSES NOFCMEN                  //Fail-safe clock monitor disabled
  12. #FUSES NODEBUG                  //No Debug mode for ICD
  13. #FUSES WDT_NOSL              
  14. #FUSES NOWRT                    //Program memory not write protected
  15. #FUSES PLL                  
  16. #FUSES NOSTVREN                 //Stack full/underflow will not cause reset
  17. #FUSES BORV19                
  18. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  19. #FUSES PUT                      //Power Up Timer
  20. #FUSES NOCLKOUT              
  21.  
  22. #use fast_io(a)
  23.  
  24. #use delay(int=4000000)
  25.  
  26. #define LED PIN_A0
  27.  
  28.  
  29. void main()
  30. {
  31.    setup_oscillator(osc_4mhz);
  32.    setup_adc_ports(NO_ANALOGS);
  33.    setup_adc(ADC_CLOCK_INTERNAL);
  34.    setup_spi(SPI_SS_DISABLED);
  35.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  36.    setup_timer_1(T1_DISABLED);
  37.    setup_timer_2(T2_DISABLED,0,1);
  38.    setup_ccp1(CCP_OFF);
  39.    setup_comparator(NC_NC);
  40.  
  41.    set_tris_a(0b00000000);
  42.  
  43.     while(true)
  44.     {
  45.     output_low(LED);
  46.     delay_ms(1000);
  47.     output_high(LED);
  48.     delay_ms(1000);
  49.     }
  50. }
Título: Re: Problema 12F1822
Publicado por: bmb en 28 de Marzo de 2011, 18:52:51
Hola f-traxx, intenté compilar tu código y no me lo permitió.  Me salen varios errores por el uso de fuses que no corresponden al PIC, entonces con el PIC Wizard del CCS V4.108 armé un código similar que compiló bien. Te lo dejo para que lo ensayes.

Código: C
  1. #include <12F1822.h>
  2. #device adc=8
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
  6. #FUSES NOCPD                    //No EE protection
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOMCLR                   //Master Clear pin used for I/O
  9. #FUSES PUT                      //Power Up Timer
  10. #FUSES NOBROWNOUT               //No brownout reset
  11. #FUSES NOIESO                   //Internal External Switch Over mode disabled
  12. #FUSES NOFCMEN                  //Fail-safe clock monitor disabled
  13.  
  14. #use delay(int=4000000)
  15.  
  16. #define LED PIN_A0
  17.  
  18. void main()
  19. {
  20.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  21.    setup_adc(ADC_CLOCK_DIV_2);
  22.    setup_spi(SPI_SS_DISABLED);
  23.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  24.    setup_timer_1(T1_DISABLED);
  25.    setup_timer_2(T2_DISABLED,0,1);
  26.    setup_ccp1(CCP_OFF);
  27.    setup_comparator(NC_NC_NC_NC);
  28.    setup_oscillator(OSC_4MHZ|OSC_INTRC|OSC_PLL_OFF,0);
  29.  
  30.    while(true)
  31.    {
  32.       output_low(LED);
  33.       delay_ms(1000);
  34.       output_high(LED);
  35.       delay_ms(1000);
  36.    }
  37. }

Saludos!

EDITO: Acabo de hacer la simulación con Mplab SIM y funciona muy bien.
Título: Re: Problema 12F1822
Publicado por: f-traxx en 29 de Marzo de 2011, 03:13:41
A mi con la versión 4.114 me lo deja compilar a la perfección.
He cogido tu codigo y lo he compilado directamente SIN tocar nada y a mi no me funciona, creo que acabo de encontrar otro bug de CCS... pasame el archivo .hex y asi pruebo si con el que genera la versión 4.108 es correcto, muchas gracias por todo.

Saludos
Título: Re: Problema 12F1822
Publicado por: bmb en 29 de Marzo de 2011, 08:43:21
Hola, como te había mencionado antes, tengo entendido que la versión 4.114 tiene muchos problemas.  Te adjunto el archivo .hex para que hagas la prueba.

Saludos!
Título: Re: Problema 12F1822
Publicado por: f-traxx en 29 de Marzo de 2011, 10:52:13
Hola bmb en el archivo que me has pasado falta la configuración de los fuses, o como mínimo eso es lo que me dice el PICKIT2, si me pudieras decir qual utilizas tu... por si acaso ya me estoy bajando la version 4.108.
Título: Re: Problema 12F1822
Publicado por: bmb en 29 de Marzo de 2011, 17:34:54
Hola f-traxx, no conozco como funciona el pickit2 y por lo tanto no sabría decirte el por qué te dice que faltan los fuses.  El archivo .hex que te envié corresponde al código que te muestro en la respuesta #8 en donde como ves tiene configurados los fuses.

No será posible con el pickit2 simplemente transferir el archivo .hex al PIC como se hace con cualquier programador?

Saludos!
Título: Re: Problema 12F1822
Publicado por: f-traxx en 30 de Marzo de 2011, 03:31:04
Ya lo he hecho, primero cogi el ejemplo que me pasaste tu, lo compile y lo grabé en el micro... no funcionó, después le pase directamente el .hex que tu me pasaste... no funcionó, me baje la version 4.108 hize un programa nuevo, compile y.... NO funcionó... ya estoy de este PIC hasta.... nunca me habia pasado esto y con este PIC se me está acabando la paciencia, porque en las simulaciones funciona, pero en la protoboard NO... solo me funcionó un ejemplo que me pasaron en hitech, me pasaron el archivo .hex y funcionó a la perfeccion, el led a parpadear... pero en CCS aun no lo he conseguido, el problema es que nada mas dar tensión, el led se enciende y ya no se apaga mas, como si no hiciera caso de los delay_ms...

Tu lo probaste en una protoboard bmb??

Saludos
Título: Re: Problema 12F1822
Publicado por: barral en 30 de Marzo de 2011, 03:54:42
En en 16F1823, no funciona la función delay_ms, creo que es un bug de CCS en esa versión. No se decirte si está arreglado en versiones posteriores, pero te aseguro que con la 4.114 da problemas con delay_ms y con la conversión A/D. Hice hace poco un programa con este micro, y al final algunas cosas las hice haciendo yo las funciones (concretamente el delay, la configuración del A/D y el uso del mismo).

Por cierto, en este hilo cuentan alguna cosa sobre esto:

http://www.ccsinfo.com/forum/viewtopic.php?t=43333

Saludos
Título: Re: Problema 12F1822
Publicado por: f-traxx en 30 de Marzo de 2011, 04:12:59
Muchisimas gracias por la respuesta, estoy seguro que es eso... me puedes decir como solucionaste porfavor... yo tambien tengo la versión 4.114 y estoy con el mismo problema, necesitaba una conversión a/d de 8 bits y como vi que eso no funcionaba, probé lo del led parpadeando... pero tampoco me funciona... me puedes ayudar barral????
Título: Re: Problema 12F1822
Publicado por: barral en 30 de Marzo de 2011, 08:06:22
Pues ahora mismo no tengo el programa por aquí, pero bueno, simplemente lo hice como si trabajara en assembler: declaré los registros, los configuré a mano, y después la marcha del A/D y la espera al final de la conversión también era "a mano" (no usaba la interrupción). En cuanto a delay_ms, como no tenía problemas ni de tiempo ni de espacio, aunque no me gustó nada la solución y es muy poco "elegante", simplemente hacía bucles de retardos de 500us. Era un programa sencillo y tampoco me calenté demasiado la cabeza.

Si tienes alguna duda me lo dices y cuando pueda me traeré el programa.

Saludos
Título: Re: Problema 12F1822
Publicado por: bmb en 30 de Marzo de 2011, 09:00:34
... Tu lo probaste en una protoboard bmb??

Saludos

Hola f-traxx, estuve buscando el PIC para hacer una prueba física y parece que no se consigue en mi pais.  Lo único que pude hacer fué una simulación con el Mplab SIM y funciona muy bien incluyendo la instrucción delay_ms().  Pensaría que se trata de un problema en el circuito físico, pero dices que te ha funcionado con códigos generados en otros compiladores.  Creo que la prueba que te propone barral declarando los registros que necesites y haciendo una función que te reemplace a delay_ms() es buena idea.  De hecho y si te fijas en el foro de CCS, esta es la solución más común cuando el compilador presenta bugs.

Saludos!
Título: Re: Problema 12F1822
Publicado por: f-traxx en 30 de Marzo de 2011, 12:27:07
No tengo ni idea de asm, me podrias pasar tu trozo de codigo donde tienes lo del conversor A/D, o algo para que pueda probar yo mi PIC12f1822, muchas gracias a todos!!
Título: Re: Problema 12F1822
Publicado por: barral en 01 de Abril de 2011, 03:37:04
Por ejemplo, definición de registros:
Código: [Seleccionar]
#byte OPTION_REG=0x95
#bit WPUEN=OPTION_REG.7
#byte WPUA=0x20C //habilita PULLUPS porta
#byte WPUC=0x20E //habilita PULLUPS portc
#byte CPSCON0=0x01E //deshabilita capacitive touch
#byte SRCON0=0x11A //deshabilita SR LATCH
#byte DACCON0=0x118 //deshabilita DAC
#byte FVRCON=0x117 //habilita ref tension interna, deshabilita indicador de temperatura
#byte ADCON0=0x9D
#bit GO_DONE=ADCON0.1
#byte ADCON1=0x9E
#byte ADRESL=0x9B
#byte ADRESH=0x9C
#byte ANSELA=0x18C
#byte ANSELC=0x18E

Configuración de algunos periféricos
Código: [Seleccionar]
WPUEN=0; //habilito poder seleccionar independientemente las pull-ups
WPUA=0b000100; //habilito PULL-UPS puerto A
WPUC=0b011000; //habilito PULL-UPS puerto C
CPSCON0=0x00; //deshabilita capacitive touch
SRCON0=0x00; //deshabilita SR LATCH
DACCON0=0x00; //deshabilita DAC
FVRCON=0b11000011; //habilita ref tension interna, deshabilita indicador de temperatura

ADCON0=0b00011001; //canal 6, AD habilitado
ADCON1=0b01000011; //justificado derecha, Fosc/4 = 1us, FVR ON
ADRESH=0;
ANSELC=0b00000100; //sólo RC2/AN6 como AD
ANSELA=0b00000000;

La función para leer el A/D (en este caso solamente se lee un canal que se configura al principio, se podría mejorar muuuucho)
Código: [Seleccionar]
void captura_valor_ad()
{
GO_DONE=1;
do
{}
while(GO_DONE==1);
captura_valor=ADRESH;

}

El retardo ahora que lo veo lo hice mediante la interrupción del timer, donde tengo la base de tiempos. Pero se pueden hacer tantos delay_us(500) como haga falta. Espero que te sea útil.

Saludos

NOTA: es un programa medio cutrillo... y algunas cosas no están hechas de la forma más elegante precisamente
Título: Re: Problema 12F1822
Publicado por: f-traxx en 01 de Abril de 2011, 04:07:36
OK barral muchas gracias, quando comentaste lo de hacerlo como trabajar en asm. creia que decias de hacer algo en programacion asm. muchas gracias por los ejemplos, alguna vez ya necesité tocar los registros manualmente, gracias por todo, quando tenga un rato lo probaré y comento que tal.

Saludos

F-traxx
Título: Re: Problema 12F1822
Publicado por: f-traxx en 07 de Abril de 2011, 03:07:36
Holam al final no lo he podido solucionar con el 12F1822, me daba problemas por todos los lados, y he hecho mi programa con un 12f683, gracias por las ayudas recibidas.

Saludos f-traxx