Autor Tema: Tutorial de "Novato para Novatos" en C con ejemplos.  (Leído 11174 veces)

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

Desconectado LoPages

  • PIC10
  • *
  • Mensajes: 29
Tutorial de "Novato para Novatos" en C con ejemplos.
« en: 24 de Abril de 2009, 18:52:03 »
Hola, este sera mi primera aportación al foro que tanto ultimamente estoy volviendo loco, hace solamente 24h que he empezado con la programación de microcontroladores y me he decantado por el lenguage C ya que yo vengo de Pascal y son muy parecidos.

Estos ejemplos estan hechos para el compilador CCS, sin ningun tipo de depuración de codigo(sin mirar si se puede poner menos codigo para hacer lo mismo), no me he molestado en mejorar el codigo porque creo que cualquier novato que quiera aprender como estoy haciendo yo ahora vera mas facil empezar con codigo mas "extendido" en cantidad a la hora de empezar, dicho esto haya vamos!!.

Ire utilizando diferentes Microcontroladores a lo largo de los ejemplos, pensad que aun no los tengo hechos, por lo que tal voy haciendo voy colgandolos y que debo emparejarlo con la facultad.

Como cualquier programador que se precie se ha de empezar por el llamado "Hello World", en este caso en microcontroladores se ha de empezar por encender un led.

PRIMER EJEMPLO--> A traves de un interruptor hacer que se enciendan o no una serie de leds.


Código: [Seleccionar]
#include <16f876.h>
#fuses XT,NOWDT
#use delay( clock = 4000000 )
#BYTE TRISB= 0x86
#BYTE PORTB=0x06
#BYTE OPTION_REG=0x81

void main(void) {
   bit_clear(OPTION_REG,7);                //Se habilita el Pull-up del uC.
   TRISB=0b000001;                          //Configuramos cada uno de los pines del puerto B como salida menos el pin RB0 que lo configuramos como entrada.
   bit_clear(PORTB,1);                       //Ponemos la salida RB1 inicialmente en 0. {clear=0, set=1).
   while (1)                                      //Creamos un bucle infinito.
   {
   if (bit_test(portb,0)==1 )             //"Si RB0=1". Hacemos que "analice" si es un 0 o un 1 la salida de RB0.
      portb=0b000000;                    //Hacemos que por todos los pines del puerto B de RB1 a RB5 salga un 0. A RB0 no le afecta porque esta como salida.
   else                                         //"sino". Si la primera poposición no era cierta pasa a esta.
      portb=0b111111;                 //Hacemos que por todos los punes del puerto B de RB1 a RB5 salga un 1. A RB0 no le afecta porque esta como salida.
   }"
   }                                         //Recordar que cuando hay mas de una sentencia se ha de poner corchete al inicio y al finalizar la secuencia de sentencias "{}"



Saludos y espero que os haya sido de utilidad este primer ejemplo.
« Última modificación: 26 de Abril de 2009, 13:04:00 por LoPages »
"Nuestra carrera es puta, pero nosotros lo somos mas!!!"---->By Meroño.

Desconectado LoPages

  • PIC10
  • *
  • Mensajes: 29
Re: Tutorial de "Novato para Novatos" en C con ejemplos.
« Respuesta #1 en: 24 de Abril de 2009, 19:11:23 »
Aqui os dejo el mismo ejemplo de arriba pero con un microcontrolador de la serie 12F, mas exactamente un 12F629, ya que he ido viendo mucha gente que se asusta al ver que el nombre de los pines de I/O de estos pics cambia la nomenclatura comparado con los 16F o 18F etc....y el cambio entre una nomenclatura a otra es bien facil y sencillo, tan solo hay que mirar el datasheet y ver las diferencias y realizar pequeños cambios.

SEGUNDO EJEMPLO-->A traves de un interruptor hacer que se enciendan o no una serie de leds.

Código: [Seleccionar]
#include <12F629.h>
#fuses XT,NOWDT
#use delay( clock = 4000000 )
#BYTE TRISO= 0x85
#BYTE GPIO=0x05
#BYTE OPTION_REG=0x81

void main(void) {
   bit_clear(OPTION_REG,7);
   TRISO=0b000001;
   bit_clear(GPIO,1);
   while (1)
   {
   if (bit_test([b]gpio[/b],0)==1 )
      gpio=0b000000;
   else
      gpio=0b111111;
   }
}



