1.1 Introduccin
1.2 NMEROS, NMEROS, NMEROS...
1.3 DETALLES IMPORTANTES
1.4 MICROCONTROLADORES PIC
1.1 INTRODUCCIN
Para entender con ms facilidad las razones del xito tan grande de los
microcontroladores, vamos a prestar atencin al siguiente ejemplo. Hace
unos 10 aos, disear un dispositivo electrnico de control de un ascensor
de un edificio de varios pisos era muy difcil, incluso para un equipo de
expertos. Ha pensado alguna vez en qu requisitos debe cumplir un simple
ascensor? Cmo lidiar con la situacin cuando dos o ms personas llaman
al ascensor al mismo tiempo? Cul llamada tiene la prioridad? Cmo
solucionar las cuestiones de seguridad, de prdida de electricidad, de fallos,
de uso indebido? Lo que sucede despus de resolver estos problemas
bsicos es un proceso meticuloso de disear los dispositivos adecuados
utilizando un gran nmero de los chips especializados. Este proceso puede
tardar semanas o meses, dependiendo de la complejidad del dispositivo.
Cuando haya terminado el proceso, llega la hora de disear una placa de
circuito impreso y de montar el dispositivo.Un dispositivo enorme! Es otro
trabajo difcil y tardado. Por ltimo, cuando todo est terminado y probado
adecuadamente, pasamos al momento crucial y es cuando uno se concentra,
respira profundamente y enciende la fuente de alimentacin.
CDIGO BCD
Cabe destacar que es necesario utilizar slo dos dgitos binarios para
representar a todos los nmeros decimales de 0 a 3. Por consiguiente, para
representar los nmeros de 0 a 7 es necesario utilizar tres dgitos binarios,
para representar los nmeros de 0 a 15 - cuatro dgitos etc. Dicho de manera
sencilla, el mayor nmero binario que se puede representar utilizando n
dgitos se obtiene al elevar la base 2 a la potencia n. Luego, al resultado se
le resta 1. Por ejemplo, si n=4:
24 - 1 = 16 - 1 = 15
Por consiguiente, al utilizar 4 dgitos binarios, es posible representar los
nmeros decimales de 0 a 15, que son 16 valores diferentes en total.
BIT
BYTE
Un byte consiste en 8 bits colocados uno junto al otro. Si un bit es un dgito,
es lgico que los bytes representen los nmeros. Todas las operaciones
matemticas se pueden realizar por medio de ellos, como por medio de los
nmeros decimales comunes. Similar a los dgitos de cualquier nmero, los
dgitos de un byte no tienen el mismo significado. El bit del extremo izquierdo
tiene la mayor ponderacin, por eso es denominado el bit ms significativo
(MSB). El bit del extremo derecho tiene la menor ponderacin, por eso es
denominado el bit menos significativo (LSB). Puesto que los 8 dgitos de un
byte se pueden combinar de 256 maneras diferentes, el mayor nmero
decimal que se puede representar con un byte es 255 (una combinacin
representa un cero).
CIRCUITOS LGICOS
COMPUERTA Y (AND)
COMPUERTA O (OR)
COMPUERTA NO (NOT)
La compuerta lgica NO dispone de una sola entrada y una sola salida, por
lo que funciona muy simplemente. Cuando un cero lgico (0) aparezca en su
entrada, la salida proporciona un uno lgico (1) y viceversa. Esto significa
que esta compuerta invierte las seales por s mismas y por eso es
denominada inversor.
En el programa la operacin lgica NO se realiza sobre un byte. El resultado
es un byte con los bits invertidos. Si los bits de un byte se consideran
nmero, el valor invertido es un complemento a ese nmero. El complemento
de un nmero es el valor que se aade al nmero hasta llegar al mayor
nmero binario de 8 dgitos. En otras palabras, la suma de un dgito de 8
nmeros y de su complemento es siempre 255.
REGISTROS
REGISTROS SFR
UNIDAD DE MEMORIA
OTP ROM (One Time Programmable ROM) - ROM programable una sola
vez
Memoria Flash
INTERRUPCIN
La mayora de programas utilizan interrupciones durante ejecucin de
programa regular. El propsito del microcontrolador generalmente consiste
en reaccionar a los cambios en su entorno. En otras palabras, cuando ocurre
algo, el microcontrolador reacciona de alguna manera... Por ejemplo, al
apretar el botn del mando a distancia, el microcontrolador lo registra y
responde al comando cambiando de canal, subiendo o bajando el volumen
etc. Si el microcontrolador pasar la mayora del tiempo comprobando varios
botones sin parar - las horas, los das, esto no sera nada prctico.
Como indica su nombre, esto es una unidad que controla todos los procesos
dentro del microcontrolador. Consiste en varias unidades ms pequeas, de
las que las ms importantes son:
El bus est formado por 8, 16 o ms cables. Hay dos tipos de buses: el bus
de direcciones y el bus de datos. El bus de direcciones consiste en tantas
lneas como sean necesarias para direccionar la memoria. Se utiliza para
transmitir la direccin de la CPU a la memoria. El bus de datos es tan ancho
como los datos, en este caso es de 8 bits o lneas de ancho. Se utiliza para
conectar todos los circuitos dentro del microcontrolador.
COMUNICACIN EN SERIE
OSCILADOR
Los pulsos uniformes generados por el oscilador permiten el funcionamiento
armnico y sncrono de todos los circuitos del microcontrolador. El oscilador
se configura normalmente de tal manera que utilice un cristal de cuarzo o
resonador cermico para estabilizacin de frecuencia. Adems, puede
funcionar como un circuito autnomo (como oscilador RC). Es importante
decir que las instrucciones del programa no se ejecutan a la velocidad
impuesta por el mismo oscilador sino varias veces ms despacio. Eso ocurre
porque cada instruccin se ejecuta en varios ciclos del oscilador. En algunos
microcontroladores se necesita el mismo nmero de ciclos para ejecutar
todas las instrucciones, mientras que en otros el tiempo de ejecucin no es el
mismo para todas las instrucciones. Por consiguiente, si el sistema utiliza el
cristal de cuarzo con una frecuencia de 20 MHZ, el tiempo de ejecucin de
una instruccin de programa no es 50 nS, sino 200, 400 o 800 nS
dependiendo del tipo del microcontrolador.
CIRCUITO DE ALIMENTACIN
Hay que mencionar dos cosas dignas de atencin con relacin al circuito de
la fuente de alimentacin de microcontroladores:
TEMPORIZADORES/CONTADORES
CONTADORES
Si el perro guardin est habilitado, cada vez que cuenta hasta el mximo
valor en el que ocurre el desbordamiento del registro se genera una seal de
reinicio del microcontrolador y la ejecucin de programa inicia en la primera
instruccin. El punto es evitar que eso ocurra al utilizar el comando
adecuado.
CONVERTIDOR A/D
Las seales del mundo real son muy diferentes de las que entiende el
microcontrolador (ceros y unos), as que deben ser convertidas para que el
microcontrolador pueda entenderlas. Un convertidor analgico-digital es un
circuito electrnico encargado de convertir las seales continuas en nmeros
digitales discretos. En otras palabras, este circuito convierte un nmero real
en un nmero binario y se lo enva a la CPU para ser procesado. Este
mdulo se utiliza para medir el voltaje en el pin de entrada.
Arquitectura de von-Neumann
Los microcontroladores que utilizan la arquitectura von- Neumann disponen
de un solo bloque de memoria y de un bus de datos de 8 bits. Como todos
los datos se intercambian por medio de estas 8 lneas, este bus est
sobrecargado, y la comunicacin por si misma es muy lenta e ineficaz. La
CPU puede leer una instruccin o leer/escribir datos de/en la memoria. Los
dos procesos no pueden ocurrir a la vez puesto que las instrucciones y los
datos utilizan el mismo bus. Por ejemplo, si alguna lnea de programa dice
que el registro de la memoria RAM llamado SUM debe ser aumentado por
uno (instruccin: incf SUMA), el microcontrolador har lo siguiente:
ARQUITECTURA DE HARVARD
Los microcontroladores que utilizan esta arquitectura disponen de dos buses
de datos diferentes. Uno es de 8 bits de ancho y conecta la CPU con la
memoria RAM. El otro consiste en varias lneas (12, 14 o 16) y conecta a la
CPU y la memoria ROM. Por consiguiente, la CPU puede leer las
instrucciones y realizar el acceso a la memoria de datos a la vez. Puesto que
todos los registros de la memoria RAM son de 8 bits de ancho, todos los
datos dentro del microcontrolador que se intercambian son de la misma
anchura. Durante el proceso de la escritura de programa, slo se manejan
los datos de 8 bits. En otras palabras, todo lo que usted podr cambiar en el
programa y a lo que podr afectar ser de 8 bits de ancho. Todos los
programas escritos para estos microcontroladores sern almacenados en la
memoria ROM interna del microcontrolador despus de haber sido
compilados a cdigo mquina. No obstante, estas localidades de memoria
ROM no tienen 8, sino 12, 14 o 16 bits. 4, 6 o 8 bits adicionales representan
una instruccin que especifica a la CPU qu hacer con los datos de 8 bits.
JUEGO DE INSTRUCCIONES
Si est pensando en todas estas cosas por primera vez, todo le parecer un
poco confuso. Por esa razn, vaya paso a paso. Antes que nada, seleccione
al fabricante, es decir, la familia de microcontroladores que ofrece. Luego,
aprenda a trabajar con un modelo particular. Slo aprenda lo que necesite
aprender, no entre demasiado en detalles. Resuelva el problema especfico y
le pasar una cosa increble - ser capaz de manejar cualquier modelo del
mismo fabricante...
If you are interested in learning more about it, just keep on reading.
JUEGO DE INSTRUCCIONES
Instrucci Bander CL
Descripcin Operacin *
n a K
Instrucciones para la transmisin de datos
MOVLW k Mover literal a W k -> w 1
MOVWF f Mover el contenido de W a f W -> f 1
MOVF f,d Mover el contenido de f a d f -> d Z 1 1, 2
CLRW Borrar el contenido de W 0 -> W Z 1
CLRF f Borrar el contenido de f 0 -> f Z 1 2
SWAPF f(7:4),(3:0) ->
Intercambiar de nibbles en f 1 1, 2
f,d f(3:0),(7:4)
Instrucciones aritmtico - lgicas
C, DC,
ADDLW k Sumar literal a W W+k -> W 1
Z
ADDWF C,
Sumar el contenido de W y f W+f -> d 1 1, 2
f,d DC ,Z
C, DC,
SUBLW k Restar W de literal k-W -> W 1
Z
SUBWF C, DC,
Restar W de f f-W -> d 1 1, 2
f,d Z
ANDLW k AND W con literal W AND k -> W Z 1
ANDWF
AND W con f W AND f -> d Z 1 1, 2
f,d
IORLW k OR inclusivo de W con literal W OR k -> W Z 1
IORWF f,d OR inclusivo de W con f W OR f -> d Z 1 1, 2
XORWF
OR exclusivo de W con literal W XOR k -> W Z 1 1, 2
f,d
XORLW k OR exclusivo de W con f W XOR f -> d Z 1
INCF f,d Sumar 1 a f f+1 -> f Z 1 1, 2
DECF f,d Restar 1 a f f-1 -> f Z 1 1, 2
RLF f,d Rotar F a la izquierda a travs C 1 1, 2
del bit de Acarreo
Rotar F a la derecha a travs
RRF f,d C 1 1, 2
del bit de Acarreo
COMF f,d Complementar f f -> d Z 1 1, 2
Instrucciones orientadas a bit
BCF f,b Poner a 0 el bit b del registro f 0 -> f(b) 1 1, 2
BSF f,b Poner a 1 el bit b del registro f 1 -> f(b) 1 1, 2
Instrucciones de control de programa
1
BTFSC f,b Saltar si bit b de registro f es 0 Skip if f(b) = 0 3
(2)
1
BTFSS f,b Saltar si bit b de reg. f es 1 Skip if f(b) = 1 3
(2)
DECFSZ Disminuir f en 1. Saltar si el f-1 -> d skip if Z = 1 1,
f,d resultado es 0 1 (2) 2, 3
INCFSZ Incrementar f en 1. Saltar si el f+1 -> d skip if Z = 1 1,
f,d resultado es 1 0 (2) 2, 3
GOTO k Saltar a una direccin k -> PC 2
PC -> TOS, k ->
CALL k Llamar a una subrutina 2
PC
RETURN Retornar de una subrutina TOS -> PC 2
k -> W, TOS ->
RETLW k Retornar con literal en W 2
PC
TOS -> PC, 1 ->
RETFIE Retornar de una interupcin 2
GIE
Otras instrucciones
TOS -> PC, 1 ->
NOP No operacin 1
GIE
Reiniciar el temporizador perro 0 -> WDT, 1 ->
CLRWDT TO, PD 1
guardin TO, 1 -> PD
0 -> WDT, 1 ->
SLEEP Poner en estado de reposo TO, PD 1
TO, 0 -> PD
LENGUAJE ENSAMBLADOR
Lenguaje C
FASES DE COMPILACIN
El proceso de compilacin consiste en varios pasos y se ejecuta
automticamente por el compilador. Por con, un conocimiento bsico del
funcionamiento puede ser til para entender el concepto del lenguaje mikroC.
ESTRUCTURA DE PROGRAMA
Los comentarios son las partes del programa utilizados para aclarar las
instrucciones de programa o para proporcionar ms informacin al respecto.
El compilador no hace caso a los comentarios y no los compila al cdigo
ejecutable. Dicho de manera sencilla, el compilador es capaz de reconocer
los caracteres especiales utilizados para designar dnde los comentarios
comienzan y terminan y no hace nada de caso al texto entre ellos durante la
compilacin. Hay dos tipos de tales caracteres. Unos designan los
comentarios largos que ocupan varias lneas de programa marcados por la
secuencia especial /*...*/, mientras que otros designan los comentarios cortos
que caben en una sola lnea //. Aunque los comentarios no pueden afectar a
la ejecucin de programa, son tan importantes como cualquier otra parte de
programa. Aqu est el porqu... Con frecuencia es necesario mejorar,
modificar, actualizar, simplificar un programa... No es posible interpretar
incluso los programas simples sin utilizar los comentarios.
Tamao
Tipo de
Descripcin (nmero de Rango de valores
dato
bits)
char Texto (caracteres) 8 de 0 a 255
int Valores enteros 16 de -32768 a 32767
Valores en punto de 1.1754943508210-38 a
float 32
flotante 6.805647744071038
Valores en punto
de 1.1754943508210-38 a
double flotante de doble 32
6.805647744071038
precisin
0. // = 0.0
-1.23 // = -1.23
23.45e6 // = 23.45 * 10^6
2e-5 // = 2.0 * 10^-5
3E+10 // = 3.0 * 10^10
.09E34 // = 0.09 * 10^34
59 // entero
'p' // carcter ASCII 'p'
Definiciones
En mikroC, los identificadores pueden ser tan largos como quiera. Sin
embargo, hay varias restricciones:
temperatura_V1 // OK
Presin // OK
no_corresponder // OK
dat2string // OK
SuM3 // OK
_vtexto // OK
7temp // NO -- no puede empezar con un nmero
%ms_alto // NO -- no pueden contener caracteres especiales
if // NO -- no puede coincidir con una palabra reservada
j23.07.04 // NO -- no puede contener caracteres especiales (punto)
nombre de variable // NO -- no puede contener espacio en blanco
Declaracin de variables
<tipo> variable;
Aparte del nombre y del tipo, a las variables se les asignan con frecuencia
los valores iniciales justamente enseguida de su declaracin. Esto no es un
paso obligatorio, sino una cuestin de buenas costumbres. Se parece a lo
siguiente:
Declaracin de constantes
Similar a las variables, las constantes deben ser declaradas antes de ser
utilizadas en el programa. En mikroC, no es obligatorio especificar el tipo de
constante al declararla. Por otra parte, las constantes deben ser inicializadas
a la vez que se declaran. El compilador reconoce las constantes por su
prefijo const utilizado en la declaracin. Dos siguientes declaraciones son
equivalentes:
int Velocidad_de_ascensor
enum motor_de_ascensor {PARADA,INICIO,NORMAL,MXIMO};
Velocidad_de_ascensor = NORMAL; // Velocidad_de_ascensor = 2
Definir los nuevos tipos de datos
La palabra clave typedef le permite crear con facilidad los nuevos tipos de
datos.
File 1:
void main(){
PORTA = cnt++; // Cualquier modificacin de cnt en File_1 ser visible en
File_2
hello(); // Funcin hello()se puede llamar desde aqu
}
File 2:
int cnt = 0;
void hello();
2.5 OPERADORES
OPERADORES ARITMTICOS
Operad
Operacin
or
+ Adicin
- Resta
* Multiplicacin
/ Divisin
Resto de la
%
divisin
int a,b,c; // Declarar 3 enteros a, b, c
a = 5; // Inicializar a
b = 4; // Inicializar b
c = a + b; // c = 9
c = c%2; // c = 1. Esta operacin se utiliza con frecuencia
// para comprobar la paridad. En este caso, el
// resultado es 1 lo que significa que la variable
// es un nmero imparo
OPERADORES DE ASIGNACIN
Ejemplo
Operad
Expresi Equivalen
or
n te
+= a += 8 a = a + 8
-= a -= 8 a = a - 8
*= a *= 8 a = a * 8
/= a /= 8 a = a / 8
%= a %= 8 a = a % 8
int a = 5; // Declarar e inicializar la variable a
a += 10; // a = a + 10 = 15
Operad Ejempl
Descripcin
or o
++a Variable "a" es incrementada
++
a++ por 1
-- --b Variable "a" es decrementada
b-- por 1
int a, b, c;
a = b = 5;
c = 1 + a++; // c = 6
b = ++c + a // b = 7 + 6 = 13
OPERADORES RELACIONALES
OPERADORES LGICOS
Operad Funci
or n
&& Y
|| O
! NO
Operad
Descripcin Ejemplo Resultado
or
~ Complemento a uno a = ~b b=5 a = -5
Desplazamiento a la a = b << b= a=
<<
izquierda 2 11110011 11001100
Desplazamiento a la a = b >> b= a=
>>
derecha 2 11110011 00011110
a=
11100011 c=
& Y lgico para manejo de bits c = a & b
b= 11000000
11001100
a=
11100011 c=
| O lgico para manejo de bits c = a | b
b= 11101111
11001100
a=
EXOR lgico para manejo 11100011 c=
^ c=a^b
de bits b= 00101111
11001100
Priorida
Operadores Asociatividad
d
de izquierda a
Alta () [] -> .
derecha
! ~ ++ -- +(unitario) -(unitario) de derecha a
*Puntero &Puntero izquierda
de izquierda a
*/%
derecha
de izquierda a
+-
derecha
de izquierda a
<>
derecha
de izquierda a
< <= > >=
derecha
de izquierda a
== !=
derecha
de izquierda a
&
derecha
de izquierda a
^
derecha
de izquierda a
|
derecha
de izquierda a
&&
derecha
|| de derecha a
izquierda
de derecha a
?:
izquierda
de izquierda a
Baja = += -= *= /= /= &= ^= |= <= >=
derecha
int a, b, res;
a = 10;
b = 100;
res = a*(a + b); // resultado = 1100
res = a*a + b; // resultado = 200
Para realizar una conversin explcita, antes de escribir una expresin o una
variable hay que especificar el tipo de resultado de operacin entre
parntesis.
ESTRUCTURAS CONDICIONALES
if(expresin) operacin;
if(expresin)
operacin1
else
operacin2
if(expresin) {
... //
... // operacin1
...} //
else
operacin2
Operador Switch
break;
case constante2:
break;
...
default:
BUCLES
Bucle While
while(expresin){
comandos
...
}
Bucle For
Bucle Do-while
do
operacin
while (cambiar_condicin);
Todos los siguientes ejemplos son equivalentes. Esta parte del cdigo
visualiza "hello" en un LCD 10 veces con un retardo de un segundo. Note
que en este ejemplo se utilizan funciones predefinidas, que se encuentran en
las libreras del compilador mikroC PRO for PIC. No obstante le aconsejamos
que no trate de entenderlas en detalle. Su comportamiento general dentro
del bucle se explica por medio de los comentarios.
i = 0; // Inicializacin del contador
SENTENCIAS DE SALTO
SENTENCIA BREAK
SENTENCIA CONTINUE
SENTENCIA GOTO
MATRICES
// mtodo 1
int display [3]; // Declaracin de la matriz display capaz de contener 3
enteros
// mtodo 2
const DGITOS = 5;
char Matriz_nueva[DGITOS]; // Declaracin de la matriz Matriz_nueva
// capaz de contener 5 enteros
Una matriz se puede inicializar a la vez que se declara, o ms tarde en el
programa. En ambos casos, este paso se realiza al utilizar llaves:
Para leer o modificar un elemento de matriz del ejemplo anterior, basta con
introducir su ndice encerrado entre corchetes:
void main() {
const MUESTRAS_DE_AGUA = 4; // Valor de la constante
MUESTRAS_DE_AGUA es 4
int i, temp; // Variables i y temp son de tipo int
int profunidad_de_sonda [MUESTRAS_DE_AGUA] = {24,25,1,1987};//
Todos
MATRICES BIDIMENSIONALES
int Tabla [3][4]; // Tabla se define de modo que tenga 3 filas y 4 columnas
PUNTEROS
tipo_de_variable *puntero;
puntero = &variable;
ESTRUCTURAS
struct nombre_de_estructura {
tipo1_de_miembro1 miembro1;
tipo2_de_miembro2 miembro2;
tipo3_de_miembro3 miembro3;
..
};
struct generador {
int voltaje;
char corriente;
};
turbina_3.voltaje = 150;
turbina_3.corriente = 12;
Por supuesto, igual que al utilizar los punteros, todava se le permite realizar
operaciones por medio de operadores y sentencias definidos en las partes
anteriores.
2.8 FUNCIONES
Una funcin es una subrutina que contiene una lista de sentencias a realizar.
La idea principal es dividir un programa en varias partes utilizando estas
funciones para resolver el problema inicial con ms facilidad. Adems, las
funciones nos permiten utilizar las destrezas y el conocimiento de otros
programadores. Una funcin se ejecuta cada vez que se llame dentro de otra
funcin. En C, un programa contiene como mnimo una funcin, la funcin
main(), aunque el nmero de funciones es normalmente mayor. Al utilizar
funciones el cdigo se hace ms corto ya que es posible llamar una funcin
tantas veces como se necesite. En C, el cdigo normalmente consiste en
muchas funciones. No obstante, en caso de que su programa sea muy corto
y simple, puede escribir todas las sentencias dentro de la funcin principal.
FUNCIN PRINCIPAL
..
.
};
Esto significa que f es una funcin que recibe un nmero real x como
parmetro y devuelve 2*x-y.
Note que una funcin no necesita parmetros (funcin main() por ejemplo),
pero debe estar entre parntesis. En caso contrario, el compilador
malinterpretara la funcin. Para hacerlo ms claro, puede sustituir el espacio
en blanco encerrado entre parntesis por la palabra clave void: main (void).
VALOR DEVUELTO
tipo de resultado
nombre de funcin
tipos de parmetros
un punto y coma (;)
void main() {
int maximum, input[SIZE] = {5,10,3,12,0}; // Declaracin de variables en la
matriz
maximum = sort(input); // Llamar a funcin y asignarle el
mximo
// valor a la variable maximum
}
void main()
{
double promedio1, promedio2; // Declaracin de las variables promedio1
// y promedio2
int voltaje [NMERO_DE_MEDICIONES] = {7,8,3,5,6,1,9}; // Declaracin
de la
// matriz voltaje
promedio1 = mtodo_1(&voltaje[0]); // Parmetro de la funcin es la
direccin
// del primer miembro
promedio2 = mtodo_2(voltaje); // Parmetro de la funcin es la direccin
de
// la matriz
}
//
//
return(suma/NMERO_DE_MEDICIONES);
}
Ahora, vamos a presentar slo las directivas del preprocesador utilizadas con
ms frecuencia. Sin embargo, no es necesario saber todas ellas para
programar microcontroladores. Slo tenga en cuenta que el preprocesador
es una herramienta muy poderosa para los programadores avanzados en C,
especialmente para el control de compilacin.
Esto significa que el cdigo sustituido debe respetar la sintaxis del mikroC.
La accin se realiza por medio de la directiva '#define'.
Tanque_1 = (((Dimetro/2)*(Dimetro/2)*PI)*altura;
INCLUSIN DE ARCHIVOS
Como ya hemos visto, hay varias divergencias entre los lenguajes mikroC y
ANSI C. En este captulo vamos a presentar las caractersticas especficas
del mikroC con el propsito de facilitar la programacin de los
microcontroladores PIC.
TRISB = 0; // todos los pines del puerto PORTB se configuran como salidas
PORTB = 0; // todos los pines del PORTB se ponen a 0
El compilador mikroC PRO for PIC le permite acceder a los bits individuales
de variables de 8 bits por su nombre o su posicin en byte:
TIPO SBIT
Si quiere declarar una variable que corresponde a un bit de un SFR, hay que
utilizar el tipo sbit. Una variable de tipo sbit se comporta como un puntero y
se debe declarar como una variable global:
TIPO BIT
El compilador mikroC PRO for PIC proporciona un tipo de datos bit que se
puede utilizar para declarar variables. No se puede utilizar en las listas de
argumentos, punteros y los valores devueltos de funciones. Adems, no es
posible declarar e inicializar una variable de tipo bit en la misma lnea. El
compilador determina el bit en uno de los registros disponibles para
almacenar las variables.
asm
{
instrucciones en ensamblador
...
}
FUNCIN DE INTERRUPCIN
void interrupt() {
cnt++ ; // Al producirse una interrupcin
// la cnt se incrementa en 1
PIR1.TMR1IF = 0; // Poner a 0 el bit TMR1IF
}
LIBRERAS
Librara Descripcin
ANSI C Ctype Utilizada principalmente para probar o para convertir los
Library datos
ANSI C Math Utilizada para las operaciones matemticas de punto
Library flotante
ANSI C Stdlib
Contiene las funciones de libreras estndar
Library
ANSI C String Utilizada para realizar las operaciones de cadenas y de
Library manipulacin de memoria
- libreras miscelneas:
Librara Descripcin
Button Library Utilizada para desarrollar los proyectos
Conversion
Utilizada para la conversin de tipos de datos
Library
Sprint Library Utilizada para formatear los datos con facilidad
PrintOut Library Utilizada para formatear los datos e imprimirlos
Time Library Utilizada para clculos de tiempo (formato UNIX time)
Trigonometry Utilizada para la implementacin de funciones
Library trigonomtricas fundamentales
Setjmp Library Utilizada para los saltos de programa
Librara Descripcin
ADC Library Utilizada para el funcionamiento del convertidor A/D
CAN Library Utilizada para las operaciones con el mdulo CAN
Utilizada para las operaciones con el mdulo CAN
CANSPI Library
externo (MCP2515 o MCP2510)
Utilizada para las operaciones con las tarjetas de
Compact Flash Library
memoria Compact Flash
Utilizada para las operaciones con la memoria
EEPROM Library
EEPROM incorporada
EthernetPIC18FxxJ60 Utilizada para las operaciones con el mdulo
Library Ethernet incorporado
Utilizada para las operaciones con la memoria Flash
Flash Memory Library
incorporada
Utilizada para las operaciones con el mdulo LCD
Graphic Lcd Library
grfico con resolucin 128x64
Utilizada para las operaciones con el mdulo de
I2C Library
comunicacin serial I2C incorporado
Utilizada para las operaciones con el teclado
Keypad Library
(botones de presin 4x4)
Utilizada para las operaciones con el LCD (de 2x16
Lcd Library
caracteres)
Manchester Code Utilizada para la comunicacin utilizando el cdigo
Library Manchester
Utilizada para las operaciones con las tarjetas
Multi Media Card Library
multimedia MMC flash
Utilizada para las operaciones con los circuitos
One Wire Library
utilizando la comunicacin serial One Wire
Utilizada para las operaciones con el extensor de
Port Expander Library
puertos MCP23S17
Utilizada para las operaciones con el teclado
PS/2 Library
estndar PS/2
PWM Library Utilizada para las operaciones con el mdulo PWM
incorporado
Utilizada para las operaciones con los mdulos
RS-485 Library
utilizando la comunicacin serial RS485
Utilizada para simular la comunicacin I2C con
Software I2C Library
software
Utilizada para simular la comunicacin SPI con
Software SPI Library
software
Utilizada para simular la comunicacin UART con
Software UART Library
software
Sound Library Utilizada para generar las seales de audio
Utilizada para las operaciones con el mdulo SPI
SPI Library
incorporado
Utilizada para la comunicacin SPI con el mdulo
SPI Ethernet Library
ETHERNET (ENC28J60)
Utilizada para la comunicacin SPI de 4 bits con el
SPI Graphic Lcd Library
LCD grfico
Utilizada para la comunicacin SPI de 4 bits con el
SPI LCD Library
LCD (de 2x16 caracteres)
Utilizada para la comunicacin SPI de 8 bits con el
SPI Lcd8 Library
LCD
SPI T6963C Graphic Utilizada para la comunicacin SPI con el LCD
Lcd Library grfico
Utilizada para las operaciones con el mdulo UART
UART Library
incorporado
Utilizada para las operaciones con el mdulo USB
USB Hid Library
incorporado
Antes que nada, usted debe instalar el compilador (con su IDE) en la PC. La
instalacin del mikroC PRO for PIC es similar a la instalacin de cualquier
programa en Windows. Todo el procedimiento se lleva a cabo por medio de
los wizards (asistentes de instalacin):
Basta con seguir las instrucciones y pulsar sobre Next, OK, Next, Next... En
general, es el mismo procedimiento menos la ltima opcin: 'Do you want to
install PICFLASH v7.11 programmer?'. Para qu sirve este software? De
eso vamos a hablar ms tarde. Por ahora, basta con saber que es un
software autnomo utilizado para cargar el programa en el microcontrolador.
Al iniciar el IDE del compilador mikroC PRO for PIC por primera vez,
aparecer una ventana como se muestra a continuacin:
Desgraciadamente, una descripcin detallada de todas las opciones
disponibles de este IDE nos tomara mucho tiempo. Por eso vamos a
describir slo lo ms importante del compilador mikroC PRO for PIC. De
todos modos, para obtener ms informacion presione el botn de Ayuda
(Help) [F1].
Una vez creado el proyecto, es posible manejar todos los archivos que
contiene al utilizar la ventana Project Manager. Basta con pulsar con el botn
derecho del ratn sobre una carpeta y seleccionar la opcin que necesita
para su proyecto.
Oscillator (oscilador):
Build/Debugger Type:
DEPURAR EL PROGRAMA
Para iniciar la depuracin, pulse sobre la opcin Start debugger del men
Run. El editor del cdigo ser ligeramente modificado automticamente y
aparecer una ventana denominada Watch Values. El principio de
depuracin se basa en ejecutar el programa paso a paso y monitorear el
contenido de los registros y los valores de las variables. De este modo, es
posible comprobar el resultado de un clculo y ver si algo inesperado ha
ocurrido. Al ejecutar el programa paso a paso, podr localizar los problemas
con facilidad.
STOPWATCH (CRONMETRO)
TERMINAL USART
arquitectura RISC
o El microcontrolador cuenta con solo 35 instrucciones diferentes
o Todas las instrucciones son uni-ciclo excepto por las de
ramificacin
Frecuencia de operacin 0-20 MHz
Oscilador interno de alta precisin
o Calibrado de fbrica
o Rango de frecuencia de 8MHz a 31KHz seleccionado por
software
Voltaje de la fuente de alimentacin de 2.0V a 5.5V
o Consumo: 220uA (2.0V, 4MHz), 11uA (2.0 V, 32 KHz) 50nA (en
modo de espera)
Ahorro de energa en el Modo de suspensin
Brown-out Reset (BOR) con opcin para controlar por software
35 pines de entrada/salida
o alta corriente de fuente y de drenador para manejo de LED
o resistencias pull-up programables individualmente por software
o interrupcin al cambiar el estado del pin
memoria ROM de 8K con tecnologa FLASH
o El chip se puede re-programar hasta 100.000 veces
Opcin de programacin serial en el circuito
o El chip se puede programar incluso incorporado en el dispositivo
destino.
La CPU cuenta con slo 35 instrucciones simples. Cabe decir que para
poder programar otros microcontroladores en lenguaje ensamblador es
necesario saber ms de 200 instrucciones
El tiempo de ejecucin es igual para casi todas las instrucciones y
tarda 4 ciclos de reloj. La frecuencia del oscilador se estabiliza por un
cristal de cuarzo. Las instrucciones de salto y de ramificacin tardan
ocho ciclos de reloj en ejecutarse. Esto significa que si la velocidad de
operacin del microcontrolador es 20 MHz, el tiempo de ejecucin de
cada instruccin ser 200nS, o sea, el programa ejecutar 5millones
de instrucciones por segundo!
MEMORIA
MEMORIA ROM
La memoria ROM se utiliza para guardar permanente el programa que se
est ejecutando. Es la razn por la que es frecuentemente llamada memoria
de programa. El PIC16F887 tiene 8Kb de memoria ROM (en total 8192
localidades). Como la memoria ROM est fabricada con tecnologa FLASH,
su contenido se puede cambiar al proporcionarle un voltaje de programacin
especial (13V).
MEMORIA EEPROM
MEMORIA RAM
...
if (PORTB.0 = 1) // Comprobar si el pin RB0 est a uno
sum++ ; // Si est, el valor de la variable se aumenta por 1
... // Si no est, el programa sale de la sentencia if
...
...
TRISC = 0x00 // un cero lgico (0) se escribe en el registro TRISC
(todos
// los pines del puerto PORTC se configuran como salidas)
PORTC = 0b01100011 // cambio de estado lgico de todos los pines del
puerto PORTC
...
Cabe tener en mente que el dato se apila circularmente. Esto significa que
despus de que se apile ocho veces, la novena vez se sobrescribe el valor
que se almacen al apilar el dato por primera vez. La dcima vez que se
apile, se sobrescribe el valor que se almacen al apilar el dato por segunda
vez etc. Datos sobrescritos de esta manera no se pueden recuperar.
Adems, el programador no puede acceder a estos registros para hacer
escritura/lectura. No hay ningn bit de estado para indicar el estado de
desbordamiento o subdesbordamiento de pila. Por esta razn hay que tener
un especial cuidado al escribir un programa.
SISTEMA DE INTERRUPCIONES
Registro STATUS
RP RP Banco
1 0 activo
0 0 Banco 0
0 1 Banco 1
1 0 Banco 2
1 1 Banco 3
TO - Time-out bit (bit de salida del temporizador perro guardin)
o 1 - Despus de encender el microcontrolador, despus de
ejecutarse la instruccin CLRWDT que reinicia al WDT
(temporizador perro guardin) o despus de ejecutarse la
instruccin SLEEP que pone al microcontrolador en el modo de
bajo consumo.
o 0 - Despus de acabarse el tiempo del WDT.
Registro OPTION_REG
El registro OPTION_REG contiene varios bits de control para configurar el
pre - escalador del Temporizador 0/WDT, el temporizador Timer0, la
interrupcin externa y las resistencias pull-up en el puerto PORTB.
T0SE - TMR0 Source Edge Select bit (bit selector de tipo de flanco en
TOCKI) selecciona el flanco (ascendente o descendente) contado por
el temporizador Timer0 por el pin RA4/T0CKI.
o 1 - Incrementa en flanco descendente en el pin TOCKI.
o 0 - Incrementa en flanco ascendente en el pinTOCKI.
PS2, PS1, PS0 Prescaler Rate Select bits (bit selector del valor del
divisor de frecuencia)
PS PS PS TMR
WDT
2 1 0 0
0 0 0 1:2 1:1
0 0 1 1:4 1:2
0 1 0 1:8 1:4
0 1 1 1:16 1:8
1 0 1 1:64 1:32
1:12
1 1 0 1:64
8
1:25 1:12
1 1 1
6 8
void main() {
OPTION_REG = 0b00001111; // Pre-escalador est asignado al WDT
(1:128)
asm CLRWDT; // Comando en ensamblador para reiniciar al WDT
...
...// El tiempo entre estos dos comandos CLRWDT no debe exceder 32.768
microsegundos (128x256)
...
asm CLRWDT; // Comando en ensamblador para reiniciar al WDT
...
...// El tiempo entre estos dos comandos CLRWDT no debe exceder 32.768
microsegundos (128x256)
...
asm CLRWDT; // Comando en ensamblador para reiniciar al WDT
}
Como hemos visto, toda la idea es muy simple y eficiente. Al llegar la peticin
de interrupcin, primero el bit de bandera se pone a uno.
Para habilitar una interrupcin causada por el cambio del estado lgico en el
puerto PORTB, es necesario habilitarla para cada bit por separado. En este
caso, los bits del registro IOCB se comportan como los bits IE de control.
Registro INTCON
void initMain() {
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como
digitales
PORTB = 0; // Todos los pines del puerto PORTB se ponen a cero
TRISB = 0b00010000; // Todos los pines del puerto PORTB menos
PORTB.4 se
// configuran como salidas
Registro PIE1
void main() {
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como
digitales
T1CON = 1; // Encender el temporizador Timer
PIR1.TMR1IF = 0; // El bit TMR1IF se pone a cero
TMR1H = 0x80; // Establecer los valores iniciales para el temporizador
Timer1
TMR1L = 0x00;
PIE1.TMR1IE = 1; // Habilitar la interrupcin al producirse un
// desbordamiento en el Timer1
cnt = 0; // Reiniciar la variable cnt
INTCON = 0xC0; // Habilitar la interrupcin (los bits GIE y PEIE)
...
Registro PIE2
void main() {
TRISB = 0; // Todos los pines del puerto PORTB se
configuran
// como salidas
PORTB.F1 = 1; // El pin PORTB.1 se pone a uno
ANSEL = 0b00000101;; // Los pines RA0/C12IN0- y RA2/C2IN+
son las
// entradas analgicas
ANSELH = 0; // Todos los pines de E/S se configuran como
digitales
CM2CON0.C2CH0 = CM2CON0.C2CH1 = 0; // El pin RA0 se selecciona
para ser una
// entrada invertida del C2
PIE2.C2IE = 1; // Habilita la interrupcin del comparador C2INT
CON.GIE = 1; // Interrupcin global est habilitada
CM2CON0.C2ON = 1; // Comparador C2 est habilitado
...
...
Registro PIR1
Registro PIR2
void main() {
PORTA.F0 = 1; // Pin PORTA.0 se pone a uno
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como
digitales
TRISA = 0; // Los pines del puerto PORTA se configuran como
salidas
Delay_ms(1); // Cargar el capacitor
PIR2.ULPWUIF = 0; // Bandera ULPWUIF se pone a cero
PCON.ULPWUE = 1; // Habilitar el funcionamiento del mdulo
ULPWU
TRISA.F0 = 1; // PORTA.0 se configura como entrada
PIE2.ULPWUIE = 1; // Habilitar la interrupcin por el mdulo
ULPWU
INTCON.GIE = INTCON.PEIE = 1; // Habilitar todas las interrupciones
asm SLEEP; // Pasar al modo de bajo consumo
...
...
Registro PCON
BOR - Brown-out Reset Status bit (bit de estado Brown - out reset)
o 1 - No se ha producido Brown - out reset.
o 0 - Se ha producido Brown - out reset. El bit debe ponerse a uno
por software despus de que se haya producido Brown - out
reset.
Los ocho bits inferiores (el byte inferior) del registro PCL son de
lectura/escritura, mientras que los cinco bits superiores del registro
PCLATH son de slo escritura.
El registro PCLATH se borra con cada reinicio.
En el lenguaje ensamblador, el valor del contador de programa est
marcado con PCL y se refiere slo a los ocho bits. Usted debe tener
cuidado al utilizar la instruccin "ADDWF PCL". Esto es una instruccin
de salto que especifica la localidad destino al aadir un nmero a la
direccin actual. Se utiliza con frecuencia para saltar a la tabla de
bsqueda o a la tabla de ramificacin de programa y leerlas. Un
problema surge si la direccin actual es de tal tamao que al sumar se
produce un cambio en un bit que pertenece al byte superior del registro
PCLATH.
La ejecucin de una instruccin sobre el registro PCL causa
simultneamente la sustitucin de los bits del contador de programa
por los contenidos en el registro PCLATH. De todos modos, el registro
PCL puede acceder slo a 8 bits inferiores del resultado de la
instruccin, pues el siguiente salto ser completamente incorrecto. La
solucin a este problema es poner estas instrucciones en las
direcciones que terminan en xx00h. De esta manera se habilitan los
saltos de programa hasta 255 localidades. Si se ejecutan los saltos
ms largos por medio de esta instruccin, el registro PCLATH debe ser
incrementado por 1 cada vez que se produce desbordamiento en el
registro PCL.
Al llamar una subrutina o al ejecutarse un salto (instrucciones CALL y
GOTO), el microcontrolador es capaz de proporcionar solamente
direccionamiento de 11 bits. Similar a la RAM que est dividida en
bancos, la ROM est dividida en las cuatro pginas de 2K cada una.
Las instrucciones dentro de estas pginas se ejecutan regularmente.
Dicho de manera sencilla, como el procesador est proporcionado con
una direccin de 11 bits del programa, es capaz de direccionar
cualquier localidad dentro de 2KB. La siguiente figura muestra el salto
a la direccin del subprograma PP1.
Como hemos visto, el problema con "los bits de direccionamiento que faltan"
se soluciona con un "prstamo" del otro registro. Esta vez, es el sptimo bit,
denominado bit IRP del registro STATUS.
Una de las caractersticas ms importantes del microcontrolador es el
nmero de los pines de entrada/ salida, que permite conectarlo con los
perifricos. El PIC16F887 tiene en total 35 pines de E/S de propsito
general, lo que es suficiente para la mayora de las aplicaciones.
Al poner a cero un bit del registro TRIS (pin=0), el pin correspondiente del
puerto se configurar como una salida. De manera similar, al poner a uno un
bit del registro TRIS (bit=1), el pin correspondiente del puerto se configurar
como una entrada. Esta regla es fcil de recordar: 0 = Entrada 1 = Salida.
Similar a que los bits del registro TRISA determinan cules pines sern
configurados como entradas y cules sern configurados como salidas, los
bits apropiados del registro ANSEL determinan si los pines sern
configurados como entradas analgicas o entradas/salidas digitales.
Cada bit de este puerto tiene una funcin adicional relacionada a algunas
unidades perifricas integradas, que vamos a describir en los siguientes
captulos. Este captulo cubre slo la funcin adicional del pin RA0, puesto
que est relacionado al puerto PORTA y a la unidad ULPWU.
// El pin PORTA.2 se configura como una entrada digital. Todos los dems
pines del puerto
// PORTA son salidas digitales
...
...
UNIDAD ULPWU
Un pin se configura como salida y se le lleva un uno lgico (1). Esto causa
una carga del capacitor. Inmediatamente despus, el mismo pin se configura
como entrada. El cambio de estado lgico habilita una interrupcin y el
microcontrolador entra en modo de reposo. Slo ha quedado esperar que se
descargue el capacitor por la corriente de fuga fluyendo por el pin de
entrada. Despus de la descarga, se produce una interrupcin y el
microcontrolador contina con la ejecucin de programa en modo normal.
Todo el procedimiento se repite.
En teora, esto es una solucin perfecta. El problema es que todos los pines
capaces de causar una interrupcin son digitales y tienen una corriente de
fuga relativamente alta cuando el voltaje sobre ellos no est cerca de los
valores lmites de Vdd (1) o VSS (0). En este caso, el condensador se
descarga en poco tiempo ya que la corriente es de varias centenas de
microamperios. Por esta razn se dise el circuito ULPWU, capaz de indicar
una lenta cada de voltaje con un consumo de corriente mnimo.
Cada bit de este puerto tiene una funcin adicional relacionada a algunas
unidades perifricas integradas, que vamos a describir en los siguientes
captulos.
Al estar habilitado, cada bit del puerto PORTB configurado como una
entrada puede causar una interrupcin al cambiar su estado lgico.
Con el propsito de habilitar que los termi nales causen una
interrupcin, el bit apropiado del registro IOCB debe estar a uno.
Gracias a estas caractersticas, los pines del puerto PORTB se utilizan con
frecuencia para comprobar los botones de presin en el teclado ya que
detectan cada apretn de botn infaliblemente. Por eso, no es necesario
examinar todas las entradas una y otra vez.
Cuando los pines X,Y y Z se configuran como entradas de puesta a uno (1),
slo se necesita esperar una peticin de interrupcin que aparece al apretar
un botn. Ms tarde, se comprueba cul botn fue activado al combinar
ceros y unos en las entradas.
...
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como
digitales
PORTB = 0; // Todos los pines del puerto PORTB se ponen a cero
TRISB = 0b00000010; // Todos los pines del puerto PORTB excepto
PORTB.1
// se configuran como salidas
RBPU = 0; // Se habilitan las resistencias pull-up
WPUB1 = 1; // La resistencia pull-up se conecta al pin PORTB.1
IOCB1 = 1; // El pin PORTB.1 puede causar una interrupcin por el
// cambio del estado lgico
RBIE = GIE = 1; // Se habilita una interrupcin
...
PIN RB0/INT
Como hemos visto, los voltajes aplicados a los pines del zcalo del
programador son los mismos que los utilizados durante la programacin
ICSP.
Similar a los puertos PORTA y PORTB, en este caso los tres pines se
pueden configurar como entradas analgicas. Los bits del registro ANSEL
determinan si estos pines sern configurados como entradas analgicas
(AN) o entradas/salidas digitales:
/* El pin PORTE.0 se configura como una entrada analgica mientras que los
dems tres
pines del mismo puerto se configuran como digitales */
...
ANSEL = 0b00100000; // El pin PORTE.0 se configura como analgico
ANSELH = 0; // Todos los pines de E/S se configuran como digitales
TRISE = 0b00000001; // Todos los pines del puerto PORTE excepto el
// PORTE.0 se configuran como salidas
PORTE = 0; // Todos los bits del puerto PORTE se ponen a cero
...
La regla es la siguiente:
Para configurar un pin como una entrada analgica, el bit apropiado de los
registros ANSEL o ANSELH se debe poner a uno (1). Para configurar un pin
como una entrada/salida digital, el bit apropiado se debe poner a cero (0).
El estado lgico de los bits del registro ANSEL no tiene influencia en las
funciones de salidas digitales. Al intentar a leer un pin de puerto configurado
como una entrada analgica, el resultado es siempre 0.
Es probable que usted nunca vaya a escribir un programa que no utilice
puertos, as que el esfuerzo para aprender todo sobre ellos en definitiva vale
la pena. De todos modos, los puertos son probablemente los mdulos ms
simples dentro del microcontrolador. Se utilizan de la siguiente manera:
Temporizador/contador de 8 bits;
Pre-escalador de 8 bits (lo comparte con el temporizador perro
guardin);
Fuente de reloj interna o externa programable;
Generacin de interrupcin por desbordamiento; y
Seleccin del flanco de reloj externo programable.
T0CS - TMR0 Clock Select bit (bit selector de tipo de reloj para el
Timer0)
o 0 - Los pulsos se llevan a la entrada del temporizador/contador
Timer0 por el pin RA4.
o 1 - El temporizador utiliza los pulsos de reloj internos (Fosc/4).
T0SE - TMR0 Source Edge Select bit (bit selector de tipo de flanco)
o 0 - Incrementa en flanco descendente en el pin TMR0.
o 1 - Incrementa en flanco ascendente en el pin TMR0.
PS2, PS1, PS0 - Prescaler Rate Select bit (bit selector del valor del
divisor de frecuencias)
o El valor del divisor de frecuencias se ajusta al combinar estos
bits. Como se muestra en la tabla a la derecha, la misma
combinacin de bits proporciona los diferentes valores del divisor
de frecuencias para el temporizador/contador y el temporizador
perro guardin, respectivamente.
PS PS PS TMR
WDT
2 1 0 0
0 0 0 1:2 1:1
0 0 1 1:4 1:2
0 1 0 1:8 1:4
0 1 1 1:16 1:8
1 0 0 1:32 1:16
1 0 1 1:64 1:32
1:12
1 1 0 1:64
8
1:25 1:12
1 1 1
6 8
Cuando el bit PSA est a 0, el pre-escalador se le asigna al
temporizador/contador Timer0, como se muestra en la siguiente figura.
void main() {
OPTION_REG = 0x04; // Pre-escalador (1:32) se le asigna al temporizador
Timer0
TMR0 = 155; // Temporizador T0 cuenta de 155 a 255
INTCON = 0xA0; // Habilitada la generacin de interrupcin para el
// temporizador Timer0
...
...
// En el siguiente ejemplo, Timer0 se configura como un
temporizador
// y se le asigna un pre-escalador.
OPTION_REG = 0x20; // Pre-escalador (1:2) se le asigna al contador
Timer0
TMR0 = 155; // Contador T0 cuenta de 155 a 255
INTCON = 0xA0; // Habilitada la generacin de interrupcin por el
// temporizador Timer0
...
...
Fuente de TMR1C
reloj S
Fosc/4 0
T1CKI pin 1
Al seleccionar la fuente de reloj interna, el par de registros TMR1H-TMR1L
ser incrementado con varios pulsos Fosc como es determinado por el pre-
escalador.
Los pines RC0/T1OSO y RC1/T1OSI se utilizan para registrar los pulsos que
vienen de los dispositivos perifricos, pero tambin tienen una funcin
adicional. Como se puede ver en la siguiente figura, se configuran
simultneamente como entrada (pin RC1) y salida (pin RC0) del oscilador de
cuarzo LP (Low Power - de bajo consumo) adicional. Este circuito est
principalmente diseado para funcionar a bajas frecuencias (hasta 200 KHz),
exactamente para el uso de cristal de cuarzo de 32.768 KHz. Este cristal se
utiliza en los relojes de cristal puesto que es fcil de obtener un pulso de
duracin de un segundo al dividir esta frecuencia.
Oscilador Frecuencia C1 C2
32 kHz 33 pF 33 Pf
LP
100 kHz 15 pF 15 pF
200 kHz 15 pF 15 pF
El pin TG1 o la salida del comparador C2 pueden ser una fuente de los
pulsos que pasan por la compuerta del temporizador Timer1. Se configuran
por software. Esta compuerta permite que el temporizador mida directamente
la duracin de los eventos externos al utilizar el estado lgico del pin T1G o
los eventos analgicos al utilizar la salida del comparador C2. Refirase a la
Figura en la pgina anterior. Para medir duracin de seal, basta con
habilitar esta compuerta y contar los pulsos que pasan por ella.
void main() {
PIR1.TMR1IF = 0; // Poner a 0 la bandera de bit del TMR1IF
TMR1H = 0x22; // Poner el valor inicial para el temporizador Timer1
TMR1L = 0x00;
TMR1CS = 0; // Temporizador1 cuenta los pulsos del oscilador
interno
T1CKPS1 = T1CKPS0 = 1; // El valor del pre-escalador asignada es 1:8
PIE1.TMR1IE = 1; // Interrupcin habilitada por desbordamiento
INTCON = 0xC0; // Interrupcin habilitada (bits GIE y PEIE)
TMR1ON = 1; // Encender el temporizador Timer1
...
Este contador detecta un uno lgico (1) en los pines de entrada. Cabe
destacar que al menos un flanco ascendente debe ser detectado antes de
empezar a contar los pulsos. Refirase a la Figura a la izquierda. Las flechas
en la figura indican los incrementos del contador.
Registro T1CON
TMR1CS - Timer TMR1 Clock Source Select bit (bit de seleccin de la fuente
de reloj del temporizador Timer1)
1 - Cuenta los pulsos por el pin T1CKI (por el flanco ascendente 0-1)
0 - Cuenta los pulsos del reloj interno del microcontrolador
Varios bits del registro T2CON estn en control del temporizador Timer2.
Registro T2CON
T2CKPS1, T2CKPS0 - Timer2 Clock Prescaler bits (seleccin del rango del
divisor del preescalador del Timer2) determina el valor del divisor de
frecuencias:
Los mdulos CCP pueden funcionar en muchos modos diferentes, por lo que
se consideran los ms complicados. Si usted intenta analizar su
funcionamiento a base de tablas que describen las funciones de bits,
comprender mejor de lo qu le estamos hablando. Si utiliza alguno de los
mdulos CCP, primero seleccione el modo que necesita, analice la figura
apropiada y entonces pngase a modificar los bits de registros. Si no...
MDULO CCP1
Los bits del registro CCP1CON estn en control del mdulo CCP1.
BANKESEL CCP1CON
...
ASM {
BANKESEL CCP1CON
CLRF CCP1CON // REGISTRO DE CONTROL BORRADO
// MDULO CCP1 EST APAGADO
MOVLW XX // NUEVO MODO DEL PRE-ESCALADOR EST
SELECCIONADO
MOVWF CCP1CON // EN EL REGISTRO DE CONTROL SE
INTRODUCE NUEVO VALOR
} // MDULO CCP1 SE ENCIENDE SIMULTNEAMENTE
...
PERODO DE PWM
El perodo de pulso de salida (T) se determina por el registro PR2 del
temporizador Timer2. El perodo de PWM se puede calcular por la siguiente
ecuacin:
Notas adicionales:
RESOLUCIN DE PWM
Una seal PWM no es nada ms que una secuencia de pulsos que varan su
ciclo de trabajo. Para una frecuencia especfica (nmero de pulsos por
segundo), hay un nmero limitado de combinaciones de ciclos de trabajo.
Este nmero representa una resolucin medida en bits. Por ejemplo, si una
resolucin es de 10 bits estarn disponibles 1024 ciclos de trabajo discretos;
si una resolucin es de 8 bits estarn disponibles 256 ciclos de trabajo
disretos etc. En este microcontrolador la resolucin es determinada por el
registro PR2. El mximo valor se obtiene al usar el nmero FFh.
void initMain() {
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como
digitales
PORTC = TRISC = 0; // Estado inicial de los pines de salida del puerto
PORTC
PWM1_Init(5000); // Inicializacin del mdulo PWM (5KHz)
}
void main() {
initMain();
duty_c = 127; // Valor inicial del ciclo de trabajo
PWM1_Start(); // Iniciar el mdulo PWM1
PWM1_Set_Duty(duty_c); // Ajustar el ciclo de trabajo de PWM al 50%
...
...
Registro CCP1CON
En modo PWM estos bits afectan al funcionamiento del mdulo CCP1 como
se muestra en la siguiente tabla:
P1M P1M
Modo
1 0
PWM con una sla salida
Por el pin P1A sale una seal modulada.
0 0
Pines P1B, P1C y P1D son entradas/salidas del
puerto D.
0 1 Configuracin Full Bridge - Forward
(puente completo con salida directa)
Por el pin P1D sale una seal modulada.
Por el pin P1D sale una seal modulada.
Pines P1B y P1C estn inactivos.
Configuracin Half Bridge (medio-puente)
Por los pines P1A y P1B sale una seal
1 0 modulada.
Pines P1C y P1D son entradas/salidas del puerto
D.
Configuracin Full Bridge - Reverse
(puente completo con salida inversa)
1 1 Por el pin P1B sale una seal modulada.
Pin P1C est activo.
Pines P1A y P1D estn inactivos.
DC1B1, DC1B0 - PWM Duty Cycle Least Significant bits (bits menos
significativos del ciclo de trabajo de PWM) - Se utilizan slo en el modo PWM
y representan dos bits menos significativos de un nmero de 10 bits. Este
nmero determina el ciclo de trabajo de la seal PWM. Los dems 8 bits se
almacenan en el registro CCPR1L.
MDULO CCP2
Con exclusin de los nombres diferentes de los registros y de los bits, este
mdulo es una muy buena copia del mdulo CCP1 puesto en modo normal.
La nica diferencia significativa entre ellos es el funcionamiento en modo de
comparacin del mdulo CCP2. La diferencia se refiere a la seal de reinicio
del temporizador T1. Concretamente, si el convertidor A/D est habilitado, al
igualarse los valores de los registros TMR1 y CCPR2, la seal de reinicio del
temporizador T1 iniciar automticamente la conversin A/D. Similar al
mdulo anterior, este circuito tambin est bajo el control de los bits del
registro de control. Esta vez es el registro CCP2CON.
Registro CCP2CON
DC2B1, DC2B0 - PWM Duty Cycle Least Significant bits (bits menos
significativos del ciclo de trabajo de PWM) - Se utilizan slo en modo PWM y
representan dos bits menos significativos de un nmero de 10 bits. Este
nmero determina el ciclo de trabajo de la seal PWM. Los dems 8 bits se
almacenan en el registro CCPR2L.
CCP2M3 - CCP2M0 - CCP2 Mode Select bits (bits de seleccin de modo del
mdulo CCP2) determina el modo del mdulo CCP2.
CCP2M CCP2M CCP2M CCP2M
Modo
3 2 1 0
0 0 0 0 Mdulo est deshabilitado (reinicio).
0 0 0 1 No utilizado.
0 0 1 0 No utilizado.
0 0 1 1 No utilizado.
Modo de Captura
0 1 0 0
Cada flanco descendente en el pin CCP2.
Modo de Captura
0 1 0 1
Cada flanco ascendente en el pin CCP2.
Modo de Captura
0 1 1 0 Cada cuarto flanco ascendente en el pin
CCP2.
Modo de Captura
0 1 1 1 Cada decimosexto flanco ascendente en el
pin CCP2.
Modo de comparacin
1 0 0 0 La salida y el bit CCP2IF se ponen a 1 al
ocurrir una coincidencia.
Modo de comparacin
1 0 0 1 La salida se pone a 0 y el bit CCP2IF se
pone a 1 al ocurrir una coincidencia
Modo de comparacin
Se produce una interrupcin, el bit CCP2IF
1 0 1 0
se pone a 1 y no hay cambio el pin CCP2
pin al ocurrir una coincidencia.
Modo de comparacin
Al ocurrir una coincidencia, el bit CCP2IF se
1 0 1 1 pone a 1, los registros del temporizador 1 se
borran y la conversin A/D se inicia si el
convertidor A/D est habilitado.
1 1 x x Modo PWM
Para configurar e iniciar el mdulo CCP1 para funcionar en modo PWM, siga
los siguientes pasos:
Deshabilitar el pin de salida del CCP1. Deber estar configurado como
entrada.
Seleccionar el perodo de seal PWM al introducir el valor en el registro
PR2.
Configurar el mdulo CCP1 para funcionar en modo PWM al combinar
los bits del registro CCP1CON.
Ajustar el ciclo de trabajo de seal PWM al introducir el valor en el
registro CCPR1L y al utilizar los bits DC1B1 y DC1B0 del registro
CCP1CON.
Configurar e iniciar el temporizador Timer2:
o Poner a cero el bit de bandera de interrupcin TMR2IF en el
registro PIR1
o Ajustar el valor de divisin de frecuencia del temporizador Timer2
por los bits
o T2CKPS1 y T2CKPS0 del registro T2CON.
o Iniciar el temporizador Timer2 al poner a uno el bit TMR2ON del
registro T2CON.
Habilitar los pines de salida de PWM despus de que haya sido
acabado un ciclo de PWM:
o Esperar el desbordamiento del temporizador Timer2 (el bit
TMR2IF del registro PIR1 se pone a uno)
o Configurar el pin apropiado como salida al poner a cero el bit en
el registro TRIS.
Si se utiliza una salida invertida, los pines activos a nivel bajo y los pulsos
que tienen la misma forma de onda se generan siempre en parejas: en los
pines P1A y P1C as como en los pines P1B y P1D, respectivamente.
MODO DE MEDIO-PUENTE
Todos los cuatro pines se utilizan como salidas en el modo Puente completo.
En la prctica, este modo es utiliza con frecuencia para activar los motores,
lo que proporciona un control simple y completo de velocidad y direccin de
rotacin. Hay dos configuraciones de este modo: Full Bridge-Forward (puente
completo con salida directa) y Full Bridge-Reverse (puente completo con
salida inversa).
CONFIGURACIN PUENTE COMPLETO - DIRECTO
Un uno lgico (1) aparece en el pin P1A (pin est activo a nivel alto);
Secuencia de pulsos aparece en el pin P1D; y
Un cero lgico (0) en los pines P1B y P1C (pines estn activos a nivel
bajo).
Un uno lgico (1) aparece en el pin P1C (pin est activo a nivel alto);
Secuencia de pulsos aparece en el pin P1B; y
Un cero lgico (0) aparece en los pines P1A y P1D (pines estn activos
a nivel bajo).
Registro PWM1CON
PDC6 - PDC0 PWM Delay Count bits (Bits de configuracin del tiempo
muerto en el modo PWM) - El nmero binario de 7 dgitos determina el
nmero de ciclos de in strucciones (4Tosc) aadidos como tiempo muerto al
activar los pines de entrada PWM.
Registro PSTRCON
Registro ECCPAS
ECCPASE - ECCP Auto-Shutdown Event Status bit (bit de estado del
apagado automtico) indica si ha ocurrido el apagado automtico del mdulo
CCP (estado de Apagado):
PSSAC1, PSSAC0 - Pins P1A, P1C Shutdown State Control bits (Bits de
configuracin de los pines P1A y P1C en modo de apagado) define el estado
lgico de los pines P1A y P1C cuando el mdulo CCP est en el estado de
apagado.
PSSAC PSSAC Estado lgico de los
1 0 pines
0 0 0
0 1 1
Alta impedancia (Tri-
1 X
estado)
PSSBD1, PSSBD0 - Pins P1B, P1D Shutdown State Control bits (Bits de
configuracin de los pines P1B y P1D en modo de apagado) define el estado
lgico de los pines P1B y P1D cuando el mdulo CCP est en el estado de
apagado.
EUSART
El mdulo Transmisor/Receptor Universal Sncrono/Asncrono mejorado
(Enhanced Universal Synchronous Asynchronous Receiver Transmitter -
EUSART) es un perifrico de comunicacin serie de entrada/salida.
Asimismo es conocido como Interfaz de comunicacin serie (Serial
Communications Interface - SCI). Contiene todos los generadores de seales
de reloj, registros de desplazamiento y bfers de datos necesarios para
realizar transmisin de datos serie de entrada/salida, independientemente de
la ejecucin de programa del dispositivo. Como indica su nombre, aparte de
utilizar el reloj para la sincronizacin, este mdulo puede establecer la
conexin asncrona, lo que lo hace nico para algunas aplicaciones. Por
ejemplo, en caso de que sea difcil o imposible proporcionar canales
especiales para transmisin y recepcin de datos y seales de reloj (por
ejemplo, mando a distancia de radio o infrarrojas), el mdulo EUSART es
definitivamente la mejor opcin posible.
Para transmitir un dato de 9 bits es necesario poner a uno el bit TX9 del
registro TXSTA. El bit TX9D del registro TXSRTA es el noveno bit y el ms
significativo. Al transmitir un dato de 9 bits, el bit de datos TX9D deber estar
escrito antes de que de se escriban los 8 bits menos significativos en el
registro TXREG. Todos los nueve bits de datos se transmiten al registro de
desplazamiento TFR inmediatamente despus de que se acabe la escritura
en el registro TXREG.
Cuando el bit ADDEN del registro RCSTA est a uno, el modulo EUSART es
capaz de recibir slo los datos de 9 bits, mientras que se ignoran todos los
datos de 8 bits. Aunque parece una restriccin, este modo habilita la
comunicacin serial entre varios microcontroladores. El principio de
funcionamiento es muy simple. El dispositivo maestro enva un dato de 9 bits
que representa la direccin de un microcontrolador esclavo. No obstante,
todos deben tener el bit ADDEN puesto a uno, ya que de esta manera se
habilita la deteccin de direccin. Todos los microcontroladores esclavos que
comparten la misma lnea de transmisin, reciben este dato (direccin) y
verifican automticamente si coincide con su propia direccin. El software, en
el que ocurre la coincidencia de direccin, debe deshabilitar la deteccin de
direccin, poniendo a cero el bit ADDEN.
El dispositivo maestro sigue enviando los datos de 8 bits al microcontrolador.
Todos los datos que pasan por la lnea de transmisin sern recibidos slo
por el mdulo EUSART direccionado. Una vez recibido el ltimo byte, el
microcontrolador esclavo debe poner a uno el bit ADDEN para habilitar de
nuevo la deteccin de direccin.
Registro TXSTA
CSRC - Clock Source Select bit - (bit de seleccin de la fuente de reloj)
determina la fuente del reloj. Se utiliza slo en modo sincrnico.
TX9 - 9-bit Transmit Enable bit (bit de habilitacin del modo de 9 bits en
transmisin)
1 - Transmisin habilitada.
0 - Transmisin deshabilitada.
SYNC - EUSART Mode Select bit (Bit de seleccin del modo EUSART)
TX9D - Ninth bit of Transmit Data (Valor del noveno bit en transmisin)
Puede ser utilizado como direccin o bit de paridad o para distinguir entre
direccin o dato en los buses maestro-esclavo).
Registro RCSTA
SPEN - Serial Port Enable bit (bit de habilitacin del puerto serie)
Modo asncrono:
1 - Recepcin habilitada.
0 - Recepcin deshabilitada.
Modo sncrono:
Bits
Modo BRG / Frmula de velocidad de transmisin
SYN BRG1 BRG
EUSART en baudios
C G H
de 8 bits
0 0 0 Fosc / [64 (n + 1)]
/asncrono
de 8 bits /
0 0 1 Fosc / [16 (n + 1)]
asncrono
de 16 bits /
0 1 0 Fosc / [16 (n + 1)]
asncrono
de 16 bits /
0 1 1 Fosc / [4 (n + 1)]
asncrono
de 8 bits /
1 0 X Fosc / [4 (n + 1)]
sncrono
de 16 bits /
1 1 X Fosc / [4 (n + 1)]
sncrono
Las tablas en las siguientes pginas contienen los valores que deben estar
escritos en el registro de 16 bits SPBRG y asignados a los bits SYNC, BRGH
y BRGH16 para obtener algunos valores de la velocidad de transmisin en
baudios estndar. La frmula para hacer el clculo de la velocidad de
transmisin en baudios:
Registro BAUDCTL
ABDOVF - Auto-Baud Detect Overflow bit (bit de desbordamiento de auto-
deteccin de la velocidad de transmisin) se utiliza slo en modo asncrono
durante la deteccin de la velocidad de transmisin.
Modo asncrono:
Modo sncrono:
char uart_rd;
void main() {
ANSEL = ANSELH = 0; // Todos los pines se configuran como
digitales
C1ON_bit = C2ON_bit = 0; // Deshabilitar los comparadores
UART1_Init(9600); // Inicializar el mdulo UART a 9600 bps
Delay_ms(100); // Esperar a que seal de reloj del mdulo UART
se
// ponga estable
UART1_Write_Text("Start");
while (1) { // Bucle infinito
if (UART1_Data_Ready()) { // Si el dato se ha recibido,
uart_rd = UART1_Read(); // lea el dato recibido
UART1_Write(uart_rd); // y envelo atrs por el UART
}
}
}
MODO SPI
// perifrico Seleccin_de_chip
sbit Chip_Select_Direction at TRISC0_bit; // Bit TRISC0 define el pin RC0
como entrada o salida
unsigned int value; // Dato a ser enviado es de tipo unsigned
int
void main() {
ANSEL = ANSELH = 0; // Todos los pines de E/S son digitales
TRISB0_bit = TRISB1_bit = 1; // Configurar los pines RB0, RB1 como
entradas
Chip_Select = 0; // Seleccionar el chip perifrico
Chip_Select_Direction = 0; // Configurar el pin CS# como salida
SPI1_Init(); // Inicializar el mdulo SPI
SPI1_Write(value); // Envar el valor al chip perifrico
...
Paso 1.
Los datos a ser transmitidos debern ser escritos en el registro del bfer
SSPBUF. Si el mdulo SPI funciona en modo maestro, el microcontrolador
ejecutar automticamente la secuencia de los siguientes pasos 2,3 y 4. Si el
mdulo SPI funciona en modo esclavo, el microcontrolador no ejecutar la
secuencia de los siguientes pasos hasta que el pin SCK detecte seal de
reloj.
Paso 2.
El dato se mueve al registro SSPSR y el contenido del registro SSPBUF no
se borra.
Paso 3.
El dato se desplaza hacia el pin de salida (primero se desplaza el bit ms
significativo - MSB), mientras que a la vez el registro se carga con los bits por
el pin de entrada. En modo maestro el microcontrolador en si mismo genera
seal de reloj, mientras que el modo esclavo utiliza seal de reloj externa
(pin SCK).
Paso 4.
El registro SSPSR est lleno despus de que hayan sido recibidos 8 bits de
datos, lo que se indica al poner a uno el bit BF del registro SSPSTAT y el bit
SSPIF del registro PIR1. Los datos recibidos (un byte) son automticamente
movidos del registro SSPSR al registro SSPBUF. Como la transmisin de
datos serial se realiza automticamente, el resto de programa se ejecuta
normalmente mientras que la transmisin de datos est en progreso. En este
caso, la funcin del bit SSPIF es de generar una interrupcin al acabar la
transmisin de un byte.
Paso 5.
Por ltimo, el dato almacenado en el registro SSPBUF est listo para su uso
y debe moverse al registro deseado.
Modo I2C
SSPCON
SSPCON2
SSPSTAT
SSPBUF
SSPSR
SSPADD
Registro SSPSTAT
Modo esclavo SPI - Este bit debe ser borrado cuando SPI se emplea en
modo esclavo.
CKE - Clock Edge Select bit (bit de seleccin del flanco de reloj) selecciona
el modo de sincronizacin.
CKP = 0:
CKP = 1:
1 - Lectura de dato.
0 - Escritura de dato.
1 - Transmisin en progreso.
0 - Transmisin no est en progreso.
Registro SSPSTAT
En modo SPI
1 - Habilita el mdulo MSSP y configura los pines SCK, SDO, SDI y SS
como una fuente de pines del puerto serie.
0 - Deshabilita el mdulo MSSP y configura estos pines como pines del
puerto de E/S.
En modo IC
1 - Habilita el mdulo MSSP y configura los pines SDA y SCL como una
fuente de pines del puerto serie.
0 - Deshabilita el mdulo MSSP y configura estos pines como pines del
puerto de E/S.
En modo SPI
En modo IC esclavo
Registro SSPCON2
1 - No reconocimiento.
0 - Reconocimiento.
IC en Modo Maestro
Despus de poner este bit a cero por software, el microcontrolador est listo
para intercambiar los datos con los perifricos.
Transmisin de datos en Modo Maestro IC
La transmisin de datos en el pin SDA se inicia con un cero lgico (0) que
aparece al poner a uno el bit SPEN del registro SSPCON2. Sin embargo,
aunque est habilitado, el microcontrolador tiene que esperar cierto tiempo
antes de iniciar la comunicacin. Se le denomina 'Condicin de Inicio'
durante la que se realizan las preparaciones y verificaciones internas. Si se
cumplen con todas la condiciones, el bit SSPIF del registro PIR1 se pone a
uno y la transmisin de datos se inicia en cuanto se cargue el registro
SSPBUF.
Las preparaciones para recibir los datos son similares a las de transmitir los
datos, con excepcin de que el ltimo bit del primer byte enviado (el que
contiene la direccin) se ponga a uno lgico (1). Eso especifica que el
dispositivo maestro espera recibir los datos del dispositivo esclavo
direccionado. Con respecto al microcontrolador, ocurre lo siguiente:
Generador de baudios
void main(){
ANSEL = ANSELH = PORTB = TRISB = 0; // Todos los pines son digitales.
Los pines del
// puerto PORTB son salidas.
I2C1_Init(100000); // Inicializar I2C con reloj deseado
Pines SDA y SCL - Cuando el mdulo SSP est habilitado, estos pines se
vuelven a las salidas de Drenaje Abierto. Esto significa que deben estar
conectados a resistencias conectados a la otra punta al polo positivo de la
fuente de alimentacin.
Para establecer la comunicacin serial en modo I2C, se debe realizar lo
siguiente:
El tiempo necesario para realizar una conversin A/D cuyo resultado es 1 bit
se define en unidades de TAD. Se requiere que sea como mnimo 1,6 uS.
Para realizar una conversin completa de 10 bits se requiere un poco ms
tiempo de lo esperado, son 11 TAD. Como la frecuencia de reloj as como la
fuente de conversin A/D son determinadas por software, es necesario
seleccionar una de las combinaciones de los bits disponibles ADCS1 y
ADCS0 antes de empezar a medir voltaje en una de las entradas analgicas.
Estos bits se almacenan en el registro ADCON0.
Para llevar a cabo una conversin A/D sin problemas as como para evitar
los resultados inesperados, es necesario considerar lo siguiente:
Registro ADCON0
#include <built_in.h>
unsigned int adc_rd;
void main() {
ANSEL = 0x04; // Configurar AN2 como pin analgico
TRISA = 0xFF; // PORTA se configura como entrada
ANSELH = 0; // Configurar los dems pines AN como E/S digitales
TRISC = 0x3F; // Pines RC7 y RC6 se configuran como salidas
TRISB = 0; // PORTB se configura como salida
do {
temp_res = ADC_Read(2); // Obtener el resultado de 10 bits de la
conversin AD
PORTB = temp_res; // Enviar los 8 bits ms bajos al PORTB
PORTC = temp_res >> 2; // Enviar los 2 bits ms significativos a los RC7,
RC6
} while(1); // Quedarse en el bucle
}
Registro ADCON1
ADFM - A/D Result Format Select bit (bit de seleccin del formato del
resultado de la conversin A/D)
Escribir un uno lgico (1) a un bit del registro TRIS, lo que resulta en
configurar el pin apropiado como una entrada.
Escribir un uno lgico (1) a un bit del registro ANSEL, lo que resulta en
configurar el pin apropiado como una entrada analgica.
Paso 5 - Inicio de la conversin poniendo a uno el bit GO/DONE del reg istro
ADCON0.
COMPARADOR ANALGICO
Aparte del convertidor A/D, hay otro mdulo, que hasta hace poco ha sido
incorpodo slo en los circuitos integrados que pertenecen a los llamados
componentes analgicos. Debido al hecho de que casi no hay ningn
dispositivo automtico complejo que en cierto modo no utilice estos circuitos,
dos comparadores de alta calidad, junto con los componentes adicionales
estn integrados en el microcontrolador y conectados a sus pines.
Estos dos circuitos estn bajo el control de los bits almacenados en los
siguientes registros:
CM1CON0 est en control del comparador C1;
CM2CON0 est en control del comparador C2;
CM2CON1 est en control del comparador C2;
COMPARADORES E INTERRUPCIN
Registro CM1CON0
Los bits de este registro estn en control del comparador C1. Eso afecta
principalmente a la configuracin de las entradas. Para explicarlo con ms
claridad, vea la siguiente figura en la que se muestran slo los componentes
directamente afectados por los bits de este registro.
* Para habilitar que el bit C1OUT aparezca en el pin, se deben cumplir dos
condiciones: C1ON = 1 (el comparador debe estar activado) y el bit
correspondiente TRIS = 0 (pin se debe configurar como salida).
Registro CM2CON0
Los bits de este registro estn en control del comparador C2. Similar al caso
anterior, la siguiente figura muestra un esquema simplificado del circuito
afectado por los bits de este registro.
C2ON - Comparator C2 Enable bit (bit de habilitacin del comparador C2)
habilita el comparador C2.
* Para habilitar que el bit C2OUT aparezca en el pin, se deben cumplir dos
condiciones: C2ON = 1 (el comparador debe estar activado) y el bit
correspondiente TRIS = 0 (pin se debe configurar como salida).
C2CH C2CH
Entrada C2Vin- del comparador
1 0
Entrada C2Vin- est conectada al pin
0 0
C12IN0-
Entrada C2Vin- est conectada al pin
0 1
C12IN1-
Entrada C2Vin- est conectada al pin
1 0
C12IN2-
Entrada C2Vin- est conectada al pin
1 1
C12IN3-
Registro CM2CON1
MC1OUT Mirror Copy of C1OUT bit es una copia del bit C1OUT
MC2OUT Mirror Copy of C2OUT bit es una copia del bit C2OUT
Registro VRCON
Seleccionar una de dos gamas de voltaje por medio del bit VRR.
Configurar el voltaje de referencia Vref necesario por medio de los bits
VR3 - VR0.
Poner a uno el bit VROE si es necesario.
Habilitar la fuente de voltaje de referencia Vref al poner a uno el bit
VREN.
Para sincronizar todos los procesos que se llevan a cabo dentro del
microcontrolador, se debe utilizar una seal de reloj, mientras que para
generar una seal de reloj, se debe utilizar un oscilador. As de simple. El
microcontrolador dispone de varios osciladores capaces de funcionar en
modos diferentes. Y aqu es donde viene lo interesante...
El bit System Clock Select (bit de seleccin del reloj del sistema - SCS) del
registro OSCCON determina si una fuente de seal de reloj del
microcontrolador ser interna o externa.
Registro OSCCON
HTS - HFINTOSC Status bit (8 MHz - 125 kHz) (bit de estado del
HFINTOSC) indica si el oscilador interno de alta frecuencia funciona en modo
estable.
SCS - System Clock Select bit (bit de seleccin del reloj del sistema)
determina cul oscilador se utilizar como una fuente de reloj.
Los resonadores cermicos son similares a los cristales de cuarzo segn sus
caractersticas, por lo que se conectan de la misma manera. A diferencia de
los cristales de cuarzo, son ms baratos y los osciladores que hacen uso de
ellos son de calidad ms baja. Se utilizan para las frecuencias de reloj entre
100 kHz y 20 MHz.
El uso de los elementos para estabilizar la frecuencia sin duda alguna tiene
muchas ventajas, pero a veces realmente no es necesario. En la mayora de
casos el oscilador puede funcionar a frecuencias que no son precisamente
definidas, as que sera una prdida de dinero embeber tales elementos. La
solucin ms simple y ms barata es estas situaciones es utilizar una
resistencia y un capacitor para el funcionamiento del oscilador. Hay dos
modos:
f = frecuencia [Hz];
T = R * C = constante de tiempo [s];
R = resistencia elctrica []; y
C = capacitancia del condensador [F].
MODOS DE RELOJ INTERNO
El reloj interno sigue siendo la fuente del reloj del sistema hasta que el
dispositivo reinicie con xito el oscilador externo que vuelve a ser la fuente
de reloj del sistema. De manera similar a casos anteriores, este mdulo est
habilitado al cambiar la palabra de configuracin justamente antes de que se
inicie el proceso de programar el chip. Esta vez, esto se realiza al seleccionar
la opcin Fail-Safe Clock Monitor.
Registro OSCTUNE
0 0 0 0 1
0 0 0 0 0 Calibrada
1 1 1 1 1
1 0 0 1 0
1 0 0 0 1
1 0 0 0 0 Mnima
Por considerar esto una zona de riesgo (por supuesto usted no quiere que el
microcontrolador borre su propio programa por casualidad), no vamos a
discutirlo aqu, no obstante le avisamos que tenga cuidado.
Registro EECON1
Para leer los datos de la memoria EEMPROM, siga los siguientes pasos:
BSF STATUS,RP1 ;
BCF STATUS,RP0 ; Acceder al banco 2
MOVF ADDRESS,W ; Mover la direccin al registro W
MOVWF EEADR ; Escribir la direccin
BSF STATUS,RP0 ; Acceder al banco 3
BCF EECON1,EEPGD ; Seleccionar la EEPROM
BSF EECON1,RD ; Leer los datos
BCF STATUS,RP0 ; Acceder al banco 2
MOVF EEDATA,W ; Dato se almacena en el registro W
W = EEPROM_Read(ADDRESS);
Las ventajas del uso del lenguaje C se han hecho ms obvias, no lo cree?
BSF STATUS,RP1
BSF STATUS,RP0
BTFSC EECON,WR1 ; Esperar a que se complete la escritura anterior
GOTO $-1 ;
BCF STATUS,RP0 ; Banco 2
MOVF ADDRESS,W ; Mover la direccin a W
MOVWF EEADR ; Escribir la direccin
MOVF DATA,W ; Mover los datos a W
MOVLW 55h
MOVWF EECON2
MOVLW AAh
MOVWF EECON2
BSF EECON1,WR
W = EEPROM_Write(ADDRESS, W);
void main(){
ANSEL = 0; // Configuracin de los pines AN como E/S
digitales
ANSELH = 0;
PORTB = 0;
PORTC = 0;
PORTD = 0;
TRISB = 0;
TRISC = 0;
TRISD = 0;
for(ii = 0; ii < 32; ii++) // Llenar el bfer con los datos
EEPROM_Write(0x80+ii, ii); // Escribir los datos en la direccin 0x80+ii
// de la EEMPROM
Delay_ms(1000); // Diodos en los puertos PORTB y PORTC
PORTB = 0xFF; // para indicar el comienzo de la lectura
PORTC = 0xFF;
Delay_ms(1000);
PORTB = 0x00;
PORTC = 0x00;
Delay_ms(1000);
PORTB = EEPROM_Read(0x02); // Leer los datos de la direccin 2 de la
EEPROM y
Delay_ms(250);
}
}
Aprimera vista, basta con encender una fuente de alimentacin para hacer
funcionar un microcontrolador. A primera vista, basta con apagar una fuente
de alimentacin para detenerlo. Slo a primera vista. En realidad, el
arranque y el final del funcionamiento son las fases crticas de las que se
encarga una seal especial denominada RESET.
REINICIO BLACK-OUT
El reinicio black out ocurre al apagar una fuente de alimentacin
correctamente. El microcontrolador no tiene tiempo para hacer nada
imprevisible puesto que el voltaje cae muy rpidamente por debajo de su
valor mnimo. En otras palabras, se apaga la luz, las cortinas bajan y el
espectculo ha terminado!
REINICIO BROWN-OUT
RUIDO ELCTRICO
Es un tipo especial del reinicio Brownout que ocurre en un ambiente
industrial cuando voltaje de alimentacin parpadea por un momento y cae
por debajo del valor mnimo. Aunque es corto, este ruido producido en una
lnea de conduccin elctrica puede afectar desfavorablemente al
funcionamiento del dispositivo.
PIN MCLR
Capitulo 4: Ejemplos
Alimentacin;
Seal de reinicio; y
Seal de reloj.
Como se muestra en la figura anterior, se trata de circuitos simples, pero no
tiene que ser siempre as. Si el dispositivo destino se utiliza para controlar las
mquinas caras o para mantener funciones vitales, todo se vuelve mucho
ms complicado.
ALIMENTACIN
SEAL DE REINICIO
Para que un microcontrolador pueda funcionar apropiadamente, un uno
lgico (VCC) se debe colocar en el pin de reinicio. El botn de presin que
conecta el pin MCLR a GND no es necesario. Sin embargo, este botn casi
siempre est proporcionado ya que habilita al microcontrolador volver al
modo normal de funcionamiento en caso de que algo salga mal. Al pulsar
sobre el botn RESET, el pin MCLR se lleva un voltaje de 0V, el
microcontrolador se reinicia y la ejecucin de programa comienza desde el
principio. Una resistencia de 10k se utiliza para impedir un corto circuito a
tierra al presionar este botn.
SEAL DE RELOJ
Cristal de cuarzo
Resonador cermico
Oscilador RC
Oscilador externo
Si se requiere sincronizar el funcionamiento de varios microcontroladores o si
por alguna razn no es posible utilizar ninguno de los esquemas anteriores,
una seal de reloj se puede generar por un oscilador externo. Refirase a la
siguiente figura.
Los interruptores y los botones de presin son los dispositivos simples para
proporcionar la forma ms simple de detectar la aparicin de voltaje en un
pin de entrada del microcontrolador. No obstante, no es tan simple como
parece... Es por un rebote de contacto. El rebote de contacto es un problema
comn en los interruptores mecnicos.
Al tocarse los contactos, se produce un rebote por su inercia y elasticidad.
Por consiguiente, la corriente elctrica es rpidamente pulsada en lugar de
tener una clara transicin de cero a la corriente mxima. Por lo general, esto
ocurre debido a las vibraciones, los desniveles suaves y la suciedad entre los
contactos. Este efecto no se percibe normalmente al utilizar estos
componentes en la vida cotidiana porque el rebote ocurre demasiado rpido
para afectar a la mayora de los dispositivos elctricos. Sin embargo, pueden
surgir problemas en algunos circuitos lgicos que responden lo
suficientemente rpido de manera que malinterpreten los pulsos producidos
al tocarse los contactos como un flujo de datos. De todos modos, el proceso
entero no dura mucho (unos pocos micro - o milisegundos), pero dura lo
suficiente para que lo detecte el microcontrolador. Al utilizar slo un botn de
presin como una fuente de seal de contador, en casi 100% de los casos
ocurren los errores.
REL
DIODOS LED
Probablemente sepa todo lo que necesita saber sobre los diodos LED, pero
tambin debe pensar en los jvenes... A ver, cmo destruir un LED?
Bueno...muy fcil.
Quemar con rapidez
Como cualquier otro diodo, los LEDs tienen dos puntas - un nodo y un
ctodo. Conecte un diodo apropiadamente a la fuente de alimentacin y va a
emitir luz sin ningn problema. Ponga al diodo al revs y conctelo a la
misma fuente de alimentacin (aunque sea por un momento). No emitir luz -
nunca ms!
Quemar lentamente
De manera similar, todo lo que tiene que hacer es elegir una resistencia para
limitar la corriente mostrada a continuacin. Dependiendo de voltaje de
alimentacin, los efectos pueden ser espectaculares.
VISUALIZADOR LED
Bsicamente, un visualizador LED no es nada ms que varios diodos LED
moldeados en la misma caja plstica. Hay varios tipos de los visualizadores y
algunos de ellos estn compuestos por varias docenas de diodos
incorporados que pueden visualizar diferentes smbolos. No obstante, el
visualizador utilizado con ms frecuencia es el visualizador de 7 segmentos.
Est compuesto por 8 LEDs. Los siete segmentos de un dgito estn
organizados en forma de un rectngulo para visualizar los smbolos, mientras
que el segmento adicional se utiliza para el propsito de visualizar los puntos
decimales. Para simplificar la conexin, los nodos y los ctodos de todos
los diodos se conectan al pin comn as que tenemos visualizadores de
nodo comn y visualizadores de ctodo comn, respectivamente. Los
segmentos estn etiquetados con letras de a a g y dp, como se muestra en
la siguiente figura. Al conectarlos, cada diodo LED se trata por separado, lo
que significa que cada uno dispone de su propia resistencia para limitar la
corriente.
Aqu le presentamos unas cosas importantes a las que debe prestar atencin
al comprar un visualizador LED:
Antes que nada, un nmero de varios dgitos debe ser dividido en unidades,
centenas etc. en una subrutina especfica. Luego, cada de estos dgitos se
debe almacenar en los bytes particulares. Los dgitos se hacen reconocibles
al realizar "enmascaramiento". En otras palabras, el formato binario de cada
dgito se sustituye por una combinacin diferente de los bits por medio de
una subrutina simple. Por ejemplo, el dgito 8 (0000 1000) se sustituye por el
nmero binario 0111 1111 para activar todos los LEDs que visualizan el
nmero 8. El nico diodo que queda inactivo aqu est reservado para el
punto decimal.
Dgitos
a
Segmentos del vi sualizador
visualiz
ar
dp a b c d e f g
0 0 1 1 1 1 1 1 0
1 0 0 1 1 0 0 0 0
2 0 1 1 0 1 1 0 1
3 0 1 1 1 1 0 0 1
4 0 0 1 1 0 0 1 1
5 0 1 0 1 1 0 1 1
6 0 1 0 1 1 1 1 1
7 0 1 1 1 0 0 0 0
8 0 1 1 1 1 1 1 1
9 0 1 1 1 1 0 1 1
OPTOACOPLADORES
VISUALIZADOR LCD
Este componente est especficamente fabricado para ser utilizado con los
microcontroladores, lo que significa que no se puede activar por los circuitos
integrados estndar. Se utiliza para visualizar los diferentes mensajes en un
visualizador de cristal lquido miniatura. El modelo descrito aqu es el ms
utilizado en la prctica por su bajo precio y grandes capacidades. Est
basado en el microcontrolador HD44780 (Hitachi) integrado y puede
visualizar mensajes en dos lneas con 16 caracteres cada una. Puede
visualizar todas las letras de alfabeto, letras de alfabeto griego, signos de
puntuacin, smbolos matemticos etc. Tambin es posible visualizar
smbolos creados por el usuario. Entre otras caractersticas tiles es el
desplazamiento automtico de mensajes (a la izquierda y a la derecha),
aparicin del cursor, retroiluminacin LED etc.
Pines del visualizador LCD
Pantalla LCD
Una pantalla LCD puede visualizar dos lneas con 16 caracteres cada una.
Cada carcter consiste en 5x8 o 5x11 pxeles. Este libro cubre un
visualizador de 5x8 pxeles que es utilizado con ms frecuencia.
Memoria LCD
Memoria DDRAM
Luego, todos los caracteres enviados por las lneas D0-D7 se van a
visualizar en el formato de mensaje al que nos hemos acostumbrado - de la
izquierda a la derecha. En este caso, la visualizacin empieza por el primer
campo de la primera lnea ya que la direccin inicial es 00hex. Si se enva
ms de 16 caracteres, todos se memorizarn, pero slo los primeros 16
sern visibles. Para visualizar los dems, se debe utilizar el comando shift.
Virtualmente, parece como si el visualizador LCD fuera una ventana,
desplazndose de la izquierda a la derecha sobre las localidades de
memoria con diferentes caracteres. En realidad, as es cmo se cre el
efecto de desplazar los mensajes sobre la pantalla.
Esto es un tipo de memoria RAM as que los datos se pueden escribir en ella
y leer de ella, pero su contenido se pierde irrecuperablemente al apagar la
fuente de alimentacin.
Memoria CGROM
Memoria CGRAM
Todos los datos transmitidos a un visualizador LCD por las salidas D0-D7
sern interpretados como un comando o un dato, lo que depende del estado
lgico en el pin RS:
RS = 1 - Los bits D0 - D7 son direcciones de los caracteres a visualizar.
El procesador LCD direcciona un carcter del mapa de caracteres y lo
visualiza. La direccin DDRAM especifica la localidad en la que se va a
visualizar el carcter. Esta direccin se define antes de transmitir el
carcter o la direccin del carcter anteriormente transmitido ser
aumentada automticamente.
RS = 0 - Los bits D0 - D7 son los comandos para ajustar el modo del
visualizador.
R R D DD D D D Tiempo de
Comando D3 D2
S W 7 64 5 1 0 ejecucin
Borrar el visualizador 0 0 0 0 0
0 0 0 0 1 1.64mS
Poner el cursor al inicio 0 0 0 0 0
0 0 0 1 x 1.64mS
I/
Modo de entrada 0 0 0 0 0 0 0 1 S 40uS
D
Activar/desactivar el
0 0 0 0 0 0 1 D U B 40uS
visualizador
Desplazar el D/ R/
0 0 0 0 0 1 x x 40uS
cursor/visualizador C L
D
Modo de funcionamiento 0 0 0 0 1 N F x x 40uS
L
Establecer la direccin
0 0 0 1 Direccin CGRAM 40uS
CGRAM
Establecer la direccin
0 0 1 Direccin CGRAM 40uS
DDRAM
Leer la bandera B
0 1 Direccin CGRAM -
"BUSY"(ocupado) (BF) F
Escribir en la CGRAM o en D D D D D D
1 0 D3 D2 40uS
la DDRAM 7 6 5 4 1 0
D D D D D D
Leer la CGRAM o la DDRAM 1 1 D3 D2 40uS
7 6 5 4 1 0
I/D 1 = Incremento (por 1) R/L 1 = Desplazamiento a la
derecha
0 = Decremento (por 1) 0 = Desplazamiento a la
izquierda
S 1 = Desplazamiento del visualizador activado DL 1 = Bus de datos de
8 bits
0 = Desplazamiento del visualizador desactivado 0 = Bus de datos de 4
bits
/* En mikroC for PIC, basta con escribir slo una funcin para realizar todo el
proceso
de la inicializacin del LCD. Antes de llamar esta funcin es necesario
declarar los
bits LCD_D4-LCD_D7, LCD_RS y LCD_EN. */
...
Lcd_Init(); // Inicializar el LCD
...
EJEMPLOS PRCTICOS
4.3 EJEMPLO 1
4.4 EJEMPLO 2
Utilizar instrucciones en ensamblador y el oscilador interno
LFINTOSC...
/* Cabecera *********************************************/
void main() {
ANSEL = 0; // Todos los pines de E/S se configuran como
digitales
ANSELH = 0;
PORTB = 0; // Todos los pines del puerto PORTB se ponen a
0
TRISB = 0; // Pines del puerto PORTB se configuran como
salidas
do {
PORTB = ~PORTB; // Invertir el estado lgico del puerto PORTB
Delay_ms(100); // Tiempo de retardo de 100mS
k++; // Incrementar k en 1
}
while(k<20); // Quedarse en bucle hasta que k<20
do {
PORTB = ~PORTB; // Invertir el estado lgico del puerto PORTB
Delay_ms(10); // Tiempo de retardo de 10 mS
k++; // Incrementar k en 1
}
while(k<20); // Quedarse en el bucle hasta que k<20
}
4.5 EJEMPLO 3
Timer0 como un contador, declarar variables nuevas, constantes de
enumeracin, utilizar rels...
void main() {
char TEST = 5; // Constante TEST = 5
enum salidas {REL = 3}; // Constante RELAY = 3
do {
if (TMR0 == TEST) // Coincide el nmero en el temporizador con la
// constante TEST?
(PORTD.RELAY = 1); // Nmeros coinciden. Poner el bit RD3 a uno
(salida REL)
}
while (1); // Quedarse en el bucle infinito
}
Si varios pines del puerto PORTD estn conectados a los rels, la expresin
anterior se puede escribir de la siguiente manera tambin:
4.6 EJEMPLO 4
void interrupt() {
cnt++; // Con una interrupcin la cnt se incrementa en 1
TMR0 = 96; // El valor inicial se devuelve en el temporizador TMR0
INTCON = 0x20; // Bit T0IE se pone a 1, el bit T0IF se pone a 0
}
void main(){
OPTION_REG = 0x84; // Pre-escalador se le asigna al temporizador
TMR0
ANSEL = 0; // Todos los pines de E/S se configuran como digitales
ANSELH = 0;
TRISB = 0; // Todos los pines de puerto PORTB se configuran
// como salidas
PORTB = 0x0; // Reiniciar el puerto PORTB
TMR0 = 96; // Temporizador T0 cuenta de 96 a 255
INTCON = 0xA0; // Habilitada interrupcin TMR0
cnt = 0; // A la variable cnt se le asigna un 0
do { // Bucle infinito
if (cnt == 400) { // Incrementar el puerto PORTB despus 400
interrupciones
PORTB = PORTB++; // Incrementar nmero en el puerto PORTB en 1
cnt = 0; // Reiniciar la variable cnt
}
} while(1);
/*Cabecera******************************************************/
void interrupt() {
cnt++ ; // Con una interrupcin la cnt se incrementa en 1
PIR1.TMR1IF = 0; // Reiniciar el bit TMR1IF
TMR1H = 0x80; // El valor inicial se devuelve en los registros
TMR1L = 0x00; // del temporizador TMR1H y TMR1L
}
void main() {
ANSEL = 0; // Todos los pines de E/S se configuran como digitales
ANSELH = 0;
PORTB = 0xF0; // Valor inicial de los bits del puerto PORTB
TRISB = 0; // Pines del puerto PORTB se configuran como salidas
T1CON = 1; // Configurar el temporizador TMR1
PIR1.TMR1IF = 0; // Reiniciar el bit TMR1IF
TMR1H = 0x80; // Ajustar el valor inicial del temporizador TMR1
TMR1L = 0x00;
PIE1.TMR1IE = 1; // Habilitar la interrupcin al producirse un
desbordamiento
cnt = 0; // Reiniciar la variable cnt
INTCON = 0xC0; // Interrupcin habilitada (bits GIE y PEIE)
do { // Bucle infinito
if (cnt == 76) { // Cambiar el estado del puerto PORTB despus de 76
interrupciones
PORTB = ~PORTB; // Nmero en el puerto PORTB est invertido
cnt = 0; // Reiniciar la variable cnt
}
} while (1);
}
/*Cabecera******************************************************/
void Reemplazar() {
PORTB = ~PORTB; // Definir nueva funcin Reemplazar
} // Funcin invierte el estado del puerto
void interrupt() {
if (PIR1.TMR2IF) { // Si el bit TMR2IF = 1,
cnt++ ; // Incrementar variable la cnt en 1
PIR1.TMR2IF = 0; // Reiniciar el bit y
TMR2 = 0; // Reiniciar el registro TMR2
}
}
// main
void main() {
cnt = 0; // Reiniciar la variable cnt
ANSEL = 0; // Todos los pines de E/S se configuran como digitales
ANSELH = 0;
PORTB = 0b10101010; // Estado lgico en los pines del puerto PORTB
TRISB = 0; // Todos los pines del puerto PORTB se configuran como
salidas
T2CON = 0xFF; // Configurar el temporizador T2
TMR2 = 0; // Valor inicial del registro del temporizador TMR2
PIE1.TMR2IE = 1; // Interrupcin habilitada
INTCON = 0xC0; // Bits GIE y PEIE se ponen a 1
4.7 EJEMPLO 5
/*Cabecera******************************************************/
void main() {
OPTION_REG = 0x0E; // Pre-escalador se le asigna al temporizador WDT
(1:64)
asm CLRWDT; // Comando en ensamblador para reiniciar el
temporizador WDT
PORTB = 0x0F; // Valor inicial del registro PORTB
TRISB = 0; // Todos los pines del puerto PORTB se configuran como
salidas
Delay_ms(300); // Tiempo de retardo de 30mS
PORTB = 0xF0; // Valor del puerto PORTB diferente del inicial
4.8 EJEMPLO 6
Este ejemplo muestra el uso del mdulo CCP1 en modo PWM. Para hacer
las cosas ms interesantes, la duracin de los pulsos en la salida P1A
(PORTC,2) se puede cambiar por medio de los botones de presin
simblicamente denominados OSCURO y CLARO. La duracin ajustada
se visualiza como una combinacin binaria en el puerto PORTB. El
funcionamiento de este mdulo est bajo el control de las funciones
pertenecientes a la librera especializada PWM. Aqu se utilizan las tres de
ellas:
void initMain() {
ANSEL = 0; // Todos los pines de E/S se configuran como digitales
ANSELH = 0;
PORTA = 255; // Estado inicial del puerto PORTA
TRISA = 255; // Todos los pines del puerto PORTA se configuran como
entradas
PORTB = 0; // Estado inicial del puerto PORTB
TRISB = 0; // Todos los pines del puerto PORTB se configuran como
salidas
PORTC = 0; // Estado inicial del puerto PORTC
TRISC = 0; // Todos los pines del puerto PORTC se configuran
// como salidas
PWM1_Init(5000); // Inicializacin del mdulo PWM (5KHz)
}
void main() {
initMain();
ciclo_de_trabajo_actual = 16; // Valor inicial de la variable
ciclo_de_trabajo_actual
ciclo_de trabajo_anterior = 0; // Reiniciar la variable ciclo_de
trabajo_anterior
PWM1_Start(); // Iniciar el mdulo PWM1
if (old_duty != ciclo_de_trabajo_actual) { // Si
ciclo_de_trabajo_actual y
// ciclo_de trabajo_anterior no son iguales
PWM1_Set_Duty(ciclo_de_trabajo_actual); // ajustar un nuevo
valor a PWM,
ciclo_de trabajo_anterior = ciclo_de_trabajo_actual; // Guardar el nuevo
valor
PORTB = ciclo_de trabajo_anterior; // y visualizarlo en el
puerto PORTB
}
Delay_ms(200); // Tiempo de retardo de 200mS
}
}
PWM
Button
4.9 EXAMPLE 7
void main() {
ANSEL = 0x0C; // Pines AN2 y AN3 se configuran como analgicos
TRISA = 0xFF; // Todos los pines del puerto PORTA se configuran
// como entradas
ANSELH = 0; // Los dems pines se configuran como digitales
TRISB = 0x3F; // Pines del puerto PORTB, RB7 y RB6 se configuran
// como salidas
TRISD = 0; // Todos los pines del PORTD se configuran como
salidas
ADCON1.F4 = 1 ; // Voltaje de referencia es llevado al pin RA3.
do {
temp_res = ADC_Read(2); // Resultado de la conversin A/D es copiado a
temp_res
PORTD = temp_res; // 8 bits menos significativos se mueven al puerto
PORTD
PORTB = temp_res >> 2; // 2 bits ms significativos se mueven a los bits
RB6 y RB7
} while(1); // Bucle infinito
}
ADC
4.10 EJEMPLO 8
void main() {{
ANSEL = 0; // Todos los pines de E/S se configuran como
digitales
ANSELH = 0;
PORTB = 0; // Valor inicial del puerto PORTB
TRISB = 0; // Todos los pines del puerto PORTB se configuran
// como salidas
PORTD = 0; // Valor inicial del puerto PORTB
TRISD = 0; // Todos los pines del puerto PORTD se configuran
// como salidas
TRISA = 0xFF; // Todos los pines del puerto PORTA se configuran
// como entradas
PORTD = EEPROM_Read(5); // Leer la memoria EEPROM en la
direccin 5
do {
PORTB = PORTB++; // Incrementar el puerto PORTB en 1
Delay_ms(100); // Tiempo de retardo de 100mS
if (PORTA.F2)
EEPROM_Write(5,PORTB); // Si se pulsa el botn MEMO, guardar el
puerto PORTB
do {
while (PORTA.F2); // Quedarse en este bucle hasta que el botn est
pulsado
}
}
while(1); // Bucle infinito
}
EEPROM
4.11 EJEMPLO 9
void interrupt() {
if (digit_no == 0) {
PORTA = 0; // Apagar ambos visualizadores
PORTD = digit1; // Colocar mscara para visualizar unidades en el
// puerto PORTD
PORTA = 1; // Encender el visualizador para las unidades (LSD)
digit_no = 1;
}else{
PORTA = 0; // Apagar ambos visualizadores
PORTD = digit10; // Colocar mscara para visualizar decenas en el
// puerto PORTD
PORTA = 2; // Encender el visualizador para las decenas (MSD)
digit_no = 0;
}
void main() {
OPTION_REG = 0x80; // Ajustar el temporizador TMR0
TMR0 = 0;
INTCON = 0xA0; // Deshabilitar las interrupciones PEIE,INTE,RBIE,T0IE
PORTA = 0; // Apagar ambos visualizadores
TRISA = 0; // Todos los pines del puerto PORTA se configuran
// como salidas
PORTD = 0; // Apagar todos los segmentos del visualizador
TRISD = 0; // Todos los pines del puerto PORTD se configuran
// como salidas
do {
for (i = 0; i<=99; i++) { // Contar de 0 a 99
digit = i % 10u;
digit1 = mask(digit); // Preparar la mscara para visualizar unidades
digit = (char)(i / 10u) % 10u;
digit10 = mask(digit); // Preparar la mscara para visualizar decenas
Delay_ms(1000);
}
} while (1); // Bucle infinito
}
mask.c
/*Cabecera******************************************************/
mask.c
example9.c
4.12 EJEMPLO 10
mikroElektronika
LCD example
mikroElektronika
voltage:3.141V
En un dispositivo real se puede visualizar temperatura actual o algn otro
valor medido en vez de voltaje.
ADC
LCD
/*Cabecera*****************************************************/
// Declarar variables
unsigned char ch;
unsigned int adc_rd;
char *text;
long tlong;
void main() {
INTCON = 0; // Todas las interrupciones deshabilitadas
ANSEL = 0x04; // Pin RA2 se configura como una entrada
analgica
TRISA = 0x04;
ANSELH = 0; // Los dems pines se configuran como digitales
while (1) {
adc_rd = ADC_Read(2); // Conversin A/D. Pin RA2 es una entrada.
Lcd_Out(2,1,text); // Escribir el resultado en la segunda lnea
tlong = (long)adc_rd * 5000; // Convertir el resultado en milivoltios
tlong = tlong / 1023; // 0..1023 -> 0-5000mV
ch = tlong / 1000; // Extraer voltios (miles de milivoltios)
// del resultado
Lcd_Chr(2,9,48+ch); // Escribir resultado en formato ASCII
Lcd_Chr_CP('.');
ch = (tlong / 100) % 10; // Extraer centenas de milivoltios
Lcd_Chr_CP(48+ch); // Escribir resultado en formato ASCII
ch = (tlong / 10) % 10; // Extraer decenas de milivoltios
Lcd_Chr_CP(48+ch); // Escribir resultado en formato ASCII
ch = tlong % 10; // Extraer unidades de milivoltios
Lcd_Chr_CP(48+ch); // Escribir resultado en formato ASCII
Lcd_Chr_CP('V');
Delay_ms(1);
}
}
4.13 EJEMPLO 11
unsigned short i;
void main() {
UART1_Init(19200); // Inicializar el mdulo USART
// (8 bits, tasa de baudios 19200, no hay bit
// de paridad...)
while (1) {
if (UART1_Data_Ready()) { // si se ha recibido un dato
i = UART1_Read(); // leerlo
UART1_Write(i); // enviarlo atrs
}
}
}
UART
4.14 EJEMPLO 12
/*Cabecera******************************************************/
// extraer temp_whole
temp_whole = temp2write >> RES_SHIFT ;
void main() {
ANSEL = 0; // Configurar los pines AN como digitales
ANSELH = 0;
C1ON_bit = 0; // Deshabilitar los comparadores
C2ON_bit = 0;
One_Wire
LCD
4.15 EXAMPLE 13
/*Cabecera******************************************************/
void Tone1() {
Sound_Play(659, 250); // Frecuencia = 659Hz, duracin = 250ms
}
void Tone2() {
Sound_Play(698, 250); // Frecuencia = 698Hz, duracin = 250ms
}
void Tone3() {
Sound_Play(784, 250); // Frecuencia = 784Hz, duracin = 250ms
}
void Melody1() { // Componer una meloda divertida 1
Tone1(); Tone2(); Tone3(); Tone3();
Tone1(); Tone2(); Tone3(); Tone3();
Tone1(); Tone2(); Tone3();
Tone1(); Tone2(); Tone3(); Tone3();
Tone1(); Tone2(); Tone3();
Tone3(); Tone3(); Tone2(); Tone2(); Tone1();
}
void main() {
ANSEL = 0; // Todos los pines de E/S son digitales
ANSELH = 0;
TRISB = 0xF0; // Pines RB7-RB4 se configuran como entradas
while (1) {
if (Button(&PORTB,7,1,1)) // RB7 genera Tono1
Tone1();
while (PORTB & 0x80) ; // Esperar que se suelte el botn
if (Button(&PORTB,6,1,1)) // RB6 genera Tono2
Tone2();
while (PORTB & 0x40) ; // Esperar que se suelte el botn
if (Button(&PORTB,5,1,1)) // RB5 genera meloda 2
Melody2();
while (PORTB & 0x20) ; // Esperar que se suelte el botn
if (Button(&PORTB,4,1,1)) // RB4 genera meloda 1
Melody1();
while (PORTB & 0x10) ; // Esperar que se suelte el botn
}
}
Button
Sound
4.16 EJEMPLO 14
/*Cabecera******************************************************/
//Declaraciones-----------------------------------------------------------------
const code char truck_bmp[1024]; // Declarar la constante definida en
truck_bmp.c
// para utilizarla en este archivo
//--------------------------------------------------------final-de-declaraciones
void main() {
unsigned short ii;
char *someText;
delay2S();
delay2S();
Glcd_Fill(0x00); // Borrar el GLCD
#ifdef COMPLETE_EXAMPLE
Glcd_Set_Font(Character8x7, 8, 7, 32); // Seleccionar la fuente, ver
// __Lib_GLCDFonts.c en la carpeta Uses
#endif
truck_bmp.c:
/*Cabecera*****************************************************/
4.17 EJEMPLO 15
En este ejemplo se utilizan las funciones que pertenecen a las libreras Glcd
y ADC.
Teniendo en cuenta que la superficie del panel tctil es ligeramente mayor
que la del LCD grfico, en caso de requerir una mayor precisin en la
determinacin de las coordenadas, es necesario incluir el software de
calibracin del panel tctil.
/* Cabecera ***************************************************/
// Leer la coordenada X
unsigned int GetX() {
//reading X
PORTC.F0 = 1; // DRIVEA = 1 (electrodo izquierdo (LEFT) conectado,
electrodo
// derecho (RIGHT) conectado, electrodo superior
(TOP)desconectado)
PORTC.F1 = 0; // DRIVEB = 0 (electrodo inferior (BOTTOM)
desconectado)
Delay_ms(5);
return ADC_Read(0); // leer el valor de X de RA0(BOTTOM)
}
// Leer la coordenada Y
unsigned int GetY() {
//Leer la Y
PORTC.F0 = 0; // DRIVEA = 0 (electrodo izquierdo (LEFT)
desconectado, electrodo
// derecho (RIGHT) desconectado, electrodo superior (TOP)
conectado)
PORTC.F1 = 1; // DRIVEB = 1 (electrodo inferior (BOTTOM) conectado)
Delay_ms(5);
return ADC_Read(1); // leer el valor de Y de RA1 (del elctrodo izquierdo
LEFT)
}
void main() {
PORTA = 0x00;
TRISA = 0x03; // RA0 y RA1 son entradas analgicas
ANSEL = 0x03;
ANSELH = 0; // Configurar otros pines AN como digitales de E/S
PORTC = 0 ; // Todos los pines del puerto PORTC estn a 0 (incluyendo
los
// pines RC6 y RC7)
while (1) {
// leer X-Y y convertirlo en la resolucin de 128x64 pxeles
x_coord = GetX();
y_coord = GetY();
x_coord128 = (x_coord * 128) / 1024;
y_coord64 = 64 -((y_coord *64) / 1024);
GLCD
ADC
C_Stdlib
4.18 EJEMPLO 16
Utilizar el teclado 4x4
kp = 0
while kp = 0
kp = Keypad_Key_Click()
Delay_ms(10)
wend
Keypad4x4
LCD
VAMOS A EMPEZAR...
PROGRAMAR EL MICROCONTROLADOR
Usted ya tiene instalado el mikroC PRO for PIC, verdad? Al iniciarlo, abra
un proyecto nuevo y un documento nuevo con extensin .c dentro del mismo.
Escriba su programa...
OK. The program has been written and tested with the simulator. It did not
report any errors during the process of compiling into the hex code? It seems
that everything is under control...
Una versin de calidad alta tiene los pines conectados a los visualizadores
LED, visualizadores LCD, sensores de temperatura u otros componentes por
los que puede estar compuesto un dispositivo destino. Si es necesario, todos
estos perifricos pueden estar conectados al microcontrolador por medio de
los puentes. Esto permite probar el programa entero en la prctica an
durante el proceso de desarrollo, porque el microcontrolador no sabe o no le
interesa si su entrada est activada por un botn de presin o un sensor
incorporado en un dispositivo real.