Introduccion a la programacion de PICS en lenguaje C (CCS)

Iniciado por MARCO_RECARGADO, 26 Julio 2007, 17:47 PM

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

MARCO_RECARGADO

#20
Disculpen mi demora pero estuve de vacaciones y no pude conectarme en los lugares que estuve pero aqui tienen a peticion de todos como escribir en LCD


////////////////////////////////////////////////////////////////////////////////
//////////////               Practica 2                   //////////////////////
//////////////      practica que escribe en una LCD       //////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////           By MARCO RECARGADO               //////////////////////
////////////////////////////////////////////////////////////////////////////////

#include <16F877A.h>                ///   libreria para el manejo del pic16f877a
#use delay(clock=8000000)          ///   declara  la frecuencia del cristal
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT
#include <lcd.c>  // Librería para el manejo del lcd para ver las conexiones
                  // abran el archivo C:\Archivos de programa\PICC\Drivers\lcd.c
                  // y ahi les muestra.
                 
////////////////////////////////////////////////////////////////////////////////
//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
////////////////////////////////////////////////////////////////////////////////



void main(void)
{
lcd_init();  // Antes de usar el lcd,hay que inicializarlo
lcd_putc("HOLA MUNDO");    // Escribes en la lcd
}   // fin de programa






para poder meter un valor de una variable hay que escribir lo siguiente

printf(lcd_putc," %d volts  ",variable_adc);

y con esto escribes el valor de tu variable tenemos que tener cuidado en el tipo de
variable pues este ejemplo es para un tipo entero s ifuera para un tipo float tendria que ser %f y para varios mas

espero les sirva de ayuda

no se como dirigirlo a alguna celda en especifico pero voy a investigarlo
y en cuanto tenga la respuesta lo publico.
hasta pronto


"Desde muy chico tuve que interrumpir mis estudios para ir a la escuela"  Gabriel García Márquez

blackmar

me gusto la practica de lcd y aprendi bocha y hice un agregado al programa original para q entre todos entendamos un poco mas, creo q haciendo una buena rutina en c se puede manejar por espacios el display...

////////////////////////////////////////////////////////////////////////////////
//////////////               Practica 2                   //////////////////////
//////////////      practica que escribe en una LCD       //////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////           By MARCO RECARGADO               //////////////////////
////////////////////////////////////////////////////////////////////////////////

#include <16F877A.h>                ///   libreria para el manejo del pic16f877a
#use delay(clock=8000000)          ///   declara  la frecuencia del cristal
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT
#include <lcd.c>  // Librería para el manejo del lcd para ver las conexiones
                  // abran el archivo C:\Archivos de programa\PICC\Drivers\lcd.c
                  // y ahi les muestra.
                 
////////////////////////////////////////////////////////////////////////////////
//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
////////////////////////////////////////////////////////////////////////////////

int i;

void main(void)
{
lcd_init();  // Antes de usar el lcd,hay que inicializarlo
while (1){
lcd_gotoxy(5,1);
lcd_putc("Martin");    // Escribes en la lcd
delay_ms(50);
for(i=0;i<8;++i){


lcd_putc("\fM\n");
delay_ms(30);

lcd_putc("\f a\n");
delay_ms(30);

lcd_putc("\f  t\n");
delay_ms(30);

lcd_putc("\f   i\n");
delay_ms(30);

lcd_putc("\f    n\n");
delay_ms(30);
}}
}   // fin de programa

MARCO_RECARGADO

#22
Hola pues en esta ocasion la practica consiste en leer un reloj de tiempo real.
con ayuda de una libreria

////////////////////////////////////////////////////////////////////////////////
////////////ESTE PROGRAMA UTILZA EL CIRCUITO DS1307 PARA MOSTRAR LA ////////////
//////////HORA EN TIEMPO REAL A TRAVEZ DE UNOS DISPLAY´S DE 7 SEGMENTOS/////////
//////////EL PROGRAMA PARA SIMULARLO EN PROTEUS SE LLAMA RELOJ TIEMPO REAL//////
////////////////////////BY MARCO RECARGADO//////////////////////////////////////

#include <16F877A.h>                ///   libreria para el manejo del pic16f877a
#use delay(clock=8000000)          ///   declara  la frecuencia del cristal
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT
#use i2c(Master, SDA=PIN_C4, SCL=PIN_C3)
#include <ds1307.c>

int32 tiempo_real=0;
long dato_1=0;
long dato_2=0;
long dato_3=0;
long dato_4=0;
long dato_5=0;
long dato_6=0;

#use fast_io(A)
#use fast_io(B)
//#use fast_io(C)                     ///   con esta instruccion evitamos que
#use fast_io(D)                     ///   se este configurando cada vez que usamos
#use fast_io(E)                     ///   alguna instruccion de entrada o salida


#byte portc = 7                     /// se definen direcciones de memoria
#byte portd = 8


#bit portd0 = 0x08.0
#bit portd1 = 0x08.1
#bit portd2 = 0x08.2
#bit portd3 = 0x08.3
#bit portd4 = 0x08.4
#bit portd5 = 0x08.5
#bit portd6 = 0x08.6
#bit portd7 = 0x08.7

