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

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

271071

  • Visitante
RE: Ejemplitos en C para 16F648A
« Respuesta #225 en: 04 de Marzo de 2006, 07:21:00 »
1) mi primera consulta es respecto a: como hago para obtener una temporización de un segundo exacto, ya que en el programa que has dado como ejemplo no es un segundo exacto.
2) tenes ejemplos o has hecho ejemplos de programas que controlen, motores paso a paso, motores de continua, y motores de alterna.
3) tenés ejemplos que hayas hecho conectando conversores al microcontrolador, ya sé que viene con un conversor analógico digital pero en caso de que tuvieras que conectar un conversador externo.

Sugerencia, no se si te sirva o no, dado que tenés tantos conocimientos y tenés tantos ejemplos, tranquilamente y casi muy similar a lo que has hecho en la página web, que podrías poner en campaña de acuerdo a tu tiempo para organizar un libro de programación en lenguaje C para microcontroladores, dado que en castellano no he visto ningún libro de ése tipo y tus ejemplos son bastante didácticos y entendibles, agregando mucho ejemplos más como ligeras variantes sobre lo que ya tenés hecho más algunas que inventes (no creo que te cueste mucho) podrías lanzar un buen libro y harías una muy buena cantidad de dinero. (Sólo es una sugerencia sin ánimos de ofender)


4) He tenido inconvenientes con una instrucción en alguna de tus últimos programas, es como si no me reconociera el programa esa instrucción.
Por ejemplo:

////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR"06
// 23/Enero/06
//
// Programa: RS232 Y PIC
// Version: 1.0 REVISION del programa 45
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.242
// Entorno IDE: MPLAB IDE v7.30 Simulador: Proteus 6.7sp3
//
// Notas: Se interacciona el PC con el PIC mediante RS232 para el tratamiento de la memoria
// eeprom interna,se muestra por v.terminal un menu:
// • 0 -> Muestra nuevamente el menu
// • 1 -> LLena la eeprom a 0xFF
// • 2 -> Lee la eeprom en modo hex
// • 3 -> Escribe en la eeprom
// • 4 -> Lee la eeprom en modo texto(ASCII)
// Todas las acciones se realizan mediante la interrupcion del puerto serial.
// Al comienzo del programa, realizar el paso 1. en caso de empezar a escribir
// en la eeprom!. Decir que las funciones gethex1() y gethex() estan sacadas
// de la libreria incluida en CCS, input.c, estan puestas en el programa
// por la pequeña modificacion en la funcion gethex1() que, en este caso, solo
// permite el paso de digitos comprendidos entre 0-f o 0-F. Tener en cuenta
// que los datos a introducir deben ser en hexadecimal, por ejmeplo, en el
// caso de almacenar en la letra "a" minuscula en la posicion 00 de la eeprom
// interna del pic, habra que realizar los siguientes pasos:
// 1. Pulsamos 3 para escribir en la eeprom interna
// 2. Ponemos la direccion 00 (esta en hexadecimal!)
// 3. Damos el valor en hex de la letra a=0x61
// 4. Leemos la memoria para ver que se almacenado correctamente(pulsando 2)
// La eeprom interna del 16F648A es de 256k.
//
// Conexiones: B2 -> TxD
// B1 -> RxD
//////////////////////////////////////////////////////////////////////////////////
#include <16f648a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT //ordenes para el programador
#fuses RC_IO //reloj interno (a esta instrucción es a la que me refiero, es como si el compilador no me las reconociera)


Y también he tenido inconvenientes con esta otra instrucción en este otro programa que vos has desarrollado

////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR"06
// 29/Enero/06
//
// Programa: Manejo del dispositivo SAA1064 en modo DINAMICO
// Version: 0.0
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.242
// Entorno IDE: MPLAB IDE v7.30 Simulador: Proteus 6.7sp3
//
// Notas: Este programa muestra pos cuatro display"s de 7seg mensajes de texto, para
// ello usamos el dispositivo SAA1064 de bus I2C.
//
// Conexiones: A0 -> SDA saa1064
// A1 -> SCL saa1064
//////////////////////////////////////////////////////////////////////////////////

