Está en la página 1de 19

M.C.

Pedro Arturo Cornejo Torres

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

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

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 cwndmainframe@hotmail.com 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

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


cantidad = Bi 2i 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.
i =0 7

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. 6 cantidad = Bi 2 i B7 (2 7 ) i =0 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

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) (-2) 1111 1111 << (Operador de Desplazamiento a la Izquierda) 1= (Un desplazamiento a la izquierda) 1111 1110

El hecho de desplazar a la izquierda un nmero positivo o negativo es equivalente a multiplicarlo por una potencia n-sima de dos. En el ejemplo anterior hemos multiplicado por 21 es decir 2. Revisando el resultado anterior, podemos verificar que efectivamente el duplo de -1 es -2. 1111 1110 = 126-128=-2. Entonces queda verificado que al insertar ceros en la parte derecha es aritmticamente correcto bajo la representacin de complemento a dos. Lo mismo sucede con nmeros positivos. Le encargo como ejercicio con cualquier cantidad positiva en representacin de complemento a dos.

Desplazamiento Aritmtico a la Izquierda


A la operacin de desplazamiento a la izquierda se le conoce con dos nombres, que operacionalmente son indistinguibles (que son lo mismo). Desplazamiento Lgico a la Izquierda (LSL Logic Shift to Left) y Desplazamiento Aritmtico a la Izquierda (ASL Arithmetic Shift to Left). En lenguajes ensambladores los mnemnicos ASLxx LSLxx se implementan con el mismo cdigo de operacin. La operacin de Desplazamiento Aritmtico es aplicable a las cantidades representadas con signo, mientras que el Desplazamiento Lgico se aplica a las cantidades sin signo. El uso coherente de estos mnemnicos ayuda a mantener conocimiento y recordarle al usuario cul es la semntica aritmtica empleada para representar la cantidad.

Desplazamiento Lgico a la Derecha


Primero trataremos el desplazamiento a la derecha para nmeros enteros sin signo. Para el desplazamiento a la derecha se debe hacer un tratamiento especial para los nmeros con signo y sin signo. NOTA IMPORTANTE: Nmeros sin signo se refiere a que el bit ms significativo (MSB) no posee semntica de signo, sino de valor ponderado. El desplazamiento a la derecha de un vector de bits con representacin sin signo, simplemente se desplazan los bits a la derecha mientras se insertan ceros por la parte izquierda. A esto se le conoce como Desplazamiento Lgico a la Derecha (LSR Logic Shift to Right). 6

M.C. Pedro Arturo Cornejo Torres

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) (-1) 1111 1110 >> (Operador de desplazamiento a la derecha) 1 = (Un desplazamiento a la derecha) 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 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: Se complementa Se le suma 1 Se desplaza 1 a la derecha Se complementa Se le suma 1 Listo (-4) (3) (4) (2) (-3) (-2) 1111 1100 0000 0011 0000 0100 0000 0010 1111 1101 1111 1110

(puede desplazar n veces)

Ntese que realizar -4/2 equivale simplemente a hacer un desplazamiento aritmtico a la derecha sin realizar complementos y sumas. Se desplaza 1 a la derecha aritmticamente. (-4) (-2) 1111 1100 1111 1110

Luego cuando x=-1 y aplicando la secuencia de operaciones anterior se tiene que Se complementa Se le suma 1 Se desplaza 1 a la derecha Se complementa Se le suma 1 Listo (-1) (0) (1) (0) (-1) (0) 1111 1111 0000 0000 0000 0001 0000 0000 1111 1111 0000 0000

(puede desplazar n veces)

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

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 D6 25 D5 24 D4 23 D3 22 D2 21 D1 20 D0 2-1 Q1 2-2 Q2 2-3 Q3 2-4 Q4 2-5 Q5 2-6 Q6 2-7 Q7 2-8 Q8 2-9 Q9

. punto
cantidad = Bi 2i + Q f 2 f
i =0 f =1 I F

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
9

M.C. Pedro Arturo Cornejo Torres 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. -/+ S 25 D5 24 D4 23 D3 22 D2 21 D1 20 D0
I

2-1 Q1

2-2 Q2
F

2-3 Q3

2-4 Q4

2-5 Q5

2-6 Q6

2-7 Q7

2-8 Q8

2-9 Q9

cantidad = Bi 2i + Q f 2 f S 2 I +1 =
i =0 f =1

= Bi 2i +
i =0

Q
f =1

2( f F ) S 2 I +1

2F

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.

10

