-
M.C. Pedro Arturo Cornejo Torres
1
Temas Selectos de Programacin y Electrnica (BORRADOR)
M.C. Pedro Arturo Cornejo Torres
QUEDAN PROHIBIDOS EL USO Y LA REPRODUCCIN TOTAL O PARCIAL POR
CUALQUIER MEDIO SIN PERMISO POR ESCRITO O CONCENTIMIENTO
DEL AUTOR Copyright Pedro Arturo Cornejo Torres MMIX
Microsoft, Microchip y dems marcas y productos mencionados en
este documento, son nombres y marcas registradas por sus
respectivas compaas.
-
M.C. Pedro Arturo Cornejo Torres
2
Introduccin
..................................................................................................................
3 Aritmtica entera
..........................................................................................................
4
Representacin de nmeros enteros sin signo
............................................................ 4
Representacin de nmeros enteros positivos y negativos en
complemento a dos ...... 5
Desplazamiento Lgico a la Izquierda
...................................................................
6 Desplazamiento Aritmtico a la Izquierda
................................................................. 6
Desplazamiento Lgico a la Derecha
.........................................................................
6 Desplazamiento Aritmtico a la Derecha
...................................................................
7 Divisin de nmeros con signo entre potencias positivas enteras de
dos .................... 7 Multiplicacin de nmeros con y sin signo
por potencias enteras positivas de dos ..... 9 Aritmtica de Punto
Fijo
...........................................................................................
9 Multiplicacin y Divisin de cantidades en representacin de punto
fijo ................. 10 Multiplicacin usando representacin de
punto fijo ................................................. 10
Divisin usando representacin de punto fijo
...................................................... 11 El
algoritmo CORDIC de Volder
............................................................................
12
CORDIC en modo Rotacin de Vectores
............................................................. 12
Detalles de Programacin del PIC18F4450 o PIC18F4550
.......................................... 15
Estructura del Bucle de Mquina de Cornejo
........................................................... 15
Valores y Modificaciones al Marco de Trabajo USB de Microchip
......................... 17 Modificaciones en los archivos para
utilizar el PIC18F4550 .................................... 18
En el archivo usb_config.h
...............................................................................
18 En el archivo usb_function_cdc.c
.....................................................................
18
-
M.C. Pedro Arturo Cornejo Torres
3
Introduccin En la actualidad existen herramientas muy poderosas
de programacin y depuracin de microcontroladores. Los fabricantes
de microcontroladores modernos, han adoptado el lenguaje C para
acelerar el desarrollo de firmware y software de sistemas
complejos, confiables, eficientes y precisos. En el estudio de la
mecatrnica, el entendimiento equilibrado de la tricotoma
Electrnica-Informtica-Mecnica permitir que los proyectos sean
concluidos, que sean eficientes y eficaces con respecto a los
requerimientos en cada una de las etapas de sus diseos.
Es por esto que he redactado este documento para que le sirva de
apoyo en la incorporacin de la tecnologa de los sistemas embebidos
en sus proyectos de robtica. Estudiaremos y repasaremos conceptos
clave de electrnica e informtica que considero y estoy seguro que
le sern de gran utilidad. Tambin se han incorporado temas que, bajo
solicitud e inquietud de los integrantes de algunos equipos, se les
considera necesaria una explicacin quizs mas detallada. Estos temas
son: Aritmtica de Punto Fijo, el uso del algoritmo CORDIC de
Volder, detalles programacin de los microcontroladores PIC18F4450 o
PIC18F4550 y el PC, as como sugerencias para intercambiar
informacin entre estos mediante una conexin USB. Tambin se estudian
temas de electrnica como control de servomotores con PWM, control
de motores de CD y encoder, opto-acopladores de fototransistor para
entrada/salida digital y acoplamiento bsico para conversin Analgica
a Digital con el PIC.
Los temas pueden ser estudiados en cualquier orden segn su
inters.
Si usted lo cree necesario, puede contactarme a la siguiente
direccin de correo electrnico [email protected] para
aclarar dudas, reportar errores y sugerencias.
Este documento no tiene la intencin de profundizar en lo que ya
ha sido detallado en documentacin que ya se le ha puesto a su
alcance. Su habilidad en estas reas de estudio depender en
definitiva de su dedicacin, respeto y responsabilidad a la materia
y a la lectura de comprensin.
-
M.C. Pedro Arturo Cornejo Torres
4
Aritmtica entera
Se sabe pues, que al utilizar un vector de n bits, es posible
generar 2n cdigos discretos diferentes entre si. A cada combinacin
o cdigo se le puede asociar una cantidad numrica. Esta asociacin
agrega una semntica aritmtica a cada cdigo binario.
Por ejemplo, cuando se utiliza un vector de 3 bits se pueden
generar 8 cdigos binarios diferentes. En la siguiente tabla se
muestra una asociacin entre cada cdigo binario con una cantidad
numrica correspondiente
Cdigo Cantidad 000 4 001 1 010 2 011 3 100 5 101 7 110 0 111
6
La aritmtica para nmeros enteros, como los que fueron utilizados
en el ejemplo anterior, esta bien definida y como tambin hemos
establecido un significado numrico para cada cdigo binario,
entonces es vlido realizar la suma aritmtica entre 000 y 010 (4+2)
lo cual da como resultado 111 (6). Resulta fcil pensar en un
circuito aritmtico digital para realizar los clculos para sumas que
resulten menores o iguales a 7. Se habr dando cuenta que, aunque
funcional esta representacin, no resulta prctica ya que no se
aprovechan las caractersticas posicionales y de ponderacin de los
sistemas numricos digitales como el decimal, el binario o el
hexadecimal.
Nota: La caracterstica de digital no hace referencia
exclusivamente a los sistemas numricos binarios, sino a todo
sistema numrico basado en dgitos. Entonces, como los circuitos
binarios utilizan dgitos binarios, tambin resulta correcto
llamarlos circuitos digitales.
Se dice que un sistema numrico es posicional, ya que se le puede
asignar un nmero ordinal a cada posicin digital i y es ponderado
porque cada posicin digital tiene un factor o peso aritmtico que,
por lo general, es una potencia de una base como 2i, 10i o 16i.
Representacin de nmeros enteros sin signo Por ejemplo, para el
sistema binario en un vector de 8 bits (byte) a un cdigo binario se
le asocia una cantidad numrica as:
27 26 25 24 23 22 21 20 B7 B6 B5 B4 B3 B2 B1 B0
-
M.C. Pedro Arturo Cornejo Torres
5
i
iiBcantidad 2
7
0
=
=
No es necesario almacenar las constantes de las potencias de 2i,
ya que quedan implcitas por la posicin del dgito y slo es necesario
almacenar el vector de bits que en este caso es el byte que define
a la cantidad.
Con la representacin anterior, se pueden manejar cantidades
enteras desde el 0 hasta el 255. Los algoritmos comunes como la
suma, resta, multiplicacin y divisin se aplican como de costumbre
sobre dos vectores de bits.
Representacin de nmeros enteros positivos y negativos en
complemento a dos Para representar nmeros negativos y positivos en
binario mediante vectores de bits, se hace uso de un bit de signo y
de la codificacin en complemento a dos. El complemento a dos es una
tcnica de codificacin de nmeros binarios que simplifica la operacin
de resta haciendo uso de sumadores binarios, y por ende se
simplifica el hardware reduciendo costos sin perder eficiencia.
Si se utiliza un vector de 8 bits (byte) entonces una
organizacin de bits conveniente es la siguiente:
-/+ 26 25 24 23 22 21 20 B7 B6 B5 B4 B3 B2 B1 B0
En donde el bit de signo es B7, si se le tiene el valor 0,
indica que el valor codificado es positivo, en caso contrario, si
se le asigna el valor 1 , la cantidad codificada es un nmero
negativo.
)2(2 776
0BBcantidad
i
ii
=
=
Ejemplo si el cdigo de 8 bits es 0000 1111, entonces la cantidad
asociada es +15, mientras que un cdigo 1111 1111 es 127-128=-1.
Por ejemplo supngase que se desea sumar las siguientes
cantidades representadas en complemento a dos 1111 1111 + -1 + 0000
1111 = 15 = (1) 0000 1110 14 Observe que el acarreo final se ignora
(el noveno bit) puesto que no es almacenable en un byte. Tambin,
como resultado del desbordamiento, el bit B7 ha cambiado a signo
positivo. En complemento a dos, una resta se realiza simplemente
con una suma algebraica.
Aunque para las operaciones de resta y suma no es necesario
hacer ninguna modificacin para tratar a nmeros con signo o sin
signo, si lo es necesario para las operaciones basadas en
desplazamientos a la izquierda o a la derecha, como lo son los
algoritmos de digito a digito como lo son la multiplicacin, la
divisin y el clculo de funciones trascendentales como coseno, seno,
logaritmo y sus inversas.
-
M.C. Pedro Arturo Cornejo Torres
6
Desplazamiento Lgico a la Izquierda Para un desplazamiento a la
izquierda, de un nmero codificado en binario ya sea con signo o sin
signo simplemente se insertan ceros en la parte derecha, mientras
que se desplazan los digitos a la izquierda. Los bits que resulten
en desbordamiento por desplazamiento, simplemente se ignoran.
Por ejemplo, volviendo a utilizar el -1 representado en un
vector de 8 bits y codificacin en complemento a dos.
(-1) 1111 1111
-
M.C. Pedro Arturo Cornejo Torres
7
En el siguiente ejemplo, utilizaremos el nmero 254 codificado
sin signo y aplicaremos el desplazamiento lgico a la derecha.
(254) 1111 1110 >> (Operador de Desplazamiento a la
Derecha) 1 = (126) 0111 1111
Podr darse cuenta, de que dividir entre potencias n-simas de dos
equivale simplemente a desplazar n veces a la derecha. Esto es
cierto en el caso de representaciones sin signo.
Desplazamiento Aritmtico a la Derecha
El desplazamiento a la derecha de un vector de bits con
representacin con signo en complemento a dos, se realiza mediante
el empleo del concepto de extensin de signo. La extensin de signo
consiste en mantener el valor de signo en la parte mas
significativa, mientras se copia, se extiende o propaga su valor a
la derecha mientras de realiza el desplazamiento de los otros bits
a la derecha. A ste desplazamiento se le conoce como Desplazamiento
Aritmtico a la Derecha. (ASR Arithmetic Shift to Right)
Analicemos el siguiente ejemplo. Supongamos que queremos
desplazar los bits correspondientes a una representacin en
complemento a dos del nmero -2 en un vector de 8 bits. El -2
codificado resulta ser 1111 1110, entonces si lo desplazamos una
vez a la derecha, debemos conservar el signo negativo (el valor del
bit B7 debe conservarse y por supuesto propagarse a los siguientes
bits menos significativos).
(-2) 1111 1110 >> (Operador de desplazamiento a la
derecha) 1 = (Un desplazamiento a la derecha) (-1) 1111 1111
El resultado de este desplazamiento a la derecha da como
resultado -1. Como puede observarse el desplazamiento a la derecha
de todo nmero diferente a -1 equivale a obtener el cociente que
resulta de dividir la cantidad entre una potencia n-sima de
dos.
La sentencia anterior dice, para todo numero diferente de -1. Qu
pasa cuando el valor a ser desplazado es -1? El resultado es -1, ya
que se conservan todos los bits en 1. As que hay que tener cuidado
cuando nuestra intensin es dividir entre 2. Recordar que -1/2 debe
ser 0 no seguir siendo -1.
Cuando el nmero tiene signo positivo, entonces, el cero se copia
hacia los bits menos significativos, tenindose as, el efecto simple
de un desplazamiento lgico a la derecha.
Divisin de nmeros con signo entre potencias positivas enteras de
dos
-
M.C. Pedro Arturo Cornejo Torres
8
Para resolver correctamente el caso cuando la cantidad a dividir
es -1 se procede a calcular el desplazamiento lgico a la derecha de
la cantidad simtrica (al multiplicarla por -1). Esto se realiza
eficientemente al negar todos los bits y luego sumarle 1.
Analicemos a continuacin el algoritmo de divisin de x/2n. Para
cuando x={-4, -1} (ntese el caso especial cuando x=-1) que son
dividendos representados en complemento a dos en un vector de 8
bits. El algoritmo slo utiliza el LSR (Desplazamiento Lgico a la
Derecha) para efectuar esta divisin. El siguiente algoritmo debe
ser aplicado cuando el nmero x es menor que 0, es decir, negativo.
Cuando el nmero x es positivo, un desplazamiento lgico a la derecha
(LSR) es ms que suficiente.
Primero x=-4.
Como x es negativo: (-4) 1111 1100 Se complementa (3) 0000 0011
Se le suma 1 (4) 0000 0100 Se desplaza 1 a la derecha (2) 0000 0010
(puede desplazar n veces) Se complementa (-3) 1111 1101 Se le suma
1 (-2) 1111 1110 Listo
Ntese que realizar -4/2 equivale simplemente a hacer un
desplazamiento aritmtico a la derecha sin realizar complementos y
sumas.
(-4) 1111 1100 Se desplaza 1 a la derecha (-2) 1111 1110
aritmticamente.
Luego cuando x=-1 y aplicando la secuencia de operaciones
anterior se tiene que
(-1) 1111 1111 Se complementa (0) 0000 0000 Se le suma 1 (1)
0000 0001 Se desplaza 1 a la derecha (0) 0000 0000 (puede desplazar
n veces) Se complementa (-1) 1111 1111 Se le suma 1 (0) 0000 0000
Listo
As se obtiene el resultado correcto de dividir -1 entre 2 cuyo
cociente es cero, y por supuesto se obtendr el resultado para
cualquier divisor que sea potencia de dos. Debe tener mucho cuidado
con los datos con los que operar. Una mala interpretacin de los
bits o sus operaciones, pueden conducir a problemas demasiado
frustrantes. Evtese molestias y entienda primero estos conceptos de
gran relevancia en el desarrollo de sistemas embebidos y en
particular para su proyecto.
-
M.C. Pedro Arturo Cornejo Torres
9
Multiplicacin de nmeros con y sin signo por potencias enteras
positivas de dos
La multiplicar nmeros con y sin signo por potencias enteras
positivas de dos, resulta ser demasiado trivial, y que bueno que es
as, ya que la multiplicacin as como la suma se utiliza con
frecuencias muy elevadas durante el procesamiento. Simplemente se
utiliza n desplazamientos a la izquierda insertando ceros en la
parte inferior (LSL hace esto). Al efectuarse estos desplazamientos
el efecto final es equivalente a calcular x2n.
Nota: El producto de dos cantidades de n bits requiere como
mximo 2n bits (el doble de bits) para almacenar el producto sin
prdida de informacin. Es decir, si se multiplican dos cantidades de
8 bits, el resultado requiere de 16 bits para representarse
exitosamente.
Aritmtica de Punto Fijo
La aritmtica de punto fijo, es otra representacin de cantidades
numricas que estn compuestas por una parte entera y una parte
fraccional. El computador digital solamente puede manejar
cantidades discretas codificadas en vectores finitos (arreglos) de
bits. Esto confina a los computadores a utilizar subconjuntos
finitos del conjunto infinito de los nmeros reales. Estando
convencidos y concientes de que nicamente podemos emplear
aproximaciones de los nmeros reales, las operaciones entre estas
cantidades, tambin proyectaran aproximaciones. Estas
aproximaciones, dependiendo de la cantidad de bits que se utilicen
tanto para la parte entera como la fraccional, pueden ser ms que
suficientes para una determinada aplicacin.
Sin darnos cuenta, en las secciones anteriores, hemos estado
utilizando una notacin de punto fijo, en donde no se tienen bits
para representar el cdigo de la parte fraccional de una cantidad.
En esas representaciones solo existan ponderaciones que son
potencias positivas de dos donde el exponente es un nmero positivo:
2n para n es 0 o un valor positivo entero. Qu pasa si introducimos
nmeros de exponentes negativos? La respuesta es muy simple,
comenzaramos a trabajar con potencias que son fracciones de
potencias con exponente negativo de dos.
Una cantidad con representacin de punto fijo, puede ser definido
de la siguiente manera
26 25 24 23 22 21 20 2-1 2-2 2-3 2-4 2-5 2-6 2-7 2-8 2-9 D6 D5
D4 D3 D2 D1 D0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 . punto
= =
+=I
i
F
f
ff
ii QBcantidad
0 122
Donde Q representa a los bits de la parte fraccional y F es el
nmero de stos bits. En la representacin de la figura anterior, F=9
pero puede ser cualquier otra cantidad segn se
-
M.C. Pedro Arturo Cornejo Torres
10
necesiten bits para representar la parte fraccional. Se tienen
adems, y sin menos preciar, 7 bits para representar una la cantidad
entera.
La cantidad ms pequea que se puede representar utilizando esa
misma representacin anteriormente expuesta es 0 y la cantidad ms
grande es 127.998046875 exactamente. En incrementos de 0.001953125
exactamente. (Esto es casi 2 milsimas por incremento o decremento
en la parte fraccional)
Las cantidades expresadas en punto fijo se suman y se restan
como si se tratasen de representaciones enteras ordinarias.
para representar cantidades negativas y positivas se emplea la
notacin en complemento a dos en toda la representacin como si se
tratase de una cantidad entera ordinaria. Se pierde un bit para
almacenar la semntica del signo.
-/+ 25 24 23 22 21 20 2-1 2-2 2-3 2-4 2-5 2-6 2-7 2-8 2-9 S D5
D4 D3 D2 D1 D0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9
1
0
1
)(
1
0 1
22
22
222
+
=
=
+
= =
+=
=+=
II
iF
F
f
Fff
ii
II
i
F
f
ff
ii
SQ
B
SQBcantidad
En la figura se utiliza S para almacenar el signo de la
cantidad. Si el valor es cero, el nmero es positivo, si es 1 la
cantidad es negativa.
Observar que las potencias de las posiciones son de nuevo una
referencia hacia una semntica aritmtica y que esto no afecta a la
manera en que el vector de bits es almacenado en la
computadora.
Al emplear complemento a dos, en toda la representacin al
tratarla como un entero ordinario, las operaciones de suma y resta
se efectan sin cambio alguno. Una de las ventajas de esta
representacin de punto fijo es que no es necesario modificar el
hardware o el software para incorporar operaciones cantidades con
partes fraccionales.
Multiplicacin y Divisin de cantidades en representacin de punto
fijo
Multiplicacin usando representacin de punto fijo Durante los
procesos de multiplicacin y divisin es muy importante tener
encuenta que el punto que separa la parte entera de la fraccional
cambiar su posicin con el objetivo de seguir representando
cocientes o productos de manera correcta.
-
M.C. Pedro Arturo Cornejo Torres
11
El siguiente ejemplo de multiplicacin muestra el hecho de que el
punto cambia su posicin (como en cuando multiplicbamos en primaria,
Si lo recuerda?). Suponga que se utiliza complemento a dos, I=3
(tres dgitos binarios enteros) y una F=3 (tres dgitos binarios
fraccionales) y las cantidades a multiplicar son 010.110 con
110.111
(2.75) 010.110 * (-1.125) 110.111 =
Calculamos el complemento a dos del multiplicador y guardamos el
signo para despus, por lo que la multiplicacin quedara como: (2.75)
010.110 * (1.125) 001.001 = (complemento a dos del multiplicador)
---------------------------
010110 + 000000 + 000000 + 010110 + 000000 + 000000
---------------------------
(3.09375) 000011.000110
Como es negativo el producto (-3.09375) 111100.111010
(complemento a dos del producto)
Observe que el punto fijo se ha desplazado otras tres posiciones
hacia la izquierda, y ha requerido el doble de bits para poder ser
representado. Antes necesitaba 6 bits, ahora requiere de 12 (con
signo incluido) para poder ser representado de forma exacta. Sin
embargo es necesario volver a la representacin de 6 bits para
continuar haciendo otras operaciones como sumas y restas cuya
semntica considera slo tres bits para la parte fraccional. Por lo
tanto el resultado debe desplazarse aritmticamente a la derecha F
veces (ASR) y tomar los primeros (de derecha a izquierda) bits del
resultado desplazado.
111100.111010 >> 3 (Desplazamiento Aritmtico a la Derecha)
111111100.111 (Se toman los primeros 6 bits) (-3.125) 100.111
(Cantidad compatible para otras operaciones)
Entonces la diferencia entre el valor real y el valor aproximado
es de 0.03125 unidades.
Podemo resumir en la siguiente frmula como debe realizarse la
multiplicacin entre dos cantidades en una representacin de punto
fijo arbitraria y convencional:
Fdormultiplicandomultiplicaproducto >>= )*(
Divisin usando representacin de punto fijo
Vamos a partir del hecho de que una multiplicacin entera, se
produce a partir de la ecuacin abp = , en este caso, a y b son dos
nmeros en una representacin de punto
-
M.C. Pedro Arturo Cornejo Torres
12
fijo arbitraria, entonces p requiere doble almacenamiento que a
o b. Despejemos la formula para encontrar el cociente a. Si bpa /=
, entonces el valor del divisor debe estar en una representacin tal
que la parte fraccional requiera el doble de bits para su
representacin fraccional. Por lo tanto antes de dividir el divisor
por el dividendo, el dividendo p debe ajustarse a doble precisin y
el cociente estar listo en la notacin convencional que haya
elegido.
La frmula para la divisin en punto fijo es la siguiente, y se
realiza un desplazamiento hacia la izquierda (LSL) F veces del
divisor antes de dividir.
cocientedivisor
Fdividendo
-
M.C. Pedro Arturo Cornejo Torres
13
Estos registros son de entrada y salida para algoritmo de
rotacin de vectores, en donde la salida se relaciona con la entrada
de la siguiente manera:
Entrada Salida X= Valor del eje x en punto fijo X= K (Xcos(Z)
Ysin(Z)) Y= Valor del eje y en punto fijo Y= K (Xsin(Z) + Ycos(Z))
Z= Valor en radianes del ngulo en punto fijo
Z=0
Donde K es aproximadamente 1.65. Para obtener el resultado final
multiplquese los registros X e Y por el inverso de 1.65. Vanse los
artculos que tratan el tema del algoritmo CORDIC para investigar
cmo calcular un valor ms preciso de la constante K.
La implementacin del algoritmo de CORDIC que le otorgado,
utiliza una representacin de punto fijo con una precisin de 9 bits
(F=9) en la parte fraccional, 22 para la parte entera (I=22) y un
bit de signo (S). Se utilizan 32 bits para poder manipular
multiplicaciones y divisiones. Con tantos bits de holgura podemos,
utilizando slo 32 bits, obtener productos y manejar dividendos de
+/- 8192 (213) (recuerde los desplazamientos de 9 bits que implican
estas operaciones).
El siguiente ejemplo, supone que usted ya dispone los archivos
de implementacin del algoritmo CORDIC. Estos archivos estn
disponibles en el sitio web de apoyo. Incluya los archivos
Cordic.h, Cordic.c y CordicROM.h a su proyecto de MPLAB, Visual C++
o la herramienta que usted prefiera.
/****************************************** Ejemplo de Uso del
Algoritmo de Cordic
Compilado utilizado: Microchip C18
******************************************/ #include
"GenericTypeDefs.h" #include "Compiler.h" #include Codic.h
long Divide(long x,long y) { return (x
-
M.C. Pedro Arturo Cornejo Torres
14
//Luego se debe escalar los resultados utilizando
__KCircular
fpX=Multiply(g_CORDIC_x,__KCircular);
fpY=Multiply(g_CORDIC_y,__KCircular);
//Ahora fpX y fpY tienen el vector [450,0] rotado PI/6 radianes
//[fpX,fpY]=[0x00030b50, 0x0001c2ae] o bien //(1 1000 0101.1 0101
0000, 1110 0001.0 1010 1110) //que es, en base 10: [389 +
(336/512), 225+(174/512)].
//Rotacin ms precisa (Calculadora de Windows):
//[389.71143170299739104367542683882, 225.0]
//CORDIC converge y funciona segn lo esperado. }
CORDIC en uso
-
M.C. Pedro Arturo Cornejo Torres
15
Detalles de Programacin del PIC18F4450 o PIC18F4550 En esta
seccin mencionar algunas recomendaciones de programacin y
configuracin de los algunos perifricos disponibles en el PIC18F4X50
para que ste funcione correctamente con la PC y el resto de su
proyecto.
Estructura del Bucle de Mquina de Cornejo El Bucle de Mquina de
Cornejo es un algoritmo y tcnica de implementacin que permite a un
microprocesador funcionar cuando ste no se encuentre atendiendo a
solicitudes de interrupcin por hardware. Adems establece
priorizacin entre tareas de interrupcin, tareas no interrumpibles y
tareas interrumpibles.
Se sabe que el microprocesador puede programarse para: a)
Procesamiento de Solicitudes de Interrupciones mediante Rutinas de
Servicio
de Interrupcin (ISRs). Cuando se utiliza exclusivamente este
paradigma, el microprocesador atiende a los perifricos al responder
a sus solicitudes de interrupcin. Un perifrico genera una solicitud
de interrupcin, cuando su estado ha cambiado. Cuando toda solicitud
ha sido servida, el microprocesador entra en espera hasta que otra
solicitud de servicio se genere. El procesamiento de la informacin
se realiza solamente cuando se sirve a una interrupcin.
b) Procesamiento mediante encuesta. Cuando se utiliza
exclusivamente este paradigma, el microprocesador encuesta a cada
perifrico de manera peridica en busca de cambios en sus estados.
Cuando el programa que corre ese microprocesador ha detectado que
el estado de un dispositivo ha cambiado, el microprocesador,
instruido por el programa, har el procesamiento indicado. En este
paradigma, el procesador siempre est activo.
c) Utilizando ambos paradigmas.
Algunos problemas se resuelven ms fcilmente mediante el uso de
interrupciones, otros son ms sencillos mediante encuesta. Otros
problemas requieren de ambos paradigmas para funcionar eficaz y
eficientemente.
El Bucle de Mquina de Cornejo es un ciclo repetitivo que se
compone un conjunto de pasos que es interrumpible y otro conjunto
de pasos que no lo es.
El conjunto de pasos interrumpibles est conformado por
algoritmos cuya ejecucin puede ser interrumpida por una solicitud
de interrupcin, y los momentos en el que los pasos inician o
terminan no se considera crtico.
El conjunto de pasos no interrumpibles est conformado por tareas
que cuando inician, stas deben terminar en los tiempos adecuados y
son tareas que se consideran crticas. Estas tareas no
interrumpibles se les conoce con el nombre de Operaciones
Atmicas.
-
M.C. Pedro Arturo Cornejo Torres
16
A continuacin se muestra un ejemplo de Bucle de Mquina de
Cornejo: /**************************************************
Estructura bsica de un bucle de mquina.
Estructura de Bucle de Mquina de Cornejo
mailto:[email protected]
***************************************************/
//Implementacin de los vectores de interrupcin
. . .
//Tareas no interrumpibles char TareasNoInterrumpibles() {
//Lista de sentencias de tareas no interrumpibles
return 0; //Si no se permite la ejecucin de otras tareas,
excepto stas. return 1; //Si se permite la ejecucin de
interrupciones y otras tareas. }
//Tareas interrumpibles void TareasInterrumpibles() { //Lista de
sentencias de tareas interrumpibles }
//Variable Global de permiso para activar interrupciones char
g_bRespaldoGIE=1;
/************************************* Punto de entrada: void
main(void) **************************************/ void main(void)
{
//Inicializar perifricos y configurar interrupciones (GIE
permanece en cero) Inicializar(); while(1) { //Hacer tareas no
interrumpibles (Conjunto No Interrumpible)
if(TareasNoInterrumpibles()==0) continue; //Se sigue procesando el
conjunto no interrumpible //Habilitar el procesamiento por
interrupcin GIE=g_bRespaldoGIE; //Hacer las tareas no crticas
(Conjunto Interrumpible) TareasInterrumpibles(); //Guardar el
estado de GIE g_bRespaldoGIE=GIE; //Deshabilitar interrupciones
GIE=0; //Otras tareas no interrumpibles } }
La estructura se caracteriza principalmente por deshabilitar y
habilitar las interrupciones de manera peridica antes y despus de
ejecutar las tareas no interrumpibles. De esta manera, se pueden
implementar transacciones u operaciones atmicas de manera
organizada. El estado del habilitador de interrupciones global GIE
se almacena en la variable bRespaldoGIE ya que las tareas no
interrumpibles as como las interrumpibles pueden controlar al
habilitador de interrupciones de manera arbitraria.
Las tareas no interrumpibles no deben tardar mucho en su
ejecucin, ya que esto aumentara la latencia al atender
interrupciones de hardware.
-
M.C. Pedro Arturo Cornejo Torres
17
Las tareas que tomen mucho tiempo y que no sean crticos deben
implementarse como tareas interrumpibles y como mquinas de estado o
autmatas.
El siguiente ejemplo es un caso de uso del Bucle de Mquina de
Cornejo
. . .
unsigned char g_bGIEBackup=1;
char IsUSBConfigured(void) { if( (USBDeviceState <
CONFIGURED_STATE )||(USBSuspendControl==1)) return 0; return 1;
}
void main() { //Inicializar estado de mquina InitSystem();
//Inicializar variables e interfase de usuario (LEDS, LCD, Teclado)
InitUser(); //Habilitar interrupciones de perifricos
INTCONbits.PEIE=1; //Entrar al ciclo de mquina while(1) {
/***************** TAREAS NO INTERRUMPIBLES *******************/
USBDeviceTasks(); //Si el USB no ha alcanzado el estado de
configurado, //o se encuentra en suspencin, continuar realizando
USBDeviceTasks if(!IsUSBConfigured()) continue; //Habilitar
interrupciones globales INTCONbits.GIE=g_bGIEBackup;
/****************TAREAS INTERRUMPIBLES**************/ //Ya se ha
alcanzado el estado de configurado //y no se encuentra en suspencin
//por lo que se puede obtener informacin proveniente del host
ProcessIncommingPacketsStateMachine(&g_USBTSM); //Realizar
tareas de recepcin y envi en el USART por paquete do {
USARTRxTasks(); USARTTxTasks(); }
while(g_bUSARTState==USART_STATE_TRANSMITTING ||
g_bUSARTState==USART_STATE_RECEIVING);
ProcessIncommingPacketsStateMachine(&g_USARTTSM); //Procesar
envos pendientes por USB CDC CDCTxService(); //Respaldar GIE
g_bGIEBackup=INTCONbits.GIE; //Deshabilitar interrupciones
INTCONbits.GIE=0; /********************* TAREAS NO INTERRUMPIBLES
****************/ StatusLedTasks(); } }
Valores y Modificaciones al Marco de Trabajo USB de Microchip A
continuacin, mostrar las modificaciones y los valores requeridos
para poder realizar exitosamente una conexin USB entre el PC y los
PIC18F4450 y PIC18F4550.
-
M.C. Pedro Arturo Cornejo Torres
18
Para poder realizar diferentes tipos de tareas, le recomiendo
utilice la estructura de Bucle de Mquina de Cornejo para que pueda
hacerse cargo de las tareas no interrumpibles de USB y las tareas
que usted necesite implementar como lo son servicios de interrupcin
o tareas interrumpibles.
El proyecto MPLAB, debe contener los siguientes archivos que
corresponden al marco de trabajo USB de Microchip. (Microchip USB
Device Framework) usb_config.c usb_device.c usb_descriptors.c
usb_function_cdc.c usb_config.h
As como los dems archivos, aunque no asociados al proyecto
explcitamente, que estn almacenados y al alcance en la subcarpeta
.\usb del proyecto.
Descargue el proyecto inicial para el PIC18F4450 que ya posee la
estructura de proyecto inicial.
Si est utilizando el PIC18F4450 necesitar el archivo con las
instrucciones de enlace 18F4450.lkr. Este archivo se encuentra el
directorio de instalacin de Microchip C18, C:\MCC18\lkr. En caso de
utilizar el PIC18F4550 deber especificar el nuevo archivo con
instrucciones de enlace para ese MCU. El archivo tambin se
encuentra en esa carpeta C:\MCC18\lkr con el nombre
18F4550.lkr.
Modificaciones en los archivos para utilizar el PIC18F4550
En el archivo usb_config.h
Debido a que el PIC18F4550 tiene ms memoria, se pueden utilizar
caractersticas ms eficientes.
/* CDC */ #define CDC_COMM_INTF_ID 0x0 #define CDC_COMM_EP 2
#define CDC_COMM_IN_EP_SIZE 8
#define CDC_DATA_INTF_ID 0x01 #define CDC_DATA_EP 3 #define
CDC_DATA_OUT_EP_SIZE 64 Modifique a este valor (antes 32) #define
CDC_DATA_IN_EP_SIZE 64 Modifique a este valor (antes 32)
En el archivo usb_function_cdc.c
Realice las modificaciones necesarias para que el ajustarse al
siguiente fragmento. /** V A R I A B L E S
********************************************************/ #if
defined(__18F14K50) || defined(__18F13K50) || defined(__18LF14K50)
|| defined(__18LF13K50) #pragma udata usbram2 #elif
defined(__18F2455) || defined(__18F2550) || defined(__18F4455) ||
defined(__18F4550)\ || defined(__18F2458) || defined(__18F2453) ||
defined(__18F4558) || defined(__18F4553) #pragma udata
USB_VARIABLES=0x500 Debe ser 0x500 el banco de Intercambio de Datos
#elif defined(__18F4450) || defined(__18F2450) #pragma udata
USB_VARIABLES=0x430
-
M.C. Pedro Arturo Cornejo Torres
19
#else #pragma udata #endif
Si tras haber realizado los cambios sigue teniendo problemas con
la conexin USB en el PIC18F4550, puede utilizar otro mecanismo de
transferencia USB.
Para ms informacin acerca de estos cambios vase la documentacin
del PIC18F4550 y la organizacin de memoria de USB.
En el archivo usb_config.h realice la siguiente modificacin
//Make sure only one of the below "#define USB_PING_PONG_MODE"
//is uncommented. #define USB_PING_PONG_MODE
USB_PING_PONG__NO_PING_PONG Descomente esta lnea //#define
USB_PING_PONG_MODE USB_PING_PONG__FULL_PING_PONG Comente esta lnea
//#define USB_PING_PONG_MODE USB_PING_PONG__EP0_OUT_ONLY //#define
USB_PING_PONG_MODE USB_PING_PONG__ALL_BUT_EP0 //NOTE: This mode is
not supported in PIC18F4550 family rev A3 devices
Esta ltima modificacin no debe ser necesaria. Verifique su
diseo, sus algoritmos, sus tiempos de procesamiento y priorizacin
de tareas, puede que esto sea el causante de los problemas de
sincronizacin y conexin.