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
}
}

semaforo con PIC16f84a

 
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:


VIDEO SIMULACION Y PRUEBAS:



 DOCUMENTO:

SIGUEME EN FECEBOOK

MI TWITTER

Translate