TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: LoPages 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.
#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.
-
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.
#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!
-
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
-
Estos ejemplos están escritos para el compilador CCS, ¿verdad?
-
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
#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.
-
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
#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!!! :-/
-
gracias por tu aporte :-/ :-/
-
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
#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. ;)
-
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
#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.
-
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.
-
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>
-
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:
-
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.
-
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.
-
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
-
Hola lopage o cual quier miembro del foro ,soy nuevo en este foro pero quiero pedirle una gran favor descarado necesito un programa en c en donde lea los datos del puerto serial y los desplegue en una matriz 5x28 , la verdad no tengo idea de programar en c , siempre he trabajado con assembler , disculpa x descarado pero la verdad me urge , muchas gracias y en espera de pronta respuesta Dios los bendiga
-
Hola lopage o cual quier miembro del foro ,soy nuevo en este foro pero quiero pedirle una gran favor descarado necesito un programa en c en donde lea los datos del puerto serial y los desplegue en una matriz 5x28 , la verdad no tengo idea de programar en c , siempre he trabajado con assembler , disculpa x descarado pero la verdad me urge , muchas gracias y en espera de pronta respuesta Dios los bendiga
Seee! Realmente descarado! :mrgreen: Lo mejor y más lindo es ir aprendiendo como se hacen las cosas ;-)
-
Si tu fuerte es el asm como lei en otro post, puedes hacerlo tranquilamente.
Pero no creo que ningun compañero del foro se ponga a hacerlo por ti. Si tienes experiencia en asm debes poder congigurar tranquilamente el port serial para que reciba datos, puedes leerlo por interrupciones o simplemente leyendo la bandera de buffer lleno. Una vez tienes el dato el resto es relativamente simple, y como te dijeron en el otro post hay mucha info en el foro que puedes usar.
Pero hecho a medida ni los sombreros vienen :D :D :D
Saludos.