Saludos!
« Última modificación: 28 de Abril de 2009, 03:52:25 por LoPages »
"Nuestra carrera es puta, pero nosotros lo somos mas!!!"---->By Meroño.

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: Tutorial de "Novato para Novatos" en C con ejemplos.
« Respuesta #2 en: 24 de Abril de 2009, 21:54:15 »
Disculpa podrias poner un ejemplo donde lo que lea el Puerto B lo mande por el Puerto A estoy usando un 16f88 y solo uso los primeros 4 bits, gracias

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Tutorial de "Novato para Novatos" en C con ejemplos.
« Respuesta #3 en: 25 de Abril de 2009, 01:23:23 »
Estos ejemplos están escritos para el compilador CCS, ¿verdad?

Desconectado LoPages

  • PIC10
  • *
  • Mensajes: 29
Re: Tutorial de "Novato para Novatos" en C con ejemplos.
« Respuesta #4 en: 25 de Abril de 2009, 11:40:40 »
Hola darck_khronos , espero que fuera esto lo que me pedias, me ha ido muy bien porque ya tenemos otro ejemplo mas :mrgreen: :-/, y algo mas que yo he aprendiendo haciendolo.

En este nuevo ejemplo se introduce una variable.


TERCER EJEMPLO-->Transportar el valor del puerto B al puerto A


Código: [Seleccionar]
#include <16f88.h>
#fuses XT,NOWDT
#use delay( clock = 4000000 )
#BYTE TRISA= 0x85
#BYTE PORTA=0x05
#BYTE TRISB= 0x86
#BYTE PORTB=0x06

signed int8 valor;                  // Configuramos la variable "valor" como un entero de 8bits con signo ("-" o "+").

void main(void){
   port_B_pullups(true);           //Activamos el Pull-up de todos los pines dle puerto B(RB0 a RB7).
   TRISB=0b11111111;           //Como en el ejemplo anterior configuramos el puerto B como entrada(RB0 a RB7).
   TRISA=0b00000;               //Configuramos el puerto A entero como salida(RA0 a RA4).

   while(1)
   {
   valor=portb;                   //Traspasamos el valor del puerto B(RB0 a RB7) a la variable "valor".
   porta=valor;                  //Traspasamos el valor de la variable "valor" al puerto A(RA0 a RA4).
   }
}   //Si poneis pulsadores en los pines del puerto B ponerlos a GND porque esta configurado con pull-up(el pin al aire da un 1).


Saludos y espero que sea de utilidad.
« Última modificación: 28 de Abril de 2009, 03:51:51 por LoPages »
"Nuestra carrera es puta, pero nosotros lo somos mas!!!"---->By Meroño.

Desconectado LoPages

  • PIC10
  • *
  • Mensajes: 29
Re: Tutorial de "Novato para Novatos" en C con ejemplos.
« Respuesta #5 en: 25 de Abril de 2009, 12:13:22 »
Hola, aqui estoy nuevamente, os dejo otro nuevo ejemplo, que como se observa la depuración es infima pero que va bien para visualizar y entender bien el codigo para novatos como yo.

En este ejemplo he quitado 2 directivas y he puesto una nueva, de esta forma te quitas 2 o 3 lineas de codigo y cambias la nomenclatura de algunos comandos.

CUARTO EJEMPLO-->Leds que se encienden de derecha a izquierda y que vuelven nuevamente a la derecha


Código: [Seleccionar]
#include <16f84a.h>                        |
#fuses XT,NOWDT                            |
#use delay( clock = 4000000 )              |------------->ESTO SON LAS LLAMADAS "DIRECTIVAS"
#BYTE OPTION_REG=0x81                      |
#use standard_io(B)                |

