Está en la página 1de 54

MICROPROCESADORES

MICROPROCESADORES
Fundamentos de programación en C

Prof. M.Sc. Rubén Darío Hernández B.

2017

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

FUNDAMENTOS DE PROGRAMACIÓN EN C

- La programación en lenguajes de alto nivel como C o Java, está hoy


en día en muchos entornos.

- C como lenguaje de programación se caracteriza por tener una


estructura definida y una serie de expresiones propias (instrucciones),
esta sintaxis de denominan las palabras reservadas del lenguaje.

- La estructura de programación en C se puede delimitar por el uso de


Librerías, uso de funciones, uso de variables globales y locales,
operadores relacionales del tipo lógico o aritmético, expresiones de
tipo condicional y ciclos condicionales entre otros.

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

FUNCIONES

- Son una agrupación de instrucciones a ejecutar las cuales pueden


entregar información o resultados a otra u otras funciones, es decir,
que pueden interactuar entre ellas, de igual forma puede solicitar
información o parámetros de operación diferentes.

- Permite segmentar las acciones que ha de realizar un programa,


generar una agrupación de instrucciones de uso recurrente sin
aumentar el consumo de espacio de memoria y fácil detección de
errores al validar por grupos de instrucciones y no todo un único
programa.

- La sintaxis de una función está dada por el siguiente esquema

void nombre de la función (void){ grupo de instrucciones;}

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

El siguiente ejemplo ilustra la forma general de interrelacionar funciones


partiendo de la función principal:

void main (void){ //definición function principal


d=5; //variable inicializada
suma(d); //llamado funcion suma enviando un parametro de operación
e=resta(); //llamado function resta recibiendo un parametro operado
} //cierre de la función principal

void suma (int d){ //función suma que recibe un parámetro de la función principal
a= 2+d;
}

int resta (void){ //función resta que devuelve un parámetro operado


a= 7-3;
return a; } // instrucción de retorno de parámetro

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

TIPOS DE DATOS

- Para el desarrollo de los programas (guardar información, ejecutar


transferencia de datos y manipulación) es necesario denominar
variables, que en el caso del microcontrolador corresponden a
registros internos de memoria de datos.

- Para los microcontroladores de 8 bits el espacio de memoria estará


dado por esta característica, dependiendo del tipo de dato se puede
describir de la siguiente forma.

Tabla 1. Tipos de datos


Tipo de
Almacenamiento Rango
dato
char 8 bits 0 a 255
int 16 bits 0 a 65535

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

- Por ejemplo, podemos definir las variables de la siguiente forma:

#include <p18f2550.h>
#USE DELAY (CLOCK = 4000000)
void main (void) {
int auxiliar, contador, A=0;
char dato=5; // se define el carácter ASCII
float division;
}

- El siguiente programa las variables dato1, dato2 y dato3 contienen


exactamente el mismo valor visto en binario.
#include <p18f2550.h>
#USE DELAY (CLOCK = 4000000)
void main (void) {
char dato1=0x41;
char dato2='A';
char dato3=65;

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES
}

- Una característica de las variables es su uso a nivel de funciones, dado


que la variable puede ser local o global, la diferencia consiste en que
la variable local solo es reconocida por la función en que es definida,
en comparación que la variable global es reconocida por todas las
funciones.
#include < pic16f88.h >
#USE DELAY (CLOCK = 4000000)
int a =3;
void ejemplo (void) {
char b=5;
a=a+b;
}
void main (void){
int c=0;
c=a;
ejemplo();
c=a;

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES
}

TIPO DE DATO Y ESTRUCTURA DE UNA FUNCIÓN

- Establecido el tipo de datos, es posible establecer la estructura de una


función o sub función que utiliza parámetros de entrada y salida.

#include < pic16f88.h >


