Está en la página 1de 36

TE2024 Laboratorio de

Microcontroladores

Profesor: Genaro Sola Ortiz

Tarea Tipo: Reporte del proyecto


final

Fecha de Entrega: 23/11/2016


Alumnos:
Luis Alejandro Morales Linares
Campus Ciudad de Mxico A01335991
Escuela de Ingeniera y Oscar Antonio Hernndez Blas
Arquitectura A01324474

Calificacin
:

SISTEMA DE CONTROL DE MANO ROBOTICA BASADO EN


ATMEGA16
Descripcin del problema a solucionar
Se requiere implementar un sistema de control para una prtesis
robtica, con las siguientes caractersticas:

1. Controlar el movimiento de una mano robtica compuesta de 3 dedos,


por medio de la comparacin de una galga extensometrica configurada
en un guante, con la finalidad de que la mano imite el movimiento.
2. Desplegar en LCD las leyendas Abriendo o Cerrando segn el
movimiento de la mano.
3. Utilizar una botonera que pueda manipular la mano sin necesidad de
utilizar la galga o el guante. sta permitir manipular cada uno de los
dedos por separado.
4. Mandar de manera serial datos sobre el movimiento a una
computadora.
5. Implementar un sistema que permita guardar una rutina de
movimientos. Durante esta accin se desplegar Guardando en el
display y posteriormente reproducir dichos movimientos.

Diagramas elctricos de la solucin implementada


Para la lectura de las galgas se propuso generar tres canales de
adquisicin con un puente de Wheatstone por canal adaptado a un
amplificador de instrumentacin con ganancia 2. Esta configuracin nos
permitir tener un voltaje de alrededor de 0 cuando la galga de los
dedos est abierta totalmente y cuando se cierre un voltaje mayor
tambin as evitamos el ruido de la resistencia variable de la galga
adquiriendo un valor de voltaje ms estable.
El voltaje de salida del puente de wheatstone es 0 cuando las
resistencias estn en equilibrio, en este caso las resistencias de la galga
son de un valor de 10k cuando no tienen flexin por lo que se
configuraron resistencias de este valor (vase figura1). De esta forma al
flexionar la galga obtendremos un voltaje mayor lo que nos servir de
referencia para la lectura del ADC en el microcontrolador. Cabe
mencionar que se dise el canal para no sobrepasar los 5 volts de
entrada del microcontrolador poniendo la referencia del puente de
wheatstone en +5 volts.

+5 R1
+5
51k

R2 R3
10k 10k U1
7
1

3
6
R4 2

10k
4
8
5

AD620
GALGA EXTENSOMETRICA

-5

Figura 1. Configuracin del canal de adquisicin

Por otro lado se implement un sistema para controlar un LCD y


servomotores por medio de un guante adonde se acoplaron las galgas y
un teclado matricial (vase figura2).
C2
KBM LCD2
0.1u LM016L

C3
OSC
RV2 MOTOR 1 A
1u
MOTOR 2 B

VDD
VSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
51%
MOTOR 3 C
7 8 9

E
A A
D

1
2
3

4
5
6

7
8
9
10
11
12
13
14
+5v
1k
B B 4 5 6 +5 R2
+5
10k
1 2 3 R1

E
RS
C C +5v

DB4
DB5
DB6
DB7
RW
1k
U1 R2 R3
D D
ON
C 0 = + 10u
9

13
RESET

XTAL1
PC0/SCL
PC1/SDA
PC2/TCK
22
23
24
S1
S2 10k 10k U4

7
1
1

12 25
XTAL2 PC3/TMS
C1 PC4/TDO
26 3
40 27 6
D1 PA0/ADC0 PC5/TDI D1
39 28 2
D2
38
PA1/ADC1 PC6/TOSC1
29
S3 R4
D3 PA2/ADC2 PC7/TOSC2 S4
U1_GND

37
PA3/ADC3 10k
GALGA EXTENSOMETRICA dedo1

4
8
5
36 14
1

PA4/ADC4 PD0/RXD AD620