void main(void){
   bit_clear(OPTION_REG,7);
   output_B(0b00000000);                           //Ponemos  el puerto B a 0 (RB0 a RB7).
   while(true)                                                   //Entramos en un bucle infinito.
  {                                                                      
   output_high(pin_b0);                             //Hacemos que por RB0 tengamos un 1.
   delay_ms(100);                                         //Creamos un retraso de 100ms entre encendido y apagado de la sucesión.
   output_low(pin_b0);                             //Hacemos que por RB0 tengamos un 0.
   output_high(pin_b1);
   delay_ms(100);
   output_low(pin_b1);
   output_high(pin_b2);
   delay_ms(100);
   output_low(pin_b2);
   output_high(pin_b3);
   delay_ms(100);
   output_low(pin_b3);
   output_high(pin_b4);
   delay_ms(100);
   output_low(pin_b4);
   output_high(pin_b5);
   delay_ms(100);
   output_low(pin_b5);
   output_high(pin_b6);
   delay_ms(100);
   [output_low(pin_b6);
   output_high(pin_b7);
   delay_ms(100);
   output_low(pin_b7);
   output_high(pin_b6);
   delay_ms(100);
   output_low(pin_b6);
   output_high(pin_b5);
   delay_ms(100);
   output_low(pin_b5);
   output_high(pin_b4);
   delay_ms(100);
   output_low(pin_b4);
   output_high(pin_b3);
   delay_ms(100);
   output_low(pin_b3);
   output_high(pin_b2);
   delay_ms(100);
   output_low(pin_b2);
   output_high(pin_b1);
   delay_ms(100);
   [output_low(pin_b1);
   }
}


Saludos!!! :-/
« Última modificación: 28 de Abril de 2009, 03:45:01 por LoPages »
"Nuestra carrera es puta, pero nosotros lo somos mas!!!"---->By Meroño.

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Tutorial de "Novato para Novatos" en C con ejemplos.
« Respuesta #6 en: 25 de Abril de 2009, 13:28:50 »
gracias por tu aporte  :-/ :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado LoPages

  • PIC10
  • *
  • Mensajes: 29
Re: Tutorial de "Novato para Novatos" en C con ejemplos.
« Respuesta #7 en: 25 de Abril de 2009, 21:48:04 »
Hola, buenas madrugadas....despues de unas 2 horas peleandome con el CCS(programa compilador C) he conseguido tener un nuevo ejemplo!! :mrgreen:
Esta vez ya me adentro en el control de una pantalla LCD, aunque de forma bastante basica.
Para poder hacer funcionar este ejemplo he creado en Proteus 7.2 SP6 el montaje para que podais probar el codigo, ademas os adjunto la libreria (lcd.c) de CCS pero modificada para poder utilizar el lcd por el puerto B de cualquier microcontrolador, de fabrica viene para el puerto D.



QUINTO EJEMPLO-->Escribir en una LCD el texto que uno quiera que aparezca de dos formas diferentes, repitiendose infinitas veces

Código: [Seleccionar]
#include <16f84a.h>
#fuses XT,NOWDT,NOPROTECT
#use delay( clock = 4000000 )
#include <lcda.c>                        //Aqui introducimos la libreria de control de la LCD


void main(void){
   while(1){                                           //Iniciamos un bucle infinito
   lcd_init();                                //Se inicializa la LCD.
   lcd_putc("\fTutorial");              //Primeramente limpiamos la pantalla(\f) y seguidamente escribimos por pantalla (Tutorial).
   delay_ms(200);
   lcd_putc("\f'Novato");           //Igual que antes pero escribimos por pantalla ('Novato).
   delay_ms(200);
   lcd_putc("\fpara");                 //Igual que antes pero escribimos por pantalla (para).
   delay_ms(200);
   lcd_putc("\fNovatos'");          //Igual que antes pero escribimos por pantalla (Novatos').
   delay_ms(200);
   lcd_putc("\fTutorial");           
   delay_ms(200);
   lcd_putc("\f'Novato");
   delay_ms(200);
   lcd_putc(" para");             //Aqui ya no borramos la pantalla por lo que se quedara de antes ('Novato) y ademas escribiremos seguido (para).
   delay_ms(200);
   lcd_putc("\nNovatos'");      //Aqui ya no borramos la pantalla por lo que quedara de antes ('Novato)(para) y ademas escribiremos en la linea de abajo(\n) (Novatos').
   delay_ms(300);
   lcd_putc("\f   <<TODOPIC>>");    //Borraremos todo lo anterior (\f) y escribiremos (<<TODOPIC>>).
   delay_ms(500);
   }
}


Para que todo os funcione bien debeis insertar en la misma carpeta donde tengais el codigo del archivo .c  el archivo lcda.c antes de darle a compilar




Saludos y espero que os sea de interes.

PD:Micro_cadaver de nada!!! no se puede pedir sin despues no dar algo a cambio, y para mi es un placer aportar aunque sea esta pequeña cosa al foro. ;)
« Última modificación: 28 de Abril de 2009, 03:41:00 por LoPages »
"Nuestra carrera es puta, pero nosotros lo somos mas!!!"---->By Meroño.

Desconectado LoPages

  • PIC10
  • *
  • Mensajes: 29
Re: Tutorial de "Novato para Novatos" en C con ejemplos.
« Respuesta #8 en: 26 de Abril de 2009, 11:45:15 »
Hola, aqui estoy de nuevo....me he peleado duramente con un libro de CCS de la facultad y con el keypad(teclado matricial), pero finalmente he conseguido saber utilizarlo!!! por lo que aqui teneis otro nuevo ejemplo.

Apartir de hoy y durante 1 semana es posible que me sea imposible poder tener algun ejemplo mas, ya que tengo cercano un examen de ecuaciones diferenciales y un proyecto de diseño de un ADC para la facultad.


SEXTO EJEMPLO-->Mostrar por LCD la tecla presionada en el Teclado

Código: [Seleccionar]
#include <16f877.h>
#fuses XT,NOWDT
#use delay( clock = 4000000 )
#include <lcd.c>
#include <kbda.c>    //Libreria modificada para poder manejar el teclado por el puerto B dejando libre el puerto D para el LCD.

char tecla;               //Variable configurada en "caracter de 8bits".

void main(void){
kbd_init();                                         //Se inicializa la libreria del teclado.
lcd_init();                                         //Se inicializa la libreria del LCD.
port_b_pullups(true);                       

   for( ; ; ){                                    //Creamos un bucle infinito
   do{ 
   tecla=kbd_getc();                      //Traspasamos el valor de la tecla presionada a la variable "tecla".
      }while(tecla==0);                    //"Mientras la variable "tecla" sea igual a 0 activara los comandos siguiente.
      {
      if (tecla=='*')                         //Si la variable "tecla" es "*".
      lcd_putc('\f');                         //Borra todo lo que este en pantalla.
      else
      lcd_putc(tecla);                     //Escribe por pantalla el valor de la variable "tecla" que sera la tecla presionada, menos la tecla "*".
      }
   }
}


He utilizado el puerto D para la LCD y el puerto B para el teclado, aunque segun he leido configurando la libreria kbd.c y lcd.c se puede cambiar el puerto a utilizar.

Adjunto el montaje de este ejemplo para Proteus.



Saludos y espero poder traer mas ejemplos por mi parte.


PD:Dar las gracias a "Vszener" por la ayuda que me han dado sus codigos de ejemplo.
« Última modificación: 28 de Abril de 2009, 03:42:06 por LoPages »
"Nuestra carrera es puta, pero nosotros lo somos mas!!!"---->By Meroño.

Desconectado caracasnet

  • PIC10
  • *
  • Mensajes: 3
Re: Tutorial de "Novato para Novatos" en C con ejemplos.
« Respuesta #9 en: 18 de Septiembre de 2009, 12:52:38 »
Saludos a todos
Ok aqui si les habla un novato novato...
Estoy apenas nutriendome de toda esta informacion suya sobre C para PIC que me parece genial, he seguido distintas instrucciones en el foro y he progresado en mi entendimiento de los Microcontr. gracias a ustedes.

Ahora llegué a un punto practico muy divertido para mi y me he encontrado con una duda operativa por asi decirlo.

Creo entender bien que los .h son las librerias necesarias para cada pic o cualquier otra libreria que necesite para mi programa.
Si yo necesito una libreria especifica para mi proyecto la creo y la llamo desde el .c como un .h
Pero tratando de usar sus ejemplos encuentro usan las librerias de los P18xxxx.h, y en un principio pense que el MPLAB las tenia y no es asi.
Bien, aqui va la duda:
Deberia tenerla ?
Deberia crearla ?
Bajo cualquiera de internet y la coloco en mi proyecto ?

Ayundenme por favor a aclarar esta duda porque siempre consigo ejemplos donde hacen referencia a ellas pero no las muestran o comentan de donde sacarlas.
Hasta ahora mi compilador dice Error[000] C:\.......  Cannot open include file "p18f2525.h"

Muchisimas gracias por su atencion espero pasada esta duda JUGAR bastante con esto.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tutorial de "Novato para Novatos" en C con ejemplos.
« Respuesta #10 en: 18 de Septiembre de 2009, 21:49:03 »
Hola, eso puede pasar si usas comillas en vez de <>.

Al usar comillas el compilador busca el archivo en el mismo directorio en donde está el archivo principal. Al usar <> el compilador busca el archivo en las librerías generales del compilador.

Cámbialo por <> y quítale la P y nos cuentas.

#include <18f2525.h>

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Tutorial de "Novato para Novatos" en C con ejemplos.
« Respuesta #11 en: 19 de Septiembre de 2009, 14:54:45 »
Te felicito LoPages, ánimo a seguir peleando  :)