#include <16f648a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP //ordenes para el programador
#fuses INTRC //oscilador interno (a esta instrucción es a la que me refiero, es como si el compilador no me las reconociera)
#use delay (clock=4000000) //Fosc=4Mhz
#define SAA1064_DINAMICO //trabajar en modo dinamico el saa1064
#define SAA1064_SCL PIN_A1 //definicion de pines...
#define SAA1064_SDA PIN_A0 //...de manejo del saa1064
#include <vs_saa1064.c> //libreria saa1064

Acaso será por la versión de compilador? PICC IDE 3.43
PCB3.203

Será por eso?

Una sugerencia más, vos subís los programas al servidor, y de ahí hay que descargarlos, pero resulta que si por algún motivo alguien tiene alguna otra versión, no se pueden abrir, evidentemente me refiero al Proteus,, lo que te sugeriría si tu puedes y no es molestia a parte de subirlo colocada una imagen  de cómo implementaste el circuito, que se yo quizá la captura la puedas hacer con la tecla print scr de tu máquina y la pegues en algún programa de dibujo., a si quizá podría facilitar algunas cosas (repito sólo es una sugerencia sin ánimos de ofender).

Verdaderamente te felicito por el trabajo estás haciendo, es admirable de los conocimientos que por seres de programación y ánimos para seguir adelante.

Mi nombre es Pedro y sobre de la república Argentina

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #226 en: 04 de Marzo de 2006, 09:32:00 »
Buenass!!!!haber por partes:
1)Ummm con respecto al segun exacto, dime cual es el programa que no lo genera(dime el numero y lo reviso), en este post de ejemplitos hay varios contadores y temporizadores, los que trabajan con el timer pues no son exactos, debes crearte una funcion o usar variables para redondear el exceso o la temprana interrupcion ocasionando el no segundo exacto, los programas realizados aqui estan basados en usar variables para el ajuste fino y medidos con el reloj de PROTEUS y normalmente es el tercer segundo el que se recupera todo el tiempo perdido o no exacto, habiendo un margen del segundo 1 al 2 de milesimas de segundo arriba o abajo....sino es asi dimelo!de todas formas en dichas variables de ajuste fino las puedes "toquetear" para ajustarlo mejor o peor. Ahora bien, si necesitas temporizaciones muy muy muy exactas, o creas una rutina en asm o mediante un chip externo te vaya generando mediante interrupcion, por ejemplo en RB0, la temporizacion.

2)He trabajado con motores, tener programas tipo los que estan en este post no los tengo, pero vamos ya me has dado otra idea de otro ejemplo a poner!jeje. Si no lo he puesto es porque este post intento exponer mi forma de programar, y lo intento hacer de una forma general, es decir, usando los recursos del pic y algun periferico externo, peor mi idea es que si alguna vez no te acuerdas de programar o como se programaba no se, la interrupcion de los pines portb <4:7> pues entras en este post y hay un ejemplito donde te lo muestra!

3)Aqui puntualizarte que el 16F648A no tiene ningun conversor, un amigo de este foro me pidio que le ayudase con un lm35 y tal, ya lo tengo casi listo la simulacion en PROTEUS y todo, en cuanto lo termine lo cuelgo aqui, y en ese programa se usa un convertidor externo ya que, repito, este dispositivo carece de ello.

Respecto a lo del libro, jeje es buena idea pero ando algo ajetreado para sentarme a escribir un libro!aunque ensallos y tal si que hay....tiempo al tiempo jeje

4)Bien, la instruccion que tienes problemas no deberias, revisa el pic si efectivamente el programa esta siendo compilado con el #include <16f648a.h> //pic a utilizar , si no es asi, pues dirigete a la carpeta donde este instalado en tu PC el picc(es el compilador ccs) y en la carpeta device(creo recordar que es sino en la carpeta dond estan todos los pic"s .h)busca el 16F648A y mira si esta dicho fuses, en caso de no estar es problema de la version de tu compilador(aunque me extraña).

Eso si en el programa que me has puesto (Programa: RS232 Y PIC) hay un fuse:
#fuses RC_IO //reloj interno
que esta mal!!!!jeje me he dado cuenta al postearlo tu!ese fuse no es el oscilador interno, el oscilador interno es este:
#fuses INTRC //oscilador interno
Bueno sera el copy & paste....que se me escapo ese detallito!jeje

Con respecto a las fotos en PROTEUS es buena idea peroooo imaginate que cada pagina de este post pue sno se, puede tener 5 0 6 programas, si tuviera 5 0 6 imagenes tardaria o comoe sta ultimamente el servicio de mi@rroba pues seguramente daria muchos problemas al abrir el post!por eso en los comentarios de cabecera especifico las conexiones, simplemente es por eso, para no dar mas lata al servidor que anda algo gracioso ultimamente jeje....

