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

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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Ejemplitos en C para 16F648A
« Respuesta #180 en: 19 de Noviembre de 2005, 07:49:00 »
Los 4 pines que sobran de la LCD siempre los conecto a tierra. Divertido La librería lcd.c usa comunicación de 4bit con la LCD.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #181 en: 20 de Noviembre de 2005, 14:33:00 »
Ke tal!!!seria todo igual pero en vez de poner el include del pic #include<16f648a> se pondria el pic a utilizar.

Suerte!!!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado lovando

  • PIC16
  • ***
  • Mensajes: 193
RE: Ejemplitos en C para 16F648A
« Respuesta #182 en: 21 de Noviembre de 2005, 18:25:00 »
Hola a todos

Una pregunta, especialmente para el MASTER del 648, vszener..

He estado diseñando un datalogger, usando el PCWH 3.236...(el ultimo es el 3.237)...y me ha dado varios problemas con los numeros float

ejemplo:

printf("Channel 0: %01.2f", valor):

el resultado es una infinidad de ceros antes que el valor deseado

"000000000000000000000000000000000000000000001,2"


Sin embargo, con la version 3.227 y anteriores, el mismo codigo responde de maravillas

"1.2".


No se si alguine ha tenido este mismo problema:


De antemano muchas gracias



Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #183 en: 22 de Noviembre de 2005, 10:48:00 »
Ke tal piclutor!!!jeje gracias por lo de MASTER....haber primero hay que tener claro para que sirven poner delante del tipo de datos esos numeros, el formato ante un printf por lo general en C es el siguiente:
Codigo:

% [flag] [anchura] . [precision] [h/l] tipo


donde:
Codigo:

flag: Signo que se añade para digamos, ajustar el dato a representar
        ·Sin flag -> Se ajusta a la derecha
        ·Con flag -> Se ajusta a la izquierda
        ·+ o - -> Escribe el signo

anchura: Numero entero que indica el ancho minimo del campo utilizado para
               representar el valor. Si este valor es menor que el campo se completa
               éste con espacios en blanco por la izquierda y si es mayor se ignora
               el tamaño del campo.

precision: Indica el numero de digitos que se utilizaran para representar la parte
                fraccionaria.



Con las definiciones por delante, si tu quieres representar el numero valor=1,2 deberas configurar el printf de esta manera:
Codigo:

printf("Channel 0: %2.1f", valor);


En la anchura pones 2 ya que el numero entero de caracteres a representar son dos(1,2 son dos numeros, el 1 y el 2) y en la precision pones 1 ya tu numero solo contiene una cifra decimal.
En la anchura pon siempre como minimo 2, tu en tu pregunta y tu programa has puesto como anchura 1, ¿eso que significa a nivel de representacion del dato? pues segun las definiciones anteriores, tu dato por pantalla mostrado solo podra tener un numero, en teoria te deberia salir el 1 simplemente(ya que valor=1,2)  pero parece ser que el compilador no deja y muestra en totalidad el numero float.
Decir que es logico ya que la configuracion 1.2 no se puede realizar tal cual ya que tu mismo en la anchura=1 estas obligando a que no haya decimales por lo tanto la precision=2 sobra, deberia, como las otras versiones del CCS que tu has provado, mostrar el numero tal cual, ya que la definicion dice que si la anchura no corresponde con la del dato se ignora el campo configurado(en la version 2.236 parece que para anchuras de 1 no lo ignora....)..asi que en resumen!jeje, decir que tienes mal definida la anchura, debes poner minimo 2! prueba con la configuracion que te he puesto y ya me cuentas!en PROTEUS funciona bien!

Suerte!!!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7907
RE: Ejemplitos en C para 16F648A
« Respuesta #184 en: 22 de Noviembre de 2005, 17:10:00 »
Creo que Piclutor tiene razon, Vszener.
Segun CCS las versiones tienen los siguientes cambios:



3.232  printf %f now puts a leading 0 for numbers less than 1
3.232  A number of new example files have been added
3.232  A limit on the number of #rom directives has been removed
3.233  A problem with #ZERO_RAM on parts with 4K of RAM is fixed
3.233  The %f, %w and %g formats have been adjusted to be more consistant
3.233  %w now accepts signed numbers
3.234  Still more %f adjustments.  It should now solve everyones problems.
3.234  More return results added to RESTART_CAUSE() for many chips
3.235  A PIC18 optimization problem has been fixed
3.235  An ADC problem with 16C774 like chips is fixed
3.235  An undeserved syntax error involving forward structure declarations is fixed
3.235  A problem with high priority interrupts on some chips is fixed
3.235  Problems with setup_wdt() and setup_oscillator on some new chips is fixed
3.235  The compiler now tolerates a .PJT file that is marked read-only
3.235  Extra, non-applicable information in errors and warnings has been removed
3.235  PCW now highlights INT8 properly
3.236  restart_cause() problems on some PIC16 parts is fixed
3.236  Some list file and coff file generation changes made to support the upcomming linker
3.236  A PCB optimization problem with write_bank() is fixed
3.237  The EXTERN qualifier is now implemented, if your code uses EXTERN see the readme.txt
3.237  Left justification has been added to %f, use %x.yf where x<=y to get left justification3.238  Fixed a problem where some users were getting an undeserved file mis-match error
3.239  Resolved some problems with the power PWM initialization
3.239  Some menu items grayed out in the PCW IDE are fixed



Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado lovando

  • PIC16
  • ***
  • Mensajes: 193
RE: Ejemplitos en C para 16F648A
« Respuesta #185 en: 22 de Noviembre de 2005, 18:21:00 »
Escrito originalmente por vszener
Ke tal piclutor!!!jeje gracias por lo de MASTER....haber primero hay que tener claro para que sirven poner delante del tipo de datos esos numeros, el formato ante un printf por lo general en C es el siguiente:
Codigo:

% [flag] [anchura] . [precision] [h/l] tipo


donde:
Codigo:

flag: Signo que se añade para digamos, ajustar el dato a representar
        ·Sin flag -> Se ajusta a la derecha
        ·Con flag -> Se ajusta a la izquierda
        ·+ o - -> Escribe el signo

anchura: Numero entero que indica el ancho minimo del campo utilizado para
               representar el valor. Si este valor es menor que el campo se completa
               éste con espacios en blanco por la izquierda y si es mayor se ignora
               el tamaño del campo.

precision: Indica el numero de digitos que se utilizaran para representar la parte
                fraccionaria.



Con las definiciones por delante, si tu quieres representar el numero valor=1,2 deberas configurar el printf de esta manera:
Codigo:

printf("Channel 0: %2.1f", valor);


En la anchura pones 2 ya que el numero entero de caracteres a representar son dos(1,2 son dos numeros, el 1 y el 2) y en la precision pones 1 ya tu numero solo contiene una cifra decimal.
En la anchura pon siempre como minimo 2, tu en tu pregunta y tu programa has puesto como anchura 1, ¿eso que significa a nivel de representacion del dato? pues segun las definiciones anteriores, tu dato por pantalla mostrado solo podra tener un numero, en teoria te deberia salir el 1 simplemente(ya que valor=1,2)  pero parece ser que el compilador no deja y muestra en totalidad el numero float.
Decir que es logico ya que la configuracion 1.2 no se puede realizar tal cual ya que tu mismo en la anchura=1 estas obligando a que no haya decimales por lo tanto la precision=2 sobra, deberia, como las otras versiones del CCS que tu has provado, mostrar el numero tal cual, ya que la definicion dice que si la anchura no corresponde con la del dato se ignora el campo configurado(en la version 2.236 parece que para anchuras de 1 no lo ignora....)..asi que en resumen!jeje, decir que tienes mal definida la anchura, debes poner minimo 2! prueba con la configuracion que te he puesto y ya me cuentas!en PROTEUS funciona bien!

Suerte!!!Giño


Gracias por la respuesta.

La verdad que he probado varias opciones, incluso aumente la precision a 4.
Respecto de el ancho, 01 esta bien, puesto que si el valor es menor que 1 (0,3 por ejemplo), la representacion usará el 0, eliminando la parte entera....

No me parece eso de que el 2 de precision no sirva, puesto que tiene que ver con los decimales, no con los enteros, que estan antes de la coma....

Ahora, el "valor deseado" 1,2 solo es un ejemplo...el resultado del calculo puede dar cualquier valor entero de 1 digito, y decimales de los que se deseen...

Bueno..gracias de todas maneras....seguire usando la 3.227...

Chavela...

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #186 en: 24 de Noviembre de 2005, 05:11:00 »
Haber la precision .2 vale siempre y cuando la anchura este bien definida(la anchura comprende todo el numero a representar) por eso si pones una anchura menor lo que supuestamente deberia hacer es ignorar tanto la anchura como la precision y representar el dato tal cual(esta version del compilador como bien señalo el amigo MGLSOFT tiene ese error, hace cosas extrañas) y lo dije en el anterior post que esta version no lo ignora:
Codigo:

...ya que la definicion dice que si la anchura no corresponde con la del dato se ignora el campo configurado(en la version 2.236 parece que para anchuras de 1 no lo ignora....)..



Bueno....de todas formas haber si en la proxima version del CCS arreglan el problema...Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado garlic_74

  • PIC10
  • *
  • Mensajes: 33
RE: Ejemplitos en C para 16F648A
« Respuesta #187 en: 24 de Noviembre de 2005, 06:27:00 »
Soy novato con proteus y no hay forma de vincularle el CCS Enfurruñado

no puedo hacer rular el codigo k posteais

un saludo Muchas risas

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #188 en: 25 de Noviembre de 2005, 05:08:00 »
Y aqui el enlace a la pagina directa donde te lo explican [MANUAL] Integrar CCS en PROTEUS 


Suerte!!! :wink:
« Última modificación: 25 de Mayo de 2006, 11:16:03 por vszener »
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #189 en: 27 de Noviembre de 2005, 11:01:00 »
Ke tal!!!bien, quizas el error de ese ejemplo sea las direcciones de memoria de la epprom, es decir, cada vez que escribimos no tenemos en cuenta la anchura de la palabra del dato a escribir y por eso se sobre-escriba, haber si me veo el data sheet de la memoria eeprom y lo corrigo y ya te digo!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado garlic_74

  • PIC10
  • *
  • Mensajes: 33
RE: Ejemplitos en C para 16F648A
« Respuesta #190 en: 27 de Noviembre de 2005, 15:48:00 »
bueno eso k dices yo tambien me lo preguntaba, pero lo bueno es k se lee de lujo, no entiendo como puede ir si en teoria estamos reescribiendo en las posiciones de memoria.

Tampoco entiendo porque al sacar la eeprom en frio y leerla con un programador, no hay forma de ver lo k se ha escrito. Siempre leo cosas que escribi directamente con el programador (t-20).


un saludo

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #191 en: 18 de Diciembre de 2005, 12:45:00 »
Ummmm se que es tarde para contestar, pero ayer lo probe y a mi si me funciona....Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #192 en: 19 de Diciembre de 2005, 09:30:00 »
Ke tal!!!bien decir, que Microchip ha sacado una nueva version de su IDE MPlab, es la version 7.30, la podeis descargar desde este enlace:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002

PD: Indice mejorado, se ha añadido herramientas de trabajo.

Suerte y Feliz Navidad!!!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #193 en: 23 de Diciembre de 2005, 06:17:00 »
Buenas!!!!bien, viendo el trabajo que estan haciendo mis compañeros de enseñar a utilizar basic y proteus para pic"s y para atmel(que la verdad esta muy bien aqui el link: EJEMPLITOS DE BASCOM AVR... ATMEGA8..  ) he visto que tienen programas de manejos de matrices de led"s asi que me ha dado pequeña envidia(envidia buena claro esta jeje) y me he dicho: "¿porque en c no hay esos programas"? bueno pues aqui uno muy simple, tratamos una matriz 5x7 y enseñamos por ella el abecedario:

////////////////////////////////////////////////////////////////////////////////////
//                     VsZeNeR"05      
//                    19/Diciembre/05
//
//   Programa:   Abecedario en matrices de led"s 5x7
//   Version:   0.0
//
//   Dispositivo: PIC 16F648A         Compilador:    CCS vs3.236
//   Entorno IDE: MPLAB IDE v7.30      Simulador:    Proteus 6.7sp3
//
//   Notas: Este programa muestra por el abecedario en una matriz de led"s 5x7.
//         En las columnas se usa un decodificador 4028 para hacer su barrido
//         Conexiones:      A0 -> A 4028 DEC            
//                     A1 -> B 4028 DEC
//                     A2 -> C 4028 DEC
//                     A3 -> D 4028 DEC
//                     B0 -> Fila 1 matriz 5x7
//                     B1 -> Fila 2 matriz 5x7
//                     B2 -> Fila 3 matriz 5x7
//                     B3 -> Fila 4 matriz 5x7         
//                     B4 -> Fila 5 matriz 5x7      
//                     B5 -> Fila 6 matriz 5x7        
//                     B6 -> Fila 7 matriz 5x7              
//////////////////////////////////////////////////////////////////////////////////