... sin ningun tipo de depuración de codigo(sin mirar si se puede poner menos codigo para hacer lo mismo), no me he molestado en mejorar el codigo porque creo que cualquier novato que quiera aprender como estoy haciendo yo ahora vera mas facil empezar con codigo mas "extendido" en cantidad a la hora de empezar...

esa es mi filosofía, primero hacer que funcione, luego entenderlo, y después mejorarlo  :lol:

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado caracasnet

  • PIC10
  • *
  • Mensajes: 3
Re: Tutorial de "Novato para Novatos" en C con ejemplos.
« Respuesta #12 en: 19 de Septiembre de 2009, 20:41:38 »
Muchas gracias por la ayuda.
Pero aun sigo con el problemita, si estaba usando los <> pero con la P en el .h
Hice lo que me sugirieron pero aun me da el mismo error.

Executing: "C:\HTSOFT\PIC18\BIN\PICC18.EXE" -C -E"tercero.cce" "C:\HTSOFT\PIC18\bin\tercero.c" -O"tercero.obj" -Zg9 -O -ASMLIST -Q -MPLAB -18F2525
Error[000] C:\HTSOFT\PIC18\bin\tercero.c 2 : Cannot open include file "18f2525.h"
Halting build on first failure as requested.
BUILD FAILED: Sat Sep 19 19:00:42 2009