M.C. Pedro Arturo Cornejo Torres 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) (-1.125) 010.110 * 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:
producto = ( multiplicando * multiplicador ) >> F

Divisin usando representacin de punto fijo


Vamos a partir del hecho de que una multiplicacin entera, se produce a partir de la ecuacin p = ab , en este caso, a y b son dos nmeros en una representacin de punto

11

M.C. Pedro Arturo Cornejo Torres fijo arbitraria, entonces p requiere doble almacenamiento que a o b. Despejemos la formula para encontrar el cociente a. Si a = p / b , 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.

cociente =

dividendo << F divisor

Puede obtenerse la frmula anterior, al despejar la frmula del producto.

El algoritmo CORDIC de Volder


El algoritmo CORDIC resuelve una gran clase de problemas, cuando volder diseo ste algoritmo lo hizo principalmente para la evaluacin de funciones trigonomtricas, posteriormente se aplic para la evaluacin de logaritmos, races cuadradas, multiplicaciones, divisiones, funciones hiperblicas en tiempo constante. La implementacin de un CORDIC no se limita a la aritmtica de punto fijo (siendo excesivamente eficiente en estas representaciones numricas) sino que tambin se extiende fcilmente al procesamiento de valores en punto flotante. El algoritmo CORDIC y sus variantes se encuentran implementados en las unidades de punto flotante de los microprocesadores poderosos de computadoras y servidores, as como en hardware de microprocesadores para el procesamiento de seales. El algoritmo CORDIC se emplea en dos modalidades. Modo de Rotacin de Vectores y el Modo de Vectorizacin. El algoritmo se caracteriza por ser preciso hasta la cantidad de bits que se le especifique e implemente. Es muy eficiente y eficaz, ya que durante la ejecucin en cualquiera de las dos modalidades, CORDIC slo requiere del acceso a una tabla pequea de constantes as como de sumas, restas y desplazamiento de bits para realizar sus clculos.

CORDIC en modo Rotacin de Vectores


El modo de Rotacin de Vectores, se utiliza para calcular senos y cosenos al efectuar la rotacin de un vector bidimensional inicial [1, 0] segn un ngulo de rotacin dado. No necesariamente se tiene que introducir un vector unitario, puede ser cualquier vector dentro del dominio de la representacin y del resultado esperado. El modo de Vectorizacin, se utiliza calcular arco seno y arco coseno mediante identidades del arco tangente partiendo de la razn de las medidas del cateto adyacente y el cateto opuesto al ngulo. Un computador digital de rotacin de coordenadas (CORDIC) tiene tres registros. El registro X, el registro Y y el registro Z.

12

M.C. Pedro Arturo Cornejo Torres

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 X= Valor del eje x en punto fijo Y= Valor del eje y en punto fijo Z= Valor en radianes del ngulo en punto fijo Salida X= K (Xcos(Z) Ysin(Z)) Y= K (Xsin(Z) + Ycos(Z)) 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<<FP_FRACTION_BITS)/y; } long Multiply(long x,long y) { x=x*y; ASR(x,FP_FRACTION_BITS); return x; } void main(void) { long fpTheta,fpX,fpY; //fp: fixed point //Rotar el vector [450,0] a PI/6 radianes fpTheta=Divide(FP_PI,INTEGER_TO_FP(6)); //Instalar el vector y el ngulo en los registros de CORDIC g_CORDIC_x=INTEGER_TO_FP(450); g_CORDIC_y=INTEGER_TO_FP(0); g_CORDIC_z=fpTheta; //Invocar a CORDIC en modo de //rotacin trigonomtrica de vectores CordicTrigonometricRotationMode(); //En este punto, [g_CORDIC_x,g_CORDIC_y]=[0x000502fd,0x0002e5f5]

13

M.C. Pedro Arturo Cornejo Torres


//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

14

M.C. Pedro Arturo Cornejo Torres

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.

15

M.C. Pedro Arturo Cornejo Torres 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:pcornejo@gdl.cinvestav.mx ***************************************************/

//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.

16

M.C. Pedro Arturo Cornejo Torres 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.

17

M.C. Pedro Arturo Cornejo Torres 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 #define CDC_COMM_EP #define CDC_COMM_IN_EP_SIZE #define #define #define #define CDC_DATA_INTF_ID CDC_DATA_EP CDC_DATA_OUT_EP_SIZE CDC_DATA_IN_EP_SIZE 0x0 2 8 0x01 3 64 64

Modifique a este valor (antes 32) 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

18

M.C. Pedro Arturo Cornejo Torres


#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.

19

También podría gustarte