#bit portc0 = 0x07.0
#bit portc1 = 0x07.1
#bit portc2 = 0x07.2
#bit portc3 = 0x07.3
#bit portc4 = 0x07.4
#bit portc5 = 0x07.5
#bit portc6 = 0x07.6
#bit portc7 = 0x07.7


#bit dato_6a = dato_6.0
#bit dato_6b = dato_6.1
#bit dato_6c = dato_6.2
#bit dato_6d = dato_6.3

#bit dato_5a = dato_5.0
#bit dato_5b = dato_5.1
#bit dato_5c = dato_5.2
#bit dato_5d = dato_5.3

#bit dato_4a = dato_4.0
#bit dato_4b = dato_4.1
#bit dato_4c = dato_4.2
#bit dato_4d = dato_4.3

#bit dato_3a = dato_3.0
#bit dato_3b = dato_3.1
#bit dato_3c = dato_3.2
#bit dato_3d = dato_3.3


#bit dato_2a = dato_2.0
#bit dato_2b = dato_2.1
#bit dato_2c = dato_2.2
#bit dato_2d = dato_2.3

#bit dato_1a = dato_1.0
#bit dato_1b = dato_1.1
#bit dato_1c = dato_1.2
#bit dato_1d = dato_1.3

byte sec;
byte min;
byte hrs;
byte day;
byte month;
byte yr;
byte dow;


////////////////////////////////////////////////////////////////////////////////
////////funcion que manda el a desplagar informacion en los displays////////////
/////Tomese en cuenta que las conexiones de los puertos son las siguientes//////
//                               pc0=a                                        //
//                               pc1=b                                        //
//                               pc6=d                                        //
//                               pc7=c                                        //
//                               pd1=digito 6                                 //
//                               pd4=digito 5                                 //
//                               pd0=digito 4                                 //
//                               pd7=digito 3                                 //
//                               pd5=digito 2                                 //
//                               pd6=digito 1                                 //
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

void desplegar()

{

portd1=0;                       
portd4=0;
portd0=0;                        /// se inihiben los displays
portd7=0;
portd5=0;
portd6=0;


portc0=dato_6a;
portc7=dato_6b;
portc1=dato_6c;
portc6=dato_6d;



portd1=1;
portd1=0;


portc0=dato_5a;
portc7=dato_5b;
portc1=dato_5c;
portc6=dato_5d;
portd4=1;
portd4=0;


portc0=dato_4a;
portc7=dato_4b;
portc1=dato_4c;
portc6=dato_4d;
portd0=1;
portd0=0;


portc0=dato_3a;
portc7=dato_3b;
portc1=dato_3c;
portc6=dato_3d;
portd7=1;
portd7=0;


portc0=dato_2a;
portc7=dato_2b;
portc1=dato_2c;
portc6=dato_2d;
portd5=1;
portd5=0;


portc0=dato_1a;
portc7=dato_1b;
portc1=dato_1c;
portc6=dato_1d;
portd6=1;
portd6=0;

}
////////////////////////////////////////////////////////////////////////////////
//////////////////////Comienzo de la funcion principal//////////////////////////
////////////////////////////////////////////////////////////////////////////////
void main()
{

   ds1307_init();                           ///se inicializa el ds1307
   
   set_tris_a(0xff);
   set_tris_d(0x00);
   set_tris_b(0x00);
   set_tris_c(0x04);
   set_tris_e(0x01);
   port_b_pullups(true);
 
  dato_1=8;
  dato_2=8;
  dato_3=8; 
  dato_4=8;
  dato_5=8; 
  dato_6=8; 
  desplegar();
 
  // Set date for -> 15 June 2005 Tuesday
  // Set time for -> 15:20:55 (9:49:00 am)
  ds1307_set_date_time(24,4,7,2,9,49,00);   /// se escribe ne le displositivo
 
  while(1)
  {
 
    delay_ms(1000);
   
  ds1307_get_date(day,month,yr,dow);        /// se obtiene la fecha 
  ds1307_get_time(hrs,min,sec);             /// se obtiene la hora
   
   
  ////////////////////bin2bcd(sec) funcion para pasar de binario(hasta 99) a bcd
 
  ////////////////////bcd2bin(sec) funcion para pasar de bcd(hasta 99) a binario
 
  sec=bin2bcd(sec);                         
  min=bin2bcd(min);                         
  hrs=bin2bcd(hrs);     
 
  dato_1=0x0f&sec;
  dato_2=swap(0xf0&sec);
  dato_3=0x0f&min;
  dato_4=swap(0xf0&min);
  dato_5=0x0f&hrs;
  dato_6=swap(0xf0&hrs);
  desplegar();
       
  }
}
/////////////////////////////  fin de programa  /////////////////////////////////////////////







si tienen alguna duda escribanla y tratare de contestarla lo mas pronto posible, tambien si quieren algun programa en especifico aqui entre todos trataremos de hayar la solucion, espero sus comentarios hasta pronto
"Desde muy chico tuve que interrumpir mis estudios para ir a la escuela"  Gabriel García Márquez

-Xenon-