Y GRACIAS!!!!!por usar estos ejemplos y preguntar y tal!y no te preocupes que no me ofende tus palabras, todo lo contrario!me dan alegriay animos para seguir asi, haciendo ejemplitos de estos que tanto me valen ami para practicar y divertirme como a la gente para mirarlos y "toquetearlos" jeje !

Si tienes alguna duda mas o alguna sugerencia ya sabes!


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 #227 en: 11 de Marzo de 2006, 07:15:00 »
Buenas!!!!¿que error te genera la instruccion setup_oscillator(); ? ¿miraste en la carpeta device en la libreria del pic? es muy raro que te de ese error, en este post hay varios ejemplos con dicha instruccion y compilando perfectamente.

Con respecto al segundo perfecto, yo te diria que por hardware, mas o menos perfecto pues en asm o como te mencione anteriormente, mediante una variable o una funcion de redondeo.


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

Desconectado levisperez

  • PIC10
  • *
  • Mensajes: 5
RE: Ejemplitos en C para 16F648A
« Respuesta #228 en: 13 de Marzo de 2006, 10:49:00 »
Estoy simulando el ejemplito de juego de luces de vszener, en el cual se ejecuta el juego de luces o el coche fantastico dependiendo del estado del Pin RA0, cree mediante el stimulus controller en el Mplab 7.31 la entrada RA0 como toggle pero como hago para llamar esa ventana (la del stimulus controller) para cambiar el estado de RA0

Slds,

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #229 en: 16 de Marzo de 2006, 09:32:00 »
Buenasss!!!la verdad que nunca he usado el MPlab para simular....suelo usar el PROTEUS y despues irme a la proto...no te puedo decir, haber si empiezo a toquetear el MPlab y te digo, si lo descubres tu hazlo saber!


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

Desconectado levisperez

  • PIC10
  • *
  • Mensajes: 5
RE: Ejemplitos en C para 16F648A
« Respuesta #230 en: 16 de Marzo de 2006, 14:24:00 »
Ya lo encontré, vszener en la ventana del stimulus controller del lado izquierdo esta el boton de fire, con el cual cambias el estado del PIN

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #231 en: 23 de Marzo de 2006, 06:57:00 »
Me alegro que lo encontraras levisperez y gracias por postearlo, asi ya todos sabemos algo mas de como simular en MPlab!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #232 en: 23 de Marzo de 2006, 07:04:00 »
Buenass!!!!hacia tiempo que no posteaba ningun ejemplito asi que ya es hora!jeje bien, como bien sabemos, el 16F648A no tiene conversor A/D asi que para trabajar con medidas y tal necesitamos un chip conversor, en este caso vamos a usar uno que tiene bastante aceptacion y hay informacion en algun que otro libro, es el fabricado por Philips el PCF8591, sirve tanto como A/D y D/A, he realizado una "mini libreria" para su manejo, aqui esta:
///////////////////////////////////////////////////////////////////////////////////////////////////
///            VsZeNeR"06                     ///
///                13/Marzo/06                     ///
///             vszener@gmail.com                     ///
///                                    ///
///      Libreria: vs_pcf8591.c    Compilador: CCS                  ///   
///      Version: 0.0                           ///
///                                    ///
///      Notas: Controlador para manejo del dispositivo pcf8591            ///
///                      de Philips.                        ///
///                      Este dispositivo se encarga, mediante I2C, del tratamiento de         ///
///                  conversor A/D como D/A.                      ///
///                  Modo:                                ///
///                 ¨¨¨¨¨¨    ·D/A: 8 bits                        ///
///                        ·A/D: 8 bits con 4 entradas analogicas            ///
///                                    ///
///      Funciones:                           ///
///            MODO D/A                     ///   
///            --------                     ///
///            pcf8591_dac_init( );       -> Inicializa el dispositivo   ///
///            write_dac_value(int data);  -> Escribe el volatje a mostrar   ///
///                            por AOUT(8 bits)         ///
///            stop_dac( );          -> Para el dispositivo. Una vez   ///
///                            realizada esta opcion, para      ///
///                            a utilizar AOUT debemos       ///
///                            inicializarlo de nuevo!      ///
///            MODO A/D                     ///   
///            --------                     ///
///            pcf8591_adc_init(control);  -> Inicializa el dispositivo.   ///
///                            Debemos enviar el byte de   ///
///                            control:            ///
///            Byte de control:  0 X XX 0 X XX               ///   
///                    0 A EA 0 I NC             ///
///                                    ///
///            A: Permiso Salida analogica 0 -> AOUT alta impedancia      ///
///                         1 -> AOUT habilitada      ///
///            EA: Programacion entradas analogicas: 00 -> 4 entradas simples   ///
///                              01 -> 3 entradas dif.   ///
///                              10 -> Simples y dif   ///
///                              11 -> 2 entradas dif.    ///
///            I: Incremento 0 -> No hay autoincremento         ///
///                          1 -> Autoincremento de la entrada del A/D      ///
///            NC: Numero del canal de la entrada 00 -> Canal 0      ///
///                           01 -> Canal 1      ///
///                           10 -> Canal 2      ///
///                           11 -> Canal 3      ///
///            read_adc_value(int data);   -> Lee el volatje a mostrar      ///
///                                    ///
///      La direccion del dispositivo se configura con los pines A2A1A0, donde en este   ///
///      caso se ha elegido GND(000). Se he habilitado siempre la salida AOUT en D/A    ///
///      y deshabilitado siempre en A/D.                     ///
///////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef PCF8591_SCL               //para definir los pines de manejo del pcf8591...
#define PCF8591_SCL PIN_B0
#define PCF8591_SDA PIN_B1
#endif                     //...en caso de no ser definidos en el programa principal

