0% encontró este documento útil (0 votos)
116 vistas5 páginas

Programacion en Pic C Compiler

Este documento contiene tres programas en C para PICs. El primero enciende y apaga un LED cada 100 ms. El segundo enciende un LED cuando se presiona un botón y lo apaga al soltarlo. El tercero hace corrimientos en el puerto D para controlar motores a pasos, moviendo el bit menos significativo hacia la derecha y sumando 3 a la izquierda cada 500 ms.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
116 vistas5 páginas

Programacion en Pic C Compiler

Este documento contiene tres programas en C para PICs. El primero enciende y apaga un LED cada 100 ms. El segundo enciende un LED cuando se presiona un botón y lo apaga al soltarlo. El tercero hace corrimientos en el puerto D para controlar motores a pasos, moviendo el bit menos significativo hacia la derecha y sumando 3 a la izquierda cada 500 ms.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 5

1.- //Programa para prender y apagar un led sin timer.

#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

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.

#include<18f452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#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 */
}
}

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

#include<18f452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#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()
{

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

También podría gustarte