#USE DELAY (CLOCK = 4000000)
int ejemplo (void) {
int a=3;
a=a+1;
return a;
}
void main (void){
int b,c=0;
b= ejemplo();
c= ejemplo();
}

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

- En el siguiente programa se presenta un ejemplo para relacionar el


caso en que la función secundaria recibe un dato de la principal:

#include <pic16f88.h>
#USE DELAY (CLOCK = 4000000)
char var1 =2;
char ejemplo (char var2) {
var1= var1+1;
return var1+ var2;
}
void main (void){
char var2=5;
char var3=0;
var2= ejemplo(var2);
var3= ejemplo(var2);
}

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

OPERADORES LÓGICO-ARITMÉTICOS

El procesamiento de los datos o información con la que ha de operar el


microcontrolador, se basa en elementos relacionales del tipo lógico y de
aritmético, teniendo:

Operador Acción Esquema Abreviatura


+ Suma datoA= datoA + datoB datoA += datoB
- Resta datoA= datoA - datoB datoA -= datoB
* Multiplicación datoA= datoA * datoB datoA *= datoB
/ Divisón datoA= datoA / datoB datoA /= datoB
% Módulo resultado= datoA % datoB ---
++ Incremento datoA= datoA++ datoA++
-- Decremento datoA = datoA-- datoA--

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

OPERADORES LÓGICO

Operador Acción Esquema Abreviatura


&& AND resultado= datoA && datoB
|| OR resultado= datoA || datoB
! Not resultado= !datoA
& And resultado= datoA & datoB
| Or resultado= datoA | datoB
^ Xor resultado= datoA ^ datoB
~ Complemento resultado= ~ datoA
<< Desplaz izq. datoA =datoA << datoB datoA <<= datoB
>> Desplaz. Der. datoA =datoA >> datoB datoA >>= datoB

Para el caso se debe tener en cuenta que las operaciones lógicas son
operaciones bit a bit, por lo que hay que realizar las conversiones de
sistema numérico a lugar. La siguiente tabla resume las operaciones
lógicas básicas para dos datos de un bit cada una.

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

dato1 dato2 And Or Xor Not dato1


0 0 0 0 0 1
0 1 0 1 1 1
1 0 0 1 1 0
1 1 1 1 0 0

Las operaciones lógicas ilustradas en en el programa se basan en las


variables inicializadas datoA y datoB, cuyos valores e binario son:

operación and or xor


datoA 1111 1111 1111
datoB 0110 0110 0110
resultado a1=0110 a2=1111 a3=1001

En el caso de las operaciones de desplazamiento izquierda y derecha se


debe tener en cuenta de un nuevo valor en decimal que genera el
desplazamiento en el número binario, de forma tal que si es
desplazamiento a la derecha el bit 7 pasa al 6 hasta el bit que pasa a 0, para
el desplazamiento izquierda el bit 0 pasa al 1 hasta que l bit 6 pasa al 7.

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

En este caso tenemos como ejemplo:

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Decimal


datoB 0 0 0 0 0 1 1 0 6
a4 0 0 0 0 1 1 0 0 12
a5 0 0 0 0 0 0 1 1 3

