viernes, 11 de octubre de 2013
Un PIC tiene terminales de entrada/salida divididos en puertos, cada puerto se puede comportar como entrada/salida por ejemplo el PIC 16f628a cuenta con 2 puertos el A y B, en la figura se muestra que el puerto A consta de 8 terminales (RA0,.......,RA7) y el puerto B tambi茅n consta de 8 terminales (RB0,.........,RB7). Por lo regular en el puerto A solo se utilizan 5 pines ya que en el RA6 y RA7 se coloca el cristal externo (aunque este PIC cuenta con un cristal interno), adem谩s en el puerto RA5 es utilizado para resetear el PIC.
Existen PICs con mayor numero de puertos como el 18f4550 que cuenta con los puertos A, B, C, D y E.
¿Como habilitar los puertos como entrada o salida?
La habilitaci贸n como entrada o salida se realiza a trav茅s del registro TRISx. Para saber en que direcci贸n se sit煤an el TRIS y PORT en la memoria solo hay que checar el datasheet de cada PIC ya que en algunos casos la direcci贸n tiende a cambiar seg煤n el PIC.
En la figura se muestra el datasheet del PIC 16f628a y se observa las direcciones de los puertos A y B.
Cuales son:
PORTA=05h,
PORTB=06h.
NOTA: la h indica que se encuentra en hexadecimal.
En CCS se puede manipular los puertos a trav茅s de la RAM, para esto se
deben definir los registros PORTx y TRISx como bytes y se sit煤an en la
posici贸n correspondiente a la memoria RAM. La directiva utilizada de C
es #BYTE.
#BYTE porta=0x05 // variable porta en 05h
#BYTE portb=0x06 // variable portb en 06h
#BYTE trisa= 0x85 // variable trisa en 85h
#BYTE trisb= 0x86 // variable trisb en 86h
NOTA: en CCS se utilizan las // para escribir comentarios.
Una vez definidas las direcciones de los PORTx y los TRISx se pueden configurar los puertos a trav茅s de los TRISx.
TRISA=0b11111 //indica que el RA0, RA1, RA2, RA3 y RA4 se ocupan como entradas.
TRISB=0b00001111// indica que RB0 al RB3 se ocupan como entradas y del RB4 al RB7 como salidas.
NOTA: Para asignar a un puerto como entrada se debe de adjudicarle un 1 y para una salida un cero. Para ocupar c贸digo binario en CCS se utiliza el c贸digo 0b antes de los bits.
PORTB=0b00011010// saca por el RB1, RB3 y RB4 un uno y por el RB0, RB2, RB5, RB6 y RB7 saca un cero.
PORTD=0x00// pon en cero el puerto d.
Ejemplo:
#include <16f628a.h> //llamado del fichero donde se especifican las caracter铆sticas del PIC
#fuses xt,nowdt //tipo de cristal a utilizar #use delay (clock=4000000)//reloj de 4Mhz
#byte trisa=0x85 //direcci贸n del trisa en la memoria
#byte trisb=0x86
#byte porta=0x05
#byte portb=0x06
void main(){ //funci贸n principal
trisa=0b10100; //RA0,RA1 y RA3 como salida, el RA2 y RA4 como entrada
trisb=0b00000000;//todo el puerto B como salida
portb=0x00; //se pone el puerto B en cero
while(true){ //buncle infinito
portb=0b01010101; //RB0,RB2,RB4 y RB6 se ponen en uno, RB1,RB3,RB5 y RB7 se ponen en 0
porta=0b01011; //RA0,RA1 y RA3 se ponen a 1, RA2 y RA4 se ponen a 0
}
}
Existen unas funciones de C que permiten trabajar bit a bit con los registros o variables definidas previamente. Estas funciones son las siguientes:
bit_clear(var,bit);//pone a 0 el bit especifico (0 a 7) de la variable.
bit_set(var,bit); //pone a 1 el bit especifico (0 a 7) de la variable.
bit_test(var,bit); //muestra el bit especifico (0 a 7) de la variable.
ejemplo:
bit_clear (portb,0);// saca un 0 en la terminal RB0.
bit_set (portb,2);// saca un 1 en la terminal RB2.
NOTA:el bit_test se utilizara mas adelante cuando esplique sobre el if.
Para poder sacar un retardo en CCS solo se utiliza el comando:
delay_ms(100);// saca un retardo de 100 milisegundos.
delay_us(100); //saca un retardo de 100 microsegundos.
con toda esta informaci贸n podemos realizar nuestro primer proyecto.
PROYECTO 1 SEM脕FORO
#include <16f84a.h> //llamado del fichero donde se especifican las caracter铆sticas del PIC
#fuses xt,nowdt //tipo de cristal a utilizar#use delay (clock=4000000)//reloj de 4Mhz
#byte trisa=0x85 //direcci贸n del trisa en la memoria
#byte trisb=0x86
#byte porta=0x05
#byte portb=0x06
void main(){ //funci贸n principal
bit_clear(trisa,3);//el RA3 como salida
trisb=0x00;//todo el puerto B como salida
portb=0x00;//puerto B puesto en 0
while(true){ //buncle infinito
bit_set(porta,3);//pone en 1 el RA3
delay_ms(5000); //retardo de 5 segundos
bit_clear(porta,3);//pone en 0 el RA3
bit_set(portb,0); //pone en 1 el RB0
delay_ms(5000);
bit_clear(portb,0);//pone en 0 el RB0
bit_set(portb,1); //pone en 1 el RB1
delay_ms(5000);
bit_clear(portb,1);//pone en 0 el RB1 y empieza de nuevo el programa desde el while
}
}
NOTA: en la simulaci贸n no se requiere poner el cristal ya que se programa cuando le damos doble click al pic, tampoco se requiere poner en 1 el MCLR, en el ejemplo 1 no le puso resistencia a los leds. Si desea realizar la practica en protoboard requiere poner lo se帽alado anteriormente.
PCB:
listo para imprimir:
NOTA: en la carpeta de archivos se encuentra un archivo word con las imagenes listo para imprimir y realizar el pcb, si no dentro de la carpeta semaforo esta el archivo para abrir con pcbwizard.
MATERIAL:
1 PIC 16f84a.
1 cristal de 4Mhz.
2 capacitores cer谩micos de 22pf.
1 porta circuito integrado de 18 pines.
1 borne(kulca) doble.
3 resistencias de 220 ohms
1 led rojo de 5mm.
1 led verde de 5mm.
1 led amarillo de 5mm.
DESCARGAR ARCHIVO HEX, SIMULACI脫N y PCB:
TUTORIAL 2:
http://microcontroladores-ing-elec-rh.blogspot.mx/2013/11/programando-pics-en-lenguaje-c-en-ccs.html
VIDEO SIMULACION Y PRUEBAS:
DOCUMENTO:
Suscribirse a:
Enviar comentarios (Atom)
2 comentarios:
excelente.aporte me sirvio de mucho ya que la electronica y la programacion es mi hobbie.gracias
podrias poner el grafico de como colocar todo en el protoboard
Publicar un comentario