35 15
Play_off PA5/ADC5 PD1/TXD Send
34 16
U2 ADC_ON PA6/ADC6 PD2/INT0
33 17
SAVE_ON PA7/ADC7 PD3/INT1 DA
11 6 18
1 X1 KBM KBM PD4/OC1B Motor 2
10 5 1 19
2 X2 OSC OSC RS PB0/T0/XCK PD5/OC1A Motor 1
3
8
X3 U3:A RW
2
PB1/T1 PD6/ICP1
20
+5 R5
7 12 3 21
4 X4 DA DA E PB2/AIN0/INT2 PD7/OC2 Motor 3 +5
13 2 1 4
OE DA PB3/AIN1/OC0 -5 51k
5
DB4 PB4/SS
1 17 6
A Y1 A S1 7404 DB5 PB5/MOSI
2 16 7 32
B Y2 B S2 DB6 PB6/MISO AREF
3 15 8 30 R6 R7
C Y3 C S3 DB7 PB7/SCK AVCC
4 14
D Y4 D S4
ATMEGA16 10k 10k U5
MM74C922

7
1
3
6
D2
R8 2
D1
SAVE_ON Send RXD 10k

4
8
5
VT52, VT100, ANSI AD620
LED-GREEN GALGA EXTENSOMETRICA dedo2
TXD

D2 RTS
Xmodem, Ymodem, Zmodem
ADC_ON CTS
+5 R9
LED-BLUE +5
-5 51k
D3
Play_off
R10 R11
LED-RED
10k 10k U6

7
1
3
6
D3
R12 2

10k

4
8
5
GALGA EXTENSOMETRICA dedo3 AD620

-5

Figura 2. Sistema completo con teclado de control y LCD

Diagrama de flujo para el diseo de software


Cdigo implementado

/* Proyecto Final
"Life Prosthetics"
Integrantes
Luis Alejandro Morales Linares A01335991
Oscar Antonio Hernandez Blasi A01324474
23/11/16 */

.include "m16def.inc"
.org 0
rjmp main
.org 4
jmp teclado

//----------variables y constantes-------
.equ RS = 0 ;en pin 0
.equ RW = 1 ;en pin 1
.equ E = 2 ;en pin 2
.equ segundalinea = 0xc0
.equ primeralinea = 0x80

.equ abrir1 = 118


.equ cerrar1 = 26
.equ abrir2 = 29
.equ cerrar2 = 6

.def repetirguardados = r24


.def cargar = r16
.def argument= r17 //argumentos de subrutinas
.def saveflag = r29
.def movguardados = r19
.def multiplexorADC=r22

//////////////////Escritura en PuertoC/////////////////////////////

WriteDataInstruction4bits://r17
call WaitBusyFlag4bits
cbi portb,E

brts MandaDato
rjmp MandaInst

MandaDato:

ldi r18,0x01
ldi r16, 0b11111111
out ddrb,r16

ldi r16,0xf0
and r16,r17

add r16,r18
out portb,r16

sbi portb,E
cbi portb,E

ldi r16,0xf0
swap r17
and r16,r17

add r16,r18
out portb,r16

sbi portb,E
cbi portb,E

ret

MandaInst:

ldi r16, 0b11111111


out ddrb,r16

ldi r16,0xf0
and r16,r17

out portb,r16

sbi portb,E
cbi portb,E

ldi r16,0xf0
swap r17
and r16,r17

out portb,r16

sbi portb,E
cbi portb,E
RET

setpunta:

/////////////////////////////////////////////
call WaitBusyFlag4bits
cbi portb,E

LDI R16, 0b11111111


OUT ddrb,r16

Ldi r16, 0b11000000


out portb, r16

sbi portb,E
cbi portb,E

ldi r16, 0x00


out portb, r16

sbi portb,E
cbi portb,E
RET
///////////////////////////////////////////

setpunta2:

/////////////////////////////////////////////
call WaitBusyFlag4bits
cbi portb,E

LDI R16, 0b11111111


OUT ddrb,r16

Ldi r16, 0b10000000


out portb, r16

sbi portb,E
cbi portb,E

ldi r16, 0x10


out portb, r16

sbi portb,E
cbi portb,E
RET
///////////////////////////////////////////

initLCD4bits:
/////////////////////////////////////////////
call WaitBusyFlag4bits
cbi portb,E

LDI R16, 0b11111111


OUT ddrb,r16

Ldi r16, 0b00000000


out portb, r16

sbi portb,E
cbi portb,E

ldi r16, 0x10


out portb, r16

sbi portb,E
cbi portb,E
///////////////////////////////////////////

/////////////////////////////////////////////
call WaitBusyFlag4bits
cbi portb,E

LDI R16, 0b11111111


OUT ddrb,r16

Ldi r16, 0b00000000


out portb, r16

sbi portb,E
cbi portb,E

ldi r16, 0x60


out portb, r16

sbi portb,E
cbi portb,E
/////////////////////////////////////////

/////////////////////////////////////////////
call WaitBusyFlag4bits
cbi portb,E