#include <pic16f88.h>
#USE DELAY (CLOCK = 4000000)
void main (void){
char a1, a2, a3, a4, a5, datoA = 15;
char datoB = 6;
char resultado
while(1){
a1 = datoA & datoB;
a2 = datoA |datoB;
a3 = datoA ^ datoB;
a4 = datoB << 1;
a5 = datoB >> 1;
resultado = ~datoA;
}

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

SENTENCIAS CONDICIONALES

Se entiende como el resultado de la comparación de una condición, que si


llegase a ser verdadera (1) o falsa (2) dará o no lugar a la ejecución de un
código. Las sentencias condicionales que son utilizadas se presentan a
seguir:

Operador Acción Esquema


> Mayor que resultado= datoA > datoB
< Menor que resultado= datoA < datoB
>= Mayor igual resultado= datoA >= datoB
<= Menor igual resultado= datoA <= datoB
== Igual a resultado= datoA == datoB
=! Diferente de resultado= datoA != datoB

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Como ejemplo se presenta un código para ordenar de mayor a menor, 3


números almacenados previamente.

Void main {
int A = 4;
int B = 8;
int C = 6;
int D = 1;
int E;
int CONT = 4;
While (CONT!=0){
If(A<B){E=A;A=B;B=E;}
If(B<C){E=B;B=C;C=E;}
if(C<D){E=C;C=D;D=E:}
cont=cont-1;
}
}

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

CONDICIONAL IF –ELSE

Establece un condicional si si-no, es decir, dada una condición resulta


verdadera se procederá a la ejecución de una o un grupo de instrucciones.

If simple If compuesto If anidado

If (condición) If (condiciónes){ If (condiciónes){


Instrucción; Instrucciónes; Instrucciónes;
Else } }
Instrucción; Else { else If (condiciónes) {
Instrucciónes; Instrucciónes;
} }
else {
Instrucciónes;
}

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Ejemplo:

#include <p18f4550.h>
Void main (void)
{
int datoA = 15;
int datoB=6 ; //declaramos e inicializamos los datos para operaciones
int resultado; // declaramos e inicializamos variable para resultados
if (datoA>=datoB) //si datoA mayor que el datoB sumara ambos datos
resultado= datoA+datoB; // suma resultado = 15+6=21
else //si datoA no es mayor que el datoB restara ambos datos
resultado= datoA-datoB; // suma resultado = 15-6=9
}

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

CONDICIONAL SWITCH

Actúa como un conmutador de opciones según un valor de referencia que


indicará la opción a escoger, por tanto, el esquema será:

Switch (variable){
Case 0: instrucción;
Case 1: instrucción;
Case 2: instrucción;
.
.
Case n: instrucción;
Default: instrucción; }

Condicional break: es una sentencia que termina o rompe el condicional


dándola por finalizada y continuando con la siguiente instrucción del
programa.

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Ejemplo:

#include <p18f4550.h>
#USE DELAY (CLOCK = 4000000)
Void main (void){
Int datoA = 15; int datoB=6 ; //declaramos e inicializamos los datos para operaciones
Int resultado, a=0; // declaramos e inicializamos variable para resultados
switch (a){
Case0: resultado= datoA+datoB ; break;
Case1: resultado= datoA-datoB; break;
Case2: resultado= datoA*datoB; break;
Default resultado= datoA/datoB; }
a++;
}

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

CONDICIONAL WHILE

Esta secuencia condicional establece que mientras una condición sea


valida, ejecutará una serie de acciones o instrucciones, su esquema de
operación es:
While (condición)
Do {instrucciones;}

Ejemplo:

Int a=108; int b=12;


While (a>=b)
Do {a=a&b;}

While (1) {
Instrucciones;
}

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Ejemplo: El siguiente código realiza un programa que trabaja como un


contador para segundos y minutos.

void main {
Int CONTMIN=0;
Int CONTSEG=0;
While (CONTMIN<60){
While (CONTSEG<60){
CONTSEG++;
}
CONTMIN++;
}
}

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

CONDICIONAL FOR

Permite establecer un ciclo repetitivo de acciones dependiendo de una


variable la cual debe ser inicializada, evaluada y modificada para el
control del número de veces que deje ejecutar dichas instrucciones
For (inicializar variable; evaluar variable; modificar variable)
{
instrucciones;
}

Ejemplo:

Int i,a=1;
For(i=0;i<10;i++)
{
a=a*2;
}

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

ARREGLOS

En varias ocasiones es útil tener un dato al que podamos asignar varios


valores según se requiera, una cadena da datos que obedecen a una lista
para una misma variable, los cuales se pueden acceder por su posición
dentro de esta se conoce como arreglo, posee la siguiente estructura:

Tipo de dato [] = {lista de valores separados por comas};

Ejemplo:

int dato,j;
int i[]={1,3,5,7,9,11,13,15};
For (j=0;j<9;j++){
Dato= i[j]
}

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Ejemplo: como ejemplo se tiene un código para realizar un programa que


promedie el valor de cinco datos almacenados en un arreglo.

void main {
Int PROMEDIO=0;
Int CONT=0;
int DATOS[]={1,3,7,9,11};
While (CONT<5){
PROMEDIO=DATOS[CONT]+PROMEDIO;
CONT++;
}
PROMEDIO=PROMEDIO/5;
}

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

LIBRERIAS

Es una forma de organizar programas y optimizar el uso de memoria


mediante el empleo de librerías.

Una librería se define como un grupo de instrucciones que son de uso


común o recurrente en un mismo programa o en distintos programas.

La inclusión de la misma en el programa se expresa de la siguiente


manera:
#include < pic16f88.h >

De forma general, la estructura de cualquier librería tendra la siguiente


forma:

#include <nombre_libreria.h>

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

DEFINICIONES

Para facilidad en la escritura del código y correspondencia con la


arquitectura del microcontrolador y es posible definir pines de los puertos
del mismo u otros registros internos con una palabra clave que relacione
este con la función que ha de desempeñar, bajo la estructura:

#define palabra_ clave valor_de_reemplazo

Ejemplo:

#define led PORTCbits.RC0

el cual asigna al bit cero del puerto C del microcontrolador el nombre de


led, luego cada vez que se requiera utilizar este bit bastara con llamarlo
led.

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

CONFIGURACIÓN BÁSICA DEL PIC

Para un correcto funcionamiento del microcontrolador, se debe tener


configuradas una o más palabras de configuración.

Los bits de estas palabras permiten seleccionar, por ejemplo: el tipo de


oscilador con el cual funcionará el pic o si se usará uno de los pines como
reset.

En XC8 la configuración se aplica mediante un macro en el archivo “pic.h”


en el cual se escribe de la siguiente manera:
__CONFIG(bitsDeConfiguración)

Cada línea “_CONFIG” representa una palabra de configuración. Para


que funcione correctamente se deben escribir en el orden en el que
aparecen en el pic.

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Ejemplo para el pic16f88

__CONFIG(MCLRE_ON & CP_OFF & CPD_OFF & LVP_OFF & BOREN_OFF &
WDTE_OFF & FOSC_INTOSCIO & PWRTE_OFF);
__CONFIG(IESO_OFF & FCMEN_OFF)

Los distintos bytes de configuración se concatenan mediante el carácter


"&". Estos van a ser propios de cada pic. Por ejemplo, en la configuración
anterior estamos indicando que el pin 4 actuará de Reset cuando no reciba
corriente (MCLRE_ON) y utilizará el oscilador interno
(FOSC_INTOSCIO).

Si en lugar de querer utilizar el oscilador interno se quisiera utilizar uno


externo de 20Mhz la configuración cambiaría a:

__CONFIG(MCLRE_ON & CP_OFF & CPD_OFF & LVP_OFF & BOREN_OFF &
WDTE_OFF & FOSC_HS & PWRTE_OFF);
__CONFIG(IESO_OFF & FCMEN_OFF);

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

DEFINICIÓN DE LOS BITS DE CONFIGURACIÓN

Bits de Protección de Código (Code Protection bits): CP1..CP0


11 = Protección de código deshabilitada
10 = Depende de cada dispositivo, ver hoja de datos
01 = Depende de cada dispositivo, ver hoja de datos
00 = Toda la memoria de programa protegida

Algunos dispositivos usan solamente un bit (CP0) para determinar la


protección de código según la siguiente descripción:
1 = Protección de código deshabilitada
0 = Protección de código habilitada

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Bit de Protección de Memoria EEPROM de Datos (Data EEPROM


Memory Code Protection bit): DP
Este bit está presente solamente cuando el dispositivo posee memoria
EEPROM de datos, adicional a su memoria ROM (flash) de programa.
1 = Protección de código deshabilitada
0 = Protección de memoria EEPROM de datos habilitada

* Bit de Habilitación de Reinicio por Apagón (Brown-out Reset Enable


bit): BOREN

1 = BOR habilitado
0 = BOR deshabilitado
Al habilitar el Reinicio por Apagón (Brown-out Reset) éste habilita
automáticamente el Temporizador de Encendido (Power-up Timer
/PWRTE), es así que se recomienda directamente habilitar este bit
(/PWRTE) siempre que se habilite el Reinicio por Apagón.

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Bit de Habilitación de Temporizador de Encendido (Power-up Timer


Enable bit): /PWRTE

1 = PWRT desabilitado
0 = PWRT habilitado

Al habilitar el Reinicio por Apagón (Brown-out Reset) se recomienda


habilitar también el Temporizador de Encendido (Power-up Timer
/PWRTE)debido a que este último es requerido también para el
funcionamiento del Reinicio por Apagón.

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Bit de Selección de Función del Pin /MCLR (MCLR Pin Function Select
bit): MCLRE
1 = La función del pin es /MCLR
0 = La función del pin es de E/S digital. /MCLR está internamente
conectado a VDD.

Recomendaciones:
- En microcontroladores que multiplexan (comparten) en un mismo
pin la función /MCLR con un bit de E/S u otra función, se debe
tener cuidado al deshabilitar /MCLR debido a que algunos
programadores (especialmente los llamados "clonados") encuentran
problemas en volver a programar un microcontrolador cuyo /MCLR
ha sido deshabilitado.
- Por precaución dejar en lo posible habilitado el /MCLR.

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Bit de Habilitación de "Perro Guardián" (Watchdog Timer Enable bit):


WDTE
1 = WDT habilitado
0 = WDT desabilitado

El Perro Guardián (WDT) es otra característica de seguridad en los


microcontroladores cuyo objeto es prevenir que el microcontrolador se
quede indefinidamente bloqueado o "colgado" debido a fallas en la lógica
del software y en algunos casos debido a fallas de hardware causadas,
entre otras cosas, por ruido electromagnético (impulsos) en ambientes de
alto riesgo.

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Bits de Selección de Oscilador (Oscillator Selection bits): FOSC1..FOSC0


11 = Oscilador RC (malla externa resistor-capacitor)
10 = Oscilador HS (cristal/resonador de alta velocidad)
01 = Oscilador XT (cristal/resonador)
00 = Oscilador LP (cristal de baja frecuencia y baja potencia)

Selección de Oscilador con Tres Bits

111 = Oscilador EXTRC con CLKOUT (externo RC con salida de reloj)


110 = Oscilador EXTRC (externo RC)
101 = INTRC con CLKOUT (interno RC con salida de reloj)
100 = INTRC (interno RC)
011 = Reservado
010 = Oscilador HS
001 = Oscilador XT
000 = Oscilador LP

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Ejemplo de definición:

/* Bits de configuración*/
#pragma config FOSC = INTOSCIO_EC // Oscilador interno, uso de pin
RA6 activado, El USB usa Clock Externo.
#pragma config WDT = OFF //desactivamos watchdog timer
#pragma config PWRT = ON // activamos power up timer

/*declaración de funciones*/

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

MICROPROCESADORES
Compilador CCS en lenguaje C

Prof. M.Sc. Rubén Darío Hernández B.

2017

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

INTRODUCCIÓN

- El compilador CCS fue creado para microcontroladores PIC MCU,


para buscar la máxima optimización del compilador con este tipo de
dispositivos.

- C como lenguaje de programación se caracteriza por tener una


estructura definida y una serie de expresiones propias (instrucciones),
esta sintaxis de denominan las palabras reservadas del lenguaje.

- La estructura de programación en C se puede delimitar por el uso de


Librerías, uso de funciones, uso de variables globales y locales,
operadores relacionales del tipo lógico o aritmético, expresiones de
tipo condicional y ciclos condicionales entre otros.

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

ESTRUCTURA DE UN PROGRAMA EN PICC

Para escribir un programa en C bajo PICC se debe considerar una serie de


estructuras básicas como:

- Directivas de preprocesado: Controlan la conversión del programa a


código máquina por parte del compilador
- Programas o Funciones: Conjunto de instrucciones. Puede haber uno o
varios; en cualquier caso siempre debe haber uno definido como
principal mediante la inclusión de la llamada main().
- Instrucciones: indican como se debe comportar el PIC en todo
momento.
- Comentarios: permiten describir lo que significa cada línea del
programa.

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

#include <18f4550.h>
#use delay(clock=4000000)
#fuses XT, NOWDT
#use standard_io B

int var0 =0; //inicial la varible

#int_TIMER0 //declara la función


void TIMER0_isr (void)
{
var0++; //incrementa la variable en 1
if(var0==1)output_bit(PIN_B0,1); //coloca el bit B0 en alto
else output_bit(PIN_B0,0); //coloca el bit Bo en bajo
set_timero (0x110);
}

void main() { //declara la function prinicpal


setup_timer_0 RTCC_INTERNAL TECC_DIV_”;
set_timer0 (0x10);
enable_interrupts (INT_TIMER0);
enable_interrupts (global);
while (1);
}

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

CONFIGURACIONES BÁSICAS EN PICC

#DEVICE chip, permite definir el PIC que se utilizará para la compilación

#device PIC18f4550

#FUSES options, la cual permita definir la palabra de configuración para


programar un PIC. Por ejemplo, en el PIC18f4550 las opciones posibles
son: LP,XT,HS,RC,NOWDT,WDT,NOPUT,PUT,PROJECT,NOPROJECT.

#device PIC18f4550
#fuses XT, NOWDT, PU, NOPROJECT

#INCLUDE “filename”, permite incluir el fichero en el programa

#include <18f4550.h>
#fuses XT, NOWDT, PUT, NOPROJECT

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

#USE DELAY (CLOCK=SPEED), permite definir las frecuencias del


oscilador del PIC, el compilador lo utiliza para realizar cálculos de tiempo.
Se puede utilizar M, MHZ, K y KHZ para definir la frecuencia.

#INCLUDE <18f4550.h>
#use delay(closck=4000000)

#ASM y #ENDASM, permite utilizar código ensamblador en el programa


en C. Se utiliza al inicio y al final del bloque ensamblador.

#asm
bsf TATUS,RP0
Movlw 0x8
Movwf PORTB
Bcf STATUS,RP0
#endasm

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

ENTORNO DE TRABAJO
COMANDO DE
MANEJO DE BARRA DE
FICHEROS COMANDOS

BARRA DE
SUBCOMANDOS

PESTAÑA DEL
PROGRAMA

ZONA DE
CÓDIGO

BARRA DE
VENTANAS
AUXILIARES

BARRA DE INFORMACIÓN

MACROS

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

GESTIÓN DE PUERTOS EN C

En lenguaje C se pueden gestionar los puertos de dos formas:

- Se declaran los registros TRISX y PORTX definiendo su posición en la


memoria RAM como variables de C.

- Utilizando las directivas especificas del compilador (#USE FAST_IO,


#USE FIXED_IO, #USE ESTÁNDAR_IO)

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

GESTIÓN DE PUERTOS EN C A TRAVÉS DE LA RAM

Se definen los registros PORTx y TRISx como bytes y se situan en la


posición correspondiente de la memoria RAM. La directiva utilizada en C
es # BYTE:

#BYTE variable = constante;

#BYTE TRISA = 0x85 //variables TRISA en 85h


#BYTE PORTA = 0x05 //variables PORTA en 05h
#BYTE TRISB = 0x86 //variables TRISB en 86h
#BYTE PORTB = 0x06 //variables PORTB en 06h
#BYTE TRISC = 0x87 //variables TRISC en 87h
#BYTE PORTC = 0x07 //variables PORTB en 07h

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Una vez definidas estas variables se pueden configurar y controlar los


puertos a través de los comandos de asignación.

TRISA = 0xFF; //8 bits de entrada


TRISB = 0x00; //8 bits de salida
TRISC = 0x0F; //4 bits mas significativos de salida y
// los 4 menos significativos de entrada

Escritura de puertos:

PORTB = 0x0A; //salida de datos 00001010 por el puerto B

Lectura de puertos:

Valor = PORTB; //asigna el dato del puerto B a la variable valor

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Manejo de sentencias:

TRISD = 0x0F;
If (PORTD & 0xOF) PORTD |= 0xA0; //comprueba los 4 bits de
//de menor peso del puerto D
//si son 1111 saca por los 4 bits
//más significativos el dato
//1010

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
swap(var); //Intercambia los bits de (5 a 7) por los bits (0 a 4)

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Se puede declarar un bit de un registro con una variable mediante la


directiva #BIT, permitiendo trabajar directamente con el terminal:

#BIT nombre = posición.bit

#bit RB4 = 0x06.4 //PORTA=0x86


RB4 = 0;

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Ejemplo 1: Configure los pines RB1 como salida y RB0 como entrada. La
salida debe tener el mismo valor que la entrada, utilice un interruptor de
entrada y un led como salida. El montaje se presenta a continuación.

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

GESTIÓN DE PUERTOS EN C A TRAVÉS DE DIRECTIVAS

El compilar ofrece funciones predefinidas para trabajar con punteros.


Estas funciones son:

output_X(valor); //Por el Puerto correspondiente saca el valor (0-255)


input_X(); //Se obtiene el valor en el puerto correspondiente
set_tris_X(valor); //Carga el registro TRISx con el valor (0-255)
port_b_pullups(valor); //Mediante valor = TRUE o valor = FALSE
//habilita o deshabilita las resistencias de
//pull-up en PORTB
get_trisX() //Devuelve el valor del registro TRISx

Donde Z es la inicial correspondiente al puerto (A, B, C, …)


output_A(0Xff); //saca por el Puerto A el valor 1111
valor = input_B(); //Lee el valor del Puerto B
set_tris_C(0xFF); //Configura el Puerto C: Co-C3 input, C4-C7 output

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Existen una seria de funciones asociadas a un terminal o pin. El parámetro


pin se define en un fichero include (por ejemplo, 18f4550.h) con un
formato del tipo PIN_Xn, donde X es el puerto y n el número del pin.

#define PIN_A0 40
#define PIN_A1 41

Las funciones son:

output_low(pin); //pin a 0
output_high(pin); //pin a 1
output_bit(pin,valor); //pin al valor especificado
output_toogle(pin); //complementa el valor del pin
output_float(pin); //pin de entrada, quedando a tensión flotante
input_state(pin); //lee el valor del pin sin cambiar el sentido
input(pin); //lee el valor del pin

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Las funciones output_x() e input_x() dependen de3 la directiva tipo #USE


_IO que esté activa. Directivas:

#use FAST_IO (PUERTO) [PUERTO: A,…..]

Cada función output_x() se saca el valor al puerto y con la función


input_x() se lee el puerto. La directiva no modifica previamente el registro
TRIS correspondiente.

Hay que asegurarse de que los registros TRIS están correctamente


definidos. Entonces, el ejemplo1 quedaría:

Prof. M.Sc. Rubén Darío Hernández B.


MICROPROCESADORES

Prof. M.Sc. Rubén Darío Hernández B.

También podría gustarte