Muy buenas tengan todos ustedes lectores de Foros de electronica, eh bajado mucha información de este lugar y eh aprendido mucho aqui, soy estudiante de ing. electromecanica y estoy en mi segunda especialidad de Automatizacion y acabo de llevar microcontroladores. Todo esto pues quisiera compartirlo con ustedes. Estare posteando varios programas en Pic C por su simplicidad, tambien programo en Assambler y empiezon con matlab para hacer controles sofisticados para misiles y posionamiento de cosas muy complejas a las cuales no me metere (porque todavia no soy un erudito en esos temas)
Bueno el dia de hoy empezare con programas sencillos como prender y apagar un led por un pin del microcontrolador sere muy especifico en los comentarios y estare 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 aqui se comparta mucho conociento y verlo en aplicaicones reales.
Bueno sin mas por el momento empecemos: (mucho ojo con los comentarios porque ocupan muchas lineas en algunos casos para la explicacion).
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 difereentes 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 recivimos, les pasare un bootloader para estar programndo 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) //inrrupciones y el home, poque 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 tambine 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 resitencia 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
De cualquier manera el PCHW nos indicara que erroes halla en caso de que los halla pero tomen en cuanta que corrigue errores de sintaxis no de logica, por otro lado veran lo facil que son los programas ya que tambien hay que administrar la programacion para no cargar inecesariamente el pic, recordemos que por cada instruccion ocupa un ciclo de reloj y por cada salto ocupa el doble, asi que hay que hacer lo mas reducinos nuestros programas, ya veran...
En este tuto ire poniendo cada vez mas complejos (que la verdad son muy sencillos) los programas las coneciones y la imaginacion dependera de ustedes, por ejemplo para este caso se puede conectar un relevador o TRansistor para accionar alga durante unos segundos y despues apagarlo o depende de la imaginacion de cada quen, esto se vera tambien despues para controlar servomotores, es exactamente lo mismo para generar frecuencias de trabajo y posicionar nuestro servomotor.
Para los proximos programas ya no dare tanta explicacion 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 facil que lo que hace es que si presiono un boton prende un led, lo suelto se apaga. super facil 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 */
}
}
Esto es para todo el puerto pero se puede hacer mas facil solo por bits con la funcion if:
Código:
While(True)
{
if (input(pin_D0)
output_high(b0);
else
output_low(b0);
}
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.
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
Con este programita se puede hacer girar un motor a pasos conectado al puerto D con sus respecitivos 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 simultaneamente cambien la direccion de >> o << para que cambie el giro y si quieren visulizar los dos nibles cambien esto m1=m1 & 0x0F; por esto m1=m1 & 0xFF; y analicenlo para que vean porque. Tambien si cambian esto m1=m1>>1 | m1 <<3; por valores en ves de 3 por 5 o 7 veran lo que hace. Espero que les sirva.
Para los proximos programas veremos como contar el numero de veces que prede 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 proxima. (y tendran que ver la resolucion de sus motores (Usamos motores Unipolares)
O si dejo el programa bootloader para que lo cargen en su pic (este solo funciona para el 18f452, despues posteo el que esta en assambler 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.
PD.Perdon si hay faltas de ortografia.