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

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

271071

  • Visitante
RE: Ejemplitos en C para 16F648A
« Respuesta #240 en: 26 de Marzo de 2006, 06:31:00 »
Hola de nuevo: este es otra variante del programa con pfc8591 pero en este caso.
hemos hecho una modificación a tu ejemplo DAC y lo hemos hecho para un ADC , la particularidad que tiene para este(ejercicio ( ADC ) según veo es que vos lo inicializar con una palabra de configuración y luego lo que haces es leerlo, sacando su valor por pantalla, en un ciclo While dentro del cual hay un retardo para que si vos quisieras pudieras ver las transiciones de un estado a otro, para lo cual se ha agregado un contador de muestra (que se ve en el display al ejecutar el programa)

////////////////////////////////////////////////////////////////////////////////////
//                     VsZeNeR"06
//                     13/Marzo/06
//
//   Programa:   Manejo del dispositivo PCF8591 en modo A/D
//   Version:   0.0
//
//   Dispositivo: PIC 16F84A         Compilador:    CCS vs3.245
//   Entorno IDE: MPLAB IDE v7.31      Simulador:    Proteus 6.7sp3
//
//   Notas: Este programa muestra como usar el conversor pfc8591 como adc.
//          La Vref es de 2,56v por lo tanto la resolucion del conversor es 10mV.
//       Básicamente lo que aquí hacemos es inicializar el conversor con la palabra
//      de configuración y luego sólo resta leer (obviamente estamos modificando la
//       tención analógica de entrada) sólo nos resta corregir  un ligero error que es
//       el que apenas pasa el valor de 128 en que se muestra valor negativo.
//      Se muestra por pantalla de lcd(LM016L)
//          
//
//         Conexiones:            RA1 -> SDA pcf8591
//                     RA0 -> SCL pcf8591
//                     
//                     lcd(LM016L)
//                     B0 -> E            
//                     B1 -> RS         
//                     B2 -> RW      
//                     B4 -> D4        
//                     B5 -> D5            
//                     B6 -> D6   
//                     B7 -> D7  
//                     VSS y VEE -> gnd
//                     VDD ->VCC
//
//                     pcf8591
//                     A0,A1,A2.EXT , AGND ->gnd
//                     AN0 divisor resistivo con potenciometro (2.5v Variables)
//                     VREF=2.56 (en est6e caso)(pin14) divisor resistivo con potenciometro
//
//
//////////////////////////////////////////////////////////////////////////////////
//Programa prueba del conversor como adc.
#include <16f84a.h>               //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT      //ordenes para el programador
#use delay (clock=4000000)            //Fosc=4Mhz
#define PCF8591_SCL PIN_A0         //definicion de pines...
#define PCF8591_SDA PIN_A1      //...de manejo del pcf8591
#include <vs_pcf8591.c>               //libreria pcf8591
#define use_portb_lcd TRUE //definir portb lcd
#include<lcd.c> //libreria manejo lcd
///DEFINICION VARIABLES GLOBALES
int x=1;                     //variable de salida por AOUT
unsigned char dato=0;
///LLAMADA FUNCION INTERRUPCION
//#INT_EXT

///PROGRAMA
void main(void)
{

   lcd_init();

   delay_ms(3000); //retraso para que se vea en pantalla los mensajes

   lcd_gotoxy(1,1);
   
   lcd_putc("f   Voltimetro" ) ;

   lcd_gotoxy(3,2);
   
   lcd_putc(" Digital!!!" ) ;

   delay_ms(3000); //retraso para que se vea en pantalla los mensajes

   lcd_putc("f" ); //borra pantalla

   pcf8591_adc_init(0b00000000); //inicializamos pcf8591 en modo A/D habilitando canal 0 solamente
            //ver la palabra de configuracion en la hoja de datos o en la libreria
            //perfectamente explicada por VS_ZeNeR
while (x<100){

   lcd_gotoxy(1,1);

   printf(lcd_putc,"X= %d",x ) ;

   dato=read_adc_value();         //se guarda valor en variable dato

   lcd_gotoxy(9,1);

   printf(lcd_putc,"%d mV",dato) ;

   delay_ms(1000); //retraso para que se vea en pantalla los mensajes

   x++;
   
   lcd_putc("f" ); //borra pantalla

}
}


271071

  • Visitante
RE: Ejemplitos en C para 16F648A
« Respuesta #241 en: 26 de Marzo de 2006, 06:40:00 »
aqui subo el circuito en el proteus el dsn, por si no les funciona tambien les mando una imagen , ya que a veces surgen ciertos inconvenientes . asi ven como son las conecciones......................un detalle esto foro no me permitio subir adjuntos, quiza sea por no tener suficientes privilegios para hacerlo

271071

  • Visitante
RE: Ejemplitos en C para 16F648A
« Respuesta #242 en: 26 de Marzo de 2006, 06:48:00 »
Aqui van algunas dudas y sugerencias , espero no incomodarte Vs_ZeNeR....




1) Me surge una duda con respecto a por qué utilizadas el oscilador interno, que utilidad tiene, dado que en esta parte de la Argentina, por lo menos los comercios no han traído el pic 16F648a, entonces nosotros  usamos el más común de todos que es el pic 16F84a, que no tiene oscilador interno y los ejemplos nos funcionan igual.

