Autor Tema: codigo c para pic16f819 con hitech para controlar dos leds con boton en RA0  (Leído 1937 veces)

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

Desconectado Giovannito

  • PIC10
  • *
  • Mensajes: 9
Hola: empecé con PIC16f819 y necesito un ejemplo de codigo para controlar dos leds en RB, mediante un botón pulsador en RA0, no puedo. cambié el botón en RB4 y funcionó bien. Pero quiero saber cómo poder usar RA0.
mi código es:

#include <htc.h>

 
__CONFIG (FOSC_XT & WDTE_OFF & PWRTE_OFF & MCLRE_ON & BOREN_OFF  & LVP_OFF & CPD_OFF &
  WRT_OFF & DEBUG_OFF & CP_OFF);

int k;
int tiempototal;

void RETARDO(int milisegundos)
{
   tiempototal = milisegundos * 40000;
   for(k=0; k<tiempototal; k++)
   {
     
   }
}

void main(void)
{
  unsigned long int k=0;

  int t=10;
 
  TRISB = 0B0010000; //1 representa entrada y 0 representa salida
  TRISA = 0B0000001;

  while(t==10)
  {
    if(RB4 == 0)
    {
      while(RB4 == 0);
      if(RB1 == 0)
      {
        RB1 = 1;
      }
      else
      {
        RB1 = 0;
      }
    }
    if(RA0 == 0)
    {
      while(RA0 == 0);
      if(RB1 == 0)
      {
        RB1 = 1;
      }
      else
      {
        RB1 = 0;
      }
    }
    RB0^=1;
    RETARDO(600);
  }
}

espero me apoyen con sus conocimientos. Gracias.

Desconectado Giovannito

  • PIC10
  • *
  • Mensajes: 9
Re: codigo c para pic16f819 con hitech para controlar dos leds con boton en RA0
« Respuesta #1 en: 23 de Agosto de 2015, 23:41:40 »
No puedo creer.  ¿Nadie quiere o nadiie puede ayudarme?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: codigo c para pic16f819 con hitech para controlar dos leds con boton en RA0
« Respuesta #2 en: 24 de Agosto de 2015, 01:01:40 »
Personalmente no lo hice en el momento por que no uso Hitech (me parece anticuado), y seguro que no disponia el tiempo en ese momento,y luego se me paso con algunas otras cosas, yo solo use XC8, que recomiendo que lo uses ya que microchip da soporte a XC8.

Asi que por ejemplo todos tus

Código: C
  1. RA0=1;
  2. RB4=1;
  3.  
  4. //en XC8 es distinto
  5.  
  6. PORTAbits.RA0=1;
  7. PORTBbits.RB0=1;

o si queres utilizar algo mas "comun" y no depender de la definicion de cada pin, ejemplo para hacer un toggle de RA0 y RA3

Código: C
  1. PORTA ^= ((1<<0) | (1<<3));  // Es decir 1 desplazado a la izquierda 0 veces y un 1 desplazado 3 veces, esto seria igual a PORTA = PORTA ^ 0b00001001;
Igual eso depende del compilador y el archivo que posea.

En fin aca te voy a dar una ayuda.

1- El puerto A no solo es digital sino tambien analogico, por lo que tambien debes modificar el registro ADCON1. En el reset todos los pines comienzan como analogicos.

Código: C
  1. ADCON1 = 0x07;  // Esto haria que esten todos como digitales los PORTA

2- Esto es innecesario:

Código: C
  1. while(t==10)

Reemplazalo por un

Código: C
  1. while(1)

Asi no tenes que usar un espacio para una variable (me refiero a la variable t)

3- No se para que declaras esto:

Código: C
  1. unsigned long int k=0;

Si no lo estas usando. Al menos no en el main() que es donde esta definido. Y esta en ese "scope"

4- tiempototal y k es un int, suponiendo que sea de 16bits (en ese compilador) eso lo lleva a poder representar como maximo un numero de 65536
Esto te trae problemas en tu "retardo" , ya que no vas a estar lo que vos queres que haga.

Ejemplo 600 * 40000 = 24000000 (24 millones)
Eso en hexadecimal 0x16E3600
Si tratas de meter ese numero en uno de 16bits lo mas seguro es que solo se guarde: 0x3600 (13824) y lo demas se pierda. Y tu for solo cuente de 0 a 13824 ( y no 24 millones). Era esto lo que querias hacer?

