Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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
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.
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.
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.
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.
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.
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
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
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.
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.
. 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
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 =
12
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
CORDIC en uso
14
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(); } }
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.
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
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