Muy buenas tengan todos ustedes lectores de Foros de electrónica, eh bajado mucha información de este lugar y eh aprendido mucho aquí, soy estudiante de ing. electromecánica y estoy en mi segunda especialidad de Automatización y acabo de llevar microcontroladores. Todo esto pues quisiera compartirlo con ustedes. Estaré publicando varios programas en Pic C por su simplicidad, también programo en Assembler y empiezo con matlab para hacer controles sofisticados para misiles y posicionamiento de cosas muy complejas a las cuales no me meteré (porque todavía no soy un erudito en esos temas)
Bueno el día de hoy empezare con programas sencillos como prender y apagar un led por un pin del microcontrolador seré muy especifico en los comentarios y estaré trabajando con el pic 18f452 i/p , claro a lo largo del tuto sabras que en pic C y sabiendo leer los datasheets (hojas de datos) cualquier pic lo hacen jalar. OJO, me perdonaran que ponga los programas ya hechos, ya que esto es antietico porque ustedes deben de pensar para hacer las cosas, pero espero que aquí se comparta mucho conocimiento y verlo en aplicaciones reales.
Bueno sin mas por el momento empecemos: (mucho ojo con los comentarios porque ocupan muchas lineas en algunos casos para la explicación).
1.- //Programa para prender y apagar un led sin timer.
De cualquier manera el PCHW nos indicara que errores halla en caso de que los halla pero tomen en cuanta que corrige errores de sintaxis no de lógica, por otro lado verán lo fácil que son los programas ya que también hay que administrar la programación para no cargar innecesariamente el pic, recordemos que por cada instrucción ocupa un ciclo de reloj y por cada salto ocupa el doble, así que hay que hacer lo mas reducidos nuestros programas, ya verán...
En este tutorial iré poniendo cada vez mas complejos (que la verdad son muy sencillos) los programas las conexiones y la imaginación dependerá de ustedes, por ejemplo para este caso se puede conectar un relevador o transistor para accionar alga durante unos segundos y después apagarlo o depende de la imaginación de cada quien, esto se vera también después para controlar servomotores, es exactamente lo mismo para generar frecuencias de trabajo y posicionar nuestro servomotor.
Para los próximos programas ya no daré tanta explicación solo esta vez para entender lo que estamos usando, ya cuando salgan cosas nuevas la explicare en su momento.
2.- Ahora pongo el programa mas fácil que lo que hace es que si presiono un boton prende un led, lo suelto se apaga. super fácil pero funcional.
Esto es para todo el puerto pero se puede hacer mas fácil solo por bits con la función if:
Depende de su uso.
3.- El siguiente programa es para hacer corrimientos en los puertos, yo los uso mucho para controlar motores a pasos, este programa va a controlar el nible bajo el alto es lo mismo.
Me voy a evitar todo lo anterior ya saben que es lo que va.
Con este programita se puede hacer girar un motor a pasos conectado al puerto D con sus respectivos transistores yo uso los TIP 125 por aguantar mucha corriente, son tipo darlington y estan protegidos internamente. recuerden que es el nible bajo D0, D1, D2, D3. estos van a las bases de los transistores. WUA eso no lo tengo que explicar.
Experimenten con este programa y pueden controlar 2 motores a pasos simultáneamente cambien la dirección de >> o << para que cambie el giro y si quieren visualizar los dos nibles cambien esto m1=m1 & 0x0F; por esto m1=m1 & 0xFF; y analicenlo para que vean porque. También si cambian esto m1=m1>>1 | m1 <<3; por valores en ves de 3 por 5 o 7 verán lo que hace. Espero que les sirva.
Para los próximos programas veremos como contar el numero de veces que prende y apaga los led en los corrimientos esto para hacer que los motores a pasos lleguen hasta cierto punto y se paren. quiere decir que si le pongo 50, solo va a hacer 50 pasos el motor. Esto para la próxima. (y tendrán que ver la resolución de sus motores (Usamos motores Unipolares)
O si dejo el programa bootloader para que lo carguen en su pic (este solo funciona para el 18f452, después publico el que esta en assembler para que modifiquen el bootloader y lo usen para cualquier pic de la serie 18F, sorry no tengo para otros, pero si buscan en la red encontraran para varios pics, incluso en el PCHW, en uno de los ejemplos viene uno, no lo eh calado pero chance y funcione, Chequenlo) yo lo mando en hexadecimal para que lo carguen de volada.
Bueno el día de hoy empezare con programas sencillos como prender y apagar un led por un pin del microcontrolador seré muy especifico en los comentarios y estaré trabajando con el pic 18f452 i/p , claro a lo largo del tuto sabras que en pic C y sabiendo leer los datasheets (hojas de datos) cualquier pic lo hacen jalar. OJO, me perdonaran que ponga los programas ya hechos, ya que esto es antietico porque ustedes deben de pensar para hacer las cosas, pero espero que aquí se comparta mucho conocimiento y verlo en aplicaciones reales.
Bueno sin mas por el momento empecemos: (mucho ojo con los comentarios porque ocupan muchas lineas en algunos casos para la explicación).
1.- //Programa para prender y apagar un led sin timer.
Código:
#include <18F452.h> //Libreria del pic a usar aqui se pondra el pic que se usara de aqui que dependera la configuracion de los puertos y de los bytes
#fuses HS,NOWDT,NOPROTECT,NOLVP //tipo de cristal externo high speed, perro guardian off, sin proteccion etc..
#use delay(clock=20000000) //Cristal de 20 Mhz leer datasheet para conexión de capacitores se puede usar diferentes cristales ver datasheet una vez mas
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //declaro esta libreria ya que usaremos mas adelante la comunicacion serial del pic, la explico de una vez, el pin Rc6 (patita 25 del pic) sera la de transmision y la Rc7 de recepcion (patita 26) estas van conectadas a un max 232 que aqui en el foro encontraran su conexión, a una velocidad de 9600 baudios esto se vera mas adelante para la configuracion de la PC y del monitor que viene incluido en el programa (Pic C compiler PCHW) para ver lo que transmitimos y recibimos, les pasare un bootloader para estar programando directamente del PC sin necesidad de programar con tarjetas (esto lo explico mas adelante)
#build (reset=0x200) //Como usaremos un programa interno para programar jeje tenemos que mover el reset las
#build (interrupt=0X208) //interrupciones y el home, porque el bootloader ocupa sus lugares establecidos y estas tres lineas
#ORG 0X0000, 0X01FF //son para eso, para cambiar de banco al y que no se nos pierda el pic al funcionar.
void BOOTLOADER() { //Esta subrrutina es solo para evitar el programa del bootloader cada vez que programemos
#ASM
NOP
#ENDASM
}
#byte PORTA= 0XF80 //Aqui nombramos loa puertos en mi caso yo les puse PORTA PORTB etc, pero ustes les pueden
#byte PORTB= 0XF81 //poner el nombre que quieran las direcciones de cada micro vienen el datasheet
#byte PORTC= 0XF82 // por eso muy importante leerlo para que no vallan a usar estas para todo pic que se les ocurra
#byte PORTD= 0XF83 //hay que leer antes de hacer.
#byte PORTE= 0XF84
void main(){ //En esta parte sera la declaracion de variables configuracion de puertos y configuracionde mas cosas como timers, ADC, pwm, entre otras cosas.
set_tris_B(0xff); /*Configuracion de puertos , a mi me gusta mucho hacerlo de forma hexadecimal pero para los que no saben explicare como se sacan los valores, ya que tambien se puede poner en binario.
Los puertos son de 8 patitas (1 byte u ocho bits) y se dividen en nibles (alto y bajo) para sacar la conversion hexadecimal yo lo hago de la siguiente manera (ya despues lo haran mentalmente):
Nible alto Nible bajo (pensando para puerto A)
A7 A6 A5 A4 A3 A2 A1 A0 (es como se acomodan los puertos en los nibles)
8 4 2 1 8 4 2 1 (estos son los valores decimales para los bits)
0 0 0 0 0 0 0 0 (este sera el valor binario para los bits "0" significa output "1" sera input)
0 0 (el valor hexadecimal para este sera 0x00)
8 4 2 1 8 4 2 1 (Ahora por el puerto A yo quiero que A0, A1, A5 y A7 sean entradas y los demas salidas)
1 0 1 0 0 0 1 1 (el codigo binario seria 0b1010011)
A 3 (Como sabemos en hexadecimal A=10 si sumamos 8+2=10 para la conversion de decimal a Hexadecimal tenemos A en el nible alto y 3 para el nible bajo 1+2=3, para eso sirven el 8 4 2 1) espero sea claro porque es muy tedioso explicar esto. */
set_tris_D(0x00); //Todos D como salida
set_tris_C(0x80); //Pin C7 como entrada y todos los demas como salida por la transmision serial
while(1){ //Aqui empezamos el programa While(True) es lo mismo para que simpre se cicle el programa
output_high(pin_D0); //Aqui lo que decimos es que nos mande a 1 o prenda el pin D0 en el cual esta conectado el led con su respectiva resistencia de 330 ohms
delay_ms(100); //Con una duracion de encendido de 100 milisegundos (ms) para nano micro segundos sera (us)
output_low(pin_D0); //Ahora lo apagamos mandandolo a 0
delay_ms(100); //Con una duracion en bajo de 100 ms tambien.
}
}//Cerramos todos los corchetes que hallamos abierto
En este tutorial iré poniendo cada vez mas complejos (que la verdad son muy sencillos) los programas las conexiones y la imaginación dependerá de ustedes, por ejemplo para este caso se puede conectar un relevador o transistor para accionar alga durante unos segundos y después apagarlo o depende de la imaginación de cada quien, esto se vera también después para controlar servomotores, es exactamente lo mismo para generar frecuencias de trabajo y posicionar nuestro servomotor.
Para los próximos programas ya no daré tanta explicación solo esta vez para entender lo que estamos usando, ya cuando salgan cosas nuevas la explicare en su momento.
2.- Ahora pongo el programa mas fácil que lo que hace es que si presiono un boton prende un led, lo suelto se apaga. super fácil pero funcional.
Código:
#include<18f452.h>
#fuses hs,nowdt, noprotect,no lvp
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#build(reset=0x200)
#build(interrupt=0x208)
#org 0x0000,0x01ff
void bootloader()
{
#asm
nop
#endasm
}
#byte portA=0xF80
#byte portB=0xF81
#byte portC=0xF82
#byte portD=0xF83
#byte portE=0xF84 //Hasta aqui lo de siempre
void main()
{
set_tris_B(0xFF);
set_tris_D(0x00);
set_tris_C(0x80);
portD=0;
portB=1;
while(1)
{
portD=portB; /*Si presiono un boton en el puerto D; recuerden que los botones van con una resistencia pull-up o pull-down depende del valor que quieran asegurar (1 o 0 sea el caso), me madara el valor al puerto B prendiendo el led que este ahi, ojo si pongo el boton en D0 el led tendra que ir en B0 */
}
}
Código:
While(True)
{
if (input(pin_D0)
output_high(b0);
else
output_low(b0);
}
3.- El siguiente programa es para hacer corrimientos en los puertos, yo los uso mucho para controlar motores a pasos, este programa va a controlar el nible bajo el alto es lo mismo.
Me voy a evitar todo lo anterior ya saben que es lo que va.
Código:
void main()
{
int m1=16; /*Declaramos variable tipo entero (int) recuerden que solo llega hasta 255 porque es un pic de 8 bits y la igualamos a 16*/
set_tris_D(0x00); //Configuracion de puertos
PortD=0; //Limpiamos el pueto para que no halla basura
while(1)
{
PortD=m1; /*El puerto D es = a 16 o sea que estan todos los led apagados en 15 todos estarian prendidos la explicacion es precido a la de la configuracion de los puertos*/
delay_ms (500); //REtardo de medio segundo entre led y led
m1=m1>>1 | m1 <<3; /*Logica del programa esto >> significa que corra hacia la derecha y << hacia la izquierda lo que le digo yo es que recorra 1 y que el sume tres pa el otro lado: con manzanas:
0 0 0 0 0 0 0 0 (asi empiezo) int =16 me dice que le ponga 1 y que le quite 3 recordemos que son corrimientos
1 0 0 0 0 0 0 0 (le puse hacia la derecha)
1 0 0 0 1 0 0 0 (ahora mas 3 hacia la izq) se pone ahi el 1 porque recuerden que estamos en 16 no en 15. y volvera a hacer lo mismo*/
m1=m1 & 0x0F; /*Todo el nible bajo lo multiplico por 1 1 1 1 para que me gurde el dato para el siguiente, si no les convece hagan las operaciones y veran que si da.*/
} //Cerramos todo
Experimenten con este programa y pueden controlar 2 motores a pasos simultáneamente cambien la dirección de >> o << para que cambie el giro y si quieren visualizar los dos nibles cambien esto m1=m1 & 0x0F; por esto m1=m1 & 0xFF; y analicenlo para que vean porque. También si cambian esto m1=m1>>1 | m1 <<3; por valores en ves de 3 por 5 o 7 verán lo que hace. Espero que les sirva.
Para los próximos programas veremos como contar el numero de veces que prende y apaga los led en los corrimientos esto para hacer que los motores a pasos lleguen hasta cierto punto y se paren. quiere decir que si le pongo 50, solo va a hacer 50 pasos el motor. Esto para la próxima. (y tendrán que ver la resolución de sus motores (Usamos motores Unipolares)
O si dejo el programa bootloader para que lo carguen en su pic (este solo funciona para el 18f452, después publico el que esta en assembler para que modifiquen el bootloader y lo usen para cualquier pic de la serie 18F, sorry no tengo para otros, pero si buscan en la red encontraran para varios pics, incluso en el PCHW, en uno de los ejemplos viene uno, no lo eh calado pero chance y funcione, Chequenlo) yo lo mando en hexadecimal para que lo carguen de volada.
Última edición por un moderador: