Autor Tema: Ayuda con 12F508  (Leído 7105 veces)

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

Desconectado musede

  • PIC10
  • *
  • Mensajes: 9
Ayuda con 12F508
« en: 27 de Marzo de 2010, 16:12:48 »
Hola, primero que nada no s si este post va aqui o en primeros pasos...

La question es que quiero usar el PIC12F508 para generar una onda cuadrada en la salida e indicar
mediante LEDs que frecuencia esta sacando. Esta es la configuracion de pines:

GP0,GP1,GP2,GP5 salidas a LEDs con anodo comun.
GP4 Salida onda cuadrada.
GP3 entrada de pulsador con resistencia de pull-up externa.

Este es el codigo en C:

Citar

#include "12c508a.h"

#use delay(clock=4000000)
#use fast_io(b)
#fuses INTRC,NOWDT,NOPROTECT,NOMCLR

int iEntrada=0;

void main()
{

SET_TRIS_B(0b001000);

//Comprobar  el pulsador.
   if(input(PIN_B4) == FALSE)
   {
      // Esperar a se deje de pulsar.
      while (input(PIN_B4) == FALSE)
      {
      }
      
      // Esperar un tiempo para evitar rebotes.
      delay_ms(150);
      
      // Cambiar frecuencia salida
      iEntrada ++;
      if(iEntrada >=4) iEntrada = 0;

      //Indicar en los LEDs la frecuencia seleccionada.
      switch(iEntrada){
         case 0x0:
            output_low(PIN_B5);
            output_high(PIN_B0);
            output_high(PIN_B1);
            output_high(PIN_B2);
         break;
         case 0x1:
            output_low(PIN_B0);
            output_high(PIN_B1);
            output_high(PIN_B2);
            output_high(PIN_B5);
         break;
         case 0x2:
            output_low(PIN_B1);
            output_high(PIN_B0);
            output_high(PIN_B2);
            output_high(PIN_B5);
         break;
         case 0x3:
            output_low(PIN_B2);
            output_high(PIN_B1);
            output_high(PIN_B0);
            output_high(PIN_B5);
         break;
      }
   }

   //Salida de frecuencia
   switch(iEntrada)
   {
      case 0:
         output_high(PIN_B4); delay_ms(100);
         output_low(PIN_B4); delay_ms(100);
         break;
      case 1:
         output_high(PIN_B4); delay_ms(200);
         output_low(PIN_B4); delay_ms(200);
         break;
      case 2:
         output_high(PIN_B4); delay_ms(400);
         output_low(PIN_B4); delay_ms(400);
         break;
      case 3:
         output_high(PIN_B4); delay_ms(800);
         output_low(PIN_B4); delay_ms(800);
         break;
   }
}

Y el problema, que muchos de ustedes ya sabran cual es con solo ver el codigo, es que no me coje
la entrada. Pero yo que estoy aprendiendo no se porque no me coje la entrada...

Espero que alguno de ustedes me pueda dar alguna indicacion... Gracias a todos!

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Ayuda con 12F508
« Respuesta #1 en: 27 de Marzo de 2010, 16:27:02 »
Código: [Seleccionar]

if(input(PIN_B4) == FALSE)
   {
      // Esperar a se deje de pulsar.
      while (input(PIN_B4) == FALSE)
      {
      }

Dices que tienes conectado un pulsador a GP3, pero usas GP4 para hacer el testeo  :lol:


Deberías agregar un ciclo infinito, porque tal como está el código, solo se ejecuta una sola vez .






Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Ayuda con 12F508
« Respuesta #2 en: 28 de Marzo de 2010, 03:56:46 »
Primero, como dice pablo, fallta el ciclo infinito, que deberia ir despues del set_tris.

Segundo, y lo estoy comprobando, me parece que en esos micros los pines se llaman GPx , a diferencia de los demas... Estaba equivocado, la notacion esta bien.

Este programa anda como quieres...
Código: C
  1. #include "12c508a.h"
  2.  
  3. #use delay(clock=4000000)
  4. #use fast_io(b)
  5. #fuses INTRC,NOWDT,NOPROTECT,NOMCLR
  6.  
  7. int iEntrada=0;
  8.  
  9. void main()
  10. {
  11.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  12. SET_TRIS_B(0b001000);
  13.  
  14. While(true)
  15. {
  16. //Comprobar  el pulsador.
  17.    if(input(PIN_B3) == FALSE)
  18.    {
  19.       // Esperar a se deje de pulsar.
  20.       while (input(PIN_B3) == FALSE)
  21.       {
  22.       }
  23.      
  24.       // Esperar un tiempo para evitar rebotes.
  25.       delay_ms(150);
  26.      
  27.       // Cambiar frecuencia salida
  28.       iEntrada ++;
  29.       if(iEntrada >=4) iEntrada = 0;
  30.  
  31.       //Indicar en los LEDs la frecuencia seleccionada.
  32.       switch(iEntrada){
  33.          case 0x0:
  34.             output_low(PIN_B5);
  35.             output_high(PIN_B0);
  36.             output_high(PIN_B1);
  37.             output_high(PIN_B2);
  38.          break;
  39.          case 0x1:
  40.             output_low(PIN_B0);
  41.             output_high(PIN_B1);
  42.             output_high(PIN_B2);
  43.             output_high(PIN_B5);
  44.          break;
  45.          case 0x2:
  46.             output_low(PIN_B1);
  47.             output_high(PIN_B0);
  48.             output_high(PIN_B2);
  49.             output_high(PIN_B5);
  50.          break;
  51.          case 0x3:
  52.             output_low(PIN_B2);
  53.             output_high(PIN_B1);
  54.             output_high(PIN_B0);
  55.             output_high(PIN_B5);
  56.          break;
  57.       }
  58.    }
  59.  
  60.    //Salida de frecuencia
  61.    switch(iEntrada)
  62.    {
  63.       case 0:
  64.          output_high(PIN_B4); delay_ms(100);
  65.          output_low(PIN_B4); delay_ms(100);
  66.          break;
  67.       case 1:
  68.          output_high(PIN_B4); delay_ms(200);
  69.          output_low(PIN_B4); delay_ms(200);
  70.          break;
  71.       case 2:
  72.          output_high(PIN_B4); delay_ms(400);
  73.          output_low(PIN_B4); delay_ms(400);
  74.          break;
  75.       case 3:
  76.          output_high(PIN_B4); delay_ms(800);
  77.          output_low(PIN_B4); delay_ms(800);
  78.          break;
  79.    }
  80. }
  81.  
  82. }
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado musede

  • PIC10
  • *
  • Mensajes: 9
Re: Ayuda con 12F508
« Respuesta #3 en: 28 de Marzo de 2010, 07:53:30 »
pablomanieri y MGLSOFT, muchas gracias a los dos!

Menudo par de despistes que he tenido, con lo del ciclo infinito y con no poner el pin que uso...

MGLSOFT, pero hay algo que no tengo claro, son dos cosas:

Citar
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
-Esta linia que hace? Porque ademas despues no usas el TMR0 no?
-La directiba #use fast_io(b) realmente que hace? lo que encuentro por ahi no esta muy bien explicado...

Por cierto, no se que hago mal pero no puedo habrir el esquematico.

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Ayuda con 12F508
« Respuesta #4 en: 28 de Marzo de 2010, 08:12:49 »
Musede, no se si me permites que te conteste yo, :lol:

Código: [Seleccionar]
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
esa línea configura el timer0, pero en este programa no lo usas para nada, así que se puede obviar

la directiva
Código: [Seleccionar]
#use fast_io (b)en resumen, le dice al compilador que la configuración de los puertos la vas a realizar tú mediante
Código: [Seleccionar]
set_tris_b(xxx).
con esto se logra que la configuración de los pines de entrada y salida solo se realice cuando colocas
Código: [Seleccionar]
set_tris_b(xxx), y no cada vez que se lee o se escribe en el puerto, logrando así que el acceso a los puertos sea más rápido, de ahí el fast_io.


El diseño no lo puedes abrir porque está guardado con una versión más reciente de ISIS
« Última modificación: 28 de Marzo de 2010, 08:15:27 por pablomanieri »

Desconectado musede

  • PIC10
  • *
  • Mensajes: 9
Re: Ayuda con 12F508
« Respuesta #5 en: 28 de Marzo de 2010, 08:25:35 »
Te lo permito no, te lo pido porfavor! jeje

Entonces lo del fast_io es mas o menos lo que tenia entendido, pero ahora esta mas claro.
Suponia que el setup_timer_0 configuraria el TMR0, pero por eso que despues no lo usa preguntava, por si era
para ajustar el oscilador interno...

Y... los parametros que se le indican dentro del () el primero sera la referencia de base de tiempo y el segundo el prescaler?

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Ayuda con 12F508
« Respuesta #6 en: 28 de Marzo de 2010, 08:40:54 »
Efectivamernte así es.
Si te fijas en el archivo de cabecera del 12c508a

Código: [Seleccionar]
//////// Standard Header file for the PIC12C508A device ////////////////
#device PIC12C508A
#nolist
//////// Program memory: 512x12  Data RAM: 25  Stack: 2
//////// I/O: 6   Analog Pins: 0
//////// C Scratch area: 07   ID Location: 0200
//////// Oscilator Calibration Address: 05
//////// Fuses: LP,XT,INTRC,RC,NOWDT,WDT,PROTECT,NOPROTECT,NOMCLR,MCLR
////////
////////////////////////////////////////////////////////////////// I/O
// Discrete I/O Functions: SET_TRIS_x(), OUTPUT_x(), INPUT_x(),
//                         PORT_x_PULLUPS(), INPUT(),
//                         OUTPUT_LOW(), OUTPUT_HIGH(),
//                         OUTPUT_FLOAT(), OUTPUT_BIT()
// Constants used to identify pins in the above are:

#define PIN_B0  48
#define PIN_B1  49
#define PIN_B2  50
#define PIN_B3  51
#define PIN_B4  52
#define PIN_B5  53

////////////////////////////////////////////////////////////////// Useful defines
#define FALSE 0
#define TRUE 1

#define BYTE int8
#define BOOLEAN int1

#define getc getch
#define fgetc getch
#define getchar getch
#define putc putchar
#define fputc putchar
#define fgets gets
#define fputs puts

////////////////////////////////////////////////////////////////// Control
// Control Functions:  RESET_CPU(), SLEEP(), RESTART_CAUSE()
// Constants returned from RESTART_CAUSE() are:
#define WDT_FROM_SLEEP  3     
#define WDT_TIMEOUT     11   
#define MCLR_FROM_SLEEP 19   
#define MCLR_FROM_RUN   27   
#define NORMAL_POWER_UP 25   
#define BROWNOUT_RESTART 26   

////////////////////////////////////////////////////////////////// Timer 0
// Timer 0 (AKA RTCC)Functions: SETUP_COUNTERS() or SETUP_TIMER_0(),
//                              SET_TIMER0() or SET_RTCC(),
//                              GET_TIMER0() or GET_RTCC()
// Constants used for SETUP_TIMER_0() are:
#define T0_INTERNAL   0
#define T0_EXT_L_TO_H 32
#define T0_EXT_H_TO_L 48

#define T0_DIV_1      8
#define T0_DIV_2      0
#define T0_DIV_4      1
#define T0_DIV_8      2
#define T0_DIV_16     3
#define T0_DIV_32     4
#define T0_DIV_64     5
#define T0_DIV_128    6
#define T0_DIV_256    7


#define T0_8_BIT      0     

#define RTCC_INTERNAL   0      // The following are provided for compatibility
#define RTCC_EXT_L_TO_H 32     // with older compiler versions
#define RTCC_EXT_H_TO_L 48
#define RTCC_DIV_1      8
#define RTCC_DIV_2      0
#define RTCC_DIV_4      1
#define RTCC_DIV_8      2
#define RTCC_DIV_16     3
#define RTCC_DIV_32     4
#define RTCC_DIV_64     5
#define RTCC_DIV_128    6
#define RTCC_DIV_256    7
#define RTCC_8_BIT      0     

// Constants used for SETUP_COUNTERS() are the above
// constants for the 1st param and the following for
// the 2nd param:

////////////////////////////////////////////////////////////////// WDT
// Watch Dog Timer Functions: SETUP_WDT() or SETUP_COUNTERS() (see above)
//                            RESTART_WDT()
// WDT base is 18ms
//

#define WDT_18MS        8   
#define WDT_36MS        9   
#define WDT_72MS       10   
#define WDT_144MS      11   
#define WDT_288MS      12   
#define WDT_576MS      13   
#define WDT_1152MS     14   
#define WDT_2304MS     15   

#define DISABLE_PULLUPS            0x40  // for 508 and 509 only
#define DISABLE_WAKEUP_ON_CHANGE   0x80  // for 508 and 509 only
#ifndef PIN_CHANGE_FROM_SLEEP
#define PIN_CHANGE_FROM_SLEEP      0x90  // for 508 and 509 only
#endif


#list

Tienes las declaracioens de los puertos, las configuraciones disponibles del timer y el resto de las características.
Si vas a la hoja de datos del micro, ahí encuentras todos los datos que necesitas para poder configurarlo correctamente. Luego debes encontrar su equivalente en C, y así haces lo que quieres hacer.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Ayuda con 12F508
« Respuesta #7 en: 28 de Marzo de 2010, 12:21:27 »
pablomanieri y MGLSOFT, muchas gracias a los dos!

Menudo par de despistes que he tenido, con lo del ciclo infinito y con no poner el pin que uso...

MGLSOFT, pero hay algo que no tengo claro, son dos cosas:

Citar
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
-Esta linia que hace? Porque ademas despues no usas el TMR0 no?
-La directiba #use fast_io(b) realmente que hace? lo que encuentro por ahi no esta muy bien explicado...

Por cierto, no se que hago mal pero no puedo habrir el esquematico.

No la quites, solo comentala y veras que hace... :mrgreen: :mrgreen:

Si no esta el pin B2 no funciona como salida, porque queda asignado al timer como tock... :lol: :lol: :lol:
En la hoja de datos lo dice bien claro.. :mrgreen: :mrgreen:

Aqui esta la imagen del archivo de pruebas...

« Última modificación: 28 de Marzo de 2010, 12:30:37 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: Ayuda con 12F508
« Respuesta #8 en: 28 de Marzo de 2010, 13:06:29 »
el include si compila, pero, no seria mas correcto asi?
Citar
#include<12f508.c>

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Ayuda con 12F508
« Respuesta #9 en: 28 de Marzo de 2010, 13:17:17 »
En realidad no me concentre en eso, porque el problema era otro, pero si es cierto, hay que cambiar el include, porque es de otro micro, y ese micro es OTP.
Buen apunte... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado musede

  • PIC10
  • *
  • Mensajes: 9
Re: Ayuda con 12F508
« Respuesta #10 en: 28 de Marzo de 2010, 13:47:38 »
Segun tengo entendido la libreria es la misma, no? microchip dice que se considere el mismo PIC y
el mplab no tiene la libreria del 12F508...

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Ayuda con 12F508
« Respuesta #11 en: 28 de Marzo de 2010, 14:31:21 »
Segun tengo entendido la libreria es la misma, no? microchip dice que se considere el mismo PIC y
el mplab no tiene la libreria del 12F508...

Lo probe y CCS tampoco la trae... :shock: :shock:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado musede

  • PIC10
  • *
  • Mensajes: 9
Re: Ayuda con 12F508
« Respuesta #12 en: 28 de Marzo de 2010, 14:36:34 »

Desconectado musede

  • PIC10
  • *
  • Mensajes: 9
Re: Ayuda con 12F508
« Respuesta #13 en: 28 de Marzo de 2010, 18:36:26 »
Código: C
  1. #include "12c508a.h"
  2.  
  3. #use delay(clock=4000000)
  4. #use fast_io(b)
  5. #fuses INTRC,NOWDT,NOPROTECT,NOMCLR
  6.  
  7. int iEntrada = 0;
  8.  
  9. void main()
  10. {
  11.  
  12. setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  13.  
  14. set_tris_b(0b001000);
  15.  
  16.  
  17.  
  18.         for(;;){
  19.                 if(input(PIN_B3) == FALSE)
  20.                 {
  21.                         // Esperar a que lse deje de pulsar el pulsador.
  22.                         while (input(PIN_B3) == FALSE)
  23.                         {
  24.                         }
  25.                        
  26.                         // Esperar un temps de precaucion per a evitar rebotes
  27.                         delay_ms(150);
  28.                        
  29.                         // Cambiar frecuencia
  30.                         iEntrada ++;
  31.                         if(iEntrada >=4){
  32.                                  iEntrada = 0;
  33.                         }
  34.  
  35.                         //Indicar en els LEDs la frecuencia seleccionada
  36.                         switch(iEntrada){
  37.                                 case 0x0:
  38.                                         output_low(PIN_B5);
  39.                                         output_high(PIN_B0);
  40.                                         output_high(PIN_B1);
  41.                                         output_high(PIN_B2);
  42.                                 break;
  43.                                 case 0x1:
  44.                                         output_low(PIN_B0);
  45.                                         output_high(PIN_B1);
  46.                                         output_high(PIN_B2);
  47.                                         output_high(PIN_B5);
  48.                                 break;
  49.                                 case 0x2:
  50.                                         output_low(PIN_B1);
  51.                                         output_high(PIN_B0);
  52.                                         output_high(PIN_B2);
  53.                                         output_high(PIN_B5);
  54.                                 break;
  55.                                 case 0x3:
  56.                                         output_low(PIN_B2);
  57.                                         output_high(PIN_B1);
  58.                                         output_high(PIN_B0);
  59.                                         output_high(PIN_B5);
  60.                                 break;
  61.                         }
  62.                 }
  63.        
  64.                 //Salidas de frecuencias
  65.                 switch(iEntrada)
  66.                 {
  67.                         case 0x0:
  68.                                 output_high(PIN_B4); delay_ms(1000);
  69.                                 output_low(PIN_B4); delay_ms(1000);
  70.                                 break;
  71.                         case 0x1:
  72.                                 output_high(PIN_B4); delay_ms(4000);
  73.                                 output_low(PIN_B4); delay_ms(4000);
  74.                                 break;
  75.                         case 0x2:
  76.                                 output_high(PIN_B4); delay_ms(6000);
  77.                                 output_low(PIN_B4); delay_ms(6000);
  78.                                 break;
  79.                         case 0x3:
  80.                                 output_high(PIN_B4); delay_ms(90000);
  81.                                 output_low(PIN_B4); delay_ms(90000);
  82.                                 break;
  83.                 }
  84.         }
  85. }

Asi es como esta por el momento el codigo con la ayuda de todos ustedes, pero sigue sin funcionar...
iEntrada no incrementa, no se si es porque se desconfigura el tris o porque... creo que lo he provado ya todo!
Se que la primera vez si que me coje el pulsador porque si cambio
Código: C
  1. if(iEntrada >=4) iEntrada = 0;

por

Código: C
  1. if(iEntrada ==4) iEntrada = 0;

empieza por la ultima y cuando le doy al pulsador pasa iEntrada a 0 i al caso 0x0, despues por mucho que le
de al pulsador, o no incrementa o no lo coje...
Deberia poner el set_tris dentro del for? No se que mas provar.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Ayuda con 12F508
« Respuesta #14 en: 28 de Marzo de 2010, 18:56:12 »
puede que sea una burrada xD

Código: [Seleccionar]
while (input(PIN_B3) == FALSE)
Pero prueba con esto

Código: [Seleccionar]
while (!input(PIN_B3) )
Código: [Seleccionar]
if(input(PIN_B3) == FALSE)
por

Código: [Seleccionar]
if(!input(PIN_B3) )