LDI R16, 0b11111111


OUT ddrb,r16

Ldi r16, 0b00000000


out portb, r16

sbi portb,E
cbi portb,E

ldi r16, 0xf0


out portb, r16

sbi portb,E
cbi portb,E

RET
///////////////////////////////////////////
Config4a2Lineas:
call WaitBusyFlag4bits
cbi portb,E

LDI R16, 0b11111111


OUT ddrb,r16

cbi portb,RS
cbi portb,RW
sbi portb,5

sbi portb,E
cbi portb,E

sbi portb,7
sbi portb,6
cbi portb,5

sbi portb,E
cbi portb,E
RET

LCDinit8bitsTo4bits:
call WaitBusyFlag8bits
cbi portb,E

LDI R16, 0b11111111


OUT ddrb,r16

LDI R16, 0b00100000


OUT portb, r16
sbi portb,E
RET

WaitBusyFlag8bits:
push r17 //Se guarda el dato que posiblemente este siendo usado
LDI R17, 0b00001111
OUT ddrb,r17
BusyFlagCiclo8:
cbi pinb,E //Se pone enable en 0

sbi portb,RW //Se preparan los bits de instruccion


cbi portb,RS

sbi portb,E//Se activa el enable


nop
nop
nop
SBIC pinb,7//Se compara el bit 7, si es 0 ya se puede escribir
y se salta el rjmp
rjmp BusyFlagCiclo8
pop r17
RET

WaitBusyFlag4bits:

push r17 //Se guarda el dato que posiblemente este siendo usado
LDI R17, 0b00001111
OUT ddrb,r17
BusyFlagCiclo4:

cbi portb,E//se pone enable en 0

sbi portb,RW//Se preparan los bits de instruccion


cbi portb,RS

sbi portb,E//activa enable


nop
nop
in r17, pinb//se guarda el bit del pin 7 y un retardo nop
cbi portb,E //se apaga el enable y se prende con un nop
intermedio
sbi portb,E
SBRC r17,7//si el bit 7 es o, se salta el rjmp y regresa el dato
en r17 y regresa al programa
rjmp BusyFlagCiclo4
pop r17

RET

//-------------------------------------Transmite
serial--------------------------------------------//
Transmit:
sbis ucsra, udre
rjmp Transmit
ret

//----------------------------------Escrituras LCD y
serial--------------------------------------//
CerrandoDedo1:
clt
ldi argument, primeralinea ;Colocamos LCD en primera linea
call WriteDataInstruction4bits

ldi zh,high(LAP<<1)
ldi zl,low(LAP<<1)
ldi r21, 16
serial1:
lpm r16, z+
out udr, r16
call Transmit
dec r21
brne serial1

ldi zh,high(Dedo<<1)
ldi zl,low(Dedo<<1)
ldi r21, 16
Dedo1:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Dedo1
clt
ldi r17, segundalinea
call WriteDataInstruction4bits
ldi r21, 16
Mensaje3:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Mensaje3
ret

AbriendoDedo1:
clt
ldi argument, primeralinea ;Colocamos LCD en primera linea
call WriteDataInstruction4bits

ldi zh,high(LAP1<<1)
ldi zl,low(LAP1<<1)
ldi r21, 16
serial11:
lpm r16, z+
out udr, r16
call Transmit
dec r21
brne serial11

ldi zh,high(D1<<1)
ldi zl,low(D1<<1)
ldi r21, 16
Dedo2:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Dedo2
clt
ldi r17, segundalinea
call WriteDataInstruction4bits
ldi r20, 16
palabra:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r20
brne palabra
ret
CerrandoDedo2:
clt
ldi argument, primeralinea ;Colocamos LCD en primera linea
call WriteDataInstruction4bits

ldi zh,high(LAP2<<1)
ldi zl,low(LAP2<<1)
ldi r21, 16
serial2:
lpm r16, z+
out udr, r16
call Transmit
dec r21
brne serial2

ldi zh,high(D2<<1)
ldi zl,low(D2<<1)
ldi r21, 16
Fer:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Fer
clt
ldi r17, segundalinea
call WriteDataInstruction4bits
ldi r21, 16
Panfi:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Panfi
ret

AbriendoDedo2:
clt
ldi argument, primeralinea ;Colocamos LCD en primera linea
call WriteDataInstruction4bits

ldi zh,high(LAP22<<1)
ldi zl,low(LAP22<<1)
ldi r21, 16
serial22:
lpm r16, z+
out udr, r16
call Transmit
dec r21
brne serial22