#include <16f648a.h>               //pic a utilizar          
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP      //ordenes para el programador
#fuses INTRC                     //oscilador interno
#use delay (clock=4000000)            //Fosc=4Mhz
#use fast_io(a)
#use fast_io(b)

///DEFINICION VARIABLES GLOBALES
int letra[5],opcion=0;

///LLAMADA FUNCION INTERRUPCION
#INT_TIMER1
void interrupcion()
{
   switch(opcion){   //selecciona letra
      case 0:   letra[0]=0b00000001;   //A
            letra[1]=0b01110110;
            letra[2]=0b01110110;
            letra[3]=0b01110110;
            letra[4]=0b00000001;   
            opcion++;
            break;
      case 1:   letra[0]=0b01001001;   //B
            letra[1]=0b00110110;
            letra[2]=0b00110110;
            letra[3]=0b00110110;
            letra[4]=0b00000000;   
            opcion++;
            break;
      case 2:   letra[0]=0b00111110;   //C   
            letra[1]=0b00111110;
            letra[2]=0b00111110;
            letra[3]=0b00111110;
            letra[4]=0b01000001;   
            opcion++;
            break;
      case 3:   letra[0]=0b01000001;   //D   
            letra[1]=0b00111110;
            letra[2]=0b00111110;
            letra[3]=0b00111110;
            letra[4]=0b00000000;   
            opcion++;
            break;
      case 4:   letra[0]=0b00111110;   //E   
            letra[1]=0b00110110;
            letra[2]=0b00110110;
            letra[3]=0b00110110;
            letra[4]=0b00000000;   
            opcion++;
            break;
      case 5:   letra[0]=0b01111110;   //F   
            letra[1]=0b01110110;
            letra[2]=0b01110110;
            letra[3]=0b01110110;
            letra[4]=0b00000000;   
            opcion++;
            break;
      case 6:   letra[0]=0b01001110;   //G   
            letra[1]=0b00110110;
            letra[2]=0b00110110;
            letra[3]=0b00111110;
            letra[4]=0b01000001;   
            opcion++;
            break;
      case 7:   letra[0]=0b00000000;   //H   
            letra[1]=0b01110111;
            letra[2]=0b01110111;
            letra[3]=0b01110111;
            letra[4]=0b00000000;   
            opcion++;
            break;
      case 8:   letra[0]=0b00111110;   //I   
            letra[1]=0b00111110;
            letra[2]=0b00000000;
            letra[3]=0b00111110;
            letra[4]=0b00111110;   
            opcion++;
            break;
      case 9:   letra[0]=0b01111111;   //J   
            letra[1]=0b00000000;
            letra[2]=0b00111110;
            letra[3]=0b00101110;
            letra[4]=0b01001111;   
            opcion++;
            break;
      case 10:   letra[0]=0b00111110;   //K   
               letra[1]=0b01011101;
               letra[2]=0b01101011;
               letra[3]=0b01110111;
               letra[4]=0b00000000;   
               opcion++;
               break;
      case 11:   letra[0]=0b00111111;   //L   
               letra[1]=0b00111111;
               letra[2]=0b00111111;
               letra[3]=0b00111111;
               letra[4]=0b00000000;   
               opcion++;
               break;
      case 12:   letra[0]=0b00000000;   //M
               letra[1]=0b01111101;
               letra[2]=0b01111011;
               letra[3]=0b01111101;
               letra[4]=0b00000000;   
               opcion++;
               break;
      case 13:   letra[0]=0b00000011;   //N
               letra[1]=0b01011111;
               letra[2]=0b01101111;
               letra[3]=0b01110111;
               letra[4]=0b00000011;   
               opcion++;
               break;
      case 14:   letra[0]=0b00000011;   //Ñ
               letra[1]=0b01011101;
               letra[2]=0b01101101;
               letra[3]=0b01110101;
               letra[4]=0b00000011;   
               opcion++;
               break;
      case 15:   letra[0]=0b01000001;   //O
               letra[1]=0b00111110;
               letra[2]=0b00111110;
               letra[3]=0b00111110;
               letra[4]=0b01000001;   
               opcion++;
               break;
      case 16:   letra[0]=0b01111001;   //P   
               letra[1]=0b01110110;
               letra[2]=0b01110110;
               letra[3]=0b01110110;
               letra[4]=0b00000000;   
               opcion++;
               break;
      case 17:   letra[0]=0b00000001;   //Q   
               letra[1]=0b00011110;
               letra[2]=0b00101110;
               letra[3]=0b00111110;
               letra[4]=0b01000001;   
               opcion++;
               break;
      case 18:   letra[0]=0b01111001;   //R   
               letra[1]=0b00110110;
               letra[2]=0b01010110;
               letra[3]=0b01100110;
               letra[4]=0b00000000;   
               opcion++;
               break;
      case 19:   letra[0]=0b01001110;   //S
               letra[1]=0b00110110;
               letra[2]=0b00110110;
               letra[3]=0b00110110;
               letra[4]=0b00111001;   
               opcion++;
               break;
      case 20:   letra[0]=0b01111110;   //T   
               letra[1]=0b01111110;
               letra[2]=0b00000000;
               letra[3]=0b01111110;
               letra[4]=0b01111110;   
               opcion++;
               break;
      case 21:   letra[0]=0b01000000;   //U   
               letra[1]=0b00111111;
               letra[2]=0b00111111;
               letra[3]=0b00111111;
               letra[4]=0b01000000;   
               opcion++;
               break;
      case 22:   letra[0]=0b01100000;   //V   
               letra[1]=0b01011111;
               letra[2]=0b00111111;
               letra[3]=0b01011111;
               letra[4]=0b01100000;   
               opcion++;
               break;
      case 23:   letra[0]=0b01000000;   //W
               letra[1]=0b00111111;
               letra[2]=0b01000111;
               letra[3]=0b00111111;
               letra[4]=0b01000000;   
               opcion++;
               break;
      case 24:   letra[0]=0b00111011;   //X
               letra[1]=0b01010111;
               letra[2]=0b01101111;
               letra[3]=0b01010111;
               letra[4]=0b00111011;   
               opcion++;
               break;
      case 25:   letra[0]=0b01111110;   //Y
               letra[1]=0b01111101;
               letra[2]=0b00000011;
               letra[3]=0b01111101;
               letra[4]=0b01111110;   
               opcion++;
               break;
      case 26:   letra[0]=0b00111100;   //Z
               letra[1]=0b00111010;
               letra[2]=0b00110110;
               letra[3]=0b00101110;
               letra[4]=0b00011110;   
               opcion=0;
      }
   set_timer1(3036);            //TMR1 se desborda cada 0,5s                         
}

