Documentos de Académico
Documentos de Profesional
Documentos de Cultura
microcomputadora
en
un
solo
chip,
denominada
ms
tarde
microcontrolador.
1.1 Introduccin
1.2 NMEROS, NMEROS, NMEROS...
1.3 DETALLES IMPORTANTES
1.4 MICROCONTROLADORES PIC
1.1 INTRODUCCIN
Los principiantes en electrnica creen que un microcontrolador es igual a un
microprocesador. Esto no es cierto. Difieren uno del otro en muchos sentidos. La
primera y la ms importante diferencia es su funcionalidad. Para utilizar al
microprocesador en una aplicacin real, se debe de conectar con componentes
tales como memoria o componentes buses de transmisin de datos. Aunque el
microprocesador se considera una mquina de computacin poderosa, no est
preparado para la comunicacin con los dispositivos perifricos que se le
conectan. Para que el microprocesador se comunique con algn perifrico, se
deben utilizar los circuitos especiales. As era en el principio y esta prctica sigue
vigente en la actualidad.
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.
Esto suele ser el punto en el que la fiesta se convierte en un verdadero
trabajo
puesto
que
los
dispositivos
electrnicos
casi
nunca
funcionan
Saba usted que todas las personas pueden ser clasificadas en uno de 10
grupos, en los que estn familiarizados con el sistema de numeracin binario y en
los que no estn familiarizados con l. Si no entendi lo anterior significa que
todava pertenece al segundo grupo. Si desea cambiar su estado, lea el siguiente
texto que describe brevemente algunos de los conceptos bsicos utilizados ms
tarde en este libro (slo para estar seguro de que estamos hablando en los
mismos trminos).
1.2 NMEROS, NMEROS, NMEROS...
son
realmente
11011010
pginas
de
un
libro?
Para
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
en tres sistemas
NMEROS NEGATIVOS
Como ya hemos visto, para escribir un nmero negativo en matemticas,
basta con aadirle el prefijo - (signo menos). Sin embargo, en la programacin,
al acabarse el proceso de la compilacin, se quedan slo los nmeros binarios,
volvindose las cosas ms complicadas. Se utilizan slo dos dgitos - 0 y 1,
mientras que todos los dems nmeros, smbolos y signos se forman por medio
de las combinaciones de estos dos dgitos. En el caso de los nmeros negativos,
la solucin es la siguiente: En los nmeros negativos, el bit ms significativo (el
bit del extremo izquierdo) representa el signo del nmero (donde 0 ser positivo y
1 negativo). En el caso de un nmero de 8 bits, para representar un valor
numrico slo quedan 7 bits. De acuerdo a este tipo de codificacin el nmero
+127 es el mayor nmero positivo con signo que se puede representar con 8 bits.
Asimismo, hay cero (0) positivo y negativo (refirase a la tabla de la derecha). La
siguiente pregunta sera: Cmo es posible saber de qu nmero se trata? Por
ejemplo, si ponemos el nmero 10000001, es -1 o 129? No se preocupe, de eso
se encarga el compilador. sta es la razn por la que se declaran variables al
escribir el programa. Bueno, de eso vamos a hablar a continuacin.
BIT
La teora dice que un bit es la unidad bsica de informacin...Vamos a
olvidarlo por un momento y demostrar qu es eso en la prctica. La respuesta es nada especial- un bit es un slo dgito binario. Similar a un sistema de numeracin
decimal en el que los dgitos de un nmero no tienen la misma ponderacin (por
ejemplo, los dgitos en el nmero 444 son los mismos pero tienen los valores
diferentes), el significado de un bit depende de la posicin que tiene en nmero
binario. En este caso no tiene sentido hablar de unidades, centenas etc. en los
nmeros binarios, sus dgitos se denominan el bit cero (el primer bit a la derecha),
el primer bit (el segundo bit a la derecha) etc. Adems, ya que el sistema binario
utiliza solamente dos dgitos (0 y 1), el valor de un bit puede ser 0 o 1.
No se confunda si se encuentra con un bit que tiene el valor 4, 16 o 64. Son
los valores representados en el sistema decimal. Simplemente, nos hemos
acostumbrado tanto a utilizar los nmeros decimales que estas expresiones
llegaron a ser comunes. Sera correcto decir por ejemplo, el valor del sexto bit en
cualquier nmero binario equivale al nmero decimal 64. Pero todos somos
humanos y los viejos hbitos mueren difcilmente. Adems, cmo le suena
nmero uno-uno-cero-uno-cero...?
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).
Un nibble o un cuarteto representa una mitad de byte. Dependiendo de la
mitad del nmero en cuestin (izquierda o derecha), se les denomina nibbles
altos o bajos, respectivamente.
CIRCUITOS LGICOS
Algunas instrucciones de programa utilizadas por un microcontrolador
funcionan de la misma manera que las compuertas lgicas, pero en forma de
comandos. A continuacin vamos a explicar el principio de su funcionamiento.
COMPUERTA Y (AND)
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.
las
dems.
Representa
una
combinacin
de
todas
las
compuertas
REGISTROS SFR
A diferencia de los registros que no tienen ninguna funcin especial y
predeterminada, cada microcontrolador dispone de un nmero de registros de
funciones especiales (SFR), con la funcin predeterminada por el fabricante. Sus
bits estn conectados a los circuitos internos del microcontrolador tales como
temporizadores, convertidores A/D, osciladores entre otros, lo que significa que
directamente
manejan
el
funcionamiento
de
estos
circuitos,
sea
del
los
registros
SFR
dirigen
los
pequeos
circuitos
dentro
del
OTP ROM (One Time Programmable ROM) - ROM programable una sola
vez
La memoria programable una sola vez permite descargar un programa en el
chip, pero como dice su nombre, una sola vez. Si se detecta un error despus de
descargarlo, lo nico que se puede hacer es descargar el programa correcto en
otro chip.
UV EPROM (UV Erasable Programmable ROM) - ROM programable
borrable por rayos ultravioleta
de
instrucciones
es
la
parte
que
descodifica
las
Tambin
almacena
los
resultados
preparados
para
el
BUS
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
La conexin paralela entre el microcontrolador y los perifricos a travs de
los puertos de entrada/salida es una solucin perfecta para las distancias cortas hasta varios metros. No obstante, en otros casos cuando es necesario establecer
comunicacin entre dos dispositivos a largas distancias no es posible utilizar la
conexin paralela. En vez de eso, se utiliza la conexin en serie.
Hoy en da, la mayora de los microcontroladores llevan incorporados varios
sistemas diferentes para la comunicacin en serie, como un equipo estndar. Cul
de estos sistemas se utilizar en un caso concreto, depende de muchos factores,
de los que ms importantes son:
Con cuntos dispositivos el microcontrolador tiene que intercambiar los
datos?
Cul es la velocidad del intercambio de datos obligatoria?
UART
(UNIVERSAL
ASYNCHRONOUS
RECEIVER/TRANSMITTER)
de
unos
mrgenes
debido
al
ruido
elctrico.
Como
el
diferentes,
ese
estado
puede
causar
un
comportamiento
incorporado
para
el
brown
out
reset.
El
circuito
reinicia
oscilador
del
microcontrolador
utiliza
cristal
de
cuarzo
para
su
razones para utilizarlo. La frecuencia del oscilador es definida con precisin y muy
estable, as que siempre genera los pulsos del mismo ancho, lo que los hace
perfectos para medicin de tiempo. Tales osciladores se utilizan en los relojes de
cuarzo. Si es necesario medir el tiempo transcurrido entre dos eventos, basta con
contar los pulsos generados por este oscilador. Esto es exactamente lo que hace
el temporizador.
el
temporizador
utiliza
el
oscilador
de
cuarzo
interno
para
su
funcionamiento, es posible medir el tiempo entre dos eventos (el valor de registro
en el momento de iniciar la medicin es T1, en el momento de finalizar la
medicin es T2, el tiempo transcurrido es igual al resultado de la resta T2 - T1). Si
los registros se aumentan con los pulsos que vienen de la fuente externa, tal
temporizador se convierte en un contador.
Esto es una explicacin simple de su funcionamiento. Es un poco ms
complicado en prctica.
CMO FUNCIONAN LOS TEMPORIZADORES?
En prctica, los pulsos generados por el oscilador de cuarzo son llevados al
circuito una vez por cada ciclo de mquina directamente o por el pre-escalador, lo
UN
PREESCALADOR
EN
EL
FUNCIONAMIENTO
DEL
TEMPORIZADOR
Un pre-escalador es un dispositivo electrnico utilizado para dividir la
frecuencia por un factor predeterminado. Esto quiere decir que se necesita llevar
1, 2, 4 o ms pulsos a su entrada para generar un pulso a la salida. La mayora de
los microcontroladores disponen de uno o ms pre-escaladores incorporados y su
tasa de divisin puede ser cambiada dentro del programa. El pre-escalador se
utiliza cuando es necesario medir los perodos de tiempo ms largos. Si el
temporizador y el temporizador perro guardin comparten un pre-escalador, ste
no se puede utilizar por los dos simultneamente.
UTILIZAR
UNA
INTERRUPCIN
EN
EL
FUNCIONAMIENTO
DEL
TEMPORIZADOR
Si el registro del temporizador es de 8 bits, el mayor nmero que se puede
escribir en l es 255 (en los registros de 16 bits es el nmero 65.535). Si se
excede este nmero, el temporizador se reinicia automticamente y el conteo
comienza de nuevo en cero. Esto es denominado desbordamiento o sobreflujo
(overflow). Permitido por el programa, el desbordamiento puede provocar una
interrupcin, lo que abre completamente nuevas posibilidades. Por ejemplo, el
estado de registros utilizados para contar segundos, minutos o das puede ser
implementado en una rutina de interrupcin. El proceso entero (excepto la rutina
de interrupcin) se lleva a cabo internamente, lo que permite que los circuitos
principales del microcontrolador funcionen regularmente.
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.
El resultado de esta medicin es un nmero (el valor digital) utilizado y
procesado ms tarde en el programa.
ARQUITECTURA INTERNA
Todos los microcontroladores actuales utilizan uno de dos modelos bsicos
de arquitectura denominados Harvard y von-Neumann.
Son dos maneras diferentes del intercambio de datos entre la CPU y la
memoria.
Arquitectura de von-Neumann
llamado SUM debe ser aumentado por uno (instruccin: incf SUMA), el
microcontrolador har lo siguiente:
1. Leer la parte de la instruccin de programa que especifica QU es lo que debe
realizar (en este caso es la instruccin para incrementar incf)
2. Seguir leyendo la misma instruccin que especifica sobre CUL dato lo debe
realizar (en este caso es el contenido del registro SUMA)
3. Despus de haber sido incrementado, el contenido de este registro se debe
escribir en el registro del que fue ledo (direccin del registro SUMA)
El mismo bus de datos se utiliza para todas estas operaciones intermedias.
ARQUITECTURA DE HARVARD
JUEGO DE INSTRUCCIONES
bsicas
(sumar,
restar,
copiar
etc...)
Las
operaciones
ms
realizara
el
dispositivo
otras
operaciones
adems
Famili
a
RO
RA
uenc
Pi
ia de
[Kb [b
ne reloj
yte
yt
s]
es]
.
[MH
z]
Reso
Ent
rad
as
A/D
luci
Tempo
n del Comp
rizador
conv
arado
es
ertid
res
8/16
or
bits
de
Comu
nicaci
n
serial
Sal
ida
s
PW
Otr
os
A/D
bits
0.3
PIC10F 75 XXX
0.7
XXX
PIC16F
XXX
0.7
5
- -
4-8
0-2 8
0-1
1x8
25
0.7
-
13
4
1.5
25
EEP
8
4-8
0-3 8
0-1
1x8
38
PIC16
HVXX
6 -
25
1.5
24
5
PIC12F
16
RO
M
14
-
EEP
20
0-3 8
0-2
1x8
RO
44
18
Vdd
20
1x8
20
=
15V
64
1.7
5
3.5
64
64
1.7
-
14
PIC16
1.7
HVXX
3.5
12
20
0 - 4 10
1 - 2 x
8 1 x 16
0 1
1.7
36
8
64
12
8
20
14
-
20
64
14
20
20
0 - 4 10
- 8
13
0
12
10
10
or
0-2
1 - 2 x
8 1 x 16
1 - 2 x USART
0 1
0 -
8 1 x 16 I2C SPI 3
2 x 8 1 USART
x 16
I2C SPI
EEP
RO
M
- 6 -
128 39
36
18
80
32
48
- 4
- 10 or
16
12
0 - 2 x
0-3
8 2 - 3
x 16
0
CAN2.
0 -
USART
I2C SPI
10
PIC18F 8
XXJXX
128
24
39
36
76
PIC18F 8
XXKXX 64
- 8 39
36
USB2.
28
-
40
10 48
- 10 16
0 - 2 x
10
8 2 - 3
x 16
0
USART
2 -
Ethern
et
I2C
SPI
28
44
64
10 13
10
1 x 8 3 USART
x 16
I2C SPI
DESCRIPCIN
OPERACIN
BANDER
A
CLK
Mover literal a W
k -> w
MOVWF f
de W a f
MOVF f,d
CLRW
CLRF f
SWAPF f,d
Mover el contenido
de f a d
Borrar el contenido
de W
Borrar el contenido
de f
Intercambiar
f -> d
0 -> W
0 -> f
de f(7:4),(3:0)
nibbles en f
->
f(3:0),(7:4)
1,
2
2
1,
2
Sumar literal a W
Sumar el contenido
de W y f
W+k -> W
C, DC, Z
W+f -> d
C, DC ,Z
SUBLW k
Restar W de literal
k-W -> W
C, DC, Z
SUBWF f,d
Restar W de f
f-W -> d
C, DC, Z
ANDLW k
W AND k -> W
ANDWF f,d
AND W con f
W AND f -> d
W OR k -> W
W OR f -> d
W XOR k -> W
W XOR f -> d
IORLW k
IORWF f,d
XORWF f,d
XORLW k
OR inclusivo de W
con literal
OR inclusivo de W
con f
OR exclusivo de W
con literal
OR exclusivo de W
con f
INCF f,d
Sumar 1 a f
f+1 -> f
DECF f,d
Restar 1 a f
f-1 -> f
RLF f,d
Rotar
la
1,
2
1,
2
1,
2
1,
2
1,
2
1,
2
1,
2
1,
izquierda a travs
Acarreo
COMF f,d
Complementar f
f -> d
1,
2
1,
2
Poner a 0 el bit b
del registro f
Poner a 1 el bit b
del registro f
0 -> f(b)
1 -> f(b)
1,
2
1,
2
Saltar si bit b de
registro f es 0
Saltar si bit b de
reg. f es 1
Disminuir f en 1.
DECFSZ f,d
Saltar
si
el
resultado es 0
Incrementar f en 1.
INCFSZ f,d
Saltar
si
el
resultado es 1
GOTO k
CALL k
RETURN
RETLW k
RETFIE
Saltar
Skip if f(b) = 1
1 (2)
una
subrutina
Retornar
1 (2)
direccin
Llamar
Skip if f(b) = 0
k -> PC
PC
de
subrutina
una
TOS -> PC
PC
de
1,
1 (2)
2,
3
1,
1 (2)
2,
3
2
2
2
2
2
interupcin
GIE
Otras instrucciones
NOP
No operacin
Reiniciar
CLRWDT
el
temporizador perro
guardin
SLEEP
reposo
GIE
TO, 0 -> PD
TO, PD
TO, PD
los
pines
del
microcontrolador.
pertenecern
microcontrolador.
al
microcontrolador,
depender
del
tipo
de
seguramente
sabe
que
no
es
suficiente
slo
conectar
el
sin
significado.
Dependiendo
de
la
arquitectura
del
el
microcontrolador
puede
reconocer
ejecutar
se
les
denominan
Este
libro
describe
una
aplicacin
muy
concreta
del
lenguaje
de
directivas del preprocesador (que siempre empiezan por #) dentro del cdigo y
modifica el cdigo fuente de acuerdo con las directivas. En esta fase se llevan a
cabo inclusin de archivos, definicin de constantes y macros etc, lo que facilita el
proceso. Ms tarde vamos a describir estas directivas en detalle. El analizador
sintctico (parser) elimina toda la informacin intil del cdigo (comentarios,
espacios en blanco). Luego, el compilador traduce el cdigo a un archivo binario
denominado archivo .mcl. El enlazador (linker) recupera toda la informacin
requerida para ejecutar el programa de los archivos externos y la agrupa en un
solo archivo (.dbg). Adems, un proyecto puede contener ms de un archivo
fuente y el programador puede utilizar funciones predefinidas y agrupadas dentro
de los archivos denominados libreras. Por ltimo, el generador .hex produce un
archivo .hex. Es el archivo que se va a cargar en el microcontrolador.
COMENTARIOS
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.
TA M A O
DESCRIPCIN
D AT O
(NMERO
BITS)
DE
RANGO
DE
VA LO R E S
char
Texto (caracteres)
de 0 a 255
int
Valores enteros
16
de -32768 a 32767
de
Valores
float
en
punto
flotante
32
1.1754943508210-38
a
6.805647744071038
double
Valores
en
punto
flotante
de
doble 32
precisin
de
1.1754943508210-38
a
6.805647744071038
puede ser positivo o negativo. El prefijo unsigned indica que el dato puede ser
slo positivo. Note que el prefijo es opcional.
TIPO
DE
TIPO
DE
D AT O
TA M A O
(NMERO
DE
RANGO
D AT O
CON PREFIJO
char
signed char
de -128 a 128
unsigned int
16
de 0 a 65535
short int
de 0 a 255
de -128 a 127
long int
32
32
int
BITS)
DE
VA LO R E S
de
4294967295
de
-2147483648
a 2147483647
0.
// = 0.0
-1.23 // = -1.23
23.45e6 // = 23.45 * 10^6
2e-5
// = 2.0 * 10^-5
59 // entero
'p' // carcter ASCII 'p'
Definiciones
Una variable es un objeto nombrado capaz de contener un dato que puede
ser modificado durante la ejecucin de programa. En C, las variables tienen tipo,
que significa que es necesario especificar el tipo de dato que se le asigna a una
variable (int, float etc.). Las variables se almacenan en la memoria RAM y el
espacio de memoria que ocupan (en bytes) depende de su tipo.
// a equivale a 15
Una constante tiene las mismas caractersticas que una variable excepto el
hecho de que su valor asignado no puede ser cambiado durante la ejecucin de
programa. A diferencia de las variables, las constantes se almacenan en la
memoria Flash del microcontrolador para guardar el mayor espacio posible de
memoria RAM. El compilador las reconoce por el nombre y el prefijo const. En
mikroC, el compilador reconoce automticamente el tipo de dato de una
constante, as que no es necesario especificar el tipo adicionalmente.
data
if
return
typedef
asm
default
inline
rx
typeid
at
delete
int
sfr
typename
auto
do
io
short
union
bit
double
long
signed
unsigned
bool
else
mutable
sizeof
using
break
enum
namespace
static
virtual
case
explicit
operator
struct
void
catch
extern
org
switch
volatile
char
false
pascal
template
while
class
float
private
this
code
for
protected
throw
const
friend
public
true
continue
goto
register
try
temperatura_V1
Presin
// OK
no_corresponder
dat2string
// OK
// OK
// OK
SuM3
// OK
_vtexto
// OK
7temp
%ms_alto
if
j23.07.04
Declaracin de variables
Cada variable debe ser declarada antes de ser utilizada en el programa.
Como las variables se almacenan en la memoria RAM, es necesario reservar el
espacio para ellas (uno, dos o ms bytes). Al escribir un programa, usted sabe
qu tipo de datos quiere utilizar y qu tipo de datos espera como resultado de
una operacin, mientras que el compilador no lo sabe. No se olvide de que el
programa maneja las variables con los nombres asignados. El compilador las
reconoce como nmeros en la memoria RAM sin conocer su tamao y formato.
Para mejorar la legibilidad de cdigo, las variables se declaran con frecuencia al
principio de las funciones:
<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:
int Velocidad_de_ascensor
enum motor_de_ascensor {PARADA,INICIO,NORMAL,MXIMO};
typedef unsigned int positivo; // positivo es un sinnimo para el tipo sin signo
int
positivo a,b;
a = 10;
b = 5;
void main(){
PORTA = cnt++;
File_2
hello();
File 2:
int cnt = 0;
void hello();
.
.
}
2.5 OPERADORES
Un operador es un smbolo que denota una operacin aritmtica, lgica u
otra
operacin
particular.
Dicho
de
manera
sencilla,
varias
operaciones
OPERADOR
OPERACIN
Adicin
Resta
Multiplicacin
Divisin
Resto de la divisin
// 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
Hay dos tipos de asignacin en el lenguaje C:
Los operadores simples asignan los valores a las variables utilizando el
carcter comn '='. Por ejemplo: a =8
Las asignaciones compuestas son especficas para el lenguaje C. Consisten
en dos caracteres como se muestra en la tabla a la derecha. Se utilizan
para simplificar la sintaxis y habilitar la ejecucin ms rpida.
OPERADOR
E J E M P LO
Expresin
Equivalente
+=
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, b, c;
a = b = 5;
c = 1 + a++; // c = 6
E J E M P LO
++a
a++
--b
b--
DESCRIPCIN
Variable "a" es incrementada por 1
Variable "a" es decrementada por 1
b = ++c + a // b = 7 + 6 = 13
OPERADORES RELACIONALES
Los operadores relacionales se utilizan en comparaciones con el propsito
de comparar dos valores. En mikroC, si una expresin es evaluada como falsa
(false), el operador devuelve 0, mientras que si una oracin es evaluada como
verdadera (true), devuelve 1. Esto se utiliza en expresiones tales como si la
expresin es evaluada como verdadera, entonces...
OPERADO
DESCRIPCI
EJEMPL
CONDICIN
VERACIDAD
>
mayor que
b>a
si b es mayor que a
a >= 5
a<b
si a es menor que b
a <= b
mayor
>=
igual
que
<
menor que
menor
<=
igual
que
==
igual que
a == 6
si a es igual que 6
!=
desigual que
a != b
si a es desigual que b
DE
int prop;
int var = 5;
prop = var < 10; // Expresin es evaluada como verdadera, prop = 1
OPERADORES LGICOS
Hay tres tipos de operaciones lgicas en el lenguaje C: Y (AND) lgico, O
(OR) lgico y negacin - NO (NOT) lgico. Los operadores lgicos devuelven
verdadero (1 lgico) si la expresin evaluada es distinta de cero. En caso
FUNCIN
&&
||
NO
>>
&
EJEMPL
DESCRIPCIN
Complemento a uno
Desplazamiento
a = ~b
a
la
izquierda
Desplazamiento
derecha
R E S U LTA D O
b=5
b
a = -5
=
a = b << 2 1111001
1
la
a = b >> 2 1111001
1
bits
1110001
1
11001100
a
00011110
= c
11000000
1100110
0
a
1110001
O lgico para manejo de
bits
c=a|b
1
b
= 11101111
1100110
0
a
1110001
EXOR lgico para manejo
de bits
c=a^b
1
b
= 00101111
1100110
0
Note que el resultado de la operacin de desplazamiento a la derecha
depende del signo de la variable. En caso de que el operando se aplique a una
variable sin signo o positiva, se introducirn los ceros en el espacio vaco creado
por desplazamiento. Si se aplica a un entero con signo negativo, se introducir un
1 para mantener el signo correcto de la variable.
CMO UTILIZAR LOS OPERADORES?
Aparte de los operadores de asignacin, dos operadores no deben estar
escritos uno junto al otro.
OPERADORES
() [] -> .
A S O C I AT I V I D A
D
de
*/%
+<>
< <= > >=
== !=
&
^
|
&&
||
?:
derecha
izquierda
derecha
izquierda
de
izquierda
derecha
de
izquierda
derecha
de
izquierda
derecha
de
izquierda
derecha
de
izquierda
derecha
de
izquierda
derecha
de
izquierda
derecha
de
izquierda
derecha
de
izquierda
derecha
de
derecha
izquierda
de
derecha
izquierda
Baja
int a, b, res;
a = 10;
b = 100;
res = a*(a + b); // resultado = 1100
res = a*a + b; // resultado = 200
de
izquierda
derecha
int x;
x = 3;
Para realizar una conversin explcita, antes de escribir una expresin o una
variable hay que especificar el tipo de resultado de operacin entre parntesis.
if(expresin) operacin;
if(expresin)
operacin1
else
operacin2
if(expresin) {
... //
... // operacin1
...} //
else
operacin2
Operador Switch
A diferencia de la sentencia if-else que selecciona entre dos opciones en el
programa, el operador switch permite elegir entre varias opciones. La sintaxis de
la sentencia switch es:
break;
case constante2:
break;
...
default:
...
break;
}
while(expresin){
comandos
...
}
...
...
Bucle For
El bucle for se parece a lo siguiente:
do
operacin
while (cambiar_condicin);
while (i<10) {
// Condicin
Delay_ms(1000);
// Retardo de 1000 ms
// Retardo de 500ms
// Contador se incrementa
}
for(i=0; i<10; i++) {
// Retardo de 1000 ms
Lcd_Cmd(_LCD_CLEAR);
Delay_ms(500);
// Borrar el LCD
// Retardo de 500ms
}
i = 0;
do {
Lcd_Out(1,3,"hello"); // Visualizar hello en el LCD
Delay_ms(1000);
// Retardo de 1000 ms
// Retardo de 500ms
// Contador se incrementa
}
while (i<10);
// Condicin
SENTENCIAS DE SALTO
SENTENCIA BREAK
A veces es necesario detener y salir de un bucle dentro de su cuerpo. La
sentencia break se puede utilizar dentro de cualquier bucle (while, for, do while) y
en las sentencias switch tambin. En stas la sentencia break se utiliza para salir
de las sentencias switch si la condicin case es verdadera. En este ejemplo,
Esperar est parpadeando en la pantalla LCD hasta que el programa detecte un
uno lgico en el pin 0 del puerto PORTA.
// Retardo de 1000 ms
Lcd_Cmd(_LCD_CLEAR);
Delay_ms(500);
// Borrar LCD
// Retardo de 500ms
SENTENCIA CONTINUE
SENTENCIA GOTO
La sentencia goto le permite hacer un salto absoluto al otro punto en el
programa. Esta caracterstica se debe utilizar con precaucin ya que su ejecucin
puede causar un salto incondicional sin hacer caso a todos los tipos de
limitaciones de anidacin. El punto destino es identificado por una etiqueta,
utilizada como un argumento para la sentencia goto. Una etiqueta consiste en un
identificador vlido seguido por un colon (:).
...
if(CO2_sensor) goto aire acondicionado; // Si se consta que el valor
...
// de la variable CO2_sensor =1
// hacer salto a la lnea de programa
// Aire acondicionado
...
Aire acondicionado:
ejecutar
// en el ambiente
// mtodo 1
int display [3]; // Declaracin de la matriz display capaz de contener 3 enteros
// mtodo 2
const DGITOS = 5;
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
// temporalmente
profundiad_de_sonda [i] = profundiad_de_sonda [MUESTRAS_DE_AGUA-1-i];
profundiad_de_sonda [MUESTRAS_DE_AGUA-1-i] = temp;
}
//
Aqu
{1987,1,25,24}
}
tenemos:
profundidad_de_sonda
[MUESTRAS_DE_AGUA]
MATRICES BIDIMENSIONALES
Aparte de las matrices unidimensionales que se pueden interpretar como
una
lista
de
valores,
multidimensionales.
bidimensionales,
En
el
esta
tambin
lenguaje
parte
vamos
denominadas
le
permite
declarar
matrices
describir
slo
matrices
tablas
matrices.
las
Una
matriz
int Tabla [3][4]; // Tabla se define de modo que tenga 3 filas y 4 columnas
tabla[0][1]
tabla[0][2]
tabla[0][3]
tabla[1][0]
tabla[1][1]
tabla[1][2]
tabla[1][3]
tabla[2][0]
tabla[2][1]
tabla[2][2]
tabla[2][3]
42
19
PUNTEROS
Un puntero es una variable destinada a recibir una direccin. Un puntero
apunta a una localidad de memoria, referenciada por una direccin. En C, la
direccin de un objeto se puede obtener por medio un operador unitario &. Para
acceder al contenido de la memoria en una direccin especfica (tambin llamado
objeto apuntado), se utiliza un operador de indireccin (*).
tipo_de_variable *puntero;
puntero = &variable;
Los punteros son muy tiles para manejar las matrices. En este caso, un
puntero se utilizar para apuntar al primer elemento de una matriz. Debido al
hecho de que es posible realizar operaciones bsicas sobre los punteros
(aritmtica de punteros), es fcil manejar los elementos de una matriz.
Fjese en la diferencia entre *v+1 y *(v+1) en el siguiente ejemplo:
// voltio[1] = 2
v++;
*v = 1;
// voltio[1] = 1
Los punteros tambin pueden ser declarados con el prefijo const. En este
caso, su valor no puede ser modificado despus de la inicializacin, similar
a una constante.
A diferencia de C, el mikroC no admite alojamiento dinmico.
ESTRUCTURAS
Ya hemos visto cmo agrupar los elementos dentro de matrices. No
obstante, al utilizar este mtodo todos los elementos deben ser del mismo tipo. Al
utilizar estructuras, es posible agrupar diferentes tipos de variables bajo el mismo
nombre. Las variables dentro de una estructura se le denominan los miembros de
la estructura. Las estructuras de datos se declaran al utilizar la siguiente sintaxis:
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.
Si est familiarizado con el lenguaje C, recuerde que mikroC no admite la
inicializacin de los miembros de estructura por medio de las llaves. Por ejemplo,
conjunto_1 ={15,m}; devuelve un error en mikroC.
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
..
.
};
Esto significa que f es una funcin que recibe un nmero real x como
parmetro y devuelve 2*x-y.
La misma funcin en C se parece a lo siguiente:
// devolver el valor de r
Note que una funcin no necesita parmetros (funcin main() por ejemplo),
pero
debe
estar
entre
parntesis.
En
caso
contrario,
el
compilador
return r;
debe ser seguida por ninguna expresin. Puede ser omitida como en el siguiente
ejemplo:
a = 10.54;
b = 5.2;
resultado = f(a,b); // Ejecutar la funcin f por medio de los parmetros a y b
pausa_1(tiempo);
tiempo
funcinX();
void main() {
int maximum, input[SIZE] = {5,10,3,12,0}; // Declaracin de variables en la
matriz
maximum = sort(input);
while(permut!=0) {
// Declaracin de variables
// Bandera de bit indica que se ha hecho una permutacin
permut = 0;
// Bandera reiniciada
float mtodo_1(int[]);
float mtodo_2(int*);
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
}
//
{
int i, suma;
voltaje[i]
return(suma/NMERO_DE_MEDICIONES);
}
//
*(voltaje+i)
return(suma/NMERO_DE_MEDICIONES);
}
FUNCIONES
#include
#undef
#define
#ifdef
#endif
#ifndef
#if
#else
#elif
necesitan
Definiciones de macro
Inclusiones de archivos
Control de compilacin
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,
programa
se sustituye
por
una
cadena
predefinida.
El
Tanque_1 = (((Dimetro/2)*(Dimetro/2)*PI)*altura;
INCLUSIN DE ARCHIVOS
La directiva de preprocesador #include copia un archivo especfico en el
cdigo fuente. El cdigo incluido debe observar la sintaxis de C para ser
compilado correctamente.
Hay dos formas de escribir estas directivas. En el primer ejemplo, slo el
nombre de archivo se especifica, as que el preprocesador lo buscar dentro del
archivo include. En el segundo ejemplo, se especifica la ruta entera, as que el
archivo estar directamente incluido (este mtodo es ms rpido).
#include <nombre_de_archivo>
archivo
#include "C:\Ruta\nombre_de_archivo.h"
// Se especifica la localidad
archivo externo e incluido dentro del compilador (archivo .def). Este archivo
contiene todos los SFR del microcontrolador PIC a programar.
TRISB = 0; // todos los pines del puerto PORTB se configuran como salidas
PORTB = 0; // todos los pines del PORTB se ponen a 0
void main() {
PORTA.B7
...
Botn_PARADA
}
bit bf;
asm
{
instrucciones en ensamblador
...
}
// W = maximum = 100
...
}
FUNCIN DE INTERRUPCIN
Una interrupcin detiene la ejecucin normal de un programa para ejecutar
las operaciones especficas. Una lista de sentencias a ejecutar debe estar escrita
dentro de una funcin particular denominada interrupt(). La sintaxis de una
interrupcin en mikroC se parece a lo siguiente:
void interrupt() {
cnt++ ;
DESCRIPCIN
Library
ANSI
datos
C
Math
Stdlib
Library
ANSI
Library
ANSI
Library
manipulacin de memoria
- libreras miscelneas:
LIBRARA
DESCRIPCIN
Button Library
Conversion
Library
Sprint Library
PrintOut Library
Time Library
Trigonometry
Utilizada
Library
trigonomtricas fundamentales
Setjmp Library
para
la
DESCRIPCIN
implementacin
de
funciones
ADC Library
CAN Library
CANSPI Library
EEPROM Library
incorporada
EthernetPIC18FxxJ60
Library
incorporado
I2C Library
Keypad Library
de presin 4x4)
Utilizada para las operaciones con el LCD (de 2x16
Lcd Library
caracteres)
Code Utilizada para la comunicacin utilizando el cdigo
Library
Multi
incorporada
Utilizada para las operaciones con el mdulo LCD
Manchester
Manchester
Media
Card Utilizada
Library
One Wire Library
Port Expander Library
PS/2 Library
PWM Library
para
las
operaciones
con
las
tarjetas
operaciones
con
los
circuitos
para
las
RS-485 Library
Software I2C Library
Software SPI Library
Software UART Library
Sound Library
SPI Library
SPI Ethernet Library
SPI Graphic Lcd Library
SPI LCD Library
SPI Lcd8 Library
SPI T6963C Graphic Lcd
Library
UART Library
USB Hid Library
Utilizada
para
las
operaciones
con
los
mdulos
para
simular
la
comunicacin
I2C
con
para
simular
la
comunicacin
SPI
con
software
Utilizada
software
Utilizada para simular la comunicacin UART con
software
Utilizada para generar las seales de audio
Utilizada para las operaciones con el mdulo SPI
incorporado
Utilizada para la comunicacin SPI con el mdulo
ETHERNET (ENC28J60)
Utilizada para la comunicacin SPI de 4 bits con el LCD
grfico
Utilizada para la comunicacin SPI de 4 bits con el LCD
(de 2x16 caracteres)
Utilizada para la comunicacin SPI de 8 bits con el LCD
Utilizada para la comunicacin SPI con el LCD grfico
Utilizada para las operaciones con el mdulo UART
incorporado
Utilizada para las operaciones con el mdulo USB
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.
Una vez ms: Next, OK, Next, Next...
lo ms importante del compilador mikroC PRO for PIC. De todos modos, para
obtener ms informacion presione el botn de Ayuda (Help) [F1].
MANEJAR LOS PROYECTOS
Antes de empezar a escribir el cdigo, usted debe crear un proyecto. Un
programa escrito en el compilador mikroC PRO for PIC no es un archivo fuente
autnomo, sino que forma parte de un proyecto que incluye un cdigo hex, un
cdigo ensamblador, cabecera y otros archivos. Algunos de ellos se requieren
para compilar el programa, mientras que otros se crean durante el proceso de
compilacin. Un archivo con extensin .mcppi le permite abrir cualquiera de estos
proyectos.
Para crear un proyecto, basta con seleccionar la opcin Project/New Project,
y un wizard aparecer automticamente. Qu hacer entonces? Siga las
instrucciones...
PROJECT MANAGER (ADMINISTRADOR DEL PROYECTO)
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.
Device (dispositivo):
Al seleccionar el tipo de microcontrolador a utilizar permite al compilador
extraer el archivo de definicin (archivo .def) asociado. El archivo de definicin de
un microcontrolador contiene las informaciones especficas de sus registros SFR,
de sus direcciones de memoria y algunas variables de programacin especficas a
ese tipo del microcontrolador. Es obligatorio crear un archivo .hex compatible.
Oscillator (oscilador):
Se debe especificar la velocidad de operacin del microcontrolador. Por
supuesto, este valor depende del oscilador utilizado. El compilador la necesita
para compilar rutinas, lo que requiere informacin del tiempo (por ejemplo, la
funcin Delay_ms). Ms tarde, el programador necesitar esta informacin
Values.
Entonces
usted
puede
hacer
una
lista
de
over,
run/pause
etc.)
en
ejecutarse
por
el
depurador
se
mide
PROGRAMAR EL MICROCONTROLADOR
Si ha solucionado todos los errores en su cdigo y cree que su programa est
listo para ser utilizado, el siguiente paso es cargarlo en el microcontrolador. El
es
posible
modificar
algunas
configuraciones
del
Terminal.
Se
puede
utilizar
para
controlar
el
funcionamiento
del
EDITOR EEPROM
Al seleccionar la opcin EEPROM Editor del men Tools, aparecer una
ventana como se muestra en la siguiente figura. As es cmo funciona la memoria
EEPROM del microcontrolador. Si quiere cambiar de su contenido despus de
cargar el programa en el microcontrolador, sta es la forma correcta de hacerlo. El
nuevo contenido es un dato de un tipo especfico (char, int o double), primero
debe seleccionarlo, introducir el valor en el campo Edit Value y pulsar sobre Edit.
Luego, pulse sobre el botn Save para guardarlo como un documento con
extensin .hex. Si la opcin Use EEPROM in Project est activa, los datos se
cargarn automticamente en el microcontrolador durante el proceso de la
programacin.
LCD
CUSTOM
CHARACTER
(CARACTERES
LCD
DEFINIDOS
POR
EL
USUARIO)
Adems de los caracteres estndar, el microcontrolador tambin puede
visualizar los caracteres creados por el programador. Al seleccionar la herramienta
LCD custom character, se evitar un pesado trabajo de crear funciones para
enviar un cdigo apropiado a un visualizador. Para crear un smbolo, pulse sobre
los cuadros pequeos en la ventana LCD custom character, luego seleccione la
posicin y la fila y pulse sobre el botn GENERATE. El cdigo apropiado aparece en
otra ventana. No es necesita pulsar ms. Copy to Clipboard (copiar al
portapapeles) - Paste (pegar)...
Un
cdigo
generado
que
utiliza
herramientas
para
controlar
los
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
DESCRIPCIN DE PINES
La mayora de los pines del microcontrolador PIC16F887 son multipropsito
como
se
muestra
en
la
figura
anterior.
Por
ejemplo,
la
asignacin
MEMORIA
El PIC16F887 tiene tres tipos de memoria: ROM, RAM y EEPROM. Como cada
una tiene las funciones, caractersticas y organizacin especficas, vamos a
presentarlas por separado.
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).
MEMORIA EEPROM
Similar a la memoria de programa, el contenido de memoria EEPROM est
permanentemente guardado al apagar la fuente de alimentacin. Sin embargo, a
diferencia de la ROM, el contenido de la EEPROM se puede cambiar durante el
funcionamiento del microcontrolador. Es la razn por la que esta memoria (256
localidades) es perfecta para guardar permanentemente algunos resultados
creados y utilizados durante la ejecucin del programa.
MEMORIA RAM
Es la tercera y la ms compleja parte de la memoria del microcontrolador.
En este caso consiste en dos partes: en registros de propsito general y en los
registros de funciones especiales (SFR). Todos estos registros se dividen en cuatro
bancos de memoria de los que vamos a hablar ms tarde en este captulo.
A unque los dos grupos de registros se ponen a cero al apagar la fuente de
alimentacin, adems estn fabricados de la misma forma y se comportan de la
manera similar, sus funciones no tienen muchas cosas en comn.
...
...
...
TRISC = 0x00
PILA
Una parte de la RAM utilizada como pila consiste de ocho registros de 13
bits. Antes de que el microcontrolador se ponga a ejecutar una subrutina
(instruccin CALL) o al ocurrir una interrupcin, la direccin de la primera
siguiente instruccin en ser ejecutada se coloca en la pila (se apila), o sea, en uno
de los registros. Gracias a eso, despus de ejecutarse una subrutina o una
interrupcin, el microcontrolador sabe dnde continuar con la ejecucin de
programa. Esta direccin se borra (se desapila) despus de volver al programa, ya
que no es necesario guardarla, disponiendo automticamente esas localidades de
la pila para un uso futuro.
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.
Vamos a hacerlo en mikroC...
saveBank = STATUS & 0b01100000; // Guardar el estado de los bits RP0 y RP1
// (bits 5 y 6 del registro STATUS)
asm {
...
...
// Cdigo ensamblador
...
}
SISTEMA DE INTERRUPCIONES
Al
aparecer
una
peticin
de interrupcin lo primero
que hace el
pero
no
se
preocupe,
Usted
no
tiene
que
hacerlo!
Los
RP0
BANCO ACTIVO
Banco 0
Banco 1
Banco 2
Banco 3
T0CS - TMR0 Clock Source Select bit (bit selector de tipo de reloj
para el Timer0)
o 1 - Pulsos introducidos a travs del TOCKI (contador).
o 0 - Pulsos de reloj internos Fosc/4 (temporizador).
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.
PS1
PS0
TMR0
WDT
1:2
1:1
1:4
1:2
1:8
1:4
1:16
1:8
1:64
1:32
1:128
1:64
1:256
1:128
cuenta
pulsos,
el
preescalador
debe
ser
asignado
al
WDT.
En
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
}
nombres
(Interrupt
Enable
Interrupcin
habilitada).
Adems,
cada
interrupcin se asocia con otro bit denominado bandera que indica que una
peticin de interrupcin ha llegado sin verificar si est habilitada. Asimismo, se
reconocen con facilidad por las dos ltimas letras contenidas en sus nombres - IF
(Interrupt Flag - Bandera de interrupcin).
Registro INTCON
El registro INTCON contiene varios bits de habilitacin y de bandera para el
desbordamiento en el registro TMR0, e interrupciones por el cambio del estado en
el puerto PORTB y las interrupciones externas en el pin INT.
Peripheral
Interrupt
Enable
bit
(bit
de
habilitacin
de
// El pin PORTB.4 se configura como una entrada sensible al cambio del estado
lgico.
void initMain() {
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como digitales
PORTB = 0;
TRISB = 0b00010000; // Todos los pines del puerto PORTB menos PORTB.4 se
// configuran como salidas
RBIE = 1;
PORTB
IOCB4 = 1;
GIE = 1;
...
cambio
...
...
Registro PIE1
El registro PIE1 contiene los bits de habilitacin de interrupciones
perifricas.
TMR2
to
PR2
Match
Interrupt
Enable
bit
(bit
de
// incrementa por 1
PIR1.TMR1IF = 0;
TMR1H = 0x80;
TMR1L = 0x00;
void main() {
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como digitales
T1CON = 1;
PIR1.TMR1IF = 0;
TMR1H = 0x80;
Timer1
TMR1L = 0x00;
PIE1.TMR1IE = 1;
// desbordamiento en el Timer1
cnt = 0;
INTCON = 0xC0;
...
Registro PIE2
El
registro
PIE2
tambin
contiene
varios
bits
de
habilitacin
de
interrupciones.
void interrupt() {
void main() {
TRISB = 0;
PORTB.F1 = 1;
ANSEL = 0b00000101;;
// entradas analgicas
ANSELH = 0;
digitales
CM2CON0.C2CH0 = CM2CON0.C2CH1 = 0; // El pin RA0 se selecciona para ser
una
// entrada invertida del C2
PIE2.C2IE = 1;
CON.GIE = 1;
CM2CON0.C2ON = 1;
...
...
Registro PIR1
El registro PIR1 contiene los bits de banderas de interrupcin.
se
produce
una
captura
la
igualdad
en
la
se
produce
una
captura
la
igualdad
en
la
void main() {
PORTA.F0 = 1;
ANSEL = ANSELH = 0;
digitales
TRISA = 0;
salidas
Delay_ms(1);
PIR2.ULPWUIF = 0;
PCON.ULPWUE = 1;
TRISA.F0 = 1;
PIE2.ULPWUIE = 1;
// Cargar el capacitor
// Bandera ULPWUIF se pone a cero
// Habilitar el funcionamiento del mdulo ULPWU
// PORTA.0 se configura como entrada
// Habilitar la interrupcin por el mdulo ULPWU
Registro PCON
de
memoria
de
programa
durante
el
funcionamiento
del
al
ejecucin
de
byte
una
superior
instruccin
del
sobre
registro
el
registro
PCLATH.
PCL
causa
el
microcontrolador
es
capaz
de
proporcionar
solamente
la
direccin
de
un
registro
para
leer
su
contenido),
este
// El pin PORTA.2 se configura como una entrada digital. Todos los dems pines
del puerto
// PORTA son salidas digitales
...
...
UNIDAD ULPWU
El microcontrolador se utiliza generalmente en los dispositivos que
funcionan peridicamente y completamente independiente utilizando una fuente
de alimentacin de batera. En tal caso, el consumo de corriente mnimo es una
de las prioridades. Los ejemplos tpicos de tales aplicaciones son: termmetros,
sensores de deteccin del fuego y similar. Es conocido que al reducir frecuencia
de reloj se reduce el consumo de corriente, pues una de las soluciones ms
convenientes a este problema es bajar la frecuencia de reloj, o sea utilizar el
cristal de cuarzo de 32KHz en vez de el de 20MHz.
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.
La salida genera una interrupcin, mientras que la entrada est conectada a
uno de los pines del microcontrolador. Es el pin RA0. Refirindose a la Figura
(R=200 ohms, C=1nF), el tiempo de descarga es aproximadamente 30mS,
mientras que un consumo total de corriente del microcontrolador es 1000 veces
ms bajo (de varias centenas de nanoamperios).
Puerto PORTB y registro TRISB
El puerto PORTB es un puerto bidireccional, de 8 bits de anchura. Los bits
del registro TRISB determinan la funcin de sus pines.
Adems de los bits del registro WPUB, hay otro bit que afecta a la
instalacin de las resistencias pull-up. Es el bit RBPU del registro OPTION_REG.
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.
Vamos a hacerlo en mikroC...
...
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como digitales
PORTB = 0;
TRISB = 0b00000010; // Todos los pines del puerto PORTB excepto PORTB.1
// se configuran como salidas
RBPU = 0;
WPUB1 = 1;
IOCB1 = 1;
RBIE = GIE = 1;
...
PIN RB0/INT
El pin RB0/INT es la nica fuente verdadera de la interrupcin externa. Se
puede configurar de manera que reaccione al borde ascendente de seal
(transicin de cero a uno) o al borde descendente de seal (transicin de uno a
cero). El bit INTEDG del registro OPTION_REG selecciona la seal apropriada.
PINES RB6 Y RB7
El PIC16F887 no dispone de ningn pin especial para la programacin (el
proceso de escribir un programa en la ROM). Los pines que generalmente estn
disponibles como los pines de E/S de propsito general, se utilizan para este
propsito. Para decir con ms precisin, son los pines del puerto PORTB utilizados
para la transmisin de seal de reloj (RB6) y de datos (RB7) al cargar el programa.
Adems, es necesario suministrar el voltaje de alimentacin Vdd (5V) as como el
voltaje apropiado Vpp (12-14V) para la programacin de memoria FLASH. Durante
que
es
muy
importante
es
que
el
programa
se
puede
cargar
al
destino
para
suministrar
al
microcontrolador
un
voltaje
de
Como hemos visto, los voltajes aplicados a los pines del zcalo del
programador son los mismos que los utilizados durante la programacin ICSP.
Puerto PORTC y registro TRISC
El puerto PORTC es un puerto bidireccional, de 8 bits de anchura. Los bits
del registro TRISC determinan la funcin de sus pines. Similar a otros puertos, un
uno lgico (1) en el registro TRISC configura el pin apropiado del puerto PORTC
como entrada.
/* 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;
...
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.
disear
un
dispositivo,
seleccione
un
puerto
por
el
que
el
Con frecuencia se necesita responder tan pronto como los pines de entrada
cambien su estado lgico. Sin embargo, no es necesario escribir un
programa para comprobar el estado lgico de los pines. Es mucho ms
simple conectar estas entradas a los pines del puerto PORTB y habilitar que
ocurra una interrupcin con cada cambio de voltaje. Los bits de los
registros IOCB e INTCON se encargan de eso.
El microcontrolador PIC16F887 dispone de tres temporizadores/contadores
independientes, denominados Timer0, Timer1 y Timer2. En este captulo se
presenta una descripcin detallada de los mismos.
3.4 TEMPORIZADOR TIMER0
El temporizador Timer0 tiene una amplia gama de aplicaciones en la
prctica. Slo unos pocos programas no lo utilizan de alguna forma. Es muy
conveniente y fcil de utilizar en programas o subrutinas para generar pulsos de
duracin arbitraria, en medir tiempo o en contar los pulsos externos (eventos)
casi sin limitaciones.
El mdulo del temporizador Timer0 es un temporizador/contador de 8 bits
con las siguientes caractersticas:
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.
La siguiente figura muestra el esquema del temporizador Timer0 con todos
los bits que determinan su funcionamiento. Estos bits se almacenan en el registro
OPTION_REG.
Registro OPTION_REG
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.
PSA
escalador)
o 0 - Pre-escalador se le asigna al WDT.
o 1 - Pre-escalador se le asigna al temporizador/contador Timer0.
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
el
temporizador
perro
respectivamente.
PS2
PS1
PS0
TMR0
WDT
1:2
1:1
1:4
1:2
1:8
1:4
1:16
1:8
guardin,
1:32
1:16
1:64
1:32
1:128
1:64
1:256
1:128
Cuando
el
bit
PSA
est
0,
el
pre-escalador
se
le
asigna
al
unsigned cnt;
TMR0 = 155;
INTCON = 0x20;
void main() {
OPTION_REG = 0x04;
Timer0
TMR0 = 155;
INTCON = 0xA0;
// 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;
INTCON = 0xA0;
// temporizador Timer0
...
...
void main() {
OPTION_REG = 0x0E; // Pre-escalador se le asigna al WDT (1:64)
asm CLRWDT;
...
...
asm CLRWDT;
...
BANKSEL TMR0
CLRWDT
CLRF TMR0
BANKSEL OPTION_REG
CLRWDT
BANKSEL TMR0
CLRWDT
BANKSEL OPTION_REG
LGICO'
MOVWF OPTION_REG
bit
de
bandera
TMR0IF
del
registro
INTCON
se
pone
uno
en
ellos
en
cualquier
momento.
En
caso
de
que
ocurra
un
al
microcontrolador
(salida
del
modo
de
reposo)
por
TMR1CS
Fosc/4
T1CKI pin
LP
FRECUENCIA
C1
C2
32 kHz
33 pF
33 pF
100 kHz
15 pF
15 pF
200 kHz
15 pF
15 pF
Una seal generada por este oscilador de cuarzo est sincronizada con el
reloj del microcontrolador al poner a 0 el bit T1SYNC. En este caso, el
temporizador no puede funcionar en modo de reposo porque el circuito
para sincronizacin utiliza el reloj del microcontrolador.
La interrupcin por desbordamiento en el registro del temporizador Timer1
puede estar habilitada. Si el bit T1SYNC se pone a 1, tales interrupciones se
producirn en el modo de reposo tambin.
COMPUERTA DEL TEMPORIZADOR TIMER1
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;
TMR1H = 0x22;
TMR1L = 0x00;
TMR1CS = 0;
INTCON = 0xC0;
TMR1ON = 1;
...
aunque los pulsos de reloj aparezcan en los pines de entrada. Como el reloj
interno del microcontrolador no funciona en este modo, no hay entradas de reloj
que se utilicen para la sincronizacin. De todas formas, el pre-escalador sigue
funcionando siempre que haya pulsos de reloj en los pines, porque es un simple
divisor de frecuencias.
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
T1GINV - Timer1 Gate Invert bit (Bit inversor de la compuerta del temporizador1)
se comporta como un inversor del estado lgico en la compuerta formada por el
pin T1G o la salida (C2OUT) del comparador C2. Este bit habilita al temporizador
para con tar los pulsos cuando la compuerta est a alto o a bajo.
1 - Temporizador 1 cuenta los pulsos cuando el pin T1G o el bit C2OUT estn
a alto (1).
0 - Temporizador 1 cuenta los pulsos cuando el pin T1G o el bit C2OUT estn
a bajo (0).
TMR1GE - Timer1 Gate Enable bit (Bit de habilitacin de la compuerta del
temporizador1) determina si la compuerta formada por el pin T1G o salida del
comparador C2 (C2OUT) estar activa o no. Este bit es funcional slo en caso de
que el temporizador Timer1 est encendido (el bit TMR1ON = 1). De lo contrario,
este bit se ignora.
1 - Temporizador Timer1 est encendido slo si la compuerta no est activa.
0 - Compuerta no afecta al temporizador Timer1.
T1CKPS1, T1CKPS0 - Timer1 Input Clock Prescale Select bits (Bits de seleccin
del preescalador de seal de reloj del Temporizador1) determina el valor del
divisor de frecuen cias asignada al temporizador Timer1.
T1CKPS1
T1CKPS0
VA LO R D E L P R E - E S C A L A D O R
1:1
1:2
1:4
1:8
T1OSCEN - LP Oscillator Enable Control bit (bit de habilitacin del oscilador LP del
Timer1)
1 - Oscilador LP est habilitado para el reloj del Timer1 (oscilador de bajo
consumo y de frecuencia de 32.768 kHz)
0 - Oscilador LP est apagado.
T1SYNC - Timer1 External Clock Input Synchronization Control bit (Bit de control
de sincronizacin de la seal de entrada) habilita la sincronizacin de la entrada
del oscilador LP o de la entrada del pin T1CKI con el reloj interno del
microcontrolador. Este bit se ignora al contar los pulsos desde el oscilador
principal (el bit TMR1CS = 0).
1 - Entrada de reloj externa no est sincronizada.
0 - Entrada de reloj externa est sincronizada.
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
TMR1ON - Timer1 On bit (TMR activo, hace entrar o no en funcionamiento el
Timer1).
1 - Habilita el temporizador Timer1.
0 - Deshabilita el temporizador Timer1.
Los pulsos que vienen del oscilador de cuarzo primero pasan por el preescalador cuyo valor puede ser modificado al combinar los bits T2CKPS1 y
T2CKPS0. La salida del preescalador se utiliza para incrementar el registro TMR2
empezando
por
00h.
Los
valores
del
TMR2
del
PR2
se
comparan
Registro T2CON
TOUTPS3 - TOUTPS0 - Timer2 Output Postcaler Select bits (bits de seleccin del
rango del divisor del post-escalador para el Timer2) se utilizan para determinar el
valor del post-escalador segn la siguiente tabla:
TOUTPS
TOUTPS
TOUTPS
TOUTPS
VA LO R
DEL
ESCALADOR
1:1
1:2
1:3
1:4
1:5
1:6
1:7
1:8
1:9
1:10
1:11
1:12
1:13
1:14
1:15
1:16
P O S T-
T2CKPS0
VA LO R D E L P R E - E S C A L A D O R
1:1
1:4
1:16
BANKESEL CCP1CON
CLRF
MOVLW
MOVWF
XX
VALOR
;MDULO CCP1 SE ENCIENDE SIMULTNEAMENTE
...
ASM {
BANKESEL CCP1CON
CLRF CCP1CON
MOVWF CCP1CON
VALOR
}
...
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:
Perodo PWM = (PR2 +1) * 4Tosc * Valor de pre-escala del Timer2
Si el perodo de PWM (T) es conocido, es fcil determinar la frecuencia de
seal F, porque estos dos valores estn relacionados por la ecuacin F=1/T.
CICLO DE TRABAJO DE PWM
El ciclo de trabajo de PWM se especifica al utilizar en total 10 bits: los ocho
bits ms significativos del registro CCPR1L y los dos bits menos significativos
adicionales del registro CCP1CON (DC1B1 y DC1B0). El resultado es un nmero de
10 bits dado por la siguiente frmula:
Ancho de pulsos = (CCPR1L,DC1B1,DC1B0) * Tosc * Valor de pre-escala del
Timer2
La siguiente tabla muestra cmo generar las seales PWM de diferentes
frecuencias cuando el microcontrolador utiliza un cristal de cuarzo de 20 MHz
(Tosc=50nS).
FRECUENCIA [KHZ]
1.2
2
4.88
19.5
78.1
156.
208.3
16
Registro PR2
FFh
FFh
FFh
3Fh
1Fh
17h
Notas adicionales:
estarn
disponibles
256
ciclos
de
trabajo
disretos
etc.
En
este
DE
PWM
Pre-escala del
temporizador
Valor del PR2
Resolucin
mxima
1.22K
4.88K
19.53K
78.12K
156.3K
208.3K
HZ
HZ
HZ
HZ
HZ
HZ
16
FFh
FFh
FFh
3Fh
1Fh
17h
10
10
10
DEL
PWM
Pre-escala
1.22K
4.90K
19.61
76.92K
153.85
200.0K
HZ
HZ
KHZ
HZ
KHZ
HZ
16
del
temporizador
Valor del PR2
Resolucin
mxima
65h
65h
65h
19h
0Ch
09h
void initMain() {
ANSEL = ANSELH = 0;
PORTC = TRISC = 0;
PWM1_Init(5000);
}
void main() {
initMain();
duty_c = 127;
PWM1_Start();
Registro CCP1CON
P1M0
MODO
PWM con una sla salida
Por
el
pin
P1A
sale
una
seal
modulada.
Full
Bridge
Forward
Por
el
pin
P1D
sale
una
seal
modulada.
Por
el
pin
P1D
sale
una
seal
modulada.
Full
Bridge
Reverse
Por
Pin
el
pin
P1B
sale
P1C
una
est
seal
modulada.
activo.
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.
CCP1M3 - CCP1M0 - (bits de seleccin de modo del mdulo CCP1)
determina el modo del mdulo CCP1.
CCP1M
CCP1M
CCP1
CCP1M
M1
No utilizado.
MODO
Modo de comparacin
0
No utilizado.
Modo de captura
Cada
decimosexto
flanco
Modo de comparacin
pone
al
ocurrir
una
coincidencia.
Modo de comparacin
1
registros de temporizadores 1 o 2
se
borran
al
ocurrir
una
coincidencia
Modo PWM
Pines P1A y P1C estn activos a
1
nivel
alto.
nivel
alto.
nivel
bajo.
nivel
bajo.
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
No utilizado.
No utilizado.
No utilizado.
MODO
Mdulo
est
deshabilitado
(reinicio).
Modo de Captura
0
Cada
decimosexto
flanco
Modo de comparacin
Se produce una interrupcin, el bit
CCP2IF se pone a 1 y no hay
A/D
se
inicia
si
el
Modo PWM
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
En cuanto al modo de medio-puente, la seal PWM es una salida en el pin
P1A, mientras que a la vez la seal complementaria PWM es una salida en el pin
P1B. Estos pulsos activan a los controladores MOSFET en modo de Medio-Puente
que habilitan/deshabilitan el flujo de corriente por el dispositivo.
controladores. Este tiempo muerto est marcado con 'td' (time delay) en la
siguiente figura. El problema se resuelve al utilizar los bits PDC0-PDC6 del registro
PWM1CON.
MODO PUENTE-COMPLETO
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).
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
STRC PWM Restart Enable bit (Bit de habilitacin del reinicio automtico
del PWM)
1 - Despus de un apagado automtico, el mdulo PWM se reinicia
automticamente, y el bit ECCPASE del registro ECCPAS se pone a cero.
0 - Para iciar el mdulo PWM despus de un apagado automtico, el bit
ECCPASE debe ponerse a cero por software.
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
La
seal
PWM
en
la
salida
del
pin
ser
cambiada
E C C PA S
E C C PA S
FUENTE
DEL
E S TA D O
A PA G A D O
DE
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.
P SS A C 1
P SS A C 0
E S TA D O L G I C O D E LO S P I N E S
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.
P SS B D 1
P SS B D 0
E S TA D O L G I C O D E LO S P I N E S
TXSTA. Los datos a enviar se deben escribir en el registro TXREG, lo que resultar
en la siguiente secuencia de eventos:
Byte ser transmitido inmediatamente al registro de desplazamiento TSR;
El registro TXREG permanece vaco, lo que indica la bandera de bit TXIF del
registro PIR1. Si se pone a uno el bit TXIE del registro PIE1, se generar una
interrupcin. De todos modos, la bandera se pone a uno sin reparar en si
una interrupcin est habilitada o no y no se puede poner a cero por
software, sino al escribir un dato nuevo en el registro TXREG.
Dispositivos electrnicos de control "empujan" el dato hacia el pin TX en
sincronizacin con seal de reloj interna: bit de arranque (START)
(1).....datos....bit de parada (STOP) (1).
Cuando el ltimo bit abandona el registro TSR, el bit TRMT en el registro
TXSTA se pone a cero automticamente.
Si mientras tanto se escribe un dato nuevo en el registro TXREG, todo el
procedimiento se repite inmediatamente despus de la transmisin del bit
de parada del dato anterior.
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.
EUSART EN MODO DE RECEPTOR ASNCRONO
al
poner
uno
el
bit
CREN;
DETECCIN DE DIRECCIN
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
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
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)
1 - Puerto serie habilitado. Los pines RX/DT y TX/CK se configuran
automticamente como entrada y salida, respectivamente.
0 - Puerto serie deshabilitado.
RX9 - (bit de habilitacin del modo de 9 bits en recepcin):
de
desplazamiento
de
recepcin
son
procesados
BRG1 BRG
MODO BRG /
F R M U L A D E V E LO C I D A D D E
E U S A RT
TRANSMISIN EN BAUDIOS
de
bits
/asncrono
de
bits
bits
bits
bits
bits
asncrono
de
16
asncrono
de
16
asncrono
de
sncrono
de
16
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
char uart_rd;
void main() {
ANSEL = ANSELH = 0;
C1ON_bit = C2ON_bit = 0;
UART1_Init(9600);
Delay_ms(100);
UART1_Write_Text("Start");
while (1) {
// Bucle infinito
if (UART1_Data_Ready()) {
uart_rd = UART1_Read();
UART1_Write(uart_rd);
// Si el dato se ha recibido,
// lea el dato recibido
// y envelo atrs por el UART
}
}
}
temporalmente
los
datos
antes
de
que
se
enven,
sea
// perifrico Seleccin_de_chip
sbit Chip_Select_Direction at TRISC0_bit; // Bit TRISC0 define el pin RC0 como
entrada o salida
unsigned int value;
void main() {
ANSEL = ANSELH = 0;
...
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.
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
El modo I2C (Bus de circuito inter-integrado) es adecuado para ser utilizado
cuando el microcontrolador debe intercambiar los datos con un circuito integrado
dentro
de
un
mismo
dispositivo.
stos
son
con
frecuencia
otros
con ms frecuencia, con una frecuencia de reloj limitada a 100 KHz. La frecuencia
mnima no est limitada.
Cuando los componentes maestro y esclavo estn sincronizados por el reloj,
el maestro siempre inicia cada intercambio de datos. Una vez que el mdulo MSSP
se ha habilitado, espera que ocurra una condicin de arranque (Start condition). El
dispositivo maestro primero enva el bit de arranque (est a cero) por el pin SDA,
luego la direccin de 7 bits del dispositivo esclavo seleccionado, y por ltimo, el
bit que requiere al dispositivo escribir (0) o leer (1) el dato enviado. En otras
palabras, los ocho bits se desplazan al registro SSPSR despus de ocurrir una
condicin de arranque. Todos los dispositivos esclavos que comparten la misma
lnea de transmisin recibirn simultneamente el primer byte, pero slo el que
contiene la direccin coincidente recibir el dato entero.
En una operacin I2C con el mdulo MSSP intervienen seis registros. Algunos
de ellos se muestran en la Figura anterior.
SSPCON
SSPCON2
SSPSTAT
SSPBUF
SSPSR
SSPADD
Registro SSPSTAT
CKE - Clock Edge Select bit (bit de seleccin del flanco de reloj)
selecciona el modo de sincronizacin.
CKP = 0:
1 - Dato transmitido en flanco ascendente de pulso de reloj (0 - 1).
0 - Dato transmitido en flanco descendente de pulso de reloj (1 - 0).
CKP = 1:
1 - Dato transmitido en flanco descendente de pulso de reloj (1 - 0).
0 - Dato transmitido en flanco ascendente de pulso de reloj (0 - 1).
D/A - Data/Address bit (bit de direcciones/datos) se utiliza slo en modo I2C.
1 - Indica que el ltimo byte recibido o transmitido es un dato.
0 - Indica que el ltimo byte recibido o transmitido es una direccin.
P - Stop bit (bit de parada) se utiliza slo en modo IC.
1 - Bit de parada (STOP) se ha detectado.
0 - Bit de parada (STOP) no se ha detectado.
S - Start bit (bit de arranque) se utiliza slo en modo I2C.
1 - Bit de arranque (START) se ha detectado.
0 - Bit de arranque (START) no se ha detectado.
R/W - Read Write bit (bit de informacin Lectura/Escritura) se utiliza slo
en modo I2C. Este bit contiene la informacin del bit de L/E despus de la ltima
direccin coin cidente. Este bit es vlido slo desde la direccin coincidente hasta
el siguiente bit de arranque, bit de parada o bit no ACK.
Modo IC en modo esclavo
1 - Lectura de dato.
0 - Escritura de dato.
Modo IC en modo esclavo
1 - Transmisin en progreso.
0 - Transmisin no est en progreso.
UA - Update Address bit (bit de activacin de direccin) se utiliza slo en
modo I2C de 10 bits.
1 - Indica que es necesario actualizar la direccin en el registro SSPADD.
0 - Indica que la direccin es correcta y que no se necesita actualizarla.
BF Buffer Full Status bit (bit de estado de bfer lleno)
Durante la recepcin de dato (en modos SPI e IC)
1 - Recepcin completa. El registro SSPBUF est lleno.
0 - Recepcin no completa. El registro SSPBUF est vaco.
Durante la transmisin de dato (slo en modo IC)
1 - Transmisin de dato en progreso (no incluye el bit ACK y bits de parada).
0 - Transmisin de dato completa (no incluye el bit ACK y bits de parada).
Registro SSPSTAT
SS P M
SS P M
SS P M
MODO
No utilizado.
No utilizado.
No utilizado.
utilizada.
Modo esclavo I2C, direccin de 10 bits
utilizada.
Modo
maestro
I2C,
reloj
Fosc
[4(SSPAD+1)].
Registro SSPCON2
IC en Modo Maestro
El caso ms comn es que un microcontrolador funciona como maestro y un
perifrico como esclavo. Es la razn por la que este libro slo trata este modo. Se
da por entendido que la direccin consiste en 7 bits y el dispositivo contiene un
solo microcontrolador (dispositivo con maestro nico).
Para habilitar el mdulo MSSP en este modo, siga las siguientes
instrucciones:
que se introduce al registro SSPADD y as como del modo SPI actual. La frecuencia
de seal de reloj del modo descrito en este libro depende del cristal de cuarzo
seleccionado y del registro SPADD. La frmula utilizada para hacer el clculo de
frecuencia de reloj es:
void main(){
ANSEL = ANSELH = PORTB = TRISB = 0; // Todos los pines son digitales. Los
pines del
// puerto PORTB son salidas.
I2C1_Init(100000);
I2C1_Start();
I2C1_Wr(0xA2);
W)
I2C1_Wr(2);
I2C1_Wr(0xF0);
I2C1_Stop();
Delay_100ms();
I2C1_Start();
I2C1_Wr(0xA2);
W)
I2C1_Wr(2);
I2C1_Repeated_Start();
I2C1_Wr(0xA3);
PORTB = I2C1_Rd(0u);
I2C1_Stop();
NOTAS TILES...
Cuando el microcontrolador se comunica con un perifrico, puede ocurrir un
fallo en la transmisin de datos por alguna razn. En este caso, es recomendable
comprobar el estado de algunos bits que pueden aclarar el problema. En la
prctica, el estado de estos bits se comprueba al ejecutar una pequea subrutina
despus de transmisin y recepcin de cada byte (por si acaso).
WCOL (SPCON,7) - Si intenta escribir un dato nuevo al registro SSPBUF
mientras que otra transmisin/recepcin de datos est en progreso, el bit WCOL
se pone a uno y el contenido del registro SSBUF se queda sin cambios. No hay
escritura. Luego, el bit WCOL debe ser borrado por el software.
BF (SSPSTAT,0) - Al transmitir los datos, este bit se pone a uno durante la
escritura en el registro SSPBUF y se queda puesto a uno hasta que el byte en
formato serial se desplace del registro SSPRS. En modo de recepcin, este bit se
pone a uno al cargar un dato o una direccin al registro SSPBUF. Se pone a cero
despus de leer el registro SSPBUF.
La condicin de Parada (STOP) se debe iniciar al poner a uno el bit PEN del
registro SSPCON para informar al dispositivo Esclavo que la transmisin se
acab.
Aparte de disponer de un gran nmero de lneas digitales de E/S utilizadas
para la comunicacin con los perifricos, el PIC16F887 contiene 14 entradas
analgicas. Debido a stas, el microcontrolador no slo puede reconocer si un pin
es llevado a bajo o alto (0 o +5V), sino que puede medir con precisin el voltaje y
convertirlo en un valor numrico, o sea, en formato digital.
CONVERTIDOR A/D
Aunque a primera vista parece muy complicado utilizar un convertidor A/D,
en realidad es muy simple. De hecho resulta ms simple utilizar un convertidor
A/D que los temporizadores o mdulos de comunicacin serie.
F U E N T E D E R E LO J
ADCS
ADCS
DE ADC
Fosc/2
FRECUENCIA
DE
DISPOSITIVO (FOSC)
20 Mhz 8 Mhz
4 Mhz
1 Mhz
100 nS
500 nS
2 uS
250 nS
Fosc/8
400 nS
1 uS
2 uS
8 uS
Fosc/32
1.6 uS
4 uS
8 uS
32 uS
Frc
2 - 6 uS
2 - 6 uS 2 - 6 uS 2 - 6 uS
Registro ADCON0
ADCS1, ADCS0 - A/D Conversion Clock Select bits (bits de seleccin de reloj
de conversin A/D) selecciona la frecuencia de reloj utilizada para sincronizacin
interna del convertidor A/D. Asimismo afecta a la duracin de la conversin.
ADCS1
ADCS2
R E LO J
Fosc/2
Fosc/8
Fosc/32
RC *
CHS
CHS
CHS
CANA
RA0/AN0
RA1/AN1
RA2/AN2
RA3/AN3
RA5/AN4
RE0/AN5
RE1/AN6
RE2/AN7
RB2/AN8
RB3/AN9
10
RB1/AN10
11
RB4/AN11
12
RB0/AN12
13
RB5/AN13
CVref
Vref = 0.6V
PIN
#include <built_in.h>
unsigned int adc_rd;
void main() {
ANSEL = 0x04;
TRISA = 0xFF;
ANSELH = 0;
TRISC = 0x3F;
TRISB = 0;
do {
temp_res = ADC_Read(2); // Obtener el resultado de 10 bits de la conversin
AD
PORTB = temp_res;
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)
esperar
que
se
produzca
una
anteriormente habilitada).
Paso 7 - Lectura del resultado de la conversin A/D:
Leer los registros ADRESH y ADRESL.
COMPARADOR ANALGICO
interrupcin
(deber
estar
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.
Cmo funciona un comparador? Bsicamente, el comparador analgico es un
amplificador que compara la magnitud de voltajes en dos entradas. Dispone de
dos entradas y una salida. Dependiendo de cul voltaje de entrada es ms alto
(valor analgico), un cero lgico (0) o un uno lgico (1) (valores digitales) ser la
salida.
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;
FUENTE INTERNA DE VOLTAJE DE REFERENCIA
Uno de dos voltajes analgicos proporcionados en las entradas del comparador es
por lo general estable e inalterable. Es denominado voltaje de referencia(Vref).
Para generarlo, se pueden utilizar tanto una fuente de voltaje externa como una
fuente de voltaje interna especial. El voltaje de referencia Vref se deriva despus
de seleccionar una fuente, por medio de una red en escalera que consiste en 16
resistencias, formando un divisor de voltaje. La fuente de voltaje es seleccionable
por el bit VRSS del registro VRCON.
Adems, la fraccin de voltaje proporcionada por la red de resistencias es
seleccionable por los bits VR0-VR3 y utilizada como voltaje de referencia. Vea la
siguiente figura:
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.
C1ON
(el
comparador
debe estar
activado)
el bit
C1CH1
C1CH0
E N T R A D A C 1 V I N - D E L C O M PA R A D O R
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
(el
comparador
debe estar
activado)
el bit
C2CH0
E N T R A D A C 2 V I N - D E L C O M PA R A D O R
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
VRR
(gama
baja)
(gama
alta)
CVref = ([VR3:VR0]/24)VLADDER
VRR
sincronizar
todos
los
procesos
que
se
llevan
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...
3.10 OSCILADOR DE RELOJ
Como se muestra en la siguiente figura, la seal de reloj se genera por uno de los
dos osciladores integrados.
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
El registro OSCCON gobierna el microcontrolador y las opciones de seleccin de
frecuencia. Contiene los siguientes bits: bits de seleccin de frecuencia (IRCF2,
IRCF1, IRCF0), bits de estado de frecuencia (HTS, LTS), bits de control de reloj del
sistema (OSTA, SCS).
IRCF1
IRCF0
FRECUENCIA
OSC.
8 MHz
HFINTOSC
4 MHz
HFINTOSC
2 MHz
HFINTOSC
1 MHz
HFINTOSC
500 kHz
HFINTOSC
250 kHz
HFINTOSC
125 kHz
HFINTOSC
OSTS
Oscillator
Start-up
31 kHz
Time-out
LFINTOSC
Status
bit
Oscilador
externo
se
utiliza
como
reloj
del
sistema.
de
Configuracin,
que
se
escribe
en
la
memoria
del
Las ventajas del funcionamiento del oscilador externo en modo EC son las
siguientes:
La fuente de reloj externa independiente est conectada al pin de entrada
OSC1. El pin OSC2 est disponible como pin de E/S de propsito general;
Es posible sincronizar el funcionamiento del microcontrolador con los dems
componentes incorporados en el dispositivo;
En este modo el microcontrolador se pone a funcionar inmediatamente
despus de encenderlo. No se requiere esperar para estabilizar la
frecuencia.
Al deshabilitar temporalmente la fuente de reloj externa, se detiene el
funcionamiento del dispositivo, dejando todos los datos intactos. Despus
de reiniciar el reloj externo, el dispositivo sigue funcionando como si no
hubiera pasado nada.
Los modos LP, XT y HS utilizan un oscilador externo como una fuente de reloj cuya
frecuencia est determinada por un cristal de cuarzo o por resonadores cermicos
conectados a los pines OSC1 y OSC2. Dependiendo de las caractersticas de los
componentes utilizados, seleccione uno de los siguientes modos:
Modo LP - (Baja potencia) se utiliza slo para cristal de cuarzo de baja
frecuencia. Este modo est destinado para trabajar con cristales de 32.768
KHz normalmente embebidos en los relojes de cristal. Es fcil de
reconocerlos por sus dimensiones pequeas y una forma cilndrica. Al
utilizar este modo el consumo de corriente ser menor que en los dems
modos.
Modo XT se utiliza para cristales de cuarzo de frecuencias intermedias
hasta 8 MHz. El consumo de corriente es media en comparacin con los
dems modos.
Modo HS - (Alta velocidad) se utiliza para cristales de reloj de frecuencia
ms alta de 8 MHz. Al utilizar este modo el consumo de corriente ser
mayor que en los dems modos.
Modo RCIO. De manera similar, el circuito RC est conectado al pin OSC1. Esta
vez, el pin OSC2 est disponible para ser utilizado como pin de E/S de propsito
general.
En ambos casos se le recomienda utilizar los componentes como se muestra en la
figura.
La frecuencia de este oscilador se calcula por medio de la frmula f = 1/T segn la
que:
f = frecuencia [Hz];
T = R * C = constante de tiempo [s];
R = resistencia elctrica []; y
C = capacitancia del condensador [F].
MODOS DE RELOJ INTERNO
El circuito del oscilador interno consiste en dos osciladores separados que se
pueden seleccionar como la fuente del reloj del microcontrolador:
El oscilador HFINTOSC est calibrado de fbrica y funciona a 8Mhz. La frecuencia
de este oscilador se puede configurar por el usuario por medio de software
utilizando los bits del registro OSCTUNE.
El oscilador LFINTOSC no est calibrado de fbrica y funciona a 31kHz.
OSCILADOR
INTERNO
EN
MODO
INTOSC
En este modo, el pin OSC1 est disponible para ser utilizado como pin de E/S de
propsito general. La seal de frecuencia del oscilador interno dividida por 4 est
disponible en el pin OSC2.
OSCILADOR
INTERNO
EN
MODO
INTOSCIO
En este modo, los dos pines estn disponibles como pines de E/S de propsito
general.
CONFIGURACIN DEL OSCILADOR INTERNO
Registro OSCTUNE
Los cambios del registro OSCTUNE afectan a la frecuencia del oscilador HFINTOSC,
pero no a la frecuencia del LFINTOSC. No hay ninguna indicacin de que haya
ocurrido
desplazamiento
microcontrolador.
de
frecuencia
durante
el
funcionamiento
del
TUN3
TUN2
TUN1
TUN0
FRECUENCIA
Mxima
Calibrada
Mnima
pueden
ser
cambiados
en
cualquier
momento.
Por
estas
caractersticas
BSF STATUS,RP1 ;
BCF STATUS,RP0 ; Acceder al banco 2
MOVF ADDRESS,W ; Mover la direccin al registro W
MOVWF EEADR
; Escribir la direccin
W = EEPROM_Read(ADDRESS);
Las ventajas del uso del lenguaje C se han hecho ms obvias, no lo cree?
ESCRITURA EN LA MEMORIA EEPROM
Antes de escribir los datos en la memoria EEPROM es necesario escribir la
direccin en el registro EESADR y los datos en el registro EESAT. Slo ha quedado
seguir a una secuencia especial para iniciar la escritura para cada byte. Durante
el proceso de escritura las interrupciones deben estar deshabilitadas.
El ejemplo que sigue muestra el procedimiento anteriormente descrito al escribir
un programa en lenguaje ensamblador:
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
MOVF DATA,W
MOVWF EEDATA
; Escribir la direccin
; 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;
ANSELH = 0;
PORTB = 0;
PORTC = 0;
PORTD = 0;
TRISB = 0;
TRISC = 0;
TRISD = 0;
EEPROM_Write(0x80+ii, ii);
EEPROM_Write(0x02,0xAA);
EEMPROM
EEPROM_Write(0x50,0x55);
// de la EEMPROM
Delay_ms(1000);
PORTB = 0xFF;
PORTC = 0xFF;
Delay_ms(1000);
PORTB = 0x00;
PORTC = 0x00;
Delay_ms(1000);
PORTB = EEPROM_Read(0x02);
EEPROM y
PORTC = EEPROM_Read(0x50);
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.
3.12 REINICIO! BLACK-OUT, BROWN-OUT O RUIDOS?
Al
producirse
un
reinicio
el
microcontrolador
detiene
su
funcionamiento
necesita, una seal tambin puede ser generada por la lgica de control interna.
Al encender una fuente de alimentacin siempre se produce un reinicio. Por
muchos eventos de transicin que ocurren al encender una fuente de
alimentacin (centelleos y fogonazos de contactos elctricos en interruptores,
subida de voltaje lenta, estabilizacin de la frecuencia de seal de reloj graduada
etc.) es necesario proporcionar un cierto tiempo muerto antes de que el
microcontrolador se ponga a funcionar. Dos temporizadores internos PWRT y OST
se encargan de eso. El PWRT puede estar habilitado/ deshabilitado durante el
proceso de escribir un programa. Vamos a ver cmo funciona todo.
REINICIO BLACK-OUT
antes
de
que
el
microcontrolador
detenga
su
funcionamiento
muerto
reset
T,
el
microcontrolador
se
pondr
funcionar
estable
que
funcione
un
amplio
rango
de
frecuencias,
el
Resonador cermico
Un resonador cermico es ms barato y muy similar a un cuarzo por la funcin y
el modo de funcionamiento. Por esto, los esquemas que muestran su conexin al
microcontrolador son idnticos. No obstante, los valores de los condensadores
difieren un poco debido a las diferentes caractersticas elctricas. Refirase a la
tabla que est a continuacin.
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.
REL
Un rel es un interruptor elctrico que se abre y se cierra bajo el control de otro
circuito electrnico. Por eso est conectado a los pines de salida del
microcontrolador y utilizado para encender/apagar los dispositivos de alto
consumo tales como: motores, transformadores, calefactores, bombillas etc. Estos
dispositivos se colocan casi siempre lejos de los componentes sensibles de la
placa. Hay varios tipos de rels, pero todos funcionan de la misma manera. Al fluir
la corriente por la bobina, el rel funciona por medio de un electromagneto,
abriendo
cerrando
uno
ms
conjunto
de
contactos.
Similar
los
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
Hay un lmite de corriente nominal, o sea, lmite de corriente mxima especificada
para cada LED que no se deber exceder. Si eso sucede, el diodo emitir luz ms
intensiva, pero slo por un perodo corto de tiempo.
Algo para recordar
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
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.
Si un puerto del microcontrolador est conectado al visualizador de tal manera
que el bit 0 active el segmento 'a', el bit 1 active el segmento 'b', el bit 2 active el
segmento 'c' etc, entonces la tabla que sigue muestra la "mscara" para cada
dgito.
DGITOS
V I S UA L I Z A
S E G M E N T O S D E L V I S UA L I Z A D O R
R
dp
La red R/C representada por una lnea quebrada en la figura anterior indica una
conexin opcional de la base de transistores dentro del optoacoplador, que reduce
los efectos de ruidos al eliminar los pulsos muy cortos.
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.
NOMBR
E S TA D O
L G I C O
Tierra
Vss
0V
Alimentacin
Vdd
+5V
Contraste
Vee
0 - Vdd
FUNCIN
Control
de
funcionamiento
DESCRIPCIN
D0 D7 considerados
4
RS
como
comandos
D0 D7 considerados
como datos
Escribir los datos (del
R/W
0
1
microcontrolador
al
LCD)
Leer los datos (del LCD
al microcontrolador)
Acceso al visualizador
LCD
Transicin
Funcionamiento normal
de 1 a 0
Datos/comandos
deshabilitado
se
estn transmitiendo al
LCD
Datos
comandos
D0
0/1
Bit 0 LSB
D1
0/1
Bit 1
D2
0/1
Bit 2
/ 10
D3
0/1
Bit 3
11
D4
0/1
Bit 4
12
D5
0/1
Bit 5
13
D6
0/1
Bit 6
14
D7
0/1
Bit 7 MSB
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.
palabras, se visualizar el carcter P. Esto se aplica a todas las letras del alfabeto
(minsculas y maysculas), pero no se aplica a los nmeros.
Como se muestra en el mapa anterior, las direcciones de todos los dgitos se
desplazan por 48 en relacin con sus valores (direccin del dgito 0 es 48,
direccin del dgito 1 es 49, direccin del dgito 2 es 50 etc.). Por consiguiente,
para visualizar los dgitos correctamente es necesario aadir el nmero decimal
48 a cada uno antes de enviarlos a un LCD.
caracteres
basada
en
el
alfabeto
ingls.
El
ASCII
especifica
una
Los smbolos estn normalmente definidos al principio del programa por una
simple escritura de ceros y unos de la memoria CGRAM as que crean las formas
deseadas. Para visualizarlos basta con especificar su direccin. Preste atencin a
la primera columna en el mapa de caracteres CGROM. No contiene direcciones de
la memoria RAM, sino los smbolos de los que se est hablando aqu. En este
ejemplo visualizar 0 significa visualizar sonrisa, visualizar 1 significa visualizar ancla etc.
Comandos bsicos del visualizador LCD
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:
DE
EJECUCI
N
Borrar
el
1.64mS
1.64mS
I/D
40uS
el 0
40uS
D/C R/L x
40uS
DL
40uS
la 0
Direccin CGRAM
visualizador
Poner el cursor
al inicio
Modo
de
entrada
Activar/desacti
var
visualizador
Desplazar
el
cursor/visualiz
ador
Modo
de
funcionamient
o
Establecer
direccin
40uS
CGRAM
Establecer
la
direccin
Direccin CGRAM
40uS
BF
Direccin CGRAM
CGRAM o en la 1
D7
D6
D5
D4
D3
D2
D1
D0
40uS
D7
D6
D5
D4
D3
D2
D1
D0
40uS
DDRAM
Leer
la
bandera
"BUSY"(ocupa
do) (BF)
Escribir en la
DDRAM
Leer la CGRAM
o la DDRAM
R/L 1 = Desplazamiento a la
derecha
0 = Decremento (por 1)
0 = Desplazamiento a la izquierda
DL 1 = Bus de datos de 8
bits
0 = Desplazamiento del visualizador desactivado
0 = Bus de datos de 4
bits
D 1 = Visualizador encendido
0 = Visualizador apagado
U 1 = Cursor activado
0 = Cursor desactivado
visualizador
0 = Parpadeo del cursor apagado
de
cuntas
lneas
se
utilizan
para
conectar
un
LCD
al
(normalmente por las lneas D4- D7), y luego los 4 bits ms bajos. La inicializacin
habilita que el LCD conecte e interprete los bits recibidos correctamente.
Pocas veces se leen los datos del LCD (por lo general se transmiten del
microcontrolador al LCD) as que, con frecuencia, es posible guardar un pin de E/S
de sobra. Es simple, basta con conectar el pin L/E a Tierra. Este ahorro del pin
tiene su precio. Los mensajes se visualizarn normalmente, pero no ser posible
leer la bandera de ocupado ya que tampoco es posible leer los datos del
visualizador. Afortunadamente, hay una solucin simple. Despus de enviar un
carcter o un comando es importante dar al LCD suficiente tiempo para hacer su
tarea. Debido al hecho de que la ejecucin de un comando puede durar
aproximadamente 1.64mS, el LCD tarda como mximo 2mS en realizar su tarea.
Inicializar al visualizador LCD
Al encender la fuente de alimentacin, el LCD se reinicia automticamente. Esto
dura aproximadamente 15mS. Despus de eso, el LCD est listo para funcionar.
Asimismo, el modo de funcionamiento est configurado por defecto de la
siguiente manera:
1. Visualizador est borrado.
2. Modo
DL
N
Bus
de
datos
LCD
de
de
bits
una
lnea
F = 0 - Carcter de 5 x 8 puntos
3. Visualizador/Cursor
D
U
encendido/apagado
0
Visualizador
-
Cursor
apagado
apagado
de
caracteres
/* 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
El proceso de crear un proyecto nuevo es muy simple. Seleccione la opcin New
Project del men Project como se muestra en la Figura de la derecha.
Por medio de la opcin Build All Projects (Shift+F9) se compilan todos los
archivos del proyecto, libreras (si el cdigo fuente contiene alguna de
ellas) y los archivos def para el microcontrolador utilizado.
La opcin Build + Program (Ctrl+F11) es importante ya que permite al
compilador mikroC PRO for PIC cargar automticamente el programa en el
microcontrolador despus de la compilacin. El proceso de la programacin
se realiza por medio del programador PICFlash.
Todos los errores encontrados durante la compilacin aparecern en la ventana
Message. Si no hay errores en el programa, el compilador mikroC PRO for PIC
generar los correspondientes archivos de salida.
4.3 EJEMPLO 1
Escribir cabecera, configurar pines de E/S, utilizar la funcin Delay y el
operador Switch
El nico propsito de este programa es de encender varios diodos LED en el
puerto B. Utilice este ejemplo para examinar cmo es un programa real. La
siguiente figura muestra el esquema de conexin, mientras que el programa se
encuentra en la siguiente pgina.
Para hacer este ejemplo ms interesante, vamos a habilitar que los LEDs
conectados al puerto PORTB parpadeen. Hay varios modos de hacerlo:
1. Tan pronto como se encienda el microcontrolador, todos los LEDs emitirn la luz
por un segundo. La funcin Delay se encarga de eso en el programa. Slo se
necesita ajustar la duracin del tiempo de retardo en milisegundos.
2. Despus de un segundo, el programa entra en el bucle for, y se queda all hasta
que la variable k sea menor que 20. La variable se incrementa en 1 despus de
cada iteracin. Dentro del bucle for, el operador switch monitorea el estado lgico
en el puerto PORTB. Si PORTB=0xFF, su estado se invierte en 0x00 y viceversa.
Cualquier cambio de estos estados lgicos hace todos los LEDs parpadear. El ciclo
de trabajo es 5:1 (500mS:100mS).
3. Al salir del bucle for, el estado lgico del puerto POTRB cambia (0xb 01010101) y
el programa entra en el bucle infinito while y se queda all hasta que 1=1. El
estado lgico del puerto PORTB se invierte cada 200mS.
4.4 EJEMPLO 2
/* Cabecera *********************************************/
int k = 0;
char saveBank;
void main() {
ANSEL = 0;
ANSELH = 0;
PORTB = 0;
TRISB = 0;
do {
PORTB = ~PORTB;
Delay_ms(100);
k++;
}
while(k<20);
k=0;
// Reiniciar variable k
saveBank = STATUS & 0b01100000; // Guardar el estado de los bits RP0 y RP1
bsf STATUS,RP0
bcf STATUS,RP1
// registro OSCCON
bcf OSCCON,6
bcf OSCCON,5
// de frecuencia de 31KHz
bcf OSCCON,4
bsf OSCCON,0
}
STATUS |= saveBank;
do {
PORTB = ~PORTB;
Delay_ms(10);
k++;
}
while(k<20);
4.5 EJEMPLO 3
Timer0 como un contador, declarar variables nuevas, constantes de
enumeracin, utilizar rels...
En cuanto a los ejemplos anteriores, el microcontrolador ha ejecutado el programa
sin haber sido afectado de ninguna forma por su entorno. En la prctica, hay
pocos dispositivos que funcionen de esta manera (por ejemplo, un simple
controlador de luz de nen). Los pines de entrada se utilizan tambin en este
ejemplo. En la siguiente figura se muestra un esquema, mientras que el programa
est en la siguiente pgina. Todo sigue siendo muy simple. El temporizador
Timer0 se utiliza como un contador. La entrada del contador est conectada a un
botn de presin, as que cada vez que se presiona el botn, el temporizador
Timer0 cuenta un pulso.
Cuando el nmero de pulsos coincida con el nmero almacenado en el registro
TEST, un uno lgico (5V) aparecer en el pin PORTD.3. Este voltaje activa un rel
electromecnico, y por eso este bit se le denomina REL en el programa.
/*Cabecera****************************************************/
void main() {
char TEST = 5;
// Constante TEST = 5
ANSEL = 0;
ANSELH = 0;
PORTA = 0;
TRISA = 0xFF;
entradas
PORTD = 0;
TRISD = 0b11110111;
dems
OPTION_REG.F3 = 1;
TMR0 = 0;
do {
if (TMR0 == TEST)
// constante TEST?
(PORTD.RELAY = 1);
REL)
}
while (1);
}
Si varios pines del puerto PORTD estn conectados a los rels, la expresin
anterior se puede escribir de la siguiente manera tambin:
A todas las constantes, precedidas por las constantes con valores asignados
(REL=3 y MOTOR=6), se les asignan automticamente los valores de las
constantes precedentes, incrementados en 1. En este ejemplo, a las constantes
CALENTADOR y SURTIDOR se les asignan los valores 4 y 7, es decir
(CALENTADOR=4 y SURTIDOR=7), respectivamente.
4.6 EJEMPLO 4
Utilizar
los
temporizadores
Timer0,
Timer1
Timer2.
Utilizar
/*Cabecera******************************************************/
unsigned cnt;
void interrupt() {
cnt++;
TMR0 = 96;
INTCON = 0x20;
void main(){
OPTION_REG = 0x84; // Pre-escalador se le asigna al temporizador TMR0
ANSEL = 0;
ANSELH = 0;
TRISB = 0;
// como salidas
PORTB = 0x0;
TMR0 = 96;
INTCON = 0xA0;
cnt = 0;
do {
// Bucle infinito
}
} while(1);
/*Cabecera******************************************************/
void interrupt() {
cnt++ ;
PIR1.TMR1IF = 0;
TMR1H = 0x80;
TMR1L = 0x00;
void main() {
ANSEL = 0;
ANSELH = 0;
PORTB = 0xF0;
TRISB = 0;
T1CON = 1;
PIR1.TMR1IF = 0;
TMR1H = 0x80;
TMR1L = 0x00;
PIE1.TMR1IE = 1;
cnt = 0;
INTCON = 0xC0;
do {
// Bucle infinito
if (cnt == 76) {
interrupciones
PORTB = ~PORTB; // Nmero en el puerto PORTB est invertido
cnt = 0;
}
} while (1);
}
/*Cabecera******************************************************/
void Reemplazar() {
PORTB = ~PORTB;
}
void interrupt() {
if (PIR1.TMR2IF) { // Si el bit TMR2IF = 1,
cnt++ ;
}
}
// main
void main() {
cnt = 0;
ANSEL = 0;
ANSELH = 0;
PORTB = 0b10101010; // Estado lgico en los pines del puerto PORTB
TRISB = 0;
salidas
T2CON = 0xFF;
// Configurar el temporizador T2
TMR2 = 0;
PIE1.TMR2IE = 1;
// Interrupcin habilitada
INTCON = 0xC0;
while (1) {
// Bucle infinito
/*Cabecera******************************************************/
void main() {
ANSEL = 0x0C;
TRISA = 0xFF;
// como entradas
ANSELH = 0;
TRISB = 0x3F;
// como salidas
TRISD = 0;
ADCON1.F4 = 1 ;
do {
temp_res = ADC_Read(2); // Resultado de la conversin A/D es copiado a
temp_res
PORTD = temp_res;
PORTD
PORTB = temp_res >> 2; // 2 bits ms significativos se mueven a los bits
RB6 y RB7
} while(1);
// Bucle infinito
/*Cabecera******************************************************/
void main() {{
ANSEL = 0;
ANSELH = 0;
PORTB = 0;
TRISB = 0;
// como salidas
PORTD = 0;
TRISD = 0;
// como salidas
TRISA = 0xFF;
// como entradas
PORTD = EEPROM_Read(5);
do {
PORTB = PORTB++;
Delay_ms(100);
if (PORTA.F2)
EEPROM_Write(5,PORTB); // Si se pulsa el botn MEMO, guardar el puerto
PORTB
do {
while (PORTA.F2);
pulsado
}
}
while(1);
// Bucle infinito
4.11 EJEMPLO 9
Contador de dos dgitos LED, multiplexin
En este ejemplo el microcontrolador funciona como un contador de dos dgitos. La
variable i se incrementa (suficiente lentamente para ser visible) y su valor se
visualiza en un visualizador de dos dgitos LED (99-0). El punto es habilitar una
conversin de un nmero binario en un decimal y partirlo en dos dgitos (en
decenas y unidades). Como los segmentos del visualizador LED se conectan en
paralelo, es necesario asegurar que alternen rpidamente para tener una
impresin de que emiten la luz simultneamente (multiplexin por divisin en
tiempo).
En este ejemplo, el temporizador TMR0 est encargado de la multiplexin por
divisin en tiempo, mientras que la funcin mask convierte un nmero binario a
formato decimal.
/*Cabecera******************************************************/
void interrupt() {
if (digit_no == 0) {
PORTA = 0;
// puerto PORTD
PORTA = 1;
digit_no = 1;
}else{
PORTA = 0;
// puerto PORTD
PORTA = 2;
digit_no = 0;
}
TMR0 = 0;
INTCON = 0x20;
void main() {
OPTION_REG = 0x80; // Ajustar el temporizador TMR0
TMR0 = 0;
INTCON = 0xA0;
PORTA = 0;
TRISA = 0;
// como salidas
PORTD = 0;
TRISD = 0;
// 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******************************************************/
Este ejemplo muestra cmo utilizar un visualizador LCD alfanumrico. Las libreras
de funciones simplifican este programa, lo que significa que al final el esfuerzo
para crear el software vale la pena.
Un mensaje escrito en dos lneas aparece en el visualizador:
mikroElektronika
LCD example
Dos segundos ms tarde, el mensaje en la segunda lnea cambia, y se visualiza el
voltaje presente en la entrada del convertidor A/D (el pin RA2). Por ejemplo:
mikroElektronika
voltage:3.141V
En un dispositivo real se puede visualizar temperatura actual o algn otro valor
medido en vez de voltaje.
/*Cabecera*****************************************************/
// Declarar variables
unsigned char ch;
unsigned int adc_rd;
char *text;
long tlong;
void main() {
INTCON = 0;
ANSEL = 0x04;
TRISA = 0x04;
ANSELH = 0;
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_LCD_CLEAR);
text = "mikroElektronika";
Lcd_Out(1,1,text);
ADCON1 = 0x82;
VCC
TRISA = 0xFF;
como entradas
Delay_ms(2000);
text = "voltage:";
while (1) {
adc_rd = ADC_Read(2);
Lcd_Out(2,1,text);
// del resultado
Lcd_Chr(2,9,48+ch);
Lcd_Chr_CP('.');
ch = (tlong / 100) % 10;
Lcd_Chr_CP(48+ch);
Lcd_Chr_CP('V');
Delay_ms(1);
}
}
4.13 EJEMPLO 11
Comunicacin serial RS-232
/*Cabecera******************************************************/
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
}
}
}
Este ejemplo muestra la ventaja de utilizar libreras con las funciones listas para
ser utilizadas. Concretamente, no tiene que examinar la documentacin
proporcionada por el fabricante para utilizar el sensor. Basta con copiar alguna de
/*Cabecera******************************************************/
// extraer temp_whole
temp_whole = temp2write >> RES_SHIFT ;
void main() {
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
Lcd_Init();
// Inicializar el LCD
Lcd_Cmd(_LCD_CLEAR);
// Borrar el LCD
/*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 main() {
ANSEL = 0;
ANSELH = 0;
TRISB = 0xF0;
while (1) {
if (Button(&PORTB,7,1,1)) // RB7 genera Tono1
Tone1();
while (PORTB & 0x80) ;
Melody2();
while (PORTB & 0x20) ;
}
}
/*Cabecera******************************************************/
void delay2S(){
Delay_ms(2000);
}
void main() {
unsigned short ii;
char *someText;
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
// Deshabilitar comparadores
C2ON_bit = 0;
Glcd_Init();
// Inicializar el GLCD
while(1) {
// Dibujar la imagen
delay2S(); delay2S();
#endif
Glcd_Fill(0x00);
// Borrar el GLCD
// Dibujar la caja
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
Glcd_Write_Text("mikroE", 1, 7, 2);
for (ii = 1; ii <= 10; ii++)
// Escribir la cadena
// Dibujar los crculos
// Dibujar la caja
delay2S();
// Cambiar de la fuente
// Escribir la cadena
delay2S();
Glcd_Set_Font(System3x5, 3, 5, 32);
// Cambiar de la fuente
// Escribir la cadena
delay2S();
Glcd_Set_Font(font5x7, 5, 7, 32);
// Cambiar de la fuente
// Escribir la cadena
delay2S();
Glcd_Set_Font(FontSystem5x7_v2, 5, 7, 32); // Cambiar de la fuente
someText = "5x7 Font (v2)";
Glcd_Write_Text(someText, 5, 6, 2);
delay2S();
#endif
}
}
// Escribir la cadena
truck_bmp.c:
/*Cabecera*****************************************************/
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
255,255,255,255,255, 0, 0, 0, 0,255,255,255,255,255, 0, 0,
0, 0,255,255,255,255,255, 0, 0, 0,255,255,255,255,255,129,
129,129,129,129,129,129,128, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0,255, 1,248, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 16,224, 24, 36,196, 70,130,130,133,217,102,112,
160,192, 96, 96, 32, 32,160,160,224,224,192, 64, 64,128,128,192,
64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 63, 96, 96, 96,224, 96, 96, 96, 96, 96, 96,
99, 99, 99, 99, 99, 96, 96, 96, 96, 99, 99, 99, 99, 99, 96, 96,
96, 96, 99, 99, 99, 99, 99, 96, 96, 96, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 96, 96, 96, 96, 96, 96, 96, 64, 64,
64,224,224,255,246, 1, 14, 6, 6, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2,130, 67,114, 62, 35, 16, 16, 0, 7, 3, 3, 2,
4, 4, 4, 4, 4, 4, 4, 28, 16, 16, 16, 17, 17, 9, 9, 41,
112, 32, 67, 5,240,126,174,128, 56, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
1, 1,127,127,127,127,255,255,247,251,123,191, 95, 93,125,189,
189, 63, 93, 89,177,115,243,229,207, 27, 63,119,255,207,191,255,
255,255,255,255,255,255,255,127,127,127,127,127,127,127,127,255,
255,255,127,127,125,120,120,120,120,120,248,120,120,120,120,120,
120,248,248,232,143, 0, 0, 0, 0, 0, 0, 0, 0,128,240,248,
120,188,220, 92,252, 28, 28, 60, 92, 92, 60,120,248,248, 96,192,
143,168,216,136, 49, 68, 72, 50,160, 96, 0, 0, 0, 0, 0, 0,
0, 0, 0,128,192,248,248,248,248,252,254,254,254,254,254,254,
254,254,254,254,254,255,255,255,255,255,246,239,208,246,174,173,
169,128,209,208,224,247,249,255,255,252,220,240,127,255,223,255,
255,255,255,255,255,254,254,255,255,255,255,255,255,255,254,255,
255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,
254,254,254,254,255,255,255,255,255,255,254,255,190,255,255,253,
240,239,221,223,254,168,136,170,196,208,228,230,248,127,126,156,
223,226,242,242,242,242,242,177, 32, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 1, 3, 3, 3, 7, 7, 7, 7, 7, 15,
15, 15, 7, 15, 15, 15, 7, 7, 15, 14, 15, 13, 15, 47, 43, 43,
4.17 EJEMPLO 15
Utilizar el panel tctil...
Un panel tctil es un panel fino, autoadhesivo y transparente, colocado sobre la
pantalla de un LCD grfico. Es muy sensible a la presin as que un suave toque
provoca algunos cambios en la seal de salida. Hay diferentes tipos de paneles
tctiles. El ms sencillo es el panel tctil resistivo del que se hablar aqu.
Un panel tctil est compuesto por dos lminas rgidas, formando una estructura
de sndwich que tiene capas resistivas en sus caras internas. La resistencia de
estas capas no excede normalmente de 1Kohm. Los lados opuestos de las lminas
disponen de los contactos para acceder a un cable plano.
a apagado del panel tctil (control del panel tctil) y leer los valores del
convertidor A/D que representan realmente las coordenadas X e Y de la posicin.
Una vez determinadas las coordenadas, es posible decidir qu es lo que
deseamos que haga el microcontrolador. En este ejemplo se explica cmo
conmutar entre encendido y apagado dos pines digitales del microcontrolador,
conectados a los LEDs A y B.
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;
electrodo
// derecho (RIGHT) conectado, electrodo superior
(TOP)desconectado)
PORTC.F1 = 0;
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;
electrodo
// derecho (RIGHT) desconectado, electrodo superior (TOP)
conectado)
PORTC.F1 = 1;
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)
// Glcd_Init_EP5
// Borrar GLCD
Glcd_Write_Text(msg1,10,0,1);
Glcd_Write_Text(msg2,17,7,1);
Glcd_Write_Text(msg5,14,4,0);
Glcd_Write_Text(msg4,74,3,0);
Glcd_Write_Text(msg6,74,4,0);
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);
// Si RC6 = 0
// Invertir el estado lgico del pin RC6
else { // Si RC6 = 1
PORTC.F6 = 0;
Delay_ms(100);
}
}
para
utilizarlo.
Para
crear
un
dispositivo
controlado
por
un
hemos
mencionado,
para
habilitar
cargar
un
cdigo
hex
en
el
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...
De acuerdo. El programa ha sido escrito y probado con el simulador. No ha
informado de ningn error durante el proceso de compilacin en el cdigo hex?
Parece que todo funciona perfecto...
El
programa
ha
sido
compilado
con
xito.
Slo
queda
cargarlo
en
el
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.
Si dispone de un sistema de desarrollo, el proceso de programar y probar un
programa es an ms sencillo. Teniendo en cuenta que el compilador mikroC PRO
for PIC (en su PC) y el hardware del programador PICflash (en su sistema de
desarrollo) colaboran perfectamente, el proceso de compilar un programa y
down
11.
12.
13.
14.
15.
Extensor de puertos
16.
17.
18.
19.
Teclado Menu
20.
Teclado 4x4
21.
22.
23.
24.
25.
26.
27.
28.