ldi zh,high(D22<<1)
ldi zl,low(D22<<1)
ldi r21, 16
Equipamiento:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Equipamiento
clt
ldi r17, segundalinea
call WriteDataInstruction4bits
ldi r20, 16
Intel:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r20
brne Intel
ret

CerrandoDedo3:
clt
ldi argument, primeralinea ;Colocamos LCD en primera linea
call WriteDataInstruction4bits

ldi zh,high(LAP3<<1)
ldi zl,low(LAP3<<1)
ldi r21, 16
serial3:
lpm r16, z+
out udr, r16
call Transmit
dec r21
brne serial3

ldi zh,high(D3<<1)
ldi zl,low(D3<<1)
ldi r21, 16
Avion:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Avion
clt
ldi r17, segundalinea
call WriteDataInstruction4bits
ldi r20, 16
Alex:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r20
brne Alex
ret

AbriendoDedo3:
clt
ldi argument, primeralinea ;Colocamos LCD en primera linea
call WriteDataInstruction4bits

ldi zh,high(LAP33<<1)
ldi zl,low(LAP33<<1)
ldi r21, 16
serial33:
lpm r16, z+
out udr, r16
call Transmit
dec r21
brne serial33

ldi zh,high(D33<<1)
ldi zl,low(D33<<1)
ldi r21, 16
Avion1:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Avion1
clt
ldi r17, segundalinea
call WriteDataInstruction4bits
ldi r20, 16
Alex1:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r20
brne Alex1
ret

CerrandoMano:
clt
ldi argument, primeralinea ;Colocamos LCD en primera linea
call WriteDataInstruction4bits

ldi zh,high(LAPM<<1)
ldi zl,low(LAPM<<1)
ldi r21, 16
serialM:
lpm r16, z+
out udr, r16
call Transmit
dec r21
brne serialM

ldi zh,high(M<<1)
ldi zl,low(M<<1)
ldi r21, 16
Facil:
set
lpm r17, z+
call WriteDataInstruction4bits
out udr, argument
dec r21
brne Facil
clt
ldi r17, segundalinea
call WriteDataInstruction4bits
ldi r21, 16
Oli:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Oli
ret

AbriendoMano:
clt
ldi argument, primeralinea ;Colocamos LCD en primera linea
call WriteDataInstruction4bits

ldi zh,high(LAPM1<<1)
ldi zl,low(LAPM1<<1)
ldi r21, 16
serialM1:
lpm r16, z+
out udr, r16
call Transmit
dec r21
brne serialM1

ldi zh,high(M1<<1)
ldi zl,low(M1<<1)
ldi r21, 16
Coke:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Coke
clt
ldi r17, segundalinea
call WriteDataInstruction4bits
ldi r21, 16
Rafa:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Rafa
ret

//---------------------------------------------Rutina de
botones------------------------------------//
Seleccion:
cpi r20, 0
brne Bot1
call CerrandoDedo1

//----------------------PWM-----------------//
ldi r16, high(26)
out ocr1ah, r16
ldi r16, low(26) ;Match DC = 7% = 90
out ocr1al, r16
jmp salgo
Bot1:
//--------------------------Escribimos en LCD----------------------//
cpi r20, 1
brne Bot2
call AbriendoDedo1

//----------------------PWM-----------------//
ldi r16, high(abrir1) ;PWM ab
out ocr1ah, r16
ldi r16, low(abrir1) ;Match DC = 7% = 90
out ocr1al, r16
jmp salgo

Bot2:
cpi r20, 2
brne Bot3
call CerrandoDedo2

//----------------------PWM-----------------//
ldi r16, high(cerrar1) ;PWM ab
out ocr1bh, r16
ldi r16, low(cerrar1) ;Match DC = 7% = 90
out ocr1bl, r16
jmp salgo

Bot3:
cpi r20, 3
brne Bot4
call AbriendoDedo2

//----------------------PWM-----------------//
ldi r16, high(abrir1) ;PWM ab
out ocr1bh, r16
ldi r16, low(abrir1) ;Match DC = 7% = 90
out ocr1bl, r16
jmp salgo

Bot4:
cpi r20, 64
brne Bot5
call CerrandoDedo3

//----------------------PWM-----------------//
ldi r16, cerrar2 ;Valor necesario para DC = 7%
out ocr2, r16
ldi r16, 0b01100110 ;Se carga la palabra de control para PWM con f de
61 Hz
out tccr2, r16
jmp salgo

Bot5:
cpi r20, 65
brne Bot6
call AbriendoDedo3

