Documento sobre la programación para el control de giro de tres motores, con base en el número de vueltas de cada uno, obtenido a partir de sensores de pulsos.
En el sistema informático, la secuencia de inicio o inicio es el proceso de iniciar el sistema de la pc, que es el programa que ejecuta el BIOS cuando se enciende la computadora el cual es responsable de la inicialización del sistema operativo y el equipo.
En el sistema informático, la secuencia de inicio o inicio es el proceso de iniciar el sistema de la pc, que es el programa que ejecuta el BIOS cuando se enciende la computadora el cual es responsable de la inicialización del sistema operativo y el equipo.
Proceso Paralelo
Es un tipo de proceso asimilable a los grandes sistemas. Consiste básicamente en procesar varias operaciones de modo simultáneo por distintas unidades centrales. En realidad, estamos en un ámbito de proceso cooperativo que implica una arquitectura de microprocesadores ligados entre sí y compartiendo tareas.
Proceso Paralelo
Es un tipo de proceso asimilable a los grandes sistemas. Consiste básicamente en procesar varias operaciones de modo simultáneo por distintas unidades centrales. En realidad, estamos en un ámbito de proceso cooperativo que implica una arquitectura de microprocesadores ligados entre sí y compartiendo tareas.
En este documento se presenta el desarrollo del proyecto de Ingeniería en Sistemas Digitales y Robótica, basado en el desarrollo de FESTO, Air_ray. Todos los derechos de propiedad pertenecen a FESTO. Este proyecto es solamente de carácter académico y con propósito educativo.
Propuesta de proyecto sobre interfaz mioeléctrica para el control de dispositivos electrónicos, incluso un miembro prostético. Presenta antecedentes y breves fundamentos teóricos.
Documento que presenta la evaluación ambiental del impacto del desecho de pilas en México. Abarca análisis ¿Qué pasa si?, Índice de Mond y mapa de riesgos.
Control de un robot de dos grados de libertad mediante visiónBronson Duhart
Documento sobre el desarrollo de una interfaz hombre-máquina para controlar la posición de un brazo robótico de 2 GDL a través de la cámara web de una computadora, a partir de reconocimiento de colores.
Resultado final: https://www.youtube.com/watch?v=sAGT6oBefyg
Programación Y Simulación De Robot SCARA, presentaciónBronson Duhart
Presentación sobre la programación para el control de giro de tres motores, con base en el número de vueltas de cada uno, obtenido a partir de sensores de pulsos.
Diseño, simulación y control de la dinámica de un robot planar de dos grados ...Bronson Duhart
Documento sobre el modelado, control y simulación de un robot planar de 2 GDL elaborado para la materia de Realidad Virtual y Simulación en la carrera de Ingeniería en Sistemas Digitales y Robótica.
Diseño, simulación y control de la dinámica de un robot planar de dos grados ...Bronson Duhart
Presentación de resultados sobre el modelado, control y simulación de un robot planar de 2 GDL elaborado para la materia de Realidad Virtual y Simulación en la carrera de Ingeniería en Sistemas Digitales y Robótica.
Criterios de la primera y segunda derivadaYoverOlivares
Criterios de la primera derivada.
Criterios de la segunda derivada.
Función creciente y decreciente.
Puntos máximos y mínimos.
Puntos de inflexión.
3 Ejemplos para graficar funciones utilizando los criterios de la primera y segunda derivada.
Caso Prático de Análise de Vibrações em Ventilador de ExtraçãoCarlosAroeira1
Caso Prático de Análise de Vibrações em Ventilador de Extração apresentado durante a Reunião do Vibration Institute realizada em Lisboa no dia 24 de maio de 2024
Aletas de Transferencia de Calor o Superficies Extendidas.pdfJuanAlbertoLugoMadri
Se hablara de las aletas de transferencia de calor y superficies extendidas ya que son muy importantes debido a que son estructuras diseñadas para aumentar el calor entre un fluido, un sólido y en qué sitio son utilizados estos materiales en la vida cotidiana
TR-514 (3) - BIS copia seguridad DOS COLUMNAS 2024 1.6.24 PREFERIDO.wbk.wbk S...
Programación Y Simulación De Robot SCARA, documento
1. PROGRAMACIÓN Y SIMULACIÓN DE
ROBOT SCARA
Lenguaje ensamblador
B. Amauri Montoya Duhart
Ernesto Álvarez Casillas
Jessica Ramírez Bustamante
Julio Cesar de la Rosa Montalvo
Víctor García Alfaro
Prof. José Eduardo Chairez Veloz
09/12/14
2. 1
Contenidos
CONTENIDOS 1
RESUMEN 3
INTRODUCCIÓN 3
OBJETIVO 5
MARCO TEÓRICO 6
LENGUAJE ENSAMBLADOR 6
MICROCONTROLADORES Y PIC’S 7
RELOJ Y MODOS DE DIRECCIONAMIENTO 8
TIMER 0 10
JUEGO DE INSTRUCCIONES 12
DESARROLLO 14
ANÁLISIS DEL PROBLEMA 14
DIAGRAMA DE FLUJO 16
PROGRAMA 18
ENSAMBLE DEL PROGRAMA 21
DIAGRAMA Y SIMULACIÓN 22
RESULTADOS 22
FUNCIONAMIENTO 22
RESTRICCIONES 26
4. 3
Resumen
En este trabajo presentamos de una manera clara y estructurada el proceso de desarrollo
de un programa en lenguaje ensamblador para el control de posición de los actuadores
de un robot SCARA, basado en el repertorio del PIC16F84A manufacturado por
Microchip, así como el diseño esquemático del circuito eléctrico y la posterior simulación
del firmware generado, dentro del software Proteus 8.
El programa resuelve la siguiente problemática:
Se tienen tres actuadores y una posición deseada fija para cada uno de ellos, las
posiciones de cada motor están dadas por el número de vueltas de los motores. El
programa se inicia detectado un objeto en un punto a través de un switch. Después, los
motores comenzaran a moverse hasta la posición dada. Entonces enciende un LED que
indica cuando el motor ha llegado a su posición. El programa se reinicia después de 4
segundos, listo para detectar un nuevo objeto.
Introducción
El lenguaje ensamblador es un lenguaje de programación de bajo nivel para las
computadoras, microprocesadores, microcontroladores y otros circuitos integrados
programables. Implementa una representación simbólica de los códigos-máquina
binarios y otras constantes necesarias para programar una arquitectura dada al CPU.
Esta representación es usualmente definida por el fabricante de hardware, y está basada
en los mnemónicos que simbolizan los pasos de procesamiento (las instrucciones), los
registros del procesador, las posiciones de memoria y otras características del lenguaje.
5. 4
Los lenguajes ensambladores fueron primero desarrollados en la década de 1950,
cuando fueron referidos como lenguaje de programación de segunda generación, un
ejemplo el SOAP; era un lenguaje ensamblador de 1957 para el computador IBM 650,
fue utilizado principalmente en los inicios del desarrollo del software, cuando aún no se
contaba con potentes lenguajes de alto nivel y los recursos eran limitados. Actualmente
se utiliza con frecuencia en ambientes académicos y de investigación, especialmente
cuando se requiere la manipulación directa de hardware, alto rendimiento, o un uso de
recursos controlado y reducido.
Por otra parte, la robótica es un sinónimo de progreso y desarrollo tecnológico; los países
y las empresas que cuentan con una fuerte presencia de robots no solamente consiguen
una extraordinaria competitividad y productividad, sino también transmiten una imagen
de modernidad, en los países más desarrollados. Las inversiones en tecnologías
robóticas han crecido de forma significativa y muy por encima de otros sectores. No
obstante, el conocimiento sobre robótica de la mayoría de la sociedad es muy limitado.
Desafortunadamente, las inversiones en la investigación en robótica han ido
disminuyendo en el mundo los últimos años, lo que contrasta con el incremento de los
esfuerzos investigadores en esta área, la robótica tiene como intención final
complementar o sustituir las funciones de los humanos, alcanzando, en algunos
sectores, aplicaciones masivas. En el contexto industrial, donde se utilizan con notable
éxito desde hace varias décadas.
El presente trabajo es un intento de nuestra parte, como ingenieros en formación, por
dejar antecedentes introductorios en el tema de la robótica y el diseño de firmware para
sistemas embebidos orientados al uso en robóica.
6. 5
Objetivo
Objetivo general: integrar de manera exitosa los conocimientos logrados a lo largo del
curso acerca de hardware y programación en lenguaje ensamblador, para poder
completar el análisis de un problema de ingeniería determinado, identificando entradas
y salidas del sistema, generando un algoritmo de solución e implementando la solución
obtenida en un fichero fuente que se pondrá a prueba mediante la simulación en Proteus
del fichero objeto construido a partir de éste.
Objetivos específicos:
Descomponer un problema dado en partes menores, más fáciles de analizar,
siguiendo una metodología establecida.
Identificar entradas y salidas de un sistema.
Desarrollar un algoritmo de solución al problema.
Traducir el algoritmo desarrollado a lenguaje ensamblador.
Ensamblar el fichero fuente producido en un fichero objeto en lenguaje
máquina.
Diseñar el esquema del circuito que resolverá el problema y probar el
firmware generado en dicho esquema.
7. 6
Marco teórico
Lenguaje ensamblador
Se denomina lenguaje máquina a la serie de datos que la parte física de la computadora
o hardware, es capaz de interpretar. Una computadora digital o, mejor dicho, su parte
física, sólo distingue datos de tipo binario, es decir, constituidos por dos únicos valores
a los que se denomina valor 0 y valor 1. Para representar datos que contengan una
información se utilizan una serie de unos y ceros cuyo conjunto indica dicha información.
La información que hace que el hardware de la computadora realice una determinada
actividad se llama instrucción. Por consiguiente, una instrucción es un conjunto de unos
y ceros. Las instrucciones así formadas equivalen a acciones elementales de la máquina,
por lo que al conjunto de dichas instrucciones que son interpretadas directamente por la
máquina se denomina lenguaje máquina. Vemos, pues, que la forma de indicar a la
máquina lo que debe hacer es totalmente diferente de la indicar a un ser humano lo
mismo, por lo que deben emplearse sistemas de traducción de una forma a otra.
Las ventajas de esto son evidentes, ya que para el hombre resulta más fácil manipular
grupos de caracteres y la traducción se hace de manera automática.
Al grupo alfabético se le denomina mnemotécnico o mnemónico, y existirá un mnemónico
por cada instrucción. Se le da este nombre porque sirve para recordar con mayor facilidad
el conjunto de instrucciones de una determinada máquina.
De esta forma aparecieron los lenguajes ensambladores (Assembler, en inglés). Poco a
poco, con el avance de la programación (Software), estas primeras y sencillas ayudas se
fueron haciendo más complejas, permitiendo que, además de los mnemónicos
correspondientes a la operación a realizar, se pudieran emplear otros para indicar, por
ejemplo, los operandos. También se introdujo la posibilidad de indicar a la computadora
la dirección de un salto en la secuencia de ejecución de un programa mediante la
utilización de etiquetas.
8. 7
A los programas que permiten pasar del programa escrito de esta manera (programa
fuente, en ensamblador) al lenguaje máquina también se les denomina normalmente
ensambladores. Estos traductores, como ya se ha dicho, se fueron complicando cada
vez más para que la labor del programador fuera más fácil, incluyendo los denominados
directivos del ensamblador, que son órdenes o informaciones que el programador da al
traductor, no instrucciones de lenguaje máquina.
El programador de lenguaje ensamblador debe conocer perfectamente el sistema físico
(Hardware) de la máquina con que trabaja, pues aunque emplee mnemónicos y
etiquetas, éstas sirven para indicar una posición de memoria determinada, un registro o
cualquier otra parte de la máquina. Por eso se dice que el lenguaje ensamblador es un
lenguaje de bajo nivel, es decir, ligado con el hardware concreto de una determinada
máquina. Éste trabaja con variables, constantes e instrucciones simbólicas, y es el
traductor quien las transforma en las direcciones apropiadas. (Paszniuk, 2013)
Microcontroladores y PIC’s
En el mundo de las computadoras existe una infinidad de términos y clasificaciones de
los sistemas empleados. Un ejemplo de esto es la categorización de microprocesadores
y microcontroladores.
Un microprocesador (µP) es la unidad informática que lleva a cabo el procesamiento de
datos, es decir, las operaciones y el control de estos. Consiste en una unida lógico-
aritmética, una unidad de control y registros que son memoria interna y sencilla del
microprocesador. Sin embargo, de nada serviría la información que el µP produce si no
se puede comunicar al exterior para usarla en algún proceso. Entonces el dispositivo del
µP debe conectarse a memoria externa y a dispositivos periféricos para la entrada y
salida de datos (I/O’s) mediante buses de datos, control y dirección. Nótese que ninguno
de estos elementos mencionados forma parte del dispositivo del µP, son todos ajenos a
él. (Tocci)
9. 8
Para algunas aplicaciones, resulta más conveniente tener la memoria y los I/O’s
integrados junto con otras funciones dentro de un mismo circuito. Esto es lo que se
conoce como microcontrolador (µC). La principal diferencia entre un µP y un µC es que
el segundo es básicamente un sistema cerrado, integra todo lo necesario dentro de sí
mimo, conectado a través de buses internos. Esto, a su vez, lo hace un sistema limitado
a sólo ciertas aplicaciones. Se puede entender que un µP es más general, mientras que
los µC’s son para sistemas específicos.
Dentro de los µC’s más conocidos se
halla la gama PIC (Peripheral Interface
Controller) creada y manufacturada por
Microchip. En especial está el
PIC16F84A, un poderoso µC de 8bits con
tiempos ejecución de 200 ns, 35
instrucciones y una memoria
Flash/EEPROM CMOS; en un empaquetado de 18 pines. (Microchip, s.f.)
Entre sus usos, se hallan aplicaciones automotrices, industriales, de sensores remotos
de baja potencia y de seguridad.
Reloj y modos de direccionamiento
Un µC contiene dentro un µP, así que la función del reloj en el primero será similar a
aquella en el segundo. Los µP’s operan como máquinas secuenciales, esto significa que
las salidas que produzcan dependerán del orden en que reciben sus entradas. Para
poder seguir el rastro de este orden es necesario sincronizar el sistema de alguna
manera, por esto se utiliza un reloj.
En el µP, el reloj se encarga de proporcionar la sincronización a los datos tal que las
operaciones sólo se hagan coincidir con determinados pulsos del reloj. Mientras no haya
pulso alguno, no se llevará a cabo ninguna actividad.
10. 9
Además del µP, algunos otros elementos internos del µC también son secuenciales y
requieren de un reloj para funcionar. Algunos ejemplos son los convertidores analógico-
digitales y digital-analógicos y los puertos para comunicación serial.
La señal de reloj se puede obtener a partir de un oscilador de cristal de cuarzo conectado
al dispositivo, un oscilador RC o de un oscilador con cristal integrado TTL. (Práctica No.1)
Los modos de direccionamiento de un procesador son las diferentes formas de
transformación del campo de operando de la instrucción en la dirección del operando.
Existen varias técnicas de direccionamiento con la finalidad de dar versatilidad al
programador y de reducir el número de bits del campo de operando. Hay cinco modos
generales de direccionamiento: implícito, inmediato, directo, indirecto y relativo.
Modo de direccionamiento implícito
En este tipo de direccionamiento, el operando se especifica en la misma definición de la
instrucción. El operando puede ser un registro, cuando la operación se refiere a un
registro particular, o un operando de la pila, cuando la operación se realiza siempre en
la cima de ésta.
Modo de direccionamiento inmediato
Consiste en el valor del operando situado en el campo de operando mismo. Es usado en
la inicialización de registros con valores constantes.
Modo de direccionamiento directo
En este modo, el campo de operando contiene ya la dirección de memoria del operando.
Es útil cuando los programas siempre se sitúan en la misma zona de memoria
(ordenadores pequeños), ya que puede dificultar su relocalización, que es la
independencia del código con respecto a su situación de memoria. También se usa con
direcciones de sistema o I/O que no cambian.
11. 10
Modo de direccionamiento indirecto
Aquí, el campo de operando contiene una dirección en donde se sitúa la dirección
efectiva del operando. La primera dirección puede ser un registro que contenga la
dirección de memoria con el operando; este es el caso de los punteros.
Modo de direccionamiento relativo
Es útil para generar programas con código relocalizable, pues considera la diferencia
entre la ubicación del operando y algún punto de referencia en la memoria, guardado en
un registro. El punto de referencia suele ser el registro contador de programa. En este
caso, el campo de operando contiene un desplazamiento u offset. (Departamento de
informática)
Timer 0
El Timer 0 es un módulo temporizador/contador de 8 bits que cuenta con un preescalador
programable también de 8 bits. Puede funcionar como temporizador o como contador.
En modo temporizador el valor del registro TMR0 se incrementa con cada ciclo de
instrucción (o cada X ciclos dependiendo del preescalador). En modo contador el valor
del registro TMR0 se incrementa en cada flanco (ascendente o descendente) del pin
RA4/T0CKI. En ambos casos al desbordarse (pasar de 0xFF a 0x0) el registro TMR0 la
bandera de interrupción del Timer 0 (bit T0IF del registro INTCON) se pone a 1.
El modo temporizador se selecciona poniendo a cero el bit T0CS del registro
OPTION_REG. Poniendo a uno ese bit el modulo trabaja en modo contador, en este
modo de operación además se debe seleccionar si el incremento se producirá en cada
flanco ascendente o descendente, al poner a cero el bit T0SE del registro OPTION_REG
se selecciona el filo ascendente.
12. 11
El preescalador es compartido por el Timer 0 y por el Watchdog. Se asigna a un módulo
o a otro mediante el bit PSA del registro OPTION_REG. Poniendo el bit a 1 el
preescalador se asigna al Watchdog y poniendolo a 0 el preescalador se asigna al Timer
0. El valor del preescalador se selecciona con los bits PS2:PS0 de la siguiente manera:
PS2:P20 TMR0 WDT
000 1:2 1:1
001 1:4 1:2
010 1:8 1:4
011 1:16 1:8
100 1:32 1:16
101 1:64 1:32
110 1:128 1:64
111 1:256 1:128
Tabla 1
En modo temporizador el Timer 0 incrementa su cuenta en cada ciclo de instrucción. Este
modo sirve para generar temporizaciones y bases de tiempo de la misma forma que los
retardos por software, sin embargo las temporizaciones con el Timer 0 pueden ser más
exactas y además se cuenta con la ventaja de que el módulo puede trabajar mediante
interrupciones así que el programa puede ejecutar otras instrucciones mientras se realiza
la temporización. (El temporizador Timer 0 en los microcontroladores PIC., n.d.)
13. 12
La temporización que se puede obtener con este módulo se obtiene de la siguiente
relación:
𝑇 = 𝑇𝑖𝑛𝑠𝑡 𝑃𝑆(256 − 𝑝𝑟𝑒𝑐𝑎𝑟𝑔𝑎)
Donde:
𝑇: temporización obtenida
𝑇𝑖𝑛𝑠𝑡: 4/frecuencia de oscilación
𝑃𝑆: preescalador, si se asigna al Watchdog, tendrá valor de 1
𝑝𝑟𝑒𝑐𝑎𝑟𝑔𝑎: valor inicial del TMR0
La temporización máxima utilizando el oscilador interno del PIC16F84A es:
𝑇 𝑀 = 1 × 10−6(256)(256 − 0) = 65.536 𝑚𝑠
Juego de instrucciones
El juego de instrucciones de un microprocesador o microcontrolador es el conjunto de
entradas binarias que producen acciones definidas durante un ciclo de instrucción. Un
juego de instrucciones es para el microcontrolador lo mismo que una tabla de verdad es
para una puerta lógica, un registro de desplazamiento o un sumador. Por supuesto, las
acciones que realiza un microcontrolador con cada instrucción son más complejas que
las que realizan los dispositivos y puertas antes mencionados.
Las instrucciones de los microcontrolador PIC cumplen con las siguientes condiciones:
Juego de instrucciones reducido
Sencillas y rápidas
Ortogonalidad
Formato uniforme de las instrucciones
Formato uniforme de los datos
14. 13
Cada microprocesador o microcontrolador posee su propio juego de instrucciones en él
y su propia arquitectura interna. Por lo tanto, un programa escrito para determinado
modelo no funcionará en otro modelo distinto.
El repertorio completo de instrucciones del PIC16F84A se muestra en la imagen
siguiente. (Microchip, s.f.)
15. 14
Desarrollo
En esta sección se lleva a cabo el trabajo medular del proyecto. El método que se seguirá
se enumera a continuación.
1. Análisis inicial acerca de los requisitos del problema y asignación de
entradas y salidas.
2. Diagrama de flujo para el desarrollo del algoritmo.
3. Programación en lenguaje ensamblador, se incluye el código fuente.
4. Ensamble del código fuente en un código objeto útil.
5. Diseño del diagrama esquemático y simulación del programa dentro del
mismo.
Análisis del problema
Se repite la descripción del problema dada en el resumen:
Se tienen tres actuadores y una posición deseada fija para cada uno de ellos, las
posiciones de cada motor están dadas por el número de vueltas de los motores. El
programa se inicia detectado un objeto en un punto a través de un switch. Después, los
motores comenzaran a moverse hasta la posición dada. Entonces enciende un LED que
indica cuando el motor ha llegado a su posición. El programa se reinicia después de 4
segundos, listo para detectar un nuevo objeto.
16. 15
A partir de dicha descripción, se identifica que habrá dos entradas, para el sensor de
proximidad y para el sensor de giro de los motores. También se identifican seis salidas,
tres para cada motor y tres para sus respectivos indicadores de posición. Se decide
emplear una salida adicional como indicador de estado de espera Finalmente, se
muestra la asignación de entradas y salidas en la tabla siguiente.
Entrada Pin
Detector de proximidad RA0
Contador de vueltas RA4 (T0CKI)
Salida Pin
Indicador de posición 1 a 3 RB0-RB2
Motor 1 a 3 RB3-RB5
Indicador de espera RB7
Tabla 2
17. 16
Diagrama de flujo
TRISA ← 0xFF
TRISB ← 0x00
Guardar posiciones
deseadas (P1, P2, P3)
Encender Motor 1
Apagar LED 1
Configurar TMR0
como contador
Compara TMR0 con
P1
Inicio
RA1 == 1
Leer RA1
TMR0 == P1
1
1
Apagar Motor 1
Encender LED 1
Configurar TMR0
como contador
Encender Motor 2
Apagar LED 2
2
Sí
No
No
Sí
4
18. 17
Compara TMR0 con
P3
Fin
TMR0 == P3
3
Apagar Motor 3
Encender LED 3
Configurar TMR0
como temporizador
4 s
No
Sí
Compara TMR0 con
P2
TMR0 == P2
2
Apagar Motor 2
Encender LED 2
Configurar TMR0
como contador
Encender Motor 3
Apagar LED 3
3
No
Sí
4
19. 18
Programa
Al final, se produjo el siguiente fichero fuente, a partir de la traducción del algoritmo
mostrado en el diagrama de flujo a lenguaje ensamblador.
PROCESSOR P = 16F84A ; Indica el modelo de PIC a emplear
RADIX HEX ; Define la base numérica para las
; literales
__CONFIG H'3FF1' ; Define frecuencia de 4 MHz
;******************************************************************************************
STATUS EQU 0x03 ; Dirección de Status
TMR0 EQU 0x01 ; Dirección de TMR0
OPTION_REG EQU 0x81 ; Dirección de OPTION_REG
INTCON EQU 0x0B ; Dirección de INTCON
TRISA EQU 0x85 ; Dirección TRISA
TRISB EQU 0x86 ; Dirección TRISB
PORTA EQU 0x05 ; Dirección PORTA
PORTB EQU 0x06 ; Dirección PORTB
pos1 EQU 0x08 ; Posición de motor 1
pos2 EQU 0x0A ; Posición de motor 2
pos3 EQU 0x04 ; Posición de motor 3
w EQU 0x00 ; Registro w
z EQU 0x02 ; Zero flag
COUNT EQU 0x0C ; Cuenta
;******************************************************************************************
ORG 0 ; Directiva de procesador que indica
; dirección de inicio de código
;******************************************************************************************
IO_Setup
bsf STATUS, 5 ; Direcciona al banco 1 con STATUS_5
clrf TRISB ; PORTB salida
movlw 0x1F ; 5 entradas
movwf TRISA ; PORTA entrada
bcf STATUS, 5 ; Direcciona al banco 0 con STATUS_5
clrf PORTA ; Inicializar
clrf PORTB ; Inicializar
main
bsf STATUS, 5 ; Direcciona al banco 1 con STATUS_5
movlw b'11101000' ; Configuración: no pull-ups,
; flancos de subida, CLK interno
; prescaler 1:1 para TMR0 (se asigna a WDT)
movwf OPTION_REG ; Cargar configuración
bcf STATUS, 5 ; Direcciona al banco 0 con STATUS_5
20. 19
Pulsa
bsf PORTB, 7 ; PORTB_7 para indicar standby
nop ; Retardo para que sea visible el LED
nop ; Retardo para que sea visible el LED
nop ; Retardo para que sea visible el LED
nop ; Retardo para que sea visible el LED
bcf PORTB, 7 ; PORTB_7 para indicar standby
nop ; Retardo para que sea visible el LED
nop ; Retardo para que sea visible el LED
nop ; Retardo para que sea visible el LED
nop ; Retardo para que sea visible el LED
btfsc PORTA, 0 ; Pregunta si el pulsador está oprimido
goto Pulsa ; Si no lo está, continúa revisándolo
Motor1_ON
clrf TMR0 ; Reinicia TMR0
movlw 0x08 ; Enciende motor 1, apaga LED 1
movwf PORTB ; Escribe en la salida
TMR0_1
movf TMR0, w ; Copia TMR0 para comparar
xorlw pos1 ; x xor x = 0
btfss STATUS, z ; Si son iguales, hay bandera de cero
goto TMR0_1 ; Sigue contando
Motor1_OFF
movlw 0x01 ; Apaga motor 1, enciende LED 1
movwf PORTB ; Escribe en la salida
Motor2_ON
clrf TMR0 ; Reinicia TMR0
movlw 0x10 ; Enciende motor 2, apaga LED 2
iorwf PORTB ; Escribe en la salida
TMR0_2
movf TMR0, w ; Copia TMR0 para comparar
xorlw pos2 ; x xor x = 0
btfss STATUS, z ; Si son iguales, hay bandera de cero
goto TMR0_2 ; Sigue contando
Motor2_OFF
movlw 0x03 ; Apaga motor 2, enciende LED 2
movwf PORTB ; Escribe en la salida
Motor3_ON
clrf TMR0 ; Reinicia TMR0
movlw 0x20 ; Enciende motor 3, apaga LED 3
iorwf PORTB ; Escribe en la salida
TMR0_3
movf TMR0, w ; Copia TMR0 para comparar
xorlw pos3 ; x xor x = 0
btfss STATUS, z ; Si son iguales, hay bandera de cero
goto TMR0_3 ; Sigue contando
Motor3_OFF
movlw 0x07 ; Apaga motor 3, enciende LED 3
movwf PORTB ; Escribe en la salida
21. 20
Delay_4s
bsf STATUS, 5 ; Direcciona al banco 1 con STATUS_5
movlw b'11000111' ; Configuración: no pull-ups,
; flancos de subida, CLK interno
; prescaler 1:256 para TMR0
movwf OPTION_REG ; Cargar configuración
bcf STATUS, 5 ; Direcciona al banco 0 con STATUS_5
clrf TMR0 ; Inicializa
clrf COUNT ; Prepara cuenta
for1
TMR0_Wait
btfss INTCON, 2 ; Prueba si hay sobreflujo TMR0
goto TMR0_Wait ; Si no, sigue esperando
incf COUNT ; Cada que cuente hasta 255, COUNT++
bcf INTCON, 2 ; Reset INT0IF
movf COUNT, w ; Copia COUNT para comparar
xorlw 0x3D ; Cuando llegue a 61, 3.997 s
btfss STATUS, z ; Si son iguales, Z flag
goto for1 ; Si no, sigue esperando
RST
clrf PORTB ; Reinicia sistema
nop ; Retardo
nop ; Retardo
nop ; Retardo
nop ; Retardo
goto main ; Endless loop
nop ; Necesario para depurar última instrucción
END ; Fin
22. 21
Ensamble del programa
El proceso que se debe seguir para obtener un archivo objeto que se pueda grabar en la
memoria del PIC queda explicado gráficamente a continuación. En general, se seguirá
este procedimiento siempre que se lleve a cabo el desarrollo de un programa orientado
a sistemas embebidos.
Escritura
del código
fuente
Ensamble
del código
fuente
Revisión y
correción
de errores
Obtención
y grabado
de código
objeto
(.hex, .bin)
23. 22
Diagrama y simulación
Dentro del software de descripción de hardware y diseño esquemático, Proteus, se
realizó un circuito que satisficiera con los requisitos del problema. Además, se probó en
éste el programa antes mostrado.
Resultados
Funcionamiento
Una vez terminado el diseño esquemático, se pudo poner a prueba el programa que se
escribió. Los resultados se mostrarán en una secuencia de imágenes que presentan
cada etapa del funcionamiento del sistema para las siguientes posiciones:
Motor Posición (número de vueltas)
1 16
2 10
3 8
Tabla 3
24. 23
1. Inicio de sistema, espera que se presione el botón. Un LED indica estado de
stand-by.
2. Se presionó el botón (el sensor detectó un objeto); comienza a moverse el
primer motor. Un contador ayuda a verificar el número de vueltas que ha
completado el motor.
25. 24
3. Luego de que el primer motor alcanza su posición, se enciende el segundo.
Nuevamente, un contador muestra las vueltas del motor.
4. Cuando el segundo motor alcanza su posición, el tercero comienza su
movimiento.
26. 25
5. Una vez que los tres motores han completado el número de vueltas
correspondiente, todos se hallan en su posición y se encienden tres LED’s
que indican el final del programa. Comienza un retardo de cuatro segundos
(se verifica en el temporizador de la esquina superior derecha).
6. Finalmente el programa se reinicia, en espera del próximo objeto.
27. 26
Restricciones
En nuestro sistema se hallaron dos problemáticas. La primera de ellas se relaciona con
el esquema empleado para la simulación. En éste, se emplea un generador de pulsos
con una frecuencia de 5 Hz. El inconveniente consiste en que la sincronización entre el
primer motor y el contador de vueltas no coincide en todo momento. En algunas corridas
de simulación, el contador se atrasa una vuelta (el número es mayor a mayores
frecuencias). La causa de esto es que el contador se reinicia con flancos ascendentes
del botón y el retraso en la simulación del retorno del mismo se reflejaba en el contador.
La solución aplicada fue cambiar el reinicio del contador por flancos de bajada. Así, el
problema no volvió a ocurrir y se pudo aumentar la frecuencia de trabajo de los motores
a 10 Hz, como inicialmente se había diseñado.
28. 27
Nuestro segundo obstáculo está relacionado con la programación. Se encontró que el
valor que se asigna a __Config afecta el funcionamiento del programa.
En la hoja de datos del PIC16F84A se puede ver que existen bits de configuración que
le permiten al usuario personalizar aspectos del dispositivo de acuerdo a la aplicación.
Estos bits determinan el modo que empleará el dispositivo cuando se enciende. Dentro
del ensamblador de MPASM existe una característica que permite asignar estos bits de
configuración dentro del código fuente a través de la directiva __Config.
La posición de estos bits varía entre un modelo y otro. En la especificación de la
programación del PIC16F84A se halla su palabra de configuración particular. La imagen
siguiente muestra cómo está construida dicha palabra y qué significa cada bit.
En nuestro caso, el valor que causaba conflicto era 0x3FFD. Según se aprecia en la
imagen anterior, esto activa al Wathcdog y a un temporizador de arranque.
29. 28
Conclusiones personales
Amauri
A lo largo de la realización de este proyecto, aprendí a desarrollar firmware orientado al
PIC16F84A que resuelva algún problema de ingeniería planteado. Encontré que la
escritura de un programa en lenguaje ensamblador, aunque específica para cada µP o
µC empleado, de acuerdo a su repertorio particular, sigue un esquema común, con
mnemónicos similares y una lógica de programación parecida. Encuentro que la
programación de hardware en lenguaje ensamblador dota al diseñador de amplio control
sobre el comportamiento del sistema, sin embargo, también aparecen dificultades que
no se resuelven con la misma rapidez y simplicidad que en lenguajes de alto nivel.
Ernesto
Jessica
En la realización de este trabajo se consiguieron los objetivos propuestos logrando
programar el PIC16F84A para la simulación del robot aplicando todo el conocimiento
adquirido en la investigación y elaboración del marco teórico, para el lenguaje de dicho
programa se puede concluir que es un lenguaje de alto nivel y puede resultar útil para un
lenguaje ensamblador ya que ahorra tiempo en su programación, depuración y
simulación en todas las gama altas y ciertos PIC, por otra parte al implementar el
programa firmware podemos decir que funciona como el nexo entre las instrucciones que
llegan al robot desde el exterior simulado y sus diversas partes que lo constituyen.
30. 29
Julio
Víctor
Programar en lenguaje ensamblador no es diferente a utilizar otros lenguajes debido a
que las capacidades de los programas están limitados por las prestaciones del hardware
y de las capacidades del programador, por lo tanto puedo concluir que la forma en que
se resuelven los problemas en programación depende de las habilidades del
programador.
31. 30
Conclusión final
En este trabajo se aprendió la conveniencia de programar en un lenguaje de bajo nivel,
como lo es el lenguaje ensamblador. También se comprobaron las desventajas que
programar a un nivel tan cercano a la máquina puede implicar.
El lenguaje ensamblador provee un dominio alto sobre el funcionamiento del hardware y
permite controlar el cauce del programa, así como aumentar la eficiencia de código y de
tiempo; sin embargo, demanda un alto precio, pues exige que el programador tenga
profundo conocimiento acerca del dispositivo que utiliza y, al mismo tiempo, lo limita,
debido a que las instrucciones, registros y prestaciones son específicas del hardware,
por lo que se debe realizar todo un nuevo proceso de aprendizaje al programar un
dispositivo diferente.
Así, un gran peso del trabajo de diseño recae en las habilidades del programador para
entender hardware y detectar problemas de diseño durante la depuración de código, y
también de su capacidad de adaptación y aprendizaje.
Finalmente, verificamos la importancia de la comunicación entre un sistema embebido y
su mundo exterior, en particular aquellos sistemas embebidos orientados a la robótica,
pues es de trascendental importancia que el controlador reciba información de su entorno
para poder corregir el curso de su operación y resolver el problema para el cuál se
concibió su uso.
Podemos decir que los objetivos planteados en este proyecto se cumplieron
satisfactoriamente, con base en el dominio logrado en la programación en lenguaje
ensamblador de un microcontrolador y en los resultados obtenidos en nuestra solución,
cuyo rendimiento resuelve la situación que le dio origen y no presenta problemas de
funcionamiento.
32. 31
Referencias
Departamento de informática. (s.f.). Modos de direccionamiento. Obtenido de
www.infor.uva.es/~bastida/OC/modos.pdf
Detmer, R. (2001). Introduction to 80x86 assembly language and computer architecture.
Jones & Bartlett Computer Science.
El lenguaje ensamblador del PIC16F84A. (s.f.). Recuperado el octubre de 2014, de
Dispositivos lógicos microprogramables:
http://perso.wanadoo.es/pictob/ensamblador.htm
El temporizador Timer 0 en los microcontroladores PIC. (s.f.). Obtenido de Circuitos
electrónicos: http://www.circuitoselectronicos.org/2011/04/el-temporizador-timer-
0-en-los.html
Microchip. (s.f.). PIC16F84A. Obtenido de Microchip products:
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010230
33. 32
Paszniuk, R. (27 de abril de 2013). Introducción al lenguaje ensamblador. Obtenido de
Programación:
http://www.programacion.com.py/escritorio/ensamblador/introduccion-al-
lenguaje-ensamblador
Práctica No.1. (s.f.). Obtenido de Universidad autónoma de San Luis Potosí:
http://galia.fc.uaslp.mx/~cantocar/microprocesadores/PRACTICAS__Z80_PDF_
S/1_RELOJ_Y_RESET.PDF
Reiniertl. (26 de junio de 2008). Introducción a los temporizadores. Obtenido de
WikiTrónica: http://electronica.wikia.com/wiki/Introducción_a_los_temporizadores
Tocci, R. (s.f.). Digital Systems: Principles and Applications. Prentice Hall.
Wikipedia. (s.f.). Controlador lógico programable. Obtenido de Wikipedia:
http://es.wikipedia.org/wiki/Controlador_lógico_programable