#use i2c(master,sda=PCF8591_SDA, scl=PCF8591_SCL)   //i2c

/////////////MODO: D/A ///////////////////////////////////////////////////////////////////////////

void stop_dac(void){         //funcion para parar el dac
   i2c_stop( );
}

void write_dac_value(int data){      //funcion que escribe en AOUT
   i2c_write(data);         
}
   
void pcf8591_dac_init(){      //funcion para inicializar pcf8591
   output_high(PCF8591_SDA);
   output_high(PCF8591_SCL);
   i2c_start( );
   i2c_write(0b10010000);      //direccion en modo escritura  
   i2c_write(0b01000000);      //palabra de control habilitando AOUT
}

/////////////MODO: A/D ////////////////////////////////////////////////////////////////////////////

int read_adc_value(void){         //funcion para la lectura del pcf8591
   byte data;
   data=i2c_read(1);         //lee y se almacena en la variable data
   return data;            //devuelve la informacion leida
}
   
void pcf8591_adc_init(int control){      //funcion para inicializar pcf8591
   output_high(PCF8591_SDA);
   output_high(PCF8591_SCL);
   control=(0b00110111 & control);      //palabra de control correcta -> deshabilita AOUT
   i2c_start( );
   i2c_write(0b10010000);         //direccion en modo escritura  
   i2c_write(control);            //palabra de control
   i2c_stop( );

   i2c_start( );             //iniciamos comandos...
   i2c_write(0b10010001);         //...de lectura
}

Bien, pues con esta "mini libreria" trabajaremos en un par de ejemplitos!

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

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #233 en: 23 de Marzo de 2006, 07:07:00 »
Desde este enlace os podeis descargar la "mini libreria" para el manejo del pcf8591


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

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #234 en: 23 de Marzo de 2006, 07:10:00 »
Holaaa!!!he aqui un programita que maneja la libreria y el dispositivo pcf8591!, en este caso como D/A, es decir, mediante un pulsador vamos sumando un valor que sera mostrado por el pcf8591 en el pin AOUT, dicho valor es de 8 bits y se vera el encendido paulatino de un led y su tension correspondiente por dicho pin:
////////////////////////////////////////////////////////////////////////////////////
//                     VsZeNeR"06      
//                     13/Marzo/06
//
//   Programa:   Manejo del dispositivo PCF8591 en modo D/A
//   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 encendido paulatino de un diodo led
//         conectado al pcf8591 configurado para actuar como D/A.
//         La Vref es de 2,5v por lo tanto la resolucion del conversor es 10mV.
//         Al pulsar el boton se produce una interrupcion, en dicha interrupcion
//         se incrementa la variable "dato" en una unidad y se muestra por el pcf8591
//         por el pin AOUT, al ser de tipo entero dicha variable puede llegar hasta
//         255 siendo este el valor maximo que puede alcanzar la señal analogica del
//         pcf8591.
//
//         Conexiones:      B7 -> SDA pcf8591            
//                     B6 -> SCL pcf8591
//                     B0 -> Boton   
//////////////////////////////////////////////////////////////////////////////////

#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 PCF8591_SCL PIN_B6            //definicion de pines...
#define PCF8591_SDA PIN_B7            //...de manejo del pcf8591
#include <vs_pcf8591.c>               //libreria pcf8591

///DEFINICION VARIABLES GLOBALES
int dato;                     //variable de salida por AOUT                        

///LLAMADA FUNCION INTERRUPCION
#INT_EXT
void IntRB0()
{
   dato++;                     //incremento variable dato
   write_dac_value(dato);         //salida analogica AOUT
}


///PROGRAMA
void main(void)
{
   setup_oscillator(OSC_4MHZ);      //configuracion del oscilador interno a 4MHz
   
   enable_interrupts(int_ext);      //activar interrupcion externa
   ext_int_edge(H_TO_L);         //configuracion:interrupcion cuando señal esta en baja
   enable_interrupts(GLOBAL);      //activar interrupciones
   
   pcf8591_dac_init( );            //inicializamos pcf8591 en modo D/A
   
   write_dac_value(dato);         //voltaje inicial de salida 0v
   
   sleep( );                  //modo reposo hasta la interrupcion
}

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 #235 en: 23 de Marzo de 2006, 07:11:00 »
Desde este enlace os podesi descargar lo necesrio para el programa anterior: pcf8591 aout


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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Ejemplitos en C para 16F648A
« Respuesta #236 en: 24 de Marzo de 2006, 17:25:00 »
Escrito originalmente por vszener
Buenas!!! al final me he puesto manos a la obra y he realizado la animacion de carga de una bateria....jeje, para ello se diseña los caracteres de la bateria(al 0%, al 20%, al 40%, al 60%, al 80% y al 100%), decir que solamente he utilizado una posicion de memoria de la GCRAM(aunque cada animacion ocupa 8 posiciones), he ido machacando valores.......aqui el codigo:


Hola vszener, estaba estudiando este código que pusiste pero no encuentro la instrucción lcd_send_byte en la ayuda de mi compilador. Tengo la versión 3.190, tu programa dice 3.227, ¿es ese el problema? Avergonzado

Desconectado monopic

  • PIC10
  • *
  • Mensajes: 25
RE: Ejemplitos en C para 16F648A
« Respuesta #237 en: 25 de Marzo de 2006, 13:23:00 »
HOLA A TODOS EN ESPECIAL A  VZENER  Y QUIERO CONTARLE QUE YA ESTOY MANEJANDO UNA LCD GRAFICA POR MEDIO DE LA LIBRERIA GLCD DE PICC Y ESTA LA PUTERIA PERO ANTES DE SUBIR TODO ESO AL FORO QUIERO SABER COMO FUNCIONA EL PROGRAMA QUE CREARON EN EL FORO QUE CONVIERTE UNA IMAGEN EN UN VECTOR DE DATOS PARA LUEGO ENVIARLA A LA PANTALLA O TAMBIEN COMO FUNCIONA UN PROGRAMA SIMILAR QUE SE LLAMA FASTLCD QUE HACE LO MISMO PERO NI IDEA COMO SERIA PARTE DEL CODIGO........................HASTA EL MOMENTO TODO LO QUE HE APRENDIDO DEL GLCD DE PICC ME HA TOCADO APRENDER POR ENSAYO Y ERROR POR QUE EN LA RED NO SE ENCUENTRA NADA DE COMO FUNCIONA ESA LIBRERIA  SI ALGUIEN SABE POR FAVOR ESCRIBA.. GRACIAS A TODOS

Desconectado monopic

  • PIC10
  • *
  • Mensajes: 25
RE: Ejemplitos en C para 16F648A
« Respuesta #238 en: 25 de Marzo de 2006, 13:27:00 »
HOLA A TODOS EN ESPECIAL A  VZENER  Y QUIERO CONTARLE QUE YA ESTOY MANEJANDO UNA LCD GRAFICA POR MEDIO DE LA LIBRERIA GLCD DE PICC Y ESTA LA PUTERIA PERO ANTES DE SUBIR TODO ESO AL FORO QUIERO SABER COMO FUNCIONA EL PROGRAMA QUE CREARON EN EL FORO QUE CONVIERTE UNA IMAGEN EN UN VECTOR DE DATOS PARA LUEGO ENVIARLA A LA PANTALLA O TAMBIEN COMO FUNCIONA UN PROGRAMA SIMILAR QUE SE LLAMA FASTLCD QUE HACE LO MISMO PERO NI IDEA COMO SERIA PARTE DEL CODIGO........................HASTA EL MOMENTO TODO LO QUE HE APRENDIDO DEL GLCD DE PICC ME HA TOCADO APRENDER POR ENSAYO Y ERROR POR QUE EN LA RED NO SE ENCUENTRA NADA DE COMO FUNCIONA ESA LIBRERIA  SI ALGUIEN SABE POR FAVOR ESCRIBA.. GRACIAS A TODOS

271071

  • Visitante
RE: Ejemplitos en C para 16F648A
« Respuesta #239 en: 26 de Marzo de 2006, 06:24:00 »
Aqui el mismo programa del Maestro VS_ZeNeR, pero para 16f84 . Se que no es mucho , pero si a alguien le interesa.....
El circuito no tiene ninguna modificacion mas que la del cambio de pic , los pines se conectan igual(en los mismos puertos)


////////////////////////////////////////////////////////////////////////////////////
//                     VsZeNeR"06
//                     13/Marzo/06
//
//   Programa:   Manejo del dispositivo PCF8591 en modo D/A
//   Version:   0.0
//
//   Dispositivo: PIC 16F648A         Compilador:    CCS vs3.245
//   Entorno IDE: MPLAB IDE v7.31      Simulador:    Proteus 6.7sp3
//
//   Notas: Este programa muestra el encendido paulatino de un diodo led
//         conectado al pcf8591 configurado para actuar como D/A.
//         La Vref es de 2,5v por lo tanto la resolucion del conversor es 10mV.
//         Al pulsar el boton se produce una interrupcion, en dicha interrupcion
//         se incrementa la variable "dato" en una unidad y se muestra por el pcf8591
//         por el pin AOUT, al ser de tipo entero dicha variable puede llegar hasta
//         255 siendo este el valor maximo que puede alcanzar la señal analogica del
//         pcf8591.
//     Agregado (): Calculo de la resolucion de escalones de conversion 2 exp 8 = 256, entonces            
//          V de Referencia / 256 = incremento de cada escalon, en este caso
//          2.56V/256 = 10mv(resolucion del conversor)
//          Aqui se modifica el programa para usar el 16f84 (que solo lo he probado en
//               simulacion) como pueden ver he realizado
//          minimas modificaciones  algunas
//           sentencias han sido puestas tipo comentario agregándole dos barras en la
//           parte delantera. Fijense que estoy usando otra version de ccs (eso por si les
//         da algun error)
//         Conexiones:      B7 -> SDA pcf8591
//                     B6 -> SCL pcf8591
//                     B0 -> Boton
//////////////////////////////////////////////////////////////////////////////////

//#include <16f648a.h>               //pic a utilizar
#include <16f84a.h>               //pic a utilizar

#fuses XT,NOWDT,NOPROTECT,PUT      //ordenes para el programador
//#fuses INTRC                     //oscilador interno
#use delay (clock=4000000)            //Fosc=4Mhz
#define PCF8591_SCL PIN_B6            //definicion de pines...
#define PCF8591_SDA PIN_B7            //...de manejo del pcf8591
#include <vs_pcf8591.c>               //libreria pcf8591

///DEFINICION VARIABLES GLOBALES
int dato;                     //variable de salida por AOUT

///LLAMADA FUNCION INTERRUPCION
#INT_EXT
void IntRB0()
{
   dato=dato+5;                     //incremento variable dato
   write_dac_value(dato);         //salida analogica AOUT
}


///PROGRAMA
void main(void)
{
//setup_oscillator(OSC_4MHZ);      //configuracion del oscilador interno a 4MHz

   enable_interrupts(int_ext);      //activar interrupcion externa
   ext_int_edge(H_TO_L);         //configuracion:interrupcion cuando señal esta en baja
   enable_interrupts(GLOBAL);      //activar interrupciones

   pcf8591_dac_init();            //inicializamos pcf8591 en modo D/A

   write_dac_value(dato);         //voltaje inicial de salida 0v

   sleep();                  //modo reposo hasta la interrupcion
}



 

anything