//----------------------PWM-----------------//
ldi r16, abrir2 ;Valor necesario para DC = 7%
out ocr2, r16
ldi r16, 0b01100110 ;Se carga la palabra de control para PWM con f de
61 Hz
out tccr2, r16
jmp salgo

Bot6:
cpi r20, 66
brne Bot7
call CerrandoMano

//----------------------PWM-----------------//
ldi r16, high(cerrar1)
out ocr1ah, r16
ldi r16, low(cerrar1) ;Cierra dedo
out ocr1al, r16
ldi r16, high(cerrar1)
out ocr1bh, r16
ldi r16, low(cerrar1)
out ocr1bl, r16
ldi r16, cerrar2 ;Cierra dedo
out ocr2, r16
ldi r16, 0b01100110 ;Se carga la palabra de control para PWM con f de
61 Hz
out tccr2, r16
jmp salgo

Bot7:
cpi r20, 67
brne salgo
call AbriendoMano

//----------------------PWM-----------------//
ldi r16, high(abrir1)
out ocr1ah, r16
ldi r16, low(abrir1) ;Abre dedo
out ocr1al, r16
ldi r16, high(abrir1)
out ocr1bh, r16
ldi r16, low(abrir1) ;Abre dedo
out ocr1bl, r16
ldi r16, abrir2 ;Valor para abrir dedo
out ocr2, r16
ldi r16, 0b01100110 ;Se carga la palabra de control para PWM con f de
61 Hz
out tccr2, r16

salgo : ret

//Retardo base 10ms


retardo10ms: push r26
ldi r26, 104
push r25
ciclo1: ldi r25, 255
ciclo: dec r25
brne ciclo
dec r26
brne ciclo1
pop r25
pop r26
ret

//Preparamos retardo 500ms


retardo500ms: push r18
ldi r18, 50
ciclo4: call retardo10ms
dec r18
brne ciclo4
pop r18
ret

//Retardo 1s
retardo1s: push r28
ldi r28, 100
ciclo5: call retardo10ms
dec r28
brne ciclo5
pop r28
ret
//retardo 2s
retardo2s: push r27
ldi r27, 200
ciclo10: call retardo10ms
dec r27
brne ciclo10
pop r27
ret

EscrituraLCD:
clt
ldi argument, primeralinea ;Colocamos LCD en primera linea
call WriteDataInstruction4bits

ldi zh,high(Bienvenida<<1)
ldi zl,low(Bienvenida<<1)
ldi r20, 16
Mensaje:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r20
brne Mensaje

clt
ldi r17, segundalinea
call WriteDataInstruction4bits
ldi r20, 16
Mensaje2:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r20
brne Mensaje2
ret

LCDSave:
sbi porta, 7
clt
ldi argument, primeralinea ;Colocamos LCD en primera linea
call WriteDataInstruction4bits

ldi zh,high(LAPG<<1)
ldi zl,low(LAPG<<1)
ldi r21, 22
serialG:
lpm r16, z+
out udr, r16
call Transmit
dec r21
brne serialG

ldi zh,high(G<<1)
ldi zl,low(G<<1)
ldi r21, 16
Rodrigo:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Rodrigo
clt
ldi r17, segundalinea
call WriteDataInstruction4bits
ldi r21, 16
Felix:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Felix

ser saveflag
ret

GuardadoLCD:
cbi porta, 7
clt
ldi argument, primeralinea ;Colocamos LCD en primera linea
call WriteDataInstruction4bits

ldi zh,high(LAPG1<<1)
ldi zl,low(LAPG1<<1)
ldi r21, 22
serialG1:
lpm r16, z+
out udr, r16
call Transmit
dec r21
brne serialG1
ldi zh,high(G1<<1)
ldi zl,low(G1<<1)
ldi r21, 16
Maria:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Maria
clt
ldi r17, segundalinea
call WriteDataInstruction4bits
ldi r20, 16
Jose:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r20
brne Jose
ret

Play:
clt
ldi argument, primeralinea ;Colocamos LCD en primera linea
call WriteDataInstruction4bits

ldi zh,high(LAPP<<1)
ldi zl,low(LAPP<<1)
ldi r21, 26
serialP:
lpm r16, z+
out udr, r16
call Transmit
dec r21
brne serialP

ldi zh,high(P<<1)
ldi zl,low(P<<1)
ldi r21, 16
Oscar:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Oscar
clt
ldi r17, segundalinea
call WriteDataInstruction4bits
ldi r21, 16
Antonio:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Antonio
ret