He seguido viendo por los foros y hago la siguiente pregunta: existe la posibilidad de que este mal instalado algo ? MPLAB o HTPIC ?

Coloco el codigo que estaba usando para aprender que es de "micro_cadaver" de aqui del foro, es para prender un LED, pensaba aprender con este porque es PIC 18 y no 16, pero como ven me he quedado en el aparato con este error.

#include <p18f2525.h>
#include <stdio.h>
#pragma config OSC = XT,FCMEN = OFF,IESO = OFF //CONFIG1H
#pragma config PWRT = ON,BOREN = OFF,BORV = 0 //CONFIG2L
#pragma config WDT = OFF,WDTPS = 32768 //CONFIG2H
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = PORTC//CONFIG3H
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF//CONFIG4L
#pragma config CP0 = ON,CP1 = ON,CP2 = ON//CONFIG5L
#pragma config CPB = ON,CPD = ON//CONFIG5H
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON//CONFIG6L
#pragma config WRTB = ON,WRTC = ON,WRTD = ON//CONFIG6H
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON//CONFIG7L
#pragma config EBTRB = ON//CONFIG7H
 
void main(void){
   TRISA = 0X00;
   TRISB = 0X00;
   TRISC = 0X00;
//*******************************************************
//*******************************************************
   LATA = 0X01;
   LATB = 0X01;   
   LATC = 0X01;
   while (1);
//*******************************************************
//*******************************************************
}
 
Muchisimas gracias por su ayuda, me encanta jugar con esto y estoy un poco molesto porque seguro es un error tonto.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tutorial de "Novato para Novatos" en C con ejemplos.
« Respuesta #13 en: 20 de Septiembre de 2009, 00:17:29 »
Los ejemplos de este tema están hechos para el compilador CCS, es recomendable que leas el tema completo antes de publicar una duda.

Será mejor que busques en el foro ejemplos con el compilador hitech.

Desconectado caracasnet

  • PIC10
  • *
  • Mensajes: 3
Re: Tutorial de "Novato para Novatos" en C con ejemplos.
« Respuesta #14 en: 20 de Septiembre de 2009, 12:23:05 »
Pido disculpas, no sabia que el lenguaje C cambiaba de acuerdo al compilador, mis tutoriales nunca dijeron eso, por lo menos ahora se la diferencia entre usar <> y comillas para las librerias.
Gracias


 

anything