2) mas o menos cuál es la corriente que soportan las entradas de los pic, y cómo hacemos para evitar de quemar una de ellas, en realidad a lo que me refiero es a que circuito ponemos recurrir o que integrado ponemos para evitar de sobrecargar una entrada, lo que si es evidentemente esque  si vas a trabajar con 220 V tendría que usar un optoacoplador, pero para integrados  con mucha más baja tensión ¿que podria usar? .

3) con respecto al ejercicio que realizamos con conversión ADC tenemos el inconveniente que la atención que transformamos y mostramos en la parte de muestra cuando pasa de 128 empieza mostrar un valor negativo (por supuesto sólo lo hemos hecho ayer) no lo hemos revisado demasiado pero hemos probado que funciona.

4) Sugerencia: de los ejemplos que ya has hecho, por ejemplo los de memoria, podrías expandir alguno para usar varias memorias (viste que las 24LC 256 se pueden colocar varias colgadas al bus I2C . que las seleccionamos con las tres entradas A0, A1, A2, tendrías algún ejemplo a mano, supongo que la modificación no llevaría demasiado tiempo.

5) Sugerencia: ¿tenés algún ejemplo realizado con sensores?, perdón sé que tenés hecho el ejemplo con el sensor de temperatura DS1620, pero por ejemplo con algún sensor de presión de fluidos, sensores de movimiento, sensores de campo magnético, LDR (light dependent resistor) sensor óptico CNY70 ,OPB 703/4/5, H211 sensor óptico de barrera sensores infrarrojos, GP2D05 ,GP2D15 ,GP2D12, receptor para control remoto SFH 5110, sensor de proximidad IS471f, detector por ultrasonido SRF04,

6) Sugerencia:a has usado el bus de una línea, por ejemplo un circuito con un ds1820 (termómetro digital).

7) para quien le interese, busque en Internet el grabador de pic TE20-SE, sería otro de los tantos grabadores que anda dando vuelta por la web, pero éste soporta grabado de memorias, graba pic de 28 pines y de 18 pines, con la particularidad de que es muy sencillo no necesita fuente de alimentación ya que la recibe directamente de la PC, es un grabador de pocos componentes sencillo de armar y barato

8)Sugerencia: la librería del pfc8591 está bastante bien explicada, por no decir muy bien explicada.
Como anexo a los ejemploss que entregaste, ¿podrías explicar otras librerías ya utilizadas como por ejemplo la librería del Display , la del DS1620, SAA1064, la librería para teclados KBD y otras, también explicada como tenés la librería anteriormente mencionada, sé que no es un ejercicio pero a los efectos del conocimiento me parece que ayudaría bastante.

PD: lamento lo errores ortograficos, es que uso un programa de dictado para hacer los textos y a veces algun errorcito se ........me pasa




Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #243 en: 30 de Marzo de 2006, 12:28:00 »
Buenas!!!!por partes:
migsantiago, la verdad que en la version mia del CCS tampoco viene en la ayuda la funcion lcd_send_byte, yo la encontre en la propia libreria de lcd.c.

monopic me alegra que ya estes ganandole la batalla a la glcd jeje yo ya tengo una por aqui haber si le meto mano y trasteo con ella tambien!Haber si posteas en un hilo del foro tus avances!

271071 gracias por modificar y adaptar el ejemplito del dac!!!me alegra que estos ejemplitos sirvan!y la verdad que te has adelantado, por motivos de viaje no pude subir el programa del a/d jeje que funciona como voltimetro!jeje veo que lo has expuesto tu y me alegro!

La "mini-libreria" pcf8591 no es exactamente una libreria ya que, bueno no es muy configurable, eso si, "mini" si que es ya que es lo minimo para poder usar dicho componente, para su ampliacion deberia retocarse un par de cositas nada mas, por eso no la puse en un hilo aparte como el caso del dispositivo saa1064.

Para poder descargar tus archivos debes subirlos al almacen y despues poner aqui la direccion de descarga de los mismos, y para la imagenes en proteus pues "casi" igual, sube la imagen en algun "almacenador de imagenes" y despues las enlazas aqui.

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

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #244 en: 30 de Marzo de 2006, 13:06:00 »
No te preocupes amigo 271071 no me incomodan las sugerencias, todo lo contrario me alegran!!!

1)El oscilador interno sive para librerar los dos pines donde deberiamos conectar el oscilador ordinario(cristal, reloj externo, red RC), con eso ahorramos componentes en nuestros proyectos y obtenemos dos pines mas por el puerto A para poder ser usados por nosotros, es cierto que el 16F84A no tiene oscilador interno, pero varios pic"s de la familia 16F si lo tienen como el caso de nuestro pic, y el 16F88, etc etc. Para que los programas funcionen igual simplemente indicale al programador el oscilador que vas a usar, eso se realiza en la parte #fuses....Añadir que para el 16F648A el oscilador interno es configurable de 4MHz y de 48KHz creo recordar....

2)Lo de la maxima corriente que admite es 25mA, segun pone en el data sheet del dispositivo, para manejar cargas de la red pues deberas usar un optoaclopador como bien dices tu, si vas a trabajar con tensiones de mas baja tension pues un optoaclopador tambien vale, sino puedes realizarte un circuito reductor de voltaje, pero ya seria enredar la maraña, o un zener, o los dispositivos que mantienen finja un voltaje, en este caso nu pude ser superior a 5v o la entrada se quemara.

3)Bueno mirate el programa que voy a postear que es supongo que hace lo mismo que el vuestro(un voltimetro digital) y lo comparais, yo cuando tenga algo de tiempo(me despeje de mis vacaciones jeje) lo revisare y haber que pasa.

4)Ummmm no tengo ningun ejemplo pero estoy en ello con varios dispositivos I2C, una memoria, el expandor del bus i2c y el conversor....cuando lo termine lo posteare, pero vamos, no es dificil como bien dices, los pines A2A1A0 del dispositivo i2c debes conectarlos de distinta forma, por ejemplo tres memorias eeprom, la primera memoria los tres pines a masa A2A1A0 a GND(valor logico 000), la segunda memoria los pines a la alimentacion(111) y la tercera no se donde quieras(A2A1A0 110 por ejemplo), cuando realices la llamada a cada dispositivo deberas enviar en el comando de start la direccion al dispositivo donde queremos acceder y listo.

5)Ejemplos con sensores no tengo, ya que saldria de la tematica de este post, pero si he trabajado con algunos sensores que has citado y bueno, decirte que en el subforo de robotica hay varios programnas y proyectos con la mayoria de los sensores que has citado, es mas, el ultimo sensor que has citado, el amigo RedPic hizo un proyecto, aqui te dejo su enlace:Medidor de distancias mediante Ultrasonidos SFR04

6)Si que he trabajado con dicho bus, y es mas, antes de irme de vacaciones estaba realizando una libreria para la implantacion de dicho bus 1-wire de dallas, haber si le doy el par de retoques y para el mes que viene lo subo con elk ejemplo del ds1822 y el ds18s20

7)El grabador TE-20SE fue mi primer grabador!!!jeje compatible con el JMD es barato y facil de montar, aunque en el subforo de programadores hay un grabador realizado por los amigos de este foro que es estupendo GTP en todas sus versiones.

8)Como dije en el anterior post no es en si una libreria, es como la llamo yo jeje una "mini-libreria" ya que la realice para estos programas que puse con su uso concretamente, aunque se puede retocar y convertirse en una libreria con todas sus letras jeje, las librerias del display y del teclado no son mias, por eso no estan comentadas, la del dispositivo ds1620 la hice en el tren y dije jeje que la tenia que revisar y todavia no lo he hecho, mas que nada porque creo que hay nuevos dispositivos que hacen al ds1620 algo obsoleto y por eso no le he vuelto a meter mano, aunque lo hare, la verdad que simplemente falta ajustar la entrega de datos...y con respecto a la del dispositivo SAA1064, decirte que si esta explicada creo que al milimetro jeje es mas, abri un post distinto para presentarla al foro, aqui te dejo el link SAA1064

No te preocupes por los errores ortograficos jeje mientras se te entienda no hay problema!!!jeje de nuevo darte las gracias por usar estos programillas!!!


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

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #245 en: 30 de Marzo de 2006, 13:09:00 »
Holaaa!!!aqui el programita que usaremos con la "mini-libreria" pcf8591 pero esta vez configurada como A/D, este programa es el tipico del voltimetro digital!:
////////////////////////////////////////////////////////////////////////////////////
//                     VsZeNeR"06      
//                     13/Marzo/06
//                     vszener@gmail.com
//
//   Programa:   Manejo del dispositivo PCF8591 en modo A/D
//   Version:   0.0
//
//   Dispositivo: PIC 16F648A         Compilador:    CCS vs3.242
//   Entorno IDE: MPLAB IDE v7.31      Simulador:    Proteus 6.7sp3
//
//   Notas: Este programa muestra el voltaje de entrada por el AIN0 en formato simple
//         de un potenciometro.
//         La Vref es de 2,5v por lo tanto la resolucion del conversor es 10mV.
//         Se configura el dispositivo con 4 entradas analogicas simples y no hay
//         auotincremento. La lectura se realiza mediante el desbordamiento del timer0
//         aproximadamente cada 65.5ms. Al ser la resolucion 2,5v, el voltaje maximo
//         puede medir es de 2,5v. Mediante software se intenta mejorar la aproximacion
//          de la señal obtenida, se multiplica por 0.009803 para mostrar el dato en su
//          forma decimal y mejorar su resolucion, tener en cuenta que el dato leido
//         por el pcf8591 es el voltaje de un potenciometro y su valor oscila entre
//         0-2.5v. Para su representacion en forma decimal debemos efectuar la operacion
//         anteriormente mencionada ya que si no lo hicieramos se mostraria por pantalla
//         un numero entero(para 2,5v se mostraria 255).
//
//         Conexiones:      A1 -> SDA pcf8591            
//                     A0 -> SCL pcf8591
//                     B0 -> E LCD
//                     B1 -> RS LCD
//                     B2 -> RW LCD
//                     B4 -> D4 LCD
//                     B5 -> D5 LCD
//                     B6 -> D6 LCD
//                     B7 -> D7 LCD   
//////////////////////////////////////////////////////////////////////////////////

#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
#define use_portb_lcd TRUE
#include <lcd.c>                  //libreria para lcd
#define PCF8591_SCL PIN_A0            //definicion de pines...
#define PCF8591_SDA PIN_A1            //...de manejo del pcf8591
#include <vs_pcf8591.c>               //libreria pcf8591                        

///LLAMADA FUNCION INTERRUPCION
#INT_TIMER0
void interrupcion( )
{
   int dato;                              //almacena lectura del pcf8591
   float variable;                           //tratamiento de la informacion a representar

   dato=read_adc_value( );                     //lee del pcf8591
   variable=(float)dato*0.009803;                //se procesa la señal para su representacion
   printf(lcd_putc,"fTension: %1.2f V",variable);   //muestra por lcd
   lcd_putc("
   VsZeNeR"06" );   
   
   set_timer0(0 );                           //carga TMR0
}

///PROGRAMA
void main(void)
{
   setup_oscillator(OSC_4MHZ);               //configuracion del oscilador interno a 4MHz
   
   enable_interrupts(INT_TIMER0);            //interrupcion TIMER0 activada
   setup_counters(RTCC_INTERNAL,RTCC_DIV_256);   //configuracion interrupcion TMR0
   
   lcd_init( );                           //inicializamos lcd
   
   set_timer0(0 );                        //carga TMR0 -> temporizacion maxima aprox 65.5ms
   enable_interrupts(GLOBAL);               //activadas interrupciones
   
   pcf8591_adc_init(0b00000000);            //inicializamos pcf8591 en modo D/A con entradas
                                    //entradas analog. simples
   while(TRUE){ }                        //bucle infinito
}


Bueno ya podemos con nuestro pic usar los convertidores!!!hasta otra!!! :wink:
« Última modificación: 25 de Mayo de 2006, 11:27:44 por vszener »
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado pelusac

  • PIC16
  • ***
  • Mensajes: 118
RE: Ejemplitos en C para 16F648A
« Respuesta #246 en: 31 de Marzo de 2006, 05:42:00 »
Maestro Vszener perdona mi desconocimiento ,pero haber si puedes dar una pequeña explicación del cálculo de la resolución que no tengo ni idea.
Gracias de antemano.Fumador

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #247 en: 31 de Marzo de 2006, 08:29:00 »
Buenas pelusac!, la resolucion del DAC, transforma el dato digital de entrada al DAC en su tension analogica de salida, segun sea el dispositivo a usar tendra una ecuacion u otra en este caso la del PCF8591 es la siguiente:
Codigo:

                         Vref - Vagnd
     Vaout =  Vagnd + ------------------  [ D0 · 2^0 + D1·2^1 +...+D7 · 2^7]
                              256


Del D0-D7 son los registros de datos del DAC y es el dato digital que nosotros enviaremos al dispositivo pcf8591 mediante la siguiente funcion:
Codigo:

     write_dac_value(dato); //salida analogica AOUT


Previamente definiremos la variable dato como un byte.
En el data sheet del dispositivo pcf8591 , concretamente en la pagina 8, la primera figura esta la formula de la resolucion, pero te voy a poner un ejemplo, ¿que tension de salida analogica por AOUT del dispositivo pcf8591 en modo DAC tendra, si Vref es de 2,56v y el pin AGND esta conectado a masa(0v), siendo el dato de entrada(D0-D7) 0b01001011?
El dato de enbtrada en decimal es 75(dato que queremos pasar a analogico)
Pues nos vamos a la formula que te puse antes de la resolucion:
Codigo:

                      2.56- 0
     Vaout =  0 + ------------------  [ 75] = 750mV = 0.75V
                       256


Si tienes alguna duda preguntamela!


Suerte!!!Giño

· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado pelusac

  • PIC16
  • ***
  • Mensajes: 118
RE: Ejemplitos en C para 16F648A
« Respuesta #248 en: 31 de Marzo de 2006, 10:47:00 »
Ninguna duda .Estupenda explicación, muy didáctica y tela de útil gracias.Fumador

Desconectado pelusac

  • PIC16
  • ***
  • Mensajes: 118
RE: Ejemplitos en C para 16F648A
« Respuesta #249 en: 04 de Abril de 2006, 11:27:00 »
locoNo sé si este es el sitio adecuado para esto, pero ahí la va pregunta  maestro Vszener.
En el caso de tener una fuente de alimentación regulable, pongamos de 0-24V o pon el voltaje que prefieras. Si quisiese mostrar el valor que adquiere la tensión por una lcd con el pcf8591 podría?. Por que si no me he enterado muy mal creo que el el voltaje máximo a interpretar viene definido por el voltaje de referencia.
En el caso de este dispositivo creo que el voltaje máximo de referencia puede ser hasta 8V. Si no es mucho preguntar, me gustaria saber, si es posible utilizar este dispositivo de voltímetro con estas tensiones mas elevadas, es decir, que el ajuste se realice por programa(cosa que tampoco sé y que ayudaría mucho un ejemplillo) o por lo contrario, que este dispositivo no sea el adecuado para este uso. loco
Me ayudaría mucho el comprender esta cuestión ya que me abriría las puertas hacia otras aplicaciones.
Gracias de antemano y espero no moleste este tipo de cuestiones que imagino que para la mayoria de los integrantes del foro son obviedades.Fumador


Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Ejemplitos en C para 16F648A
« Respuesta #250 en: 20 de Abril de 2006, 13:49:57 »
Buenas!!!!joe ando bastante perdido por este post y ahora es cuando he leido tu mensaje!jeje, si se puede obtener medidas mayores, eso si tendriamos que añadir a la entrada circuitos amplificadores y demas para la correcta lectura, haber si termino con lo que estoy haciendo y vuelvo a postear mas ejemplitos que ya hay ganas!


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

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Ejemplitos en C para 16F648A
« Respuesta #251 en: 25 de Abril de 2006, 12:18:37 »
REMODELACION!!!

Bueno el indice a cambiado 'algo' ya que estoy en fase de remodelacion total jeje, antes todos los post apuntaban al foro de mi@ y por lo tanto el indice con la spaginas que apuntaba aqui eran erroneas, ya esta solucionado y todo los enlaces de paginas apuntan correctamente y a este foro(no al de mi@), vereis que hay varias opciones desactivadas, es decir, por ejemplo la descarga y en herramientas los programas en vb, estan desactivadas ya que tengo que subir los programas a este foro, en cuanto lo suba, actualizare nuevamente el indice para dejarlo como estaba....y tambien subire todos los programas con sus respectivas simulaciones a este foro y a este post!


Hasta pronto!!! :wink:
« Última modificación: 25 de Mayo de 2006, 11:28:24 por vszener »
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado pelusac

  • PIC16
  • ***
  • Mensajes: 118
Re: Ejemplitos en C para 16F648A
« Respuesta #252 en: 25 de Abril de 2006, 12:45:22 »
Como siempre realizando un impecable trabajo, gracias por la dedicación desinteresada y sigue así. :-/

Saludos desde triana en plena feria 8)

Desconectado zimanka

  • PIC10
  • *
  • Mensajes: 7
Re: Ejemplitos en C para 16F648A
« Respuesta #253 en: 30 de Abril de 2006, 12:01:47 »
mi asunto es el siguiente

necesito desarrollar una comunicacion entre 4 pics, uno maestro y tres computadores si alguien me puede ayudar gracias

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Ejemplitos en C para 16F648A
« Respuesta #254 en: 30 de Abril de 2006, 12:39:48 »
Te aconsejo que crees un post nuevo con tu peticion, pero eso si, con mas informacion, el tipo d elenguaje a utilizar, el modo de comunicacion entre los pic's, la forma....


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


 

anything