sigoguardando1:
clt
ldi argument, primeralinea ;Colocamos LCD en primera linea
call WriteDataInstruction4bits

ldi zh,high(LAPSG<<1)
ldi zl,low(LAPSG<<1)
ldi r21, 26
serialLSG:
lpm r16, z+
out udr, r16
call Transmit
dec r21
brne serialLSG

ldi zh,high(SG<<1)
ldi zl,low(SG<<1)
ldi r21, 16
LALA:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne LALA
clt
ldi r17, segundalinea
call WriteDataInstruction4bits
ldi r21, 16
Mensaje10:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Mensaje10
ret
NoMovGuardados:
clt
ldi argument, primeralinea ;Colocamos LCD en primera linea
call WriteDataInstruction4bits

ldi zh,high(LAPSG1<<1)
ldi zl,low(LAPSG1<<1)
ldi r21, 27
serialLSG1:
lpm r16, z+
out udr, r16
call Transmit
dec r21
brne serialLSG1

ldi zh,high(SG1<<1)
ldi zl,low(SG1<<1)
ldi r21, 16
Lupita:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Lupita
clt
ldi r17, segundalinea
call WriteDataInstruction4bits
ldi r21, 16
Mensaje101:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Mensaje101
ret

GuanteSelect:
clt
ldi argument, primeralinea ;Colocamos LCD en primera linea
call WriteDataInstruction4bits

ldi zh,high(MG1<<1)
ldi zl,low(MG1<<1)
ldi r21, 27
serialguante:
lpm r15, z+
out udr, r15
call Transmit
dec r21
brne serialguante

ldi zh,high(MG<<1)
ldi zl,low(MG<<1)
ldi r21, 16
Fernanda:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Fernanda
clt
ldi r17, segundalinea
call WriteDataInstruction4bits
ldi r21, 16
Lou:
set
lpm r17, z+
call WriteDataInstruction4bits
dec r21
brne Lou
ret

//Puntero de guardado de rutinas


PunteroX:
ldi xl, low(0x300)
ldi xh, high(0x300)
ret

//---------Programa principal--------------------------------//
main:
//-----------pila--------------------------------------------//
ldi r16,high(ramend)
out sph,r16
ldi r16,low(ramend)
out spl,r16
clr r16

//--------------------------Definicion de puertos---------------//
//Entrada de teclado matricial
sbi portc, 0 ;Pull up interno
sbi portc, 1
sbi portc, 6
sbi portc, 7

sbi ddrc, 2
sbi ddrc, 3
sbi ddrc, 4
sbi ddrc, 5
cbi portc, 2
cbi portc, 3
cbi portc, 4
cbi portc, 5

//Salida para PWM y entrada interrupcion teclado matricial

sbi ddrd, 1
sbi ddrd, 4
sbi ddrd, 5
sbi ddrd, 7
ldi r16, 0b10111111
out portd, r16

//Puerto LCD
ser r16
out ddrb, r16

//LEDs indicadores
sbi ddra, 5
sbi ddra, 6
sbi ddra, 7

//--------------------------Palabras de control-----------------//
ldi r16, 0b10000110 //8bit trama, stop=1bit, paridad=deshab,
asincrono
out ucsrc, r16
ldi r16, 0b00001000 ;Se habilita Tx
out ucsrb, r16
ldi r16, 34 ;9600 baudios para probar con Proteus
/* Cambiar a 14400 que es un valor de 34 */
out ubrrl, r16

//------------------------------ADC------------------------------//
ldi r16,0b00000111
out porta,r16 ;pullup

ldi multiplexorADC, 0b11100000


out admux,multiplexorADC
ldi r16,0b10000111
out adcsra,r16

//------------Interrupciones externas--------------------------//
ldi r16, 0b11000000 ;Se activan interrupciones externas 0 y 1
out gicr, r16
ldi r16, 0b00001110 ;Se activa interrupcion externa 0 por pulso de
bajada y 1 de subida
out mcucr, r16

//--------------------PWM-------------------------------------//
//PWM que mantiene mano abierta en un inicio
ldi r16, high(1025) ;Tope para f=61Hz
out icr1h, r16
ldi r16, low(1025)
out icr1l, r16

ldi r16, 0b10100010 ;TCCR1A


out tccr1a, r16
ldi r16, 0b00010011 ;TCCR1B
out tccr1b, r16

ldi r16, high(abrir1)


out ocr1ah, r16
ldi r16, low(abrir1)
out ocr1al, r16
ldi r16, high(abrir1)
out ocr1bh, r16
ldi r16, low(abrir1)
out ocr1bl, r16

ldi r16, abrir2 ;Valor necesario para DC = 7%


out ocr2, r16
ldi r16, 0b01100110 ;Se carga la palabra de control para PWM con f de
61 Hz
out tccr2, r16

//------Establecer LCD---------
call WaitBusyFlag8bits
cbi portb,E
call LCDinit8bitsTo4bits
cbi portb,E
call WaitBusyFlag4bits
cbi portb,E
call Config4a2Lineas
cbi portb,E
cbi portb,E

call initLCD4bits

clt
ldi r17, 0b00001100
call WriteDataInstruction4bits

//----------------------Escritura LCD-----------------------//
call EscrituraLCD

clr movguardados
clr repetirguardados
clr saveflag

sei

fin:rjmp fin

//-------------------------------Interrupcion externa de teclado----------------//


teclado:
in r16, sreg
push r16

in r20, pinc
andi r20, 0xff ;Protege parte baja por MM74C922

/*cpi r20, 8
brne apagarADC*/

cpi r20, 0
brne Boton1
cpi saveflag, 0xff ;Preguntamos por la bandera de guardado, de estar
activa guarda el boton presionado
brne continuo0
inc movguardados
st x+, r20
jmp salir
continuo0:
call Seleccion
jmp salir

Boton1:
cpi r20, 1
brne Boton2
cpi saveflag, 0xff ;Preguntamos por la bandera de guardado, de estar
activa guarda el boton presionado
brne continuo1
inc movguardados
st x+, r20
jmp salir
continuo1:
call Seleccion
jmp salir

Boton2:
cpi r20, 2
brne Boton3
cpi saveflag, 0xff ;Preguntamos por la bandera de guardado, de estar
activa guarda el boton presionado
brne continuo2
inc movguardados
st x+, r20
jmp salir
continuo2:
call Seleccion
jmp salir

Boton3:
cpi r20, 3
brne Boton4
cpi saveflag, 0xff ;Preguntamos por la bandera de guardado, de estar
activa guarda el boton presionado
brne continuo3
inc movguardados
st x+, r20
jmp salir
continuo3:
call Seleccion
jmp salir

Boton4:
cpi r20, 64
brne Boton5
cpi saveflag, 0xff ;Preguntamos por la bandera de guardado, de estar
activa guarda el boton presionado
brne continuo4
inc movguardados
st x+, r20
jmp salir
continuo4:
call Seleccion
jmp salir

Boton5:
cpi r20, 65
brne Boton6
cpi saveflag, 0xff ;Preguntamos por la bandera de guardado, de estar
activa guarda el boton presionado
brne continuo5
inc movguardados
st x+, r20
jmp salir
continuo5:
call Seleccion
jmp salir

Boton6:
cpi r20, 66
brne Boton7
cpi saveflag, 0xff ;Preguntamos por la bandera de guardado, de estar
activa guarda el boton presionado
brne continuo6
inc movguardados
st x+, r20
jmp salir
continuo6:
call Seleccion
jmp salir

Boton7:
cpi r20, 67
brne Bot8
cpi saveflag, 0xff ;Preguntamos por la bandera de guardado, de estar
activa guarda el boton presionado
brne continuo7
inc movguardados
st x+, r20
jmp salir
continuo7:
call Seleccion
jmp salir

Bot8:
/*Boton para activar ADC de guante*/
cpi r20, 128
breq BOTONADC
jmp Bot12

BOTONADC:
push r25
ldi r25, 30
call GuanteSelect
sbi porta, 6

cicloadc:
sbi ADCSRA,ADSC
call wait
sbi adcsra,adif
in r16,ADCL
in r23,ADCH

cpi r23,2
brlo abrirD1
rjmp cerrarD1

seguir:
inc multiplexorADC
out admux,multiplexorADC
sbi ADCSRA,ADSC
call wait
sbi adcsra,adif
in r16,ADCL
in r23,ADCH

cpi r23, 2
brlo abrirD2
rjmp cerrarD2

seguir2:
inc multiplexorADC
out admux,multiplexorADC
sbi ADCSRA,ADSC
call wait
sbi adcsra,adif
in r16,ADCL
in r23,ADCH

cpi r23, 2
brlo abrirD3
rjmp cerrarD3
ex:
call retardo1s
ldi multiplexorADC, 0b11000000
out admux,multiplexorADC

dec r25
brne cicloadc
pop r25
cbi porta, 6
call EscrituraLCD
jmp salir