sabes algun enlace a algun buen tutorial para iniciarse en c para pic's?

tus programas de ejemplo los veo muy utiles pero si esto pretende ser una iniciacion para los que no sabemos, podrias dar algunas pistas de como empezaste tu? que manuales leiste, etc.. referencias para poder entender tus codigos de ejemplo

sabes algo del protocolo i2c? y como manejarlo con c para pic's?

gracias un saludo
Cuando el ingenio se queda pequeño,
No basta con poner empeño,
Solo el talento consigue el diseño

MARCO_RECARGADO

Por tu comentario creo que voy muy rapido. El proposito de este tutorial es que cualquiera que no sepa sobre la programacion de pics en lenguaje c aprende con estas practicas, pero ya deben tener un conocimiento sobre pics al menos en ensamblador.En dado caso que no lo tengan pues las practicas que ponga en c por muy sencillas que esten no se podran comprender.

El mejor tutorial que conozco para iniciarse en C con los PICS lo encontre en un foro de electronica, no se si este bien poner el link del foro pues pareceria que le hago publicidad, si quieres el link mandame un mensaje privado y te lo paso, de hecho es el mejor foro con respecto a pics que encontre en español. Aunque en lo personal me gustaria que trataramos de hacerlo todo aqui.

Ahora yo empece a programar pics en ensamblador (en lo que a mi respecta es lo primer paso para pics) y despues segui con lenguaje C. Pero ya tenia algunos años de experiencia en ensamblador, aun asi puedes empezar a programar en C sin tener conocimientos de pics. El primer consejo para empezar es leer el manual del pic que quieres porgramar en www.microchip.com puedes bajar los manuales de cualquier pic ahora si el ingles no es lo tuyo en la red andan circulando varias guias del PIC16F84A que es uno de los pics mas basicos ademas de que es del que hay mas informacion o si lo deseas puedes ver el manual en español pero del PIC16F877 que esta al principo de este tema. Eso es basico sin leer esos manuales no podras entender mucho, aun en ensamblador.

Con respecto a el protocolo i2c es muy facil implementarlo en C. voy a hacer un programa de ejemplo.

PD Espero haberte ayudado hasta pronto
"Desde muy chico tuve que interrumpir mis estudios para ir a la escuela"  Gabriel García Márquez

-Xenon-


gracias!, me has ayudado bastante, si puedes pasarme el link por privado o en publico como quieras, te lo agradeceria

gracias por compartir tu trabajo, un saludo
Cuando el ingenio se queda pequeño,
No basta con poner empeño,
Solo el talento consigue el diseño

skapunky

Muy buenas aportaciones, quiza algun dia ponga yo algun tuto e programas basicos en asm para electrónica.

PD: Le pondre chincheta temporal mientras tenga un minimo de actividad. Marco, buen trabajo, espero que sigas por aqui.

Saludos.
Killtrojan Syslog v1.44: ENTRAR

lu8emw

MARCO_RECARGADO te felicito vas muy bien. Uso tus ejemplos  para ir aprendiendo un poco c, ya que usualmente manejaba un poquito de basic que se me hace mas facil...pero nunca esta de mas. Te hago una pregunta: Tienes algun ejemplo en c de lectura de codigos por IR? Es decir para interpretar los controles remotos de infrarrojo, ya que la mayoria que me encontre son para alguno en especifico como la norma rc5 de phillips o la de sony..pero tambien vi un proyecto de un dimmer digital que diseño un croata, que es muy reducido y este  "aprende" los codigos de infrarrojos que le mandemos al receptor. Lo que hace es reconocer el codigo y guardarlo en la memoria de un 16f629. Lo que no puedo lograr comprender es como "interpretar" los codigos, ya que con el tema de los tiempos entre señal y señal se me hace un garabato horrible que no logro comprender. Si tienes algo pare3cido no dudes en comentarlo. Un saludo y sigue asi.

cristian77

Marco yo me consegui el css 4.058 pcwhd para dspic dime donde consigo ejemplos para programar dspic con el css ya encontre con el microCdspic.

EL Malicioso

Hola Marco_Recargado, Te agradezco tus ganas de enseñar y compartir, aunque no digo nada nuevo, siempre es bueno remarcarlo.
Yo programaba en ASM para los 8085 y probé el PIC 16F873. Ahora quiero meterle con CSS porque me quemè la cabeza para algunos proyectos grandes.
Aca va mi pregunta:
Cuando en unos de los ejemplos (16F84) ponès lo sgte

#byte PORTB = 6              //declaramos a la variable PORTB

1-asignas la dccion del puerto B a tu gusto? o es la dccion qeu la datasheet del pic establece para este modelo?
2-el 6  está en decimal o en hexa? (en este caso, si el nro es 6 en decimal, en hexa es lo mismo, pero quiero ver si la sintaxis obliga a poner 0x06 por ejemplo)
3-eso ya no està definido cuando pones #include<16F84>  ?
4-para acceder al bit 3 del puertoB deberia acceder a la dccion de memoria  6*8+3=51? o hay alguna manera ya optimizada en el CSS (soy nuevo enel CSS :-[ )

y Gracias por el aporte!!!