void main(void)
{
   int i;   //variable contador
   
   enable_interrupts(INT_TIMER1);            //interrupcion TIMER1 activada
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);      //configuracion TMR1
   set_timer1(65535);                     //carga TMR1 para un desbordamiento inmediato
   enable_interrupts(GLOBAL);               //activadas interrupciones
         
   set_tris_b (0x00);      //portb salida
   set_tris_a (0x00);      //porta salida
   
   do{            //bucle...
      for(i=0;i<5;i++){      
         output_a( i );         //columnas
          output_b(letra[ i ]);      //filas
            delay_ms(10);         //pausa para poder verse
            }
      }while(TRUE);   //...infinito
}

Bien, pues decir antes que nada, que las letras no estan realizadas en formato standard ehh!!!!jeje

PD: Felices fiestas a todos los integrantes del foro que aunque en la lejania, este medio parece algo magico ya que nos une un poquito mas.....FELIZ NAVIDAD!!! :wink:
« Última modificación: 25 de Mayo de 2006, 11:32:22 por vszener »
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #194 en: 23 de Diciembre de 2005, 06:21:00 »
Holaaa!!! bien de aqui os podeis descargar lo necesario para el ejemplo anterior: abecedario en una matriz de led"s 7x5


FELIZ NAVIDAD!!! :wink:
« Última modificación: 25 de Mayo de 2006, 11:17:33 por vszener »
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte