Autor Tema: Ejemplitos en C para 16F648A  (Leído 611471 veces)

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

Desconectado Vicfred

  • PIC10
  • *
  • Mensajes: 2
Re: Ejemplitos en C para 16F648A
« Respuesta #390 en: 09 de Marzo de 2009, 04:10:45 »
hola, el ccs es de de paga verdad? no hay una version gratis ademas del demo?

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Ejemplitos en C para 16F648A
« Respuesta #391 en: 09 de Marzo de 2009, 13:07:28 »
Buenas:

kicho: El error que te da el CCS es que debes definir un micro antes de incluir las librerías, tal y como se hace en el Ejemplito 24, de todas formas, si continúas con el error, sube el archivo o ponlo en el foro.

Vicfred: CCS posee licencia de uso y no es gratuita, es de pago, la única opción es la demo que mencionas.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado juansi

  • PIC16
  • ***
  • Mensajes: 102
Re: Ejemplitos en C para 16F648A
« Respuesta #392 en: 10 de Marzo de 2009, 15:56:31 »
vszener sigo tus ejemplos como si de una religion se tratase, y me gustaria q me resolvieras una duda q es la siguiente:
quiero hacer un contador de 0 a 9999 q incremente en 1 cuando pulse el pin A4 sin rebotes, el caso es que si mantengo pulsado el pulsador se apagan los displayshasta q suelte.
La cuestion es si la forma como la hice esta bien o se puede simplificar de alguna manera.
aqui va el codigo:
Código: C
  1. #include <16f84a.h>
  2. #fuses XT,NOWDT,NOPROTECT,PUT
  3. #use standard_io(B)
  4. #use standard_io(A)
  5. #use delay (clock=4000000)
  6.  
  7.  
  8.  
  9. void main(void)
  10. {
  11. char i=0,j=0,k=0,l=0,p;
  12.  
  13. int tab7seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
  14. set_tris_b(0x00);
  15. set_tris_a(0x00);
  16. disable_interrupts(GLOBAL);
  17.  
  18. do{
  19. output_a(0b1110);
  20. delay_ms(10);
  21. output_b(tab7seg[i]);
  22. output_a(0b1101);
  23. delay_ms(10);
  24. output_b(tab7seg[j]);
  25. output_a(0b1011);
  26. delay_ms(10);
  27. output_b(tab7seg[k]);
  28. output_a(0b0111);
  29. delay_ms(10);
  30. output_b(tab7seg[l]);
  31.  
  32. if(!input(pin_a4)){
  33.    i++;
  34.       if(i>9){
  35.          i=0;
  36.          j++;
  37.          if(j>9){
  38.             j=0;
  39.             k++;
  40.             if(k>9){
  41.                k=0;
  42.                l++;
  43.                   if(l>9)
  44.                      l=0;
  45.             }
  46.          }
  47.       }
  48. }
  49.  
  50.    while(!input(pin_a4)){
  51. output_a(0b1110);
  52. delay_ms(10);
  53. output_b(tab7seg[i]);
  54. output_a(0b1101);
  55. delay_ms(10);
  56. output_b(tab7seg[j]);
  57. output_a(0b1011);
  58. delay_ms(10);
  59. output_b(tab7seg[k]);
  60. output_a(0b0111);
  61. delay_ms(10);
  62. output_b(tab7seg[l]);
  63. }
  64.  
  65.  
  66. }while(true);
  67. }
Las mujeres quieren "SOLUCIONES", y los hombres lo mismo pero escrito al reves.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Ejemplitos en C para 16F648A
« Respuesta #393 en: 11 de Marzo de 2009, 00:46:09 »
Hola.

Lo que pasa es que tu muestra de datos en los displays lo haces en el programa principal, por ende, el segun tu rutina, el programa se queda clavado hasta que no sueltes el pulsador y no puede continuar con la rutina de visualizacion.

Mira este link 7 Segmentos con int Timer0, puede ser util para ti.

Ahi propongo crear la rutina de visualizacion independientemente del programa principal (mediante las interrupciones del Timer0), de esta manera siempre vas a ver el numero en los diplays.

Saludos
El papel lo aguanta todo

Desconectado juansi

  • PIC16
  • ***
  • Mensajes: 102
Re: Ejemplitos en C para 16F648A
« Respuesta #394 en: 11 de Marzo de 2009, 20:22:46 »
MLO soy muy novato para hacerlo con el timer0, lo he intentado pero no consigo eliminar los rebotes, y ademas ni siquiera me funcionaba bien.
Te inportaria orientarme un poco??? mil gracias por la ayuda q prestais en el foro si no fuera por vosotros no seria capaz de aprender esto.
Las mujeres quieren "SOLUCIONES", y los hombres lo mismo pero escrito al reves.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Ejemplitos en C para 16F648A
« Respuesta #395 en: 11 de Marzo de 2009, 22:08:51 »
Hola.

Los rebotes en los pulsadores se pueden eliminar colcando un antirrebotes -valga la redundancia-. Un codigo podria ser el siguiente:

Código: [Seleccionar]
if(input_state(pin_a1))//o cualquier otro pin donde tengas conectado el pulsador
{
 delay_ms(50);//tiempo que espero hasta que se estabilice
 if(input_state(pin_a1))//verifico si el pulsador sigue presionado
 {
  ....//Hago lo que tenga que hacer
  while(input_state(pin_a1));//Espero hasta que se deje de presionar el pulsador
 }
}

Dime que dudas tienes y las iremos resolviendo entre todos...

Saludos
El papel lo aguanta todo

Desconectado juansi

  • PIC16
  • ***
  • Mensajes: 102
Re: Ejemplitos en C para 16F648A
« Respuesta #396 en: 11 de Marzo de 2009, 23:12:47 »
MLO a ver q te parece este codigo para evitar el while(!input()){} y eliminar los rebotes con una variable
Código: C
  1. #include <16f870.h> //pic a utilizar
  2. #fuses XT,NOWDT,NOPROTECT,PUT
  3. #use standard_io(B)
  4. #use standard_io(A)
  5. #use standard_io(C)
  6. #use delay (clock=4000000)
  7.  
  8.  
  9.  
  10. void main(void)
  11. {
  12. int i=0,j=0,k=0,l=0,rem=0;
  13.  
  14. int tab7seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
  15. set_tris_b(0x00);
  16. set_tris_c(0x00);
  17. disable_interrupts(GLOBAL); //activadas interrupciones
  18.  
  19. do{
  20. output_c(0b1110);
  21. delay_ms(10);
  22. output_b(tab7seg[i]);
  23. output_c(0b1101);
  24. delay_ms(10);
  25. output_b(tab7seg[j]);
  26. output_c(0b1011);
  27. delay_ms(10);
  28. output_b(tab7seg[k]);
  29. output_c(0b0111);
  30. delay_ms(10);
  31. output_b(tab7seg[l]);
  32.  
  33.    if(rem==1){
  34.       i++;
  35.       if(i>9){
  36.          i=0;
  37.          j++;
  38.          if(j>9){
  39.             j=0;
  40.             k++;
  41.             if(k>9){
  42.                k=0;
  43.                l++;
  44.                   if(l>9)
  45.                      l=0;
  46.             }
  47.          }
  48.       }
  49.    }
  50. if(!input(pin_a0)){
  51.    rem++;
  52.    if(rem>2)
  53.       rem=2;
  54. }
  55. else{
  56. rem=0;
  57. }
  58. }while(true);
  59. }
la variable rem la utilizo para eliminar rebotes y asi no se apagan los displays cuando el boton esta pulsado
¿crees q seria mejor hacerlo de otra manera?¿hay una mas simple?
Gracias por tu ayuda de nuevo.
Las mujeres quieren "SOLUCIONES", y los hombres lo mismo pero escrito al reves.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Ejemplitos en C para 16F648A
« Respuesta #397 en: 12 de Marzo de 2009, 15:10:41 »
Hola.

Lo ideal es que la visualizacion siempre este activa sin importar que se haga en el programa principal, por eso es mejor usar las interrupciones del Timer para gestionar la rutina de visualizacion.

Dime que dudas tienes de la rutina en el timer y vamos aclarandolo, no importa si eres novato, mira que aprenderias a usar el timer!!!
El papel lo aguanta todo

Desconectado juansi

  • PIC16
  • ***
  • Mensajes: 102
Re: Ejemplitos en C para 16F648A
« Respuesta #398 en: 16 de Marzo de 2009, 19:50:00 »
Hola mlo.
La unica forma que se me ocurre es encendiendo los displays en la interrupcion pero tendria mandar bits al puerto en la interrupcion, yo creia q no se podia hacer eso, que en la interrupcion solo se manejaban variables.
¿estoy en lo cierto?¿o me equivoco?.
Si me pudieras dar un empujoncito para guiarme el camino.
GRACIAS
Las mujeres quieren "SOLUCIONES", y los hombres lo mismo pero escrito al reves.

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Ejemplitos en C para 16F648A
« Respuesta #399 en: 16 de Marzo de 2009, 22:37:58 »
con el timer0 configurar los displays de leds es muy facil, a cada interrupcion del timer0, un contador suma, cuando da de valor 1,enciende el primer display,cuando el valor es 2, enciende el segundo,cuando el valor es tres el tercero y asi sucesivamente..... asta el ultimo display, que pondra el contador en 0 y empezara de nuevo la cuenta....
creo recurdar que hay un ejemplo

AQUI lo tienes
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Ejemplitos en C para 16F648A
« Respuesta #400 en: 19 de Marzo de 2009, 13:45:34 »
Hola.

Tu puedes modificar pines y variables en la interrupcion, no hay problema, la idea es no demorarse tanto.

Para el despliegue de los displays de 7 segmentos, es muy sencillo usando el timer, veamos:

Configuracion del Timer0 para escoger la base de tiempo de multiplexacion, es decir cuanto tiempo va a permanecer encendido cada display:
Código: [Seleccionar]
setup_timer_0(RTCC_8_BIT | RTCC_DIV_4 | RTCC_INTERNAL);
Es decir, uso un registro de 8 bits, por lo que tendre un desborde cada 256uS (usando un cristal de 4MHz, cada tick del reloj es de 1uS por 256 = 256uS) y al usar un prescaler de 4 la interrupcion saltara cada 4 * 256uS = 1.024mS. Por ende cada display se visualizara cada 1.024mS (casi 1mS).

Definimos la interrupcion:
Código: C#
  1. #int_TIMER0
  2. void Timer0_isr(void)
  3. {
  4.  ++ ints_timer0;//Sumo uno al contador cada que entre a la interrupcion
  5.  dato_1 = int2bcd(value_1);//Convierto el valor de la variable a BCD
  6.  if(ints_timer0==1)
  7.  {
  8.   off(dec_p);//Apago habilitador decenas
  9.   unidades_p = dato_1 & 0x0F;//Separo las unidades de las decenas
  10.   display(unidades_p);//Pongo en el puerto las unidades
  11.   on(uni_p);//Habilito el display de las unidades
  12.  }
  13.  if(ints_timer0==2)
  14.  {
  15.   off(uni_p);//Apago el habilitador de las unidades
  16.   decenas_p = (dato_1>>4) & 0x0F;//Separo las decenas de las unidades
  17.   display(decenas_p);//Pongo en el puerto las decenas
  18.   on(dec_p);//Habilito el display de las decenas
  19.   ints_timer0 = 0;//Pongo a ceros el contador para volver al estado inicial
  20.   }
  21. }

Saludos

El papel lo aguanta todo

Desconectado J_jOsE

  • PIC12
  • **
  • Mensajes: 57
Re: Ejemplitos en C para 16F648A
« Respuesta #401 en: 03 de Abril de 2009, 18:38:28 »
Hola a todos  :)

estuve viendo las respuesta y realmente a uno le hayudan bastante y felicidades por eso :-/

 pero ahora me encontre con un problema,  :(
estoy trabajando en un pruyecto donde utilizo un uC 16F690 y el CSS C 4.065
y obserbando su datasheet vi que se puede configurar interrupciones para cada pin del puerto A y B, como tambien los pull-up
individualmente de cada pin

ahora mi problema radica enque no pude configurar dichas interrupciones ni los pull-up
en si lo que nesecito es  habilitar los pull-up individualmente de los pins RA1 , RA2 y adicionalmente poder habilitar sus interrupciones de cada pin individualmente tmb. para asi utilizarlo como entradas digitales

espero su F1 o mejor dicho su hayuda :mrgreen:
y de antemano gracias
No Pain No Gain

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Ejemplitos en C para 16F648A
« Respuesta #402 en: 05 de Abril de 2009, 11:18:57 »
Hola paisano, para los pull-up tienes que usar, en el main (esto solo si el micro tiene los pull-up disponibles para esos pines):

PORT_x_PULLUPS(pin_a1);
PORT_x_PULLUPS(pin_a2);

y para las interrupciones:

#int_ra1
void isr_int_a1(void){
...//la rutina
}

#int_ra2
void isr_int_a2(void){
...//la rutina
}

y en el main:

enable_interrupts(int_ra1);
enable_interrupts(int_ra2);
enable_interrupts(global);

En teoría tendría que funcionar así, pruébalo y nos avisas. Que lindo pic, tiene muchas cosas

Un saludo, que gusto es ver gente boliviana, y que mejor cochala por el foro :-/

pd. creo que debiste haber creado otro tema, porque este es dedicado solo al 16f648a, si tenes algún código por ahí también serviría para ver si tienes solamente alguna falla por ahí
.

Desconectado J_jOsE

  • PIC12
  • **
  • Mensajes: 57
Re: Ejemplitos en C para 16F648A
« Respuesta #403 en: 06 de Abril de 2009, 10:44:25 »
MUCHAS GRACIAS   Cryn  :)

lo estoy probando y si no me resulta
creare un nuevo tema y lo subo el cod.  pa q lo revisen

y….   arriba los bolivianos  :-/
No Pain No Gain

Desconectado J_jOsE

  • PIC12
  • **
  • Mensajes: 57
Re: Ejemplitos en C para 16F648A
« Respuesta #404 en: 06 de Abril de 2009, 18:14:42 »

bueno Cryn

respecto a los pull-up
el compilador genera error :(
creo q es por la version del compilador (v4.065) por q estuve viendo el archivo 16F690.h
y la configuracion para estas se encuentran en ese archivo

respecto a la int de cada pin
tmb. el compilador genera error

bueno
ahora lo ise con la interrupcion del puerto, no esta como queria pero hace lo q dbria :?

aca esta el programilla (lo basico)

http://www.todopic.com.ar/foros/index.php?topic=25489.new#new

bye
No Pain No Gain


 

anything