abrirD1:
ldi r16, high(abrir1) ;PWM ab
out ocr1ah, r16
ldi r16, low(abrir1) ;Match DC = 7% = 90
out ocr1al, r16
rjmp seguir

cerrarD1:
ldi r16, high(26)
out ocr1ah, r16
ldi r16, low(26) ;Match DC = 7% = 90
out ocr1al, r16
rjmp seguir

abrirD2:
ldi r16, high(abrir1) ;PWM ab
out ocr1bh, r16
ldi r16, low(abrir1) ;Match DC = 7% = 90
out ocr1bl, r16
rjmp seguir2

cerrarD2:
ldi r16, high(cerrar1) ;PWM ab
out ocr1bh, r16
ldi r16, low(cerrar1) ;Match DC = 7% = 90
out ocr1bl, r16
rjmp seguir2

abrirD3:
ldi r16, abrir2 ;Valor necesario para DC = 7%
out ocr2, r16
ldi r16, 0b01100110 ;Se carga la palabra de control para PWM con f de
61 Hz
out tccr2, r16
rjmp ex

cerrarD3:
ldi r16, cerrar2 ;Valor necesario para DC = 7%
out ocr2, r16
ldi r16, 0b01100110 ;Se carga la palabra de control para PWM con f de
61 Hz
out tccr2, r16
rjmp ex

wait: sbis ADCSRA,ADIF


rjmp wait
RET

//--------------------------Boton de guardado----------------------------//
Bot12:
cpi r20, 192
brne Bot13
cpi saveflag, 0xff
breq ApagaEscrituraRAM
call PunteroX
call LCDSave
jmp salir

ApagaEscrituraRAM:
clr saveflag
call GuardadoLCD
jmp salir

//---------------------------Reproduce Movimientos guardados---------------------//


Bot13:
cpi r20, 193
brne salir
cpi movguardados, 0
breq Guardaalgo
cpi saveflag, 0
brne sigoguardando
call Play
call retardo1s
call PunteroX
iniciaplay:
sbi porta, 5
inc repetirguardados
ld r20, x+
call retardo2s
call Seleccion
dec movguardados
brne iniciaplay
cbi porta, 5
jmp salir

Guardaalgo:
cpi repetirguardados, 0
breq sigoaqui
mov movguardados, repetirguardados
call Play
call retardo1s
call PunteroX
iniciaplay1:
ld r20, x+
call retardo2s
call Seleccion
dec movguardados
brne iniciaplay1
sbi porta, 5 ;LED indicador que finaliza la reproduccion de
movimientos
call retardo1s
cbi porta, 5
jmp salir

sigoaqui:
call NoMovGuardados
jmp salir
sigoguardando:
//Despliego error, sigo guardando
call sigoguardando1

salir:
pop r16
out sreg, r16
reti

.org 0x500
Bienvenida:
.db "Sistema Bionico"
.db "Life Prosthetics"

Dedo:
.db " Cerrando "
.db " Dedo 1 "
LAP:
.db "Cerrando Dedo 1 "
D1:
.db " Abriendo "
.db " Dedo 1 "
LAP1:
.db "Abriendo Dedo 1 "
D2:
.db " Cerrando "
.db " Dedo 2 "
LAP2:
.db "Cerrando Dedo 2 "
D22:
.db " Abriendo "
.db " Dedo 2 "
LAP22:
.db "Abriendo Dedo 2 "
D3:
.db " Cerrando "
.db " Dedo 3 "
LAP3:
.db "Cerrando Dedo 3 "
D33:
.db " Abriendo "
.db " Dedo 3 "
LAP33:
.db "Abriendo Dedo 3 "
M:
.db " Cerrando "
.db " Mano "
LAPM:
.db " Cerrando Mano "
M1:
.db " Abriendo "
.db " Mano "
LAPM1:
.db " Abriendo Mano "
G:
.db " Guardando "
.db " Movimientos "
LAPG:
.db "Guardando Movimientos "
G1:
.db " Movimientos "
.db " Guardados "
LAPG1:
.db "Movimientos Guardados "
P:
.db " Reproduciendo "
.db " Movimientos "
LAPP:
.db "Reproduciendo Movimientos "
SG:
.db " Error: Continua"
.db " Guardando Mov "
LAPSG:
.db "Error: Cont Guardando Mov "
SG1:
.db " Error: No Hay "
.db " Mov Guardados "
LAPSG1:
.db "Error: No Hay Mov Guadados "
MG:
.db " Modo Guante "
.db " Seleccionado "
MG1:
.db " Modo Guante Seleccionado "

También podría gustarte