580 likes | 1.09k Views
CORPOCIDES. PROGRAMACION DE MICROCONTROLADORES PIC EN C. Ing. Emilio Medina Baquero Ing.medinaemilio@gmail.com. SOFTWARE NECESARIO. INSTALADOR DE PICC PROTEUS. OPERADORES. Asignación de Suma: x+=y ; // Es lo mismo que x=x+y; Ejercicio: int x=4,y=5; x+=y; // Cuanto vale x?
E N D
CORPOCIDES PROGRAMACION DE MICROCONTROLADORES PIC EN C Ing. Emilio Medina Baquero Ing.medinaemilio@gmail.com
SOFTWARE NECESARIO INSTALADOR DE PICC PROTEUS
OPERADORES Asignación de Suma: x+=y ; // Es lo mismo que x=x+y; Ejercicio: int x=4,y=5; x+=y; // Cuanto vale x? Asignación de Resta: x-=y ; // Es lo mismo que x=x-y; Ejercicio: int y=4,x=5; x-=y; // Cuanto vale x?
OPERADORES Asignación de Multiplicación: x*=y ; // Es lo mismo que x=x*y; Ejercicio: int x=4,y=5; x*=y; // Cuanto vale x? Asignación de División: x/=y ; // Es lo mismo que x=x/y; Ejercicio: int y=4,x=20; x/=y; // Cuanto vale x?
FUNCIONES • Tipodato Nombrefunción(tipo param1, tipo param2,…) • { • Sentencias; • return(dato); • } • Ejemplo: • int suma(int a,int b) //Definición de la función • { • int c; • c=a+b; • return(c); • } • Void main() • { • int dato; • dato=suma(a,b); //Llamado de la función • }
VARIABLES VARIABLES GLOBALES: Su valor puede ser escrito y leído desde cualquier función. VARIABLES LOCALES: Su valor se pierde al salir de una función.
INSTALACION DE PICC 1. Instalar el PICC: - Es importante descomprimir el instalador e instalar los dos archivos:
EL PRIMER PROYECTO 1. Abre el PICC (Inicio, programas, PIC-C, PIC C Compiler) 2.Seleccionar New -> Project Wizard
EL PRIMER PROYECTO 3. coloca el nombre del proyecto (Primer_Programa) y la carpeta donde se guardará.
EL PRIMER PROYECTO 4. En la pestaña General selecciona las opciones como aparece en la figura
EL PRIMER PROYECTO 5. En la pestaña Comunicaciones deshabilita RS-232
EL PRIMER PROYECTO 6. Acepta los cambios haciendo click en OK 7. La ventana del PICC debe aparecer como en la figura:
EL PRIMER PROYECTO 8. Nuestro primer programa consistirá en sacar un “1” por el pin RB0 con el comando: output_high(pin_b0);
EL PRIMER PROYECTO 9. Ahora compilamos el código haciendo click en Build de la pestaña Compile.
EL PRIMER PROYECTO 10. Ahora verificamos que no se hallan presentado errores, mirando la ventana Output
EL PRIMER PROYECTO 11. Para simular el programa usaremos Proteus, por lo que debemos abrir el ISIS. 12. Hacemos click en la carpeta para abrir el esquemático
EL PRIMER PROYECTO 14. Hacemos doble click sobre el PIC para editar sus propiedades. - Verificamos la frecuencia del reloj: 4MHz
EL PRIMER PROYECTO 15. Hacemos doble click sobre la carpeta de la opción Program File 16. Seleccionamos el programa (.hex) de la carpeta del proyecto de PICC
I/O DIGITALES Los microcontroladores PIC tienen teminales de entrada/salida divididos en puertos, que se encuentran nombrados alfabéticamente A,B,C,D. Cada puerto puede tener hasta 8 teminales que, de forma básica se comportan como una entrada/salida digital.
I/O DIGITALES • Los pines son configurables por software como entrada o salida digital. • - El pin RA4 necesita resistencia de pull-up si se va a usar como salida. • - El puerto B tiene resistencias de pull-up que se pueden habilitar por software.
I/O DIGITALES • Los pines de salida del PIC tienen un límite de corriente.
I/O DIGITALES • Por defecto se usa la directiva STANDARD_IO (el compilador configura automáticamente los pines como entrada o salida). • COMANDOS: • output_a(valor); //saca valor (entero de 8 bits) por el puerto A • output_b(valor); //saca valor (entero de 8 bits) por el puerto B • Ejemplo: • output_b(23); //saca el dato 23 por el puerto B • Es importante notar que el comando output configura automáticamente el puerto como salida.
I/O DIGITALES • Modificamos el programa • Compilamos • En el ISIS damos play a la simulación. • (es necesario detener la simulación previamente para que los cambios en el programa se reflejen)
I/O DIGITALES output_bit(pin,valor); //saca valor (1 ó 0) por el pin seleccionado Ejemplo: output_bit(pin_b1,0); //saca un “0” lógico por el pin RB1 Es importante notar que el comando output_bit configura automáticamente el pin como salida.
I/O DIGITALES • Modificamos el programa • Compilamos • En el ISIS damos play a la simulación. • (es necesario detener la simulación previamente para que los cambios en el programa se reflejen)
I/O DIGITALES output_high(pin); //saca un “1” lógico por el pin seleccionado Ejemplo: output_high(pin_b7); //saca un “1” lógico por el pin RB7 Es importante notar que el comando output_high configura automáticamente el pin como salida.
I/O DIGITALES • Modificamos el programa • Compilamos • En el ISIS damos play a la simulación. • (es necesario detener la simulación previamente para que los cambios en el programa se reflejen)
I/O DIGITALES output_low(pin); //saca un “0” lógico por el pin seleccionado Ejemplo: output_low(pin_b0); //saca un “0” lógico por el pin RB1 Es importante notar que el comando output_low configura automáticamente el pin como salida.
I/O DIGITALES • Modificamos el programa • Compilamos • En el ISIS damos play a la simulación. • (es necesario detener la simulación previamente para que los cambios en el programa se reflejen)
I/O DIGITALES output_toggle(pin); //niega el estado lógico del pin seleccionado Ejemplo: output_toggle(pin_b6); //si el estado del pin b6 es “0” saca un “1” //si el estado del pin b6 es “1” saca un “0” Es importante notar que el comando output_toggle configura automáticamente el pin como salida.
I/O DIGITALES • Modificamos el programa • Compilamos • En el ISIS damos play a la simulación. • (es necesario detener la simulación previamente para que los cambios en el programa se reflejen)
I/O DIGITALES • Valor1=input_a(); //lee el dato (8 bits) del puerto A y lo almacena en • //la variable Valor1 • Valor2=input_b(); //lee el dato (8 bits) del puerto B y lo almacena en • //la variable Valor2 • - La función retorna un dato entero (8bits). • Es importante notar que el comando input configura automáticamente el puerto como entrada. • Ej: int dato; • dato=input_a(); • Output_b(dato);
I/O DIGITALES • Modificamos el programa • Compilamos • En el ISIS damos play a la simulación. • (es necesario detener la simulación previamente para que los cambios en el programa se reflejen)
I/O DIGITALES CICLOS INFINITOS: While(1){ //aquí va el programa a repetir infinitamente } For(;;) { //aquí va el programa a repetir infinitamente }
INSTRUCCIÓN IF-ELSE Con la ayuda de If-Else se pueden tomar desiciones. If (expresión){ sentencia1; } Else{ sentencia2; }
I/O DIGITALES • Valor1=input(pin); // lee el valor (“0” ó “1”) del pin seleccionado • // y lo almacena en la variable Valor1 • La función retorna un valor booleano “0” si el pin está en bajo. • La función retorna un valor booleano “1” si el pin está en alto. • - Es importante notar que el comando input configura automáticamente el puerto como entrada. • Ejemplo: • While(1){ • if(input(pin_a0)==1) • output_b(0xFF); • else • output_b(0x00); • }
I/O DIGITALES • Modificamos el programa • Compilamos • En el ISIS damos play a la simulación. • (es necesario detener la simulación previamente para que los cambios en el programa se reflejen)
I/O DIGITALES • Valor1=input_state(pin); // lee el valor (“0” ó “1”) del pin seleccionado • // y lo almacena en la variable Valor1 • Ejemplo: • Valor2=input_state(pin_b1); //lee el pin RB1 y almacena el valor en Valor2 • La función retorna un valor booleano “0” si el pin está en bajo. • La función retorna un valor booleano “1” si el pin está en alto. • - Es importante notar que el comando input NO cambia la dirección del pin leído.
EJERCICIOS • Se tiene una lámpara conectada al pin RB0 y dos pulsadores conectados a los pines RA0 y RA1 respectivamente. • Encender la lámpara si se presionan los dos pulsadores (si se pulsa uno solo no debe encender). • Encender la lámpara si se presiona alguno de los dos pulsadores (si se pulsan juntos también debe encender) • Encender la lámpara si se presiona alguno de los dos pulsadores (si se pulsan juntos no debe encender) • Si se tiene un tercer pulsador conectado en el pin RA2, encender la lámpara si se pulsan 2 interruptores a la vez. (si se pulsa uno solo o los tres a la vez no debe encender) • Realizar la siguiente secuencia de luces, dejando 500ms entre cada dato: • 00000001, 00000010, 00000101, 00001010, 00010100, 00101000, • 01010000, 10100000, 01000000, 10000000, 00000000 • Para realizar retardos se usa el comando delay_ms(tiempo_en_ms); • F. Realice un programa en el cual al presionar un pulsador en RA0 se incremente el dato del puerto B y al presionar un pulsador en RA1 se decremente el dato del puerto B.