Quedan 2 opciones. utilizar una variable que lo pueda tener (32bits- unsigned long en XC8) o hacer de otra forma el programa. es decir:

Código: C
  1. unsigned long k,tiempototal;
Ventajas: no modificas mucho tu codigo.
 Desventajas: usas 2 variables de 32bits, estoy mas que seguro que vas a tener que modificar esos 40000 por un numero mas epqueño, ya que se tiene que realizar 4 sumas de 8 bytes y luego 4 comparaciones de 8bytes.

o

Código: C
  1. void RETARDO(int milisegundos)
  2. {
  3.    int j,k;
  4.    for(k=0; k<milisegundos;k++)
  5.    {
  6.     for(j=0;j<40000;j++){ }
  7.    }
  8. }
Ventajas: Menor cantidad de uso de memoria, ya que solo son 2 bytes cada una de las variables.
Desventajas: Modificar el codigo

Ambas opciones son un delay simple pero no preciso, si queres algo preciso deberias hacerlo con ASM o alguna funcion del hitech.

El resto del programa quedaria:

Código: C
  1. void main(void)
  2. {
  3.  
  4.   TRISB = 0B0010000; //1 representa entrada y 0 representa salida
  5.   TRISA = 0B0000001;
  6.   ADCON1 = 0x07;        // Digital
  7.  
  8.   while(1)   // Loop que se ejecuta siempre
  9.   {
  10.     if(!RB4)  // hacer !RB4 es parecido a hacer RB4 == 0, no es lo mismo conceptualmente. pero se puede hacer el mismo uso. Asi te vas acostumbrando a verlo
  11.     {
  12.       while(!RB4);
  13.       RB1 ^= 1;   //Toggle de RB1
  14.     }
  15.     if(!RA0)
  16.     {
  17.       while(!RA0);
  18.       RB1 ^= 1;
  19.     }
  20.     RB0^=1;
  21.     RETARDO(600);
  22.   }
  23. }

Una cosa que no entendi es que ambos botones manejan el mismo led. No se si querias hacerlo asi o fue un error.

Espero que esto solucione los problemas que tenes
« Última modificación: 24 de Agosto de 2015, 01:33:20 por KILLERJC »

Desconectado Giovannito

  • PIC10
  • *
  • Mensajes: 9
Re: codigo c para pic16f819 con hitech para controlar dos leds con boton en RA0
« Respuesta #3 en: 24 de Agosto de 2015, 22:01:19 »
Desde ya es una información q

Desconectado Giovannito

  • PIC10
  • *
  • Mensajes: 9
Re: codigo c para pic16f819 con hitech para controlar dos leds con boton en RA0
« Respuesta #4 en: 24 de Agosto de 2015, 22:03:00 »
perdón, quería decir que es una información que supera mis preguntas. Te agradezco mucho el detalle. voy a probar enseguida. De todas maneras ¿còmo obtengo XC8? si no es mucha molestia.

Desconectado Giovannito

  • PIC10
  • *
  • Mensajes: 9
Re: codigo c para pic16f819 con hitech para controlar dos leds con boton en RA0
« Respuesta #5 en: 24 de Agosto de 2015, 22:19:36 »
Muchas KillerJC

eres una persona muy eficiente. funciona una delicia. perfecto. Y muchas gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: codigo c para pic16f819 con hitech para controlar dos leds con boton en RA0
« Respuesta #6 en: 24 de Agosto de 2015, 22:31:13 »
perdón, quería decir que es una información que supera mis preguntas. Te agradezco mucho el detalle. voy a probar enseguida. De todas maneras ¿còmo obtengo XC8? si no es mucha molestia.

Lo obtenes de la pagina de microchip.
Tenes que bajarte el MPLAB X (el IDE y trae para ASM) , y bajar e instalar el XC8 (que da soporte a todos los micros de 8bits), lo unico "feo" es que para tener la mejor optimizacion es pago (el XC8 es pago nomas) y puede que no te guste el IDE. pero la version Free para cosas simples sirve. Es C en general y tiene una forma muy parecida al Hi-Tech en el que tenes que modificar los registros. Y no tiene tantas funciones como CCS (este es pago) que te cambia bastante la forma de programar algunas cosas. En fin esto depende unicamente de vos, si ves que con eso estas comodo entonces no hay problema. Lo unico que pienso que puedas a llegar tener problemas en con el soporte a todos los micros. Pero si es un problema de C o del PIC como es que lo tuviste vos, entonces es solucionable de todas formas.