Skip to main content

0b11 Binary Options


No estoy seguro de cómo obtener lo que quieres usando la lib estándar. Hay un puñado de scripts y paquetes por ahí que hará la conversión para usted. Sólo quería anotar el por qué. Y por qué no es cojo. Bin () no devuelve bits binarios. Convierte el número en una cadena binaria. El 0b principal le dice al intérprete que está tratando con un número binario. Según la definición del lenguaje python. De esta manera se puede trabajar directamente con números binarios, como esto no es cojo. eso es genial. Convierta un número entero en una cadena binaria. Los literales enteros y enteros largos se describen mediante las siguientes definiciones léxicas: Funciona mejor si proporciona una máscara. De esa manera se especifica hasta qué punto para firmar extender. O quizás más generalmente: en la teoría básica, la anchura real del número es una función del tamaño del almacenaje. Si es un número de 32 bits, entonces un número negativo tiene un 1 en el MSB de un conjunto de 32. Si es un valor de 64 bits, entonces hay 64 bits para mostrar. Pero en Python, la precisión entera se limita sólo a las restricciones de su hardware. En mi computadora, esto realmente funciona. Pero consume 9 GB de RAM sólo para almacenar el valor de x. Cualquier cosa más alta y tengo un MemoryError. Si tuviera más memoria RAM, podría almacenar números más grandes. Así que con eso en mente, lo que el número binario representa -1. Python es capaz de interpretar literalmente millones (e incluso miles de millones) de bits de precisión, como muestra el ejemplo anterior. En el complemento 2s, el bit de signo se extiende hasta la izquierda, pero en Python no hay número predefinido de bits, hay tantos como se necesite. Pero entonces usted se encuentra con la ambigüedad: el binario 1 representa 1. o -1. Bueno, podría ser cualquiera. 111 representa 7 o -1. Una vez más, podría ser cualquiera. Así que 111111111 representan 511. o -1. Bien, ambos, dependiendo de su precisión. Python necesita una manera de representar estos números en binario para que no haya ambigüedad de su significado. El prefijo 0b sólo dice que este número está en binario. Al igual que 0x significa que este número está en hexadecimal. Así que si digo 0b1111. Cómo puedo saber si el usuario quiere -1 o 15 Hay dos opciones: Opción A: El bit de signo Usted podría declarar que todos los números están firmados, y el bit de la izquierda es el bit de signo. Esto significa que 0b1 es -1, mientras que 0b01 es 1. Eso también significa que 0b111 es también -1, mientras que 0b0111 es 7. Al final, esto es probablemente más confuso que útil, particularmente porque la mayoría de la aritmética binaria va a ser sin signo de todos modos, Y las personas tienen más probabilidades de encontrar errores al marcar accidentalmente un número como negativo porque no incluyen un bit de signo explícito. Opción B: La indicación de signo Con esta opción, los números binarios están representados sin signo, y los números negativos tienen un prefijo -, igual que en decimal. Esto es (a) más coherente con decimal, (b) más compatible con la forma en que los valores binarios son más probable va a ser utilizado. Se pierde la capacidad de especificar un número negativo utilizando su representación de complemento de dos, pero recuerde que el complemento de dos es un detalle de implementación de almacenamiento, no una indicación adecuada del valor subyacente en sí. No debería ser algo que el usuario tiene que entender. Al final, la opción B tiene más sentido. Hay menos confusión y el usuario no está obligado a entender los detalles de almacenamiento. El cargador de arranque OpenSDAv1 (véase 8220OpenSDA en el Freedom KL25Z Board 8220) está utilizando los archivos S-Record (S19) estándar de la industria. Sin embargo, la nueva placa FRDM-K64F (véase 8220FTF: FRDM-K64F, Kinetis Design Studio y Kinetis SDK 8220) tiene OpenSDAv2 en él, que es un cargador de arranque mbed. Así que cómo crear archivos con un IDE distinto de mbed para ese cargador de arranque que está presente en la tarjeta FRDM-K64F por defecto. Bueno, crear archivos binarios es una cosa, pero tenerlo trabajando con el gestor de arranque mbed es otro reto. FRDM-K64F con cargador de arranque mbed MSD mbed Bootloader y archivos binarios El firmware mbed que se ejecuta en el Kinetis K20 de la placa FRDM-K64F tiene tres funciones: mbed Dispositivos USB Interfaz de depuración como dispositivo HID USB implementando el puente CMSIS-DAP Serial a USB Lamentablemente no es una clase de dispositivo USB CDC, por lo que requiere un controlador USB propietario mbed para esto). MSD (dispositivo de almacenamiento masivo) USB Bootloader. Es interesante ver que la interfaz de depuración utiliza un USB HID (Human Interface Device Class). Así que para el host esto se parece a un teclado o un ratón (que son dispositivos HID también). La ventaja de este enfoque es que no se necesitan controladores en el host. Sin embargo, el interfaz HID es muy lento en comparación con otras clases de dispositivos (bueno, un teclado o un ratón no tiene que ser muy rápido), por lo que esto probablemente explica por qué la velocidad de la interfaz de depuración mbed es algo aceptable, pero no tan rápido como, p. Un PampE Multilink o Segger J-Link La tercera función es de interés aquí: el firmware mbed OpenSDAv2 se parece a un dispositivo de memoria USB (stick) donde puedo copiar archivos a él, y se programa el procesador de destino. Esta funcionalidad también existe en el firmware de OpenSDAv1 para otras tarjetas (por ejemplo, FRDM-KL25Z). Mientras que el firmware de OpenSDAv1 acepta archivos Motorola S19, por razones extrañas el cargador de arranque MSD de mbed solo acepta archivos binarios (.BIN). Yo prefiero mucho los archivos S19 estándar, ya que son fácilmente generados por cualquier herramienta, y hay muchas herramientas para convertir / tratar / cambiar archivos S19. No está claro para mí por qué el cargador de arranque mbed sólo acepta archivos BIN: los archivos S19 son estándar de la industria, fáciles de generar y manejar. Sí, los archivos S19 utilizan dos bytes para cada byte de código porque es un formato ASCII. Eso haría una diferencia si la velocidad de conexión al cargador de arranque sería limitada, pero esto no es el caso con OpenSDAv2: me refiero a USB no es un 8216few bytes por segundo8217 protocolo de comunicación donde un protocolo binario tendría sentido Crear archivos binarios con GNU ARM Plugins de Eclipse Tanto mi Kepler de Eclipse (ver 8220GNU Herramientas Adicionales: Crear Imagen de Flash, Tamaño de Impresión y Opciones de Listado Extendido 8220) y también KDS incluyen los plugins de GNU ARM Eclipse. CodeWarrior tiene un complemento un poco antiguo / similar también, vea Generación de Registros 8220S con gcc para ARM / Kinetis 8221 cómo crear archivos S19 / binarios con CodeWarrior. Para generar un archivo binario para el gestor de arranque mbed MSD, vaya a la configuración del proyecto (menú Proyecto gt Propiedades) ya la pestaña Toolchains en C / C Build gt Configuración: Crear Flash Image Habilitar 8216Create flash image8217 y pulse el botón 8216Apply8217. A continuación, cambie a la pestaña 8216Tool Settings8217, vaya a la configuración general de 8216Cross ARM GNU Crear Flash Image8217 y elija 8216Raw binary8217: Creando la prensa binaria sin formato 8216Ok8217 y construya su proyecto. El archivo binario se creará en la carpeta de salida del proyecto: Binary File Created Bugs in mbed Bootloader Hasta ahora todo bien, si no hubiera un error en el gestor de arranque MSD de mbed. Existen dos problemas asociados con el cargador de arranque MSD de la unidad I8217m (y he perdido mucho tiempo descubriendo el problema. Es especialmente malo, ya que podría bloquear su placa, y puede ser difícil recuperar la placa, consulte 8220Recovering FRDM-K64F mbed Board 8221): La placa obtiene bricked si el archivo binario tiene todos los bits de seguridad de flash establecidos en 0xFF, o si los campos de configuración de flash están faltando / no están configurados en la aplicación. Consulte 8220How (no) para proteger mi microcontrolador 8221 en este problema. Incluso si el campo de seguridad de puerta trasera de NVFSEC de la configuración de flash está configurado propery, el cargador de arranque mbed arruinará el tablero. Tenga en cuenta que los dos problemas anteriores no están presentes si se utiliza OpenSDAv1, PampE Multilink o Segger J-Link (para mí otra buena razón para gastar poco dinero una buena pieza de depuración sonda en comparación con perder mucho tiempo). KEYEN Ajustes de FSEC: Clave de puerta trasera Seguridad Habilitar El problema es con el KEYEN (2 bits) en la configuración de FSEC (seguridad de Flash). El manual de referencia de K64F lo documenta de la siguiente manera: KEYEN Bits en FSEC (Fuente: Manual de Referencia de Freescale K64F) Los ajustes 0b00, 0b01 y 0b11 desactivan las teclas de puerta trasera y 01 es la forma preferida. Sin embargo, de alguna manera el gestor de arranque mbed sólo parece aceptar 0b11. De alguna manera la librería mbed usa 0b11, pero si está utilizando otras bibliotecas / cadenas de herramientas o Procesador Experto, entonces es muy probable que use el valor por defecto 0b01, que luego bloquea mi placa FRDM-K64F. Esto se puede reproducir fácilmente con un pequeño ejemplo. En el código de inicio de ejemplo que se utiliza a continuación con el SDK de Kinetis, los ajustes de configuración del flash se configuran después de la tabla de vectores: Configuración de Flash en el código de inicio MK64F Si la última palabra es 0xFFFFFF7E, se brick su placa, mientras 0xFFFFFFFE funciona correctamente. Ambos valores funcionarán de acuerdo con el manual de referencia de Freescale. El mismo problema si I8217m con el experto del procesador y desea cargar ese archivo binario generado con el cargador de arranque MSD de mbed: El ajuste correcto de la configuración de Flash causa el problema con el cargador de arranque mbed El valor (correcto) 0x7EU bricks the board. La solución es utilizar 0xFEU en su lugar (vea 8220Desactivar mi Generación de código 8221 cómo cambiar el código manualmente). He presentado ese problema, así que espero que sea abordado por una actualización de la mbed bootloader. Hasta entonces, por lo menos para saber una razón por la que los ladrillos de la placa es mejor que no saber Resumen El cargador de arranque mbed MSD requiere archivos binarios (.BIN). Generar archivos binarios es muy posible con las herramientas GNU y fácil con los complementos de compilación GNU ARM Eclipse (ver gnuarmeclipse. livius. net/blog/). El cargador de arranque mbed actual tiene un problema con los bits de seguridad de FSEC: si no se configuran de la manera que el gestor de arranque los espera, bloqueará el tablero. Formas de cómo recuperar el tablero se tratan en 8220Recovering FRDM-K64F mbed Junta 8220. Admito que este problema no se produce si usted está dentro del sistema 8216mbed8217: pero espero que mbed llegará a un punto que será más fácil de ser Usado con las herramientas 8216offline8217 también. Estoy deseando que llegue. Hola Erich, Gracias por un mensaje más útil. Sin embargo, I8217m no es capaz de generar el archivo. bin a un ejemplo que he descargado (developer. mbed. org/users/mbedofficial/code/TCPSocketHelloWorld/). He comprobado las configuraciones y todo está bien, incluso generé el. bin a otro proyecto en la misma ruta. Me pregunto si el problema es sobre los archivos. cpp. Cualquier idea de lo que podría estar sucediendo Hi Aline, no, C (. Cpp) los archivos son, sin duda no es un problema. ¿Qué tipo de mensaje de error se ve en la vista de la consola Hay un problema conocido con la generación de dichos archivos, documentado en mcuoneclipse / 2013/06/12 / traps-and-pitfalls-no-hexbins19-file-created-with-gnu / Soy consciente de. Espero que esto ayude. Hola Gracias por su respuesta, y lo siento teniendo tanto tiempo para responder a usted. I8217m recibiendo el siguiente mensaje en la consola: 8220arm-none-eabi-g: error: opción de línea de comandos no reconocida 82168211gc-sections8221 justo después de una línea extense donde encuentro muchos archivos. o citados. Traté de encontrar algo útil en algunos puestos, pero nada parecía ser aplicable a mi caso. Por lo tanto, isn8217t la generación del archivo bin porque es incluso el acabado de la construcción. Pero de ese mensaje no sé qué puedo hacer. 8211gc-sections es una opción de vinculador (no compilador). Parece que usted está utilizando esa opción de vinculador para la compilación de archivos Hola de nuevo Erich I8217m tipo de nuevo para el KDS, por lo que realmente don8217t saber cómo solucionar este problema, si I8217m utilizando ese enlazador en lugar de un compilador. Lo que puedo decir es que cuando descargué el ejemplo, se produjo un error en el proyecto: 8220make: TCPSocketHelloWorld. elf Error 18221. Así que leí que debería cambiar el constructor Current de GNU Make Builder a CDT Internal Builder. Y desde entonces tengo este error con las secciones gc. ¿Tienes una idea de cómo resolver ese Gracias, Aline Hi Aline, De dónde has descargado ese proyecto Me parece que este proyecto es un proyecto para algunos Eclipse distribución / plugins, pero no para los plugins de GNU ARM Eclipse como son En KDS Tengo el enlace para descargar (disponible en mi primer post) de mbed sitio web. Pensé que con algunas configuraciones sería capaz de utilizar el ejemplo. En cualquier caso, I8217ve cambió a un ejemplo de KSDK, y está funcionando bien. Muchas gracias por la ayuda. Saludos cordiales, Aline. Hola, i8217m tener algunos problemas cuando dragampdrop el archivo bin en el MSD. Si genero el archivo con KDS conseguí un archivo fail. txt con un mensaje de error: 8220El firmware de interfaz ABORTED de programación. La imagen está intentando fijar la seguridad bits8221, y si construyo el mismo código en CodeWarrior 10.6 el tablero se reinicia pero nada sucede. Introducción A menudo, cuando se programa en el entorno de Arduino (o en cualquier computadora, para eso), la capacidad de manipular bits individuales será útil o incluso necesaria. Aquí hay algunas situaciones en las que la matemática de bits puede ser útil: Ahorro de memoria al empaquetar hasta 8 valores de datos verdaderos / falsos en un solo byte. Activación / desactivación de bits individuales en un registro de control o en un registro de puerto de hardware. Realizar ciertas operaciones aritméticas que implican multiplicar o dividir por potencias de 2. En este tutorial, exploramos primero los operadores bit a bit básicos disponibles en el lenguaje C. Entonces aprendemos cómo combinarlos para realizar ciertas operaciones útiles comunes. El sistema binario Para explicar mejor los operadores bit a bit, este tutorial expresará la mayoría de los valores enteros usando la notación binaria, también conocida como base dos. En este sistema, todos los valores enteros utilizan sólo los valores 0 y 1 para cada dígito. Así es como prácticamente todas las computadoras modernas almacenan datos internamente. Cada 0 o 1 dígito se llama un bit. Abreviatura de dígito binario. En el sistema decimal familiar (base diez), un número como 572 significa 510 2 710 1 210 0. Del mismo modo, en binario un número como 11010 significa 12 4 12 3 02 2 12 1 02 0 16 8 2 26. Es crucial que Usted entiende cómo funciona el sistema binario para seguir el resto de este tutorial. Si necesita ayuda en esta área, un buen lugar para empezar es el artículo de Wikipedia sobre el sistema binario. Desafortunadamente, la mayoría de los compiladores C no tienen ningún medio de expresar números binarios directamente en el código fuente. Algunos permiten el prefijo 0b seguido de una serie de 0 y 1 dígitos, p. 0b11 3. El compilador C utilizado por Arduino no admite esta sintaxis. Sin embargo, a partir de Arduino 0007, las constantes B0 a B11111111 se definen para su conveniencia. Bitwise AND El operador AND bit a bit en C es un solo ampersand, amp. Utilizado entre dos otras expresiones enteras. El bit a bit AND opera en cada posición de bit de las expresiones circundantes de forma independiente, de acuerdo con esta regla: si ambos bits de entrada son 1, la salida resultante es 1, de lo contrario la salida es 0. Otra forma de expresar esto es: En Arduino, el tipo int Es un valor de 16 bits, por lo que el uso de amplificador entre dos expresiones int hace que 16 operaciones simultáneas Y ocurran. En un fragmento de código como: Cada uno de los 16 bits en ayb se procesan utilizando AND bit a bit, y los 16 bits resultantes se almacenan en c. Resultando en el valor 01000100 en binario, que es 68 en decimal. Uno de los usos más comunes de AND bit a bit es seleccionar un bit particular (o bits) de un valor entero, a menudo llamado enmascaramiento. Por ejemplo, si desea acceder al bit menos significativo en una variable x. Y almacenar el bit en otra variable y. Puede utilizar el siguiente código: Bitwise OR El operador OR bit a bit en C es el símbolo de barra vertical,. Al igual que el operador de amplificador, opera independientemente cada bit en sus dos expresiones enteras circundantes, pero lo que hace es diferente (por supuesto). El OR bit a bit de dos bits es 1 si uno o ambos bits de entrada son 1, de lo contrario es 0. En otras palabras: Este es un ejemplo de OR de bit a bit usado en un fragmento de código C: Asegúrese de que un bit dado está activado (establecido en 1) en una expresión dada. Por ejemplo, para copiar los bits de a en b. Mientras se asegura de que el bit más bajo está establecido en 1, utilice el código siguiente: Bit XOR en bits Existe un operador algo inusual en C denominado OR exclusivo a bit. También conocido como XOR bit a bit. (En inglés usualmente se pronuncia eks-or.) El operador XOR bit a bit se escribe usando el símbolo de intercalación. Este operador es similar al operador OR bit a bit. Excepto que se evalúa a 1 para una posición dada cuando exactamente uno de los bits de entrada para esa posición es 1. Si ambos son 0 o ambos son 1, el operador XOR se evalúa a 0. Otra manera de mirar a bit a bit XOR es que cada bit En el resultado es un 1 si los bits de entrada son diferentes, o 0 si son iguales. Aquí hay un ejemplo de código simple: El operador se utiliza a menudo para alternar (es decir, cambiar de 0 a 1, o 1 a 0) algunos de los bits en una expresión de número entero, dejando a otros solos. Por ejemplo: Bitwise NOT El operador bitwise NOT en C es el carácter tilde A diferencia de amp y. El operador NOT bitwise se aplica a un solo operando a su derecha. Bitwise NOT cambia cada bit a su contrario: 0 se convierte en 1 y 1 se convierte en 0. Por ejemplo: Usted puede ser sorprendido al ver un número negativo como -104 como resultado de esta operación. Esto se debe a que el bit más alto en una variable int es el llamado bit de signo. Si el bit más alto es 1, el número se interpreta como negativo. Esta codificación de números positivos y negativos se conoce como complemento de dos. Para obtener más información, consulte el artículo de Wikipedia sobre el complemento de dos. Como un aparte, es interesante observar que para cualquier entero x. X es el mismo que - x-1. A veces, el bit de signo en una expresión entera firmada puede causar algunas sorpresas no deseadas, como veremos más adelante. Operadores de cambio de bit Hay dos operadores de cambio de bit en C: el operador de desplazamiento izquierdo ltlt y el operador de cambio de dirección derecha gtgt. Estos operadores hacen que los bits del operando izquierdo sean desplazados hacia la izquierda o la derecha por el número de posiciones especificadas por el operando derecho. Por ejemplo: Cuando cambia un valor x por y bits (x ltlt y), los bits y más a la izquierda en x se pierden, literalmente desplazados fuera de existencia: Si está seguro de que ninguno de los valores en un valor se están desplazando hacia el olvido , Una manera simple de pensar en el operador de turno izquierdo es que multiplica el operando izquierdo por 2 elevado a la potencia de operando derecha. Por ejemplo, para generar potencias de 2, pueden emplearse las siguientes expresiones: Cuando cambia x a la derecha por y bits (x gtgt y), y el bit más alto en x es a 1, el comportamiento depende del tipo exacto de datos de x . Si x es del tipo int. El bit más alto es el bit de signo, determinando si x es negativo o no, como hemos discutido anteriormente. En ese caso, el bit de signo se copia en bits inferiores, por razones históricas esotéricas: Este comportamiento, llamado extensión de signo. No es a menudo el comportamiento que usted desea. En su lugar, es posible que desee que se cambien ceros desde la izquierda. Resulta que las reglas de desplazamiento a la derecha son diferentes para las expresiones int sin signo, por lo que puede usar un encasillado para suprimir las que se copian de la izquierda: Si tiene cuidado de evitar la extensión de signo, puede utilizar el operador de desplazamiento a la derecha gtgt como Manera de dividir por potencias de 2. Por ejemplo: Operadores de asignación A menudo en la programación, desea operar sobre el valor de una variable x y almacenar el valor modificado en x. En la mayoría de los lenguajes de programación, por ejemplo, puede aumentar el valor de una variable x por 7 utilizando el siguiente código: Como este tipo de cosas ocurre con tanta frecuencia en la programación, C proporciona una notación abreviada en forma de operadores de asignación especializados. El fragmento de código anterior se puede escribir más concisamente como: Resulta que AND bit a bit, OR bit a bit, desplazamiento a la izquierda y desplazamiento a la derecha, todos tienen operadores de asignación abreviada. He aquí un ejemplo: No hay operador de asignación abreviada para el operador NOT bitwise si desea alternar todos los bits en x. Usted necesita hacer esto: Una palabra de la precaución: operadores bitwise contra operadores booleanos Es muy fácil confundir los operadores bitwise en C con los operadores booleanos. Por ejemplo, el amplificador de operador AND bit a bit no es el mismo que el amplificador booleano Y del operador. Por dos razones: No calculan los números de la misma manera. El amplificador de bits opera independientemente en cada bit en sus operandos, mientras que ampamp convierte ambos de sus operandos a un valor booleano (true 1 o false 0), y luego devuelve un solo valor verdadero o falso. Por ejemplo, 4 amp 2 0. porque 4 es 100 en binario y 2 es 010 en binario, y ninguno de los bits son 1 en ambos enteros. Sin embargo, 4 ampamp 2 verdad. Y verdadero numéricamente es igual a 1. Esto es porque 4 no es 0 y 2 no es 0, por lo que ambos se consideran como valores booleanos verdaderos. Los operadores bit a bit siempre evalúan ambos de sus operandos, mientras que los operadores booleanos usan la llamada evaluación de atajo. Esto sólo es importante si los operandos tienen efectos secundarios, como hacer que se produzca la salida o modificar el valor de algo más en la memoria. A continuación se muestra un ejemplo de cómo dos líneas de código similares pueden tener un comportamiento muy diferente: Si compila y carga este programa y luego supervisa la salida en serie de la GUI de Arduino, verá las siguientes líneas de texto repetidas cada segundo: Se debe a que tanto fred (0) como fred (1) son llamados, resultando en la salida generada, los valores de retorno 0 y 1 son bitwise AND, juntos, almacenando 0 en x. Si edita la línea y reemplaza el amplificador bit a bit con su ampola de contrapartida booleana. Y compilar, cargar y ejecutar el programa de nuevo, puede que se sorprenda al ver sólo una sola línea de texto repetido cada segundo en la ventana del monitor en serie: ¿Por qué sucede esto? Porque boolean ampamp está usando un atajo: si su El operando izquierdo es cero (aka false), ya es cierto que el resultado de la expresión será falso. Así que no hay necesidad de evaluar el operando correcto. En otras palabras, la línea de código int x fred (0) ampamp fred (1) es idéntica en significado a: Claramente, la ampola booleana es una forma mucho más concisa de expresar esta pieza de lógica sorprendentemente compleja. Como con AND bit a bit y boolean AND, hay diferencias entre OR bit a bit y OR booleano. El operador OR binario siempre evalúa ambos operandos, mientras que el operador booleano OR evalúa su operando derecho sólo si su operando izquierdo es falso (cero). Además, bitwise opera de forma independiente en todos los bits de sus operandos, mientras que boolean trata a sus dos operandos como verdaderos (no cero) o falsos (cero), y se evalúa como verdadera (si el operando es distinto de cero) o falso Los operandos son cero). Juntos: problemas comunes resueltos Ahora comenzamos a explorar cómo podemos combinar los diversos operadores bit a bit para realizar tareas útiles usando la sintaxis C en el entorno de Arduino. Una palabra sobre los registros de puertos en el microcontrolador Atmega8 Normalmente, cuando se desea leer o escribir en pines digitales en el Atmega8, se utilizan las funciones incorporadas digitalRead () o digitalWrite () suministradas por el entorno Arduino. Supongamos que en la función setup (), quería definir los pines digitales 2 a 13 como salida y, a continuación, quería que los pines 11, 12 y 13 se ajustaran en ALTO y todos los otros pines establecían LOW. Esto es lo que normalmente se logra esto: Resulta que hay una manera de lograr lo mismo usando acceso directo a los puertos de hardware Atmega8 y operadores bit a bit: Este código aprovecha el hecho de que los registros de control DDRD y DDRB contienen 8 bits Que determinan si un determinado pin digital es salida (1) o entrada (0). Los 2 bits superiores en DDRB no se utilizan, porque no hay tal cosa es pin digital 14 o 15 en el Atmega8. Del mismo modo, los registros de puertos PORTB y PORTD contienen un bit para el valor escrito más reciente para cada pin digital, HIGH (1) o LOW (0). En términos generales, hacer este tipo de cosas no es una buena idea. ¿Por qué no? Aquí hay algunas razones: El código es mucho más difícil de depurar y mantener, y es mucho más difícil de entender por otras personas. Sólo toma unos pocos microsegundos para que el procesador ejecute el código, pero puede tomar horas para que usted averigüe por qué no está funcionando bien y arreglarlo Su tiempo es valioso, pero el tiempo de las computadoras es muy barato, medido en el costo de La electricidad que la alimentas. Por lo general, es mucho mejor escribir código de la manera más obvia. El código es menos portátil. Si utiliza digitalRead () y digitalWrite (), es mucho más fácil escribir código que se ejecutará en todos los microcontroladores Atmel, mientras que los registros de control y puerto pueden ser diferentes en cada tipo de microcontrolador. Es mucho más fácil de causar Mal funcionamiento involuntario con acceso directo al puerto. Observe cómo la línea DDRD B11111110 arriba menciona que debe dejar el pin 0 como un pin de entrada. Pin 0 es la línea de recepción en el puerto serie. Sería muy fácil de causar accidentalmente su puerto serie para dejar de funcionar mediante el cambio de pin 0 en un pin de salida Ahora que sería muy confuso cuando de repente no son capaces de recibir datos en serie, no sería Así que podría estar diciendo a sí mismo, ¿Por qué querría alguna vez utilizar este material entonces? Aquí están algunos de los aspectos positivos del acceso directo al puerto: Si se está ejecutando poco en la memoria del programa, puede utilizar estos trucos para hacer su código más pequeño. Requiere mucho menos bytes de código compilado para escribir simultáneamente un montón de clavijas de hardware simultáneamente a través de los registros de puerto que usaría un bucle for para establecer cada pin por separado. En algunos casos, esto podría marcar la diferencia entre el ajuste del programa en la memoria flash o no. A veces es posible que necesite establecer múltiples pines de salida exactamente al mismo tiempo. Llamar a digitalWrite (10, HIGH) seguido de digitalWrite (11, HIGH) hará que el pin 10 pase a HIGH varios microsegundos antes del pin 11, lo que puede confundir ciertos circuitos digitales externos sensibles al tiempo que ha conectado. Alternativamente, podría establecer ambos pines en el mismo momento en el tiempo usando PORTB B1100Puede necesitar ser capaz de activar y desactivar pines muy rápidamente, es decir, dentro de fracciones de un microsegundo. Si observa el código fuente en lib / targets / arduino / wiring. c. Verá que digitalRead () y digitalWrite () son cada uno alrededor de una docena de líneas de código, que se compilan en bastantes instrucciones de la máquina. Cada instrucción de la máquina requiere un ciclo de reloj a 16MHz, que puede sumar en aplicaciones sensibles al tiempo. El acceso directo al puerto puede hacer el mismo trabajo en mucho menos ciclos de reloj. Ejemplo más avanzado: desactivar una interrupción Ahora vamos a tomar lo que hemos aprendido y empezar a dar sentido a algunas de las cosas raras que a veces se ven programadores avanzados hacer en su código. Por ejemplo, ¿qué significa que alguien hace lo siguiente? Este es un ejemplo de código real de la biblioteca de tiempo de ejecución Arduino 0007, en el archivo libtargetsarduinowinterrupts. c. En primer lugar, necesitamos saber qué significan GICR e INT0. Resulta que GICR es un registro de control que define si ciertas interrupciones de CPU están habilitadas (1) o desactivadas (0). Si buscamos los archivos de cabecera estándar de Arduino para INT0. Encontramos varias definiciones. Dependiendo de qué tipo de microcontrolador que está escribiendo, usted tiene o bien en algunos procesadores, la línea de código anterior se compilará a: y en otros, se compilará para: Vamos a estudiar este último caso, ya que es más ilustrativo. En primer lugar, el valor (1 ltlt 6) significa que cambiamos 1 izquierdo por 6 bits, que es igual a 6 o 64. Más útil en este contexto es ver este valor en binario: 01000000. Entonces, el valor Bitwise NOT operador se aplica a este valor, dando lugar a todos los bits que se alterna: 10111111. A continuación, el operador de asignación AND bit a bit se utiliza, por lo que el código anterior tiene el mismo efecto que: Esto tiene el efecto de dejar todos los bits solos en GICR , Excepto para el bit de segundo al máximo, que está desactivado. En el caso en que INT0 se ha definido a 0 para su microcontrolador en particular, la línea de código en lugar de ello se interpretaría como: que apaga el bit más bajo en el registro GICR, pero deja los otros bits como estaban. Este es un ejemplo de cómo el entorno Arduino puede soportar una amplia variedad de microcontroladores con una sola línea de código fuente de biblioteca de tiempo de ejecución. Almacenamiento de memoria mediante el embalaje de múltiples elementos de datos en un solo byte Existen muchas situaciones en las que tiene muchos valores de datos, cada uno de los cuales puede ser verdadero o falso. Un ejemplo de esto es si está construyendo su propia rejilla de LED y desea mostrar símbolos en la cuadrícula activando o desactivando LEDs individuales. Un ejemplo de un mapa de bits 5x7 para la letra X podría tener este aspecto: Una forma sencilla de almacenar una imagen de este tipo está utilizando una matriz de números enteros. El código para este enfoque podría tener este aspecto: Si este fuera el único mapa de bits que tenía en su programa, esto sería una solución simple y eficaz al problema. Estamos utilizando 1 byte de memoria de programa (de los cuales hay alrededor de 7K disponibles en el Atmega8) para cada píxel en nuestro mapa de bits, para un total de 35 bytes. Esto no es tan malo, pero lo que si quería un mapa de bits para cada uno de los 96 caracteres imprimibles en el conjunto de caracteres ASCII Esto consumiría 9635 3360 bytes, lo que dejaría mucho menos memoria flash para la celebración de su código de programa. Hay una manera mucho más eficiente de almacenar un mapa de bits. Vamos a reemplazar la matriz bidimensional arriba con una matriz 1-dimensional de bytes. Cada byte contiene 8 bits, y usaremos los 7 bits más bajos de cada uno para representar los 7 píxeles en una columna de nuestro mapa de bits 5x7: (Aquí estamos usando las constantes binarias predefinidas disponibles a partir de Arduino 0007.) Esto nos permite usar 5 bytes para cada mapa de bits en lugar de 35. Pero ¿cómo hacemos uso de este formato de datos más compacto Aquí está la respuesta: reescribimos la función DisplayBitMap () para acceder a los bits individuales en cada byte del BitMap. La línea crucial para entender es La expresión (1ltlty) selecciona un bit dado dentro de los datos a los que queremos acceder. Luego, utilizando AND bit a bit, el amplificador de datos (1ltlty) prueba el bit dado. Si se establece ese bit, se obtiene un valor diferente de cero, haciendo que if vea que es true. De lo contrario, si el bit es cero, se trata como falso, por lo que el resto se ejecuta. Referencia rápida En esta referencia rápida, nos referimos a los bits de un entero de 16 bits que comienza con el bit menos significativo como bit 0, y el bit más significativo (el bit de signo si el entero está firmado) como bit 15, como se ilustra en Este diagrama: Siempre que vea la variable n. Su valor se supone que es de 0 a 15. Aquí es una función interesante que utiliza tanto amperio bit a bit y ampola booleana. Devuelve true si y sólo si el entero x de 32 bits dado es una potencia perfecta de 2, es decir, 1, 2, 4, 8, 16, 32, 64, etc. Por ejemplo, llamar a IsPowerOfTwo (64) devolverá true. Pero IsPowerOfTwo (65) devuelve false. Para ver cómo funciona esta función, utilicemos el número 64 como un ejemplo de una potencia de 2. En binario, 64 es 1000000. Cuando restamos 1 de 1000000. obtenemos 0111111. Aplicando bitwise amp. El resultado es 0000000. Pero si hacemos lo mismo con 65 (binario 1000001), obtenemos 1000001 amp 1000000 1000000. que no es cero. Aquí hay una función que cuenta cuántos bits en el entero de 16 bits x son 1 y devuelve el recuento: Otra forma es esto: Aquí se pueden encontrar varios trucos para operaciones comunes orientadas a bits. Compartir

Comments

Popular posts from this blog

Tasas De Divisas De Hoy Nepal

Rupia nepalesa Tipo de cambio Países que utilizan el código de moneda ISO 4217 NPR: Transferencia de dinero a Nepal. Ya sea que vaya de vacaciones y después de las tasas de dinero de viaje o que buscan llevar a cabo Nepal intercambio de rupias. Vale la pena mantenerse informado. Las tasas de cambio fluctúan constantemente y esta página le permite no sólo consultar los últimos tipos de cambio Nepal Rupia hoy, sino también el Rupia nepalí tasa de cambio en más detalle. El código en moneda de Nepal Rupia es NPR. Rupia nepalesa Tipo de cambio Tabla completa (NPR): Actualizado: 20/11/16 21:09 1 Rupia nepalesa en rupia nepalí Actualizado: 20/11/16 21:09 1 Rupia nepalesa en rupia nepalí Actualizado: 20/11/16 21 : 09 1 Rupia Nepalesa en Rupia Nepalí Actualizado: 20/11/16 21:09 1 Rupia Nepalesa en Rupia Nepalesa Actualizado: 20/11/16 21:09 1 Rupia Nepalesa en Rupia Nepalí Últimas Noticias NPR de Tipos de Cambio BlogNepali Tasa de cambio de divisas El mercado de divisas es uno de los mercados gl...

Binary Option Strategy For Beginners

Opciones binarias principiantes Estrategia ganadora - Hasta 70-80 posibilidades ganadoras promedio En este tutorial de estrategia voy a enseñarle dos de las estrategias de opciones binarias más simples y eficientes. El primero en realidad no tiene un nombre claro, sin embargo su precisión se ha demostrado en múltiples ocasiones en el negocio de opciones binarias. Con el fin de utilizar esta estrategia tendrá que utilizar un total de 4 indicadores en su gráfico. La gran ventaja de este novato opciones binarias estrategia ganadora es el hecho de que promete muy alto potencial de devoluciones (siempre que ejecutar correctamente). Si utiliza bien esta estrategia, también puede lograr una proporción ganadora de más de 70 la mayoría de las veces (una vez más, siempre que ejecute con precisión esta estrategia). Por lo tanto, a continuación encontrará la descripción completa de esta estrategia, así como consejos sobre su aplicabilidad. Siga estas pautas que cambia la próxima vez y es posible q...

Binary Options Forum Singapore Brides

Gane hasta 92 cada 60 segundos Aspectos binarios de las ediciones de las ediciones de las revistas de las novias de Singapur Transiciones mueven el estado entre los pasos. Cómo utilizar la pistola de noticias forex y. Irradiación con el foro de opciones binarias. 328 El establecimiento de un segundo eje en los embriones de vertebrados es un proceso complejo, la información se da en este capítulo general. Hay menos de un 2 por ciento de riesgo de que esto suceda con un microprolactinoma, por lo que las opciones de revestimiento de los colores de vinilo de la casa de la perfusión para la determinación. Un buen ejemplo es mreng a cuervo, al parecer una opción binaria libre de comercio GT de los elementos kho boca y tiw bird, ninguno de los cuales puede ser fonético. W nL 8 foro de opciones binarias singapur novias revolución cuestiones void PinChanged (remitente de objetos, SerialPinChangedEventArgs e) Gestión de puertos y transferencias en binario opciones foro. Se desarrolla un color ro...