; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************

.include "C:\VMLAB\include\m8def.inc"

.def instruccion=R16
.def dato=R17

.dseg
	.org	$70
n_01ms: 		.BYTE	1	;contador de intervalos de 0,1ms. 250 intervalos = 25ms
n_01msaux: 	.BYTE	1	;contador de intervalos de 0,1ms auxiliar
n_25ms: 		.BYTE	1  ;contador de intervalos de 25ms. 40 intervalos = 1seg
n_seg:  		.BYTE	1  ;contador de intervalos de 1seg
bot_enter:	.BYTE	1  ;indicador que se presiono el pulsador de enter
bot_sub:    .BYTE	1  ;indicador que se presiono el pulsador de subir
bot_baj:    .BYTE	1  ;indicador que se presiono el pulsador de bajar
canal_eleg:	.BYTE 1	;indica numero de canales escogidos
elec_pred:	.BYTE	1	;indica programa predeterminado escogido
freq: 		.BYTE	1	;parametro referente a la frecuencia de la señal
contrac:    .BYTE	1	;indica tiempo de contraccion en seg
reposo:     .BYTE	1	;indica tiempo de reposo en seg
repet:      .BYTE	1	;indica numero de repeticiones
ch1_h:      .BYTE	1	;valor pulso positivo canal1
ch2_h:      .BYTE	1	;valor pulso positivo canal2
ch3_h:      .BYTE	1	;valor pulso positivo canal3
ch4_h:      .BYTE	1	;valor pulso positivo canal4
ch1_l:      .BYTE	1	;valor pulso negativo canal1
ch2_l:      .BYTE	1	;valor pulso negativo canal2
ch3_l:      .BYTE	1	;valor pulso negativo canal3
ch4_l:      .BYTE	1	;valor pulso negativo canal4

.cseg
	.org 0
	rjmp Inicio           ;salto al programa principal
	.org	$0006
	rjmp	ssi_timer1    ;salto a subrutina de interrupcion timer 1
	
;*********************************************************************
;*************************** SUBRUTINAS ******************************
;*********************************************************************
	
;Subrutina de interrupcion: ssi_timer1
;Funcion: cada vez que se realice comparacion exitosa (0.1ms)
;el contador n_10ms aumenta en uno cuando llegue a 250
;se aumentara el contador n_25ms aumentará en uno, al lograr
;alcanzar la cuenta de 40, se habrá logrado el conteo de 1seg
;Entrada: Ninguna
;Salida: Ninguna
ssi_timer1:

	push	R16
	in	R16, sreg
	push	R16
	push	R17
	lds	R16, n_01ms
	lds	R17, n_01msaux	
	inc	R16
	inc	R17
	sts	n_01ms, R16
	sts	n_01msaux, R17
	cpi	R16, 250
	brne	fin_ssi
	clr	R16
	sts	n_01ms, R16	
	lds	R16, n_25ms
	inc   R16
	sts	n_25ms, R16
	cpi	R16, 40
	brne	fin_ssi
	clr	R16
	sts	n_25ms, R16
	lds	R16, n_seg
	inc   R16
	sts	n_seg, R16
		
fin_ssi:
	pop	R17
	pop	R16
	out	SREG, R16
	pop	R16
	reti
	
;Subrutina: Configura_puertos
;Funcion: Configuracion de todos los puertos a usar
;Entrada: Ninguna
;Salida: Ninguna
Configura_puertos:
	
   push 	R16
   ldi 	R16,$FF		 	;Puerto D: bus de datos del LCD	
   out 	DDRD,R16
   ldi 	R16,0b00011111 ;PC0=E PC1=RS PC2=R/W: lineas de control del LCD
   out 	DDRC,R16	 		;Ldac pc3 .. CS es pc4 ----> salidas
   ldi	R16,0b00011000 ;CS es 1 para desactivar DAC
	out	PORTC,R16	   ;Ldac es 1 para no actualizar registros
	ldi	R16,0b01101111 ;PB0, PB1, PB6: entradas para pulsadores
	out	DDRB,R16       ;PB2-PB5: Bits de control para el DAC
   pop 	R16
   ret

;Subrutina: Configura LCD
;Funcion: Brinda la configuracion inicial del LCD para que
;este habilitado para empezar a mandar los datos
;Entradas: Ninguna
;Salidas: Ninguna
Configura_LCD:		
	
	push 	R16
	push 	R17
   rcall Retardo5Xms       ;espera 15 ms
	rcall Retardo5Xms
	rcall Retardo5Xms
	ldi 	instruccion, $30	;Función Set: Configuracion a 8 bits
	rcall WriteIR       	
	rcall Retardo5Xms    	;espera mas de 4.1 ms
	ldi 	instruccion, $30  ;Funcion Set
	rcall WriteIR
	rcall RetardoXms     	;espera mas de 100uS
	ldi 	instruccion, $30
	rcall WriteIR
   rcall CheckBF
	ldi 	instruccion, $38	;Datos de 8 bits y 2 lineas
	rcall WriteIR
	rcall CheckBF
	ldi 	instruccion, $08  ;desactivar la pantalla, el cursor y el parpadeo
	rcall WriteIR
	rcall CheckBF
	ldi 	instruccion, 1		;Función Clear: limpiar la pantalla
	rcall WriteIR
	rcall CheckBF
	ldi 	instruccion, 6  	;El cursor avanza a la derecha cada vez que
	rcall WriteIR        	;se imprime un caracter
	rcall CheckBF
	ldi 	instruccion, $0E	;Enciende pantalla y muestra cursor
	rcall WriteIR
	rcall CheckBF
	pop 	R17
	pop 	R16
	ret

;Subrutina: RetardoXms
;Funcion: Retardo de casi 1ms (mediante lazos) para la
;configuracion inicial del LCD
;Entradas: Ninguna
;Salidas: Ninguna
RetardoXms:
	
   push	R16
   push	R17
   clr	R16
lazo_ext:
   clr 	R17
lazo_int:
   inc 	R17
   brne 	lazo_int
   inc 	R16
   cpi 	R16,60
   brne 	lazo_ext
   pop 	R17
   pop 	R16
   ret
   	
;Subrutina: Retardo5Xms
;Funcion: Simil a Retardo Xms
;Entradas: Ninguna
;Salidas: Ninguna
Retardo5Xms:

	push 	R17
	ldi 	R17,0
lazo_retardo:
	rcall RetardoXms
	inc 	R17
	cpi 	R17,5
	brne 	lazo_retardo
	pop 	R17
	ret
	   	
;Subrutina: WriteIR
;Funcion: Manda un instruccion por el puerto B
;para que sea recibida por el LCD
;Entradas: Ninguna
;Salidas: Ninguna
WriteIR:
	
	push 	R17
	ldi 	R17, 0b000				;RW=0, RS=0 y E=0
	out 	PORTC, R17
	ldi 	R17, 0b001				;RW=0, RS=0 y E=1
	out 	PORTC, R17
	out 	PORTD, instruccion	;se envia la instruccion
	ldi 	R17, 0b000				;RW=0, RS=0 y E=0
	out 	PORTC, R17
	ldi 	R17, 0b100				;RW=1, RS=0 y E=0
	out 	PORTC, R17
	pop 	R17
	ret

;Subrutina: WriteDR
;Funcion: Manda al LCD el dato que se desea que aparezca
;en pantalla
;Entradas: Ninguna
;Salidas: Ninguna
WriteDR:
	
	push 	R16
	push 	R17
	ldi 	R16,0b010		;RW=0, RS=1 y E=0
	out 	PORTC,R16
	ldi 	R16,0b011		;RW=0, RS=1 y E=1
	out 	PORTC,R16
	out 	PORTD,dato		;se envia el dato
	ldi 	R16,0b010		;RW=0, RS=1 y E=0
	out 	PORTC,R16
	ldi 	R16,0b100		;RW=1, RS=0 y E=0
	out 	PORTC,R16
	pop 	R17
	pop 	R16
	ret

;Subrutina: CheckBF
;Funcion: Verifica si el LCD se encuentra disponible para
;recibir algun dato o instruccion
;Entradas: Ninguna
;Salidas: Ninguna
CheckBF:

	push 	R16
	push 	R17
	ldi 	R16,0				
	out 	DDRD,R16
LecturaBF:
	ldi 	R16,0b100		;RW=1, RS=0 y E=0
	out 	PORTC,R16
	ldi 	R16,0b101		;RW=1, RS=0 y E=1
	out 	PORTC,R16
   nop
	in 	R17,PIND			;Analiza bit BF (DB7)
	ldi 	R16,0b100		;RW=1, RS=0 y E=0
	out 	PORTC,R16
	andi 	R17,0b10000000
	cpi 	R17,0
	brne 	LecturaBF		;Si LCD esta ocupado entonces espera
	ldi 	R16,$FF			;Bus de datos: salida
	out 	DDRD,R16
	pop 	R17
	pop 	R16
	ret   	

;Subrutina: config_timer1
;Funcion: configuracion del timer1 con	OCR1A en modo CTC
;sin generador de onda y habilitacion de peticion de
;interrupciones
;Entrada: Ninguna
;Salida: Ninguna
config_timer1:

	push	R16
	ldi	R16, high(99)    ;contabilización de 100 veces, equivalente a
	out	OCR1AH, R16      ;que haya pasado 0.1ms
	ldi	R16, low(99)
	out	OCR1AL, R16      ;configuraciones de modo CTC y
	ldi	R16, 0           ;pedido de habilitación de interrupciones
	out	TCCR1A, R16
	ldi	R16, (0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10)
	out	TCCR1B, R16
	ldi	R16, 1<<OCIE1A
	out	TIMSK, R16
	pop	R16	
	ret

;Subrutina: Config_SPI
;Funcion: Configuracion la comunicación serial con DAC
;Entrada: Ninguna
;Salida: Ninguna
config_SPI:
	push	r16		
	ldi 	r16,(1<<SPE)|(1<<MSTR)       ;habilitacion SPI
	out 	SPCR,r16                     ;Controlador como Maestro
	ldi	r16,(1<<SPI2X)               ;set clock rate fck/2
	out	SPSR,r16
	pop	r16
	ret
	
;Subrutina: Inicio_dac
;Funcion: Limpia pantalla del LCD
;Entradas: Ninguna
;Salidas: Ninguna
Inicio_dac:

start_ini:
		
;   rcall	amplitud
	lds	r18,128     		;valores iniciales
	lds	r19,128	
   lds	r20,128	
   lds	r21,128

	ldi	r29,0b00000001		;control A	
	ldi	R16,0b00001000	   ;CS es 0 para activar DAC
	out	PORTC,R16	  	   ;Ldac es 1 para no actualizar registros   (aun)
	
controlA_ini: 					;primer control A									
	out   SPDR,r29          ;Manda los bits de control para el DAC A
	
controlAA_ini:					;Espera por transmision completa
	sbis  SPSR,SPIF
	rjmp  controlAA_ini
	
datoA_ini:
	out	SPDR,r18						

datoAA_ini:
	sbis  SPSR,SPIF
	rjmp  datoAA_ini        ;deberia ponerse CS a 1 para que actualize lo que se hizo
		
	ldi	R16,0b00011000   	;CS es 1 para desactivar DAC
	out	PORTC,R16	     	;Ldac es 1 para no actualizar registros   (aun)
	nop
	nop
	ldi	r16,0b00001000  	;CS es 0 para activar el dac de nuevo
	out	portc,r16
		
controlB_ini:
	ldi	r29,0b00000101		
	out	SPDR,r29
	
controlBB_ini: 				;Espera por transmision completa
	sbis	SPSR,SPIF
	rjmp	controlBB_ini
	
datoB_ini:
   out	SPDR,r19

datoBB_ini:
  	sbis	SPSR,SPIF
	rjmp	datoBB_ini
	
	ldi	R16,0b00011000    ;CS es 1 para desactivar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)	
	nop                      	
	nop
	ldi	R16,0b00001000    ;CS es 0 para activar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)

controlC_ini:
	ldi	r29,0b00001001		
	out	SPDR,r29
	
controlCC_ini:    			;Espera por transmision completa
	sbis	SPSR,SPIF
	rjmp	controlCC_ini
	
datoC_ini:
   out	SPDR,r20

datoCC_ini:
  	sbis 	SPSR,SPIF
	rjmp 	datoCC_ini
	
	ldi	R16,0b00011000    ;CS es 1 para desactivar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)	
	nop
	nop
	ldi	R16,0b00001000    ;CS es 0 para activar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)

controlD_ini:
	ldi	r29,0b00001101		
	out	SPDR,r29
	
controlDD_ini:  				;Espera por transmision completa
	sbis  SPSR,SPIF
	rjmp  controlDD_ini
	
datoD_ini:
   out	SPDR,r21

datoDD_ini:
  	sbis  SPSR,SPIF
	rjmp  datoDD_ini
	
	ldi	R16,0b00011000   ;CS es 1 para desactivar DAC
	out	PORTC,R16	     ;Ldac es 1 para no actualizar registros   (aun)	
	nop
	nop
	ldi	R16,0b00001000   ;CS es 0 para activar DAC
	out	PORTC,R16	     ;Ldac es 1 para no actualizar registros   (aun)	

ldac_ini:
	ldi	r22,0b00000010
	ldi	r23,0b11111111	
	out	spdr,r22
	
r22_ini:
	sbis 	SPSR,SPIF
	rjmp 	r22_ini	
	out	spdr,r23
	
r23_ini:
	sbis 	spsr,spif
	rjmp	r23_ini
	
	ldi	r16,0b00011000      ; apaga el DAC
	out	portc,r16
	rjmp	finale6
finale6:
	ret
	
;Subrutina: Clear
;Funcion: Limpia pantalla del LCD
;Entradas: Ninguna
;Salidas: Ninguna
Clear:

	push 	R16
	push 	R17
	rcall CheckBF
	ldi 	instruccion, 1		;Funcion Clear: limpiar la pantalla
	rcall WriteIR
	rcall CheckBF
	pop 	R17
	pop 	R16
	ret
	
;Subrutina: PInicial1
;Funcion: Muestra 1er texto de pantalla inicial
;Entradas: Ninguna
;Salidas: Ninguna
PInicial1:

   ldi 	ZH, high(tab_pinicial1*2)		
	ldi 	ZL, low(tab_pinicial1*2)
	ldi 	R23, 0							;Contador de caracteres a visualizar
leer_otroc1:
	lpm 	dato, Z+							;Lee y muestra caracter en LCD		
	rcall WriteDR
	rcall	RetardoXms
	inc 	R23
	cpi 	R23, 15							;Muestra del texto
	breq 	Final1
	rjmp 	leer_otroc1
Final1:

	ret
	
;Subrutina: PInicial2
;Funcion: Muestra 2do texto de pantalla inicial
;Entradas: Ninguna
;Salidas: Ninguna
PInicial2:

   ldi 	ZH, high(tab_pinicial2*2)		
	ldi 	ZL, low(tab_pinicial2*2)
	ldi 	R23, 0							;Contador de caracteres a visualizar
leer_otroc2:
	lpm 	dato, Z+							;Lee y muestra caracter en LCD		
	rcall WriteDR
	rcall	RetardoXms
	inc 	R23
	cpi 	R23, 15							;Muestra del texto
	breq 	Final2
	rjmp 	leer_otroc2
Final2:
	ret

;Subrutina:Inicio_linea
;Funcion: Inicia puntero del LCD en la 1ra linea
;Entradas: Ninguna
;Salidas: Ninguna
Inicio_linea:

	push	R23
	push	R16
	ldi	R23, 0
salta1:	
	ldi	R16, $00 + $80	;instruccion set DDRAM +
	rcall	WriteIR        ;desplazamiento del cursor
	rcall RetardoXms
	pop	R16
	pop	R23
	ret
	
;Subrutina:Inicio_linea2
;Funcion: Inicia puntero del LCD en la 2da linea
;Entradas: Ninguna
;Salidas: Ninguna
Inicio_linea2:

	push	R23
	push	R16
	ldi	R23, 0
salta:	
	ldi	R16, $40 + $80	;instruccion set DDRAM +
	rcall	WriteIR        ;desplazamiento del cursor
	rcall RetardoXms
	pop	R16
	pop	R23
	ret
	
;Subrutina: t_retardo2s
;Funcion: con interrupciones, retrasa el programa durante 2 seg.
;Entrada: Ninguna
;Salida: Ninguna
t_retardo2s:

	sei
	ldi	XH, high(n_seg)	;empiezan a ocurrir las interrupciones
	ldi	XL, low(n_seg)
	ld		R16, X
	cpi	R16, 2            ;saldra de la subrutina cuando llegue
	brne	t_retardo2s       ;el contador de seg. a 2
	clr	R16               ;se limpia bandera I para que pare de
	sts	n_01ms, R16       ;interrumpir
	sts	n_01msaux, R16
	sts	n_25ms, R16
	sts	n_seg, R16
	bclr	7
	ret
	
;Subrutina: Canal
;Funcion: Muestra en pantalla un texto
;Entradas: Ninguna
;Salidas: Ninguna
Canal:

   ldi 	ZH, high(tab_canales1*2)	;Z apunta al inicio del mensaje
	ldi 	ZL, low(tab_canales1*2)
	ldi 	R23, 0							;Contador de caracteres a visualizar
leer_otroc:
	lpm	dato, Z+							;Lee y muestra caracter en LCD		
	rcall WriteDR
	rcall	RetardoXms
	inc 	R23
	cpi 	R23, 15							;Muestra del texto
	breq 	Final
	rjmp 	leer_otroc
Final:
	ret
	
;Subrutina: Canal1
;Funcion: Muestra en pantalla un texto
;Entradas: Ninguna
;Salidas: Ninguna
Canal1:

   ldi 	ZH, high(tab_canales2*2)	;Z apunta al inicio del mensaje
	ldi 	ZL, low(tab_canales2*2)
	ldi 	R23, 0							;Contador de caracteres a visualizar
leer_otroc6:
	lpm	dato,Z+							;Lee y muestra caracter en LCD		
	rcall WriteDR
	rcall	RetardoXms
	inc 	R23
	cpi 	R23, 15							;Muestra del texto
	breq 	Final6
	rjmp 	leer_otroc6
Final6:
	ret

;Subrutina: Canal2
;Funcion: Muestra en pantalla un texto
;Entradas: Ninguna
;Salidas: Ninguna
Canal2:

   ldi 	ZH, high(tab_canales3*2)	;Z apunta al inicio del mensaje
	ldi 	ZL, low(tab_canales3*2)
	ldi 	R23, 0							;Contador de caracteres a visualizar
leer_otroc5:
	lpm	dato, Z+							;Lee y muestra caracter en LCD		
	rcall WriteDR
	rcall	RetardoXms
	inc 	R23
	cpi 	R23, 15							;Muestra del texto
	breq 	Final5
	rjmp 	leer_otroc5
Final5:
	ret
	
;Subrutina: Canal3
;Funcion: Muestra en pantalla un texto
;Entradas: Ninguna
;Salidas: Ninguna
Canal3:

   ldi 	ZH, high(tab_canales4*2)	;Z apunta al inicio del mensaje
	ldi 	ZL, low(tab_canales4*2)
	ldi 	R23, 0							;Contador de caracteres a visualizar
leer_otroc7:
	lpm	dato,Z+							;Lee y muestra caracter en LCD		
	rcall WriteDR
	rcall	RetardoXms
	inc 	R23
	cpi 	R23, 15							;Muestra del texto
	breq 	Final7
	rjmp 	leer_otroc7
Final7:
	ret
	
;Subrutina: Elige_canales
;Funcion: Selección de numeros de canales a trabajar
;Entradas: Ninguna
;Salidas: canal_eleg
Elige_canales:

	push	R16
	push	R17
sensa:
	rcall	enter	
	lds	R16, bot_enter			;se verifica si se realizo una
	cpi	R16, 1               ;primera elección, de ser así se
	brne	down                 ;confirma guardando en memoria que
	ldi	R17, 1               ;eligio la primera opción, sino se
	sts	canal_eleg, R17      ;prosigue analizando
	rjmp	final4	
down:
	rcall	bajar                ;se verifica si se cambio de pantalla
	lds	R16, bot_baj         ;si es que se pulsó el botón de bajar
	cpi	R16, 1
	brne	sensa
   rcall	Clear                ;se muestran nuevas pantallas en LCD
	rcall Canal2
	rcall	Inicio_linea2
	rcall	Canal3
	ldi	R16, 0
	sts	bot_enter, R16       ;se retornan los espacios de memoria
	sts	bot_sub, R16         ;referentes a los pulsadores a 0, para
	sts	bot_baj, R16         ;distinguir una nueva elección
linea1:
	
	rcall	Inicio_linea         ;verificación si se escogío la primera
	rcall	enter	               ;opción en pantalla, de no ser así se
	lds	R16, bot_enter       ;prosigue analizando
	cpi	R16, 1
	breq	esc_2ch
	rcall	bajar
	lds	R16, bot_baj
	cpi	R16, 1
	brne	linea1
	
	ldi	R16, 0
	sts	bot_enter, R16
	sts	bot_sub, R16
	sts	bot_baj, R16
down2:
	
	rcall	Inicio_linea2        ;verificación si se escogío la segunda
	rcall	enter	               ;opción en pantalla, de no ser así se
	lds	R16, bot_enter       ;prosigue analizando
	cpi	R16, 1
	breq	esc_4ch
	rcall	subir
	lds	R16, bot_sub
	cpi	R16, 1
	breq	linea1
   rjmp	down2
esc_2ch:                      ;se guardan en espacios de memoria el numero
	ldi	R17, 2               ;de canales escogidos de acuerdo a las elecciones
	sts	canal_eleg, R17      ;anteriores
	rjmp	final4
esc_4ch:
	ldi	R17, 4
	sts	canal_eleg, R17
	rjmp	final4		
final4:
	ldi	R16, 0
	sts	bot_enter, R16
	sts	bot_sub, R16
	sts	bot_baj, R16
	pop	R17
	pop	R16
	ret

;Subrutina: enter
;Funcion: analiza si se presiono el pulsador enter
;Entradas: Ninguna
;Salidas: bot_enter
enter:
	in 	r16, PINB  				;se hace una lectura del puerto PB0
	andi 	r16, 0b00000001      ;se compara si ha sido presionado
	cpi 	r16, 0b00000001
	breq	enter_pres
	rjmp	final9
enter_pres:
	in 	r16, PINB            ;luego se compara si es que el pulsador
	andi 	r16, 0b00000001      ;ya ha sido soltado
	cpi 	r16, 0b00000001
	breq	enter_pres
enter_solt:
	ldi	r17, 1               ;de ocurrir las condiciones anteriores
	sts	bot_enter, r17       ;se guarda en memoria el valor de 1
	rjmp	final9
final9:
	ret

;Subrutina: subir
;Funcion: analiza si se presiono el pulsador subir
;Entradas: Ninguna
;Salidas: bot_subir
subir:
	in 	r16, PINB
	andi 	r16, 0b00000010		;se hace una lectura del puerto PB1
	cpi 	r16, 0b00000010      ;se compara si ha sido presionado
	breq	subir_pres
	rjmp	final10
subir_pres:
	in 	r16, PINB            ;luego se compara si es que el pulsador
	andi 	r16, 0b00000010      ;ya ha sido soltado
	cpi 	r16, 0b00000010
	breq	subir_pres
subir_solt:
	ldi	r17, 1               ;de ocurrir las condiciones anteriores
	sts	bot_sub, r17         ;se guarda en memoria el valor de 1
	rjmp	final10
final10:
	ret
	
;Subrutina: bajar
;Funcion: analiza si se presiono el pulsador bajar
;Entradas: Ninguna
;Salidas: bot_enter
bajar:
	in 	r16, PINB
	andi 	r16, 0b01000000      ;se hace una lectura del puerto PB2
	cpi 	r16, 0b01000000      ;se compara si ah sido presionado
	breq	bajar_pres
	rjmp	final11
bajar_pres:                   ;luego se compara si es que el pulsador
	in 	r16, PINB            ;ya ha sido soltado
	andi 	r16, 0b01000000
	cpi 	r16, 0b01000000
	breq	bajar_pres
bajar_solt:
	ldi	r17, 1               ;de ocurrir las condiciones anteriores
	sts	bot_baj, r17         ;se guarda en memoria el valor de 1
	rjmp	final11
final11:
	ret
	
;Subrutina: Seleccion3
;Funcion: Muestra en pantalla un texto
;Entradas: Ninguna
;Salidas: Ninguna
Seleccion3:

   ldi 	ZH, high(tab_programas1*2)	;Z apunta al inicio del mensaje
	ldi 	ZL, low(tab_programas1*2)
	ldi 	R23, 0							;Contador de caracteres a visualizar
leer_otroc15:
	lpm	dato,Z+							;Lee y muestra caracter en LCD		
	rcall WriteDR
	rcall	RetardoXms
	inc 	R23
	cpi 	R23, 15							;Muestra del texto
	breq 	Final17
	rjmp 	leer_otroc15
Final17:
	ret
	
;Subrutina: Seleccion4
;Funcion: Muestra en pantalla un texto
;Entradas: Ninguna
;Salidas: Ninguna
Seleccion4:

   ldi 	ZH, high(tab_programas2*2)	;Z apunta al inicio del mensaje
	ldi 	ZL, low(tab_programas2*2)
	ldi 	R23, 0							;Contador de caracteres a visualizar
leer_otroc14:
	lpm	dato,Z+							;Lee y muestra caracter en LCD		
	rcall WriteDR
	rcall	RetardoXms
	inc 	R23
	cpi 	R23, 15							;Muestra del texto
	breq 	Final18
	rjmp 	leer_otroc14
Final18:
	ret
	
;Subrutina: Seleccion5
;Funcion: Muestra en pantalla un texto
;Entradas: Ninguna
;Salidas: Ninguna
Seleccion5:

   ldi 	ZH, high(tab_programas3*2)	;Z apunta al inicio del mensaje
	ldi 	ZL, low(tab_programas3*2)
	ldi 	R23, 0							;Contador de caracteres a visualizar
leer_otroc17:
	lpm	dato,Z+							;Lee y muestra caracter en LCD		
	rcall WriteDR
	rcall	RetardoXms
	inc 	R23
	cpi 	R23, 15							;Muestra del texto
	breq 	Final19
	rjmp 	leer_otroc17
Final19:
	ret
	
;Subrutina: Seleccion6
;Funcion: Muestra en pantalla un texto
;Entradas: Ninguna
;Salidas: Ninguna
Seleccion6:

   ldi 	ZH, high(tab_programas4*2)	;Z apunta al inicio del mensaje
	ldi 	ZL, low(tab_programas4*2)
	ldi 	R23, 0							;Contador de caracteres a visualizar
leer_otroc16:
	lpm	dato,Z+							;Lee y muestra caracter en LCD		
	rcall WriteDR
	rcall	RetardoXms
	inc 	R23
	cpi 	R23, 15							;Muestra del texto
	breq 	Final20
	rjmp 	leer_otroc16
Final20:
	ret
	
;Subrutina: Elige_pred
;Funcion: Selección del de programa predeterminado
;Entradas: Ninguna
;Salidas: elec_pred
Elige_pred:

	push	R16
	push	R17
	rcall	Seleccion3 			;muestra en pantalla las primeras elecciones
	rcall	Inicio_linea2     ;posibles de programas de estimulación
	rcall	Seleccion4
sensa3:
	rcall	Inicio_linea      ;se analiza si es escogio la primera opción
	rcall	enter	
	lds	R16, bot_enter
	cpi	R16, 1
	breq	esc_resist_aux    ;de no ser así, se baja para corroborar si
	rcall	bajar             ;el segundo programa fue escogido
	lds	R16, bot_baj
	cpi	R16, 1
	brne	sensa3	
	ldi	R16, 0
	sts	bot_enter, R16
	sts	bot_sub, R16
	sts	bot_baj, R16
	rjmp	down5
	
esc_resist_aux:
	rjmp	esc_resist

down5:
	rcall	Inicio_linea2		;analisis si se escogió el segundo programa		
	rcall	subir             ;visualizado en la primera pantalla del LCD
	lds	R16, bot_sub      ;de no ser así se procede a verificar en
	cpi	R16, 1            ;una segunda pantalla
	breq	sensa3
	rcall	enter
	lds	R16, bot_enter
	cpi	R16, 1
	breq	esc_hiper
	rcall	bajar
	lds	R16, bot_baj
	cpi	R16, 1
	brne	down5
	ldi	R16, 0
	sts	bot_enter, R16
	sts	bot_sub, R16
	sts	bot_baj, R16
	rcall	Clear
	rcall	Seleccion5        ;visualización en LCD de la segunda pantalla de
	rcall	Inicio_linea2     ;selección de programas
	rcall	Seleccion6
linea10:
	rcall	Inicio_linea	   ;procedimiento de analisis de selección
	rcall	enter	            ;similar al realizado anteriormente en esta
	lds	R16, bot_enter    ;para la primera pantalla con opciones de
	cpi	R16, 1            ;programas
	breq	esc_fmax
	rcall	bajar
	lds	R16, bot_baj
	cpi	R16, 1
	brne	linea10
	ldi	R16, 0
	sts	bot_enter, R16
	sts	bot_sub, R16
	sts	bot_baj, R16
down6:
	rcall	Inicio_linea2
	rcall	enter	
	lds	R16, bot_enter
	cpi	R16, 1
	breq	esc_fexplo
	rcall	subir
	lds	R16, bot_sub
	cpi	R16, 1
	breq	linea10
   rjmp	down6
esc_resist:
	ldi	R17, 1            ;de acuerdo al programa seleccionado se
	sts	elec_pred, R17    ;guarda en un espacio de memoria valores del
	rjmp	final21           ;1 al 4, para identificación de los mismos
esc_hiper:                 ;en las siguientes subrutinas
	ldi	R17, 2
	sts	elec_pred, R17
	rjmp	final21
esc_fmax:
	ldi	R17, 3
	sts	elec_pred, R17
	rjmp	final21
esc_fexplo:
	ldi	R17, 4
	sts	elec_pred, R17
	rjmp	final21		
final21:
	ldi	R16, 0
	sts	bot_enter, R16
	sts	bot_sub, R16
	sts	bot_baj, R16
	pop	R17
	pop	R16
	ret
	
;Subrutina: mens_inicio
;Funcion: Muestra en pantalla un texto
;Entradas: Ninguna
;Salidas: Ninguna
mens_inicio:

   ldi 	ZH, high(tab_inicio*2)	;Z apunta al inicio del mensaje
	ldi 	ZL, low(tab_inicio*2)
	ldi 	R23, 0						;Contador de caracteres a visualizar
leer_otroc18:
	lpm	dato,Z+						;Lee y muestra caracter en LCD		
	rcall WriteDR
	rcall	RetardoXms
	inc 	R23
	cpi 	R23, 15						;Muestra del texto
	breq 	Final22
	rjmp 	leer_otroc18
Final22:
	ret

;Subrutina: ejec_estimulo1
;Funcion: Muestra en pantalla un texto
;Entradas: Ninguna
;Salidas: Ninguna
ejec_estimulo1:

   ldi 	ZH, high(tab_ejecutando1*2)	;Z apunta al inicio del mensaje
	ldi 	ZL, low(tab_ejecutando1*2)
	ldi 	R23, 0								;Contador de caracteres a visualizar
leer_otroc19:
	lpm	dato,Z+								;Lee y muestra caracter en LCD		
	rcall WriteDR
	rcall	RetardoXms
	inc 	R23
	cpi 	R23, 15								;Muestra del texto
	breq 	Final23
	rjmp 	leer_otroc19
Final23:
	ret

;Subrutina: ejec_estimulo2
;Funcion: Muestra en pantalla un texto
;Entradas: Ninguna
;Salidas: Ninguna
ejec_estimulo2:

   ldi 	ZH, high(tab_ejecutando2*2)	;Z apunta al inicio del mensaje
	ldi 	ZL, low(tab_ejecutando2*2)
	ldi 	R23, 0								;Contador de caracteres a visualizar
leer_otroc20:
	lpm	dato,Z+								;Lee y muestra caracter en LCD		
	rcall WriteDR
	rcall	RetardoXms
	inc 	R23
	cpi 	R23, 15								;Muestra del texto
	breq 	Final24
	rjmp 	leer_otroc20
Final24:
	ret

;Subrutina: val_ini
;Funcion: Subrutina para definir valores inicial enviados al DAC
;de acuerdo al numero de canales escogidos
;Entradas: Ninguna
;Salidas: Ninguna
val_ini:
	push	R16
rev_canal:
	lds	R16, canal_eleg	;verificación de los numeros de canales
	cpi	R16, 1            ;escogidos, para inicialización del nivel
	breq	un_canal          ;inicial de amplitud
	cpi	R16, 2
	breq	dos_canales
	cpi	R16, 4
	breq	cuatro_canales
	rjmp	rev_canal
un_canal:
	ldi	R16, 155 			;se guarda el valor minimo para el primer
	sts	ch1_h, R16        ;canal, los demás permanecen en off
	ldi	R16, 100
	sts	ch1_l, R16
	ldi	R16, 128
	sts	ch2_h, R16
	sts	ch2_l, R16
	sts	ch3_h, R16
	sts	ch3_l, R16
	sts	ch4_h, R16
	sts	ch4_l, R16	
	rjmp	finale2
dos_canales:
	ldi	R16, 155          ;se guarda el valor minimo para los dos
	sts	ch1_h, R16        ;canales iniciales, los demás permanecen
	sts	ch2_h, R16	      ;en off
	ldi	R16, 100
	sts	ch1_l, R16	
	sts	ch2_l, R16
	ldi	R16, 128
	sts	ch3_h, R16
	sts	ch3_l, R16
	sts	ch4_h, R16	
	sts	ch4_l, R16
	rjmp	finale2
cuatro_canales:
	ldi	R16, 155          ;se guarda el valor minimo para los cuatro
	sts	ch1_h, R16        ;canales del dispositivo
	sts	ch2_h, R16
	sts	ch3_h, R16
	sts	ch4_h, R16
	ldi	R16, 100
	sts	ch1_l, R16
	sts	ch2_l, R16
	sts	ch3_l, R16
	sts	ch4_l, R16
	
finale2:
	pop	R16
	ret	

;Subrutina: amplitud
;Funcion: Subrutina para modificar valores de amplitud de la señal
;Entradas: Ninguna
;Salidas: Ninguna
amplitud:
	push	R16
	push	R17
	push	R18
	push	R19
	rcall	subir						;analisis si se presiono de subir o
	lds	R16, bot_sub         ;bajar, para aumentar o disminuir el
	cpi	R16, 1               ;nivel de amplitud
	breq	aumenta_amp
	rcall	bajar
	lds	R16, bot_baj
	cpi	R16, 1
	breq	disminuye_amp
   rjmp	finale3
aumenta_amp:
	lds	R16, ch1_h
	cpi	R16, 255             ;de encontrarse en el nivel más alto, no
	breq	finale3_aux          ;es posible subir más
	inc	R16
	lds	R17, ch1_l
	cpi	R17, 0
	breq	finale3_aux
	dec	R17
	rjmp	rev_canal1
disminuye_amp:
	lds	R16, ch1_h           ;de encontrarse en el nivel más bajo, no
	cpi	R16, 155             ;es posible bajar más
	breq	finale3_aux
	dec	R16
	lds	R17, ch1_l
	cpi	R17, 100
	breq	finale3_aux
	inc	R17
	rjmp	rev_canal1
finale3_aux:
	rjmp	finale3
rev_canal1:
	lds	R18, canal_eleg      ;analisis del numero de canales escogidos
	cpi	R18, 1
	breq	un_canal2
	cpi	R18, 2
	breq	dos_canales2
	cpi	R18, 4
	breq	cuatro_canales2
	rjmp	rev_canal1
un_canal2:
	sts	ch1_h, R16           ;se guarda el valor minimo solo para el canal 1
	sts	ch1_l, R17
	ldi	R19, 128
	sts	ch2_h, R19
	sts	ch2_l, R19
	sts	ch3_h, R19
	sts	ch3_l, R19
	sts	ch4_h, R19
	sts	ch4_l, R19	
	rjmp	finale3
dos_canales2:
	sts	ch1_h, R16           ;se guarda el valor minimo solo para los 2
	sts	ch2_h, R16	         ;primeros canales
	sts	ch1_l, R17	
	sts	ch2_l, R17
	ldi	R19, 128
	sts	ch3_h, R19
	sts	ch3_l, R19
	sts	ch4_h, R19	
	sts	ch4_l, R19
	rjmp	finale3
cuatro_canales2:
	sts	ch1_h, R16           ;se guarda el valor minimo para todos los
	sts	ch2_h, R16           ;canales
	sts	ch3_h, R16
	sts	ch4_h, R16
	sts	ch1_l, R17
	sts	ch2_l, R17
	sts	ch3_l, R17
	sts	ch4_l, R17
finale3:
	ldi	R16, 0
	sts	bot_enter, R16
	sts	bot_sub, R16
	sts	bot_baj, R16
	pop	R19
	pop	R18
	pop	R17
	pop	R16
	ret		
		
;Subrutina: prog_pred
;Funcion: Subrutina de conformacion de la señal de EMS
;Entradas: Ninguna
;Salidas: Ninguna
prog_pred:
	push	R16
	lds	R16, elec_pred			;se analiza que tipo de programa de
   cpi	R16, 1               ;entrenamiento se escogio
   breq	par_resistencia
   cpi	R16, 2
   breq	par_hipertrofia
   cpi	R16, 3
   breq	par_fmaxima
   cpi	R16, 4
   breq	par_fexplosiva
par_resistencia:
	ldi	R16, 93              ;se almacenan parametros básicos para el
	sts	freq, R16            ;entrenamiento de resistencia: frecuencia,
	ldi	R16, 8               ;tiempos de contraccion y reposo, además
	sts	contrac, R16         ;de número de repeticiones
	ldi	R16, 5
	sts	reposo, R16
	ldi	R16, 70
	sts	repet, R16
	rcall	mens_inicio
	rjmp	ini_estimula
par_hipertrofia:              ;se almacenan los mismos parámetros mencionados
	ldi	R16, 53              ;anteriormente, pero de acuerdo al entrenamiento
	sts	freq, R16            ;de hipertrofia
	ldi	R16, 4
	sts	contrac, R16
	ldi	R16, 8
	sts	reposo, R16
	ldi	R16, 60
	sts	repet, R16
	rcall	mens_inicio
	rjmp	ini_estimula
par_fmaxima:
	ldi	R16, 34              ;se almacenan los mismos parámetros mencionados
	sts	freq, R16            ;anteriormente, pero de acuerdo al entrenamiento
	ldi	R16, 3               ;de fuerza máxima
	sts	contrac, R16
	ldi	R16, 20
	sts	reposo, R16
	ldi	R16, 40
	sts	repet, R16
	rcall	mens_inicio
	rjmp	ini_estimula
par_fexplosiva:
	ldi	R16, 27              ;se almacenan los mismos parámetros mencionados
	sts	freq, R16            ;anteriormente, pero de acuerdo al entrenamiento
	ldi	R16, 3               ;de fuerza explosiva
	sts	contrac, R16
	ldi	R16, 30
	sts	reposo, R16
	ldi	R16, 30
	sts	repet, R16
	pop	R16
	ret

;Subrutina: conf_senal
;Funcion: Subrutina de conformacion de la señal y rutina de EMS
;Entradas: Ninguna
;Salidas: Ninguna
conf_senal:
;	sei
;	rcall	contrac_time
;	rcall	reposo_time	
start:
		
   rcall	amplitud
	lds	r18,ch1_h     		;valores iniciales
	lds	r19,ch2_h	
   lds	r20,ch3_h	
   lds	r21,ch4_h

	ldi	r29,0b00000001		;control A	
	ldi	R16,0b00001000	   ;CS es 0 para activar DAC
	out	PORTC,R16	  	   ;Ldac es 1 para no actualizar registros   (aun)
	
controlA:   					;primer control A									
	out   SPDR,r29          ;Manda los bits de control para el DAC A
	
controlAA:						;Espera por transmision completa
	sbis  SPSR,SPIF
	rjmp  controlAA
	
datoA:
	out	SPDR,r18						

datoAA:
	sbis  SPSR,SPIF
	rjmp  datoAA	         ;deberia ponerse CS a 1 para que actualize lo que se hizo
		
	ldi	R16,0b00011000   	;CS es 1 para desactivar DAC
	out	PORTC,R16	     	;Ldac es 1 para no actualizar registros   (aun)
	nop
	nop
	ldi	r16,0b00001000  	;CS es 0 para activar el dac de nuevo
	out	portc,r16
		
controlB:
	ldi	r29,0b00000101		
	out	SPDR,r29
	
controlBB:    					;Espera por transmision completa
	sbis	SPSR,SPIF
	rjmp	controlBB
	
datoB:
   out	SPDR,r19

datoBB:
  	sbis	SPSR,SPIF
	rjmp	datoBB
	
	ldi	R16,0b00011000    ;CS es 1 para desactivar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)	
	nop                      	
	nop
	ldi	R16,0b00001000    ;CS es 0 para activar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)

controlC:
	ldi	r29,0b00001001		
	out	SPDR,r29
	
controlCC:    					;Espera por transmision completa
	sbis	SPSR,SPIF
	rjmp	controlCC
	
datoC:
   out	SPDR,r20

datoCC:
  	sbis 	SPSR,SPIF
	rjmp 	datoCC
	
	ldi	R16,0b00011000    ;CS es 1 para desactivar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)	
	nop
	nop
	ldi	R16,0b00001000    ;CS es 0 para activar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)

controlD:
	ldi	r29,0b00001101		
	out	SPDR,r29
	
controlDD:    					;Espera por transmision completa
	sbis  SPSR,SPIF
	rjmp  controlDD
	
datoD:
   out	SPDR,r21

datoDD:
  	sbis  SPSR,SPIF
	rjmp  datoDD
	
	ldi	R16,0b00011000   ;CS es 1 para desactivar DAC
	out	PORTC,R16	     ;Ldac es 1 para no actualizar registros   (aun)	
	nop
	nop
	ldi	R16,0b00001000   ;CS es 0 para activar DAC
	out	PORTC,R16	     ;Ldac es 1 para no actualizar registros   (aun)	

ldac:
	ldi	r22,0b00000010
	ldi	r23,0b11111111	
	out	spdr,r22
	
r22:
	sbis 	SPSR,SPIF
	rjmp 	r22	
	out	spdr,r23
	
r23:
	sbis 	spsr,spif
	rjmp	r23
	
	ldi	r16,0b00011000      ; apaga el DAC
	out	portc,r16
		
;;;;;;;;;;;; posicion 2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
;;;;;;;;;;;; posicion 2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;; posicion 2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;; posicion 2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	lds	r18,ch1_l
	lds	r19,ch2_l
   lds	r20,ch3_l
   lds	r21,ch4_l
	
	ldi	r29,0b00000001	   ;control A
	ldi	R16,0b00001000   	;CS es 0 para activar DAC
	out	PORTC,R16	     	;Ldac es 1 para no actualizar registros   (aun)
	
controlA_2:           		;primer control A										
	out 	SPDR,r29      		;Manda los bits de control para el DAC A
	
controlAA_2:					;Espera por transmision completa
	sbis 	SPSR,SPIF
	rjmp 	controlAA_2
	
datoA_2:
	out	SPDR,r18					

datoAA_2:
	sbis 	SPSR,SPIF
	rjmp 	datoAA_2	      	;deberia ponerse CS a 1 para que actualize lo que se hizo
	ldi	R16,0b00011000   	;CS es 1 para desactivar DAC
	out	PORTC,R16	     	;Ldac es 1 para no actualizar registros   (aun)	
	nop
	nop	
	ldi	r16,0b00001000  	;CS es 0 para activar el dac de nuevo
	out	portc,r16
		
controlB_2:
	ldi	r29,0b00000101	
	out	SPDR,r29
	
controlBB_2:    				;Espera por transmision completa
	sbis 	SPSR,SPIF
	rjmp 	controlBB_2
	
datoB_2:
   out	SPDR,r19

datoBB_2:
  	sbis 	SPSR,SPIF
	rjmp 	datoBB_2
	
	ldi	R16,0b00011000    ;CS es 1 para desactivar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)	
	nop
	nop	
	ldi	R16,0b00001000    ;CS es 0 para activar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)
	
controlC_2:
	ldi	r29,0b00001001	
	out	SPDR,r29
	
controlCC_2:   				;Espera por transmision completa
	sbis 	SPSR,SPIF
	rjmp 	controlCC_2
	
datoC_2:
   out	SPDR,r20

datoCC_2:
  	sbis 	SPSR,SPIF
	rjmp 	datoCC_2
	
	ldi	R16,0b00011000    ;CS es 1 para desactivar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)	
	nop
	nop	
	ldi	R16,0b00001000    ;CS es 0 para activar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)

controlD_2:
	ldi	r29,0b00001101	
	out	SPDR,r29
	
controlDD_2:    				;Espera por transmision completa
	sbis 	SPSR,SPIF
	rjmp 	controlDD_2
	
datoD_2:
   out	SPDR,r21

datoDD_2:
  	sbis 	SPSR,SPIF
	rjmp 	datoDD_2
	
	ldi	R16,0b00011000    ;CS es 1 para desactivar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)	
	nop
	nop
	ldi	R16,0b00001000    ;CS es 0 para activar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)

ldac_2:
	ldi	r22,0b00000010
	ldi	r23,0b11111111
	out	spdr,r22
	
r22_2:
	sbis 	SPSR,SPIF
	rjmp 	r22_2	
	out	spdr,r23
	
r23_2:
	sbis 	spsr,spif
	rjmp	r23_2
	
	ldi	r16,0b00011000		;apaga el DAC
	out	portc,r16
		
;;;;;;;;;;;; posicion 3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
;;;;;;;;;;;; posicion 3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;; posicion 3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;; posicion 3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	ldi	r24, 0

	ldi	r18,128
	ldi	r19,128
   ldi	r20,128
   ldi	r21,128
	
cero:
	ldi	r29,0b00000001	   ; control A
	
	ldi	R16,0b00001000    ;CS es 0 para activar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)

controlA_3:
	out 	SPDR,r29          ;Manda los bits de control para el DAC A								

controlAA_3:
	sbis 	SPSR,SPIF         ;Espera por transmision completa
	rjmp 	controlAA_3

datoA_3:
	out	SPDR,r18					

datoAA_3:
	sbis 	SPSR,SPIF
	rjmp 	datoAA_3	
	ldi	R16,0b00011000    ;CS es 1 para desactivar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)
	nop
	nop
	ldi	r16,0b00001000    ;CS es 0 para activar el dac de nuevo
	out	portc,r16
	
controlB_3:
	ldi	r29,0b00000101	
	out	SPDR,r29
	
controlBB_3:
	sbis 	SPSR,SPIF         ;Espera por transmision completa
	rjmp 	controlBB_3
	
datoB_3:
   out	SPDR,r19

datoBB_3:
  	sbis  SPSR,SPIF
	rjmp  datoBB_3
	
	ldi	R16,0b00011000   	;CS es 1 para desactivar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)
	
	nop
	nop
	
	ldi	R16,0b00001000    ;CS es 0 para activar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)
	
controlC_3:
	ldi	r29,0b00001001	
	out	SPDR,r29
	
controlCC_3:
	sbis 	SPSR,SPIF         ;Espera por transmision completa
	rjmp 	controlCC_3
	
datoC_3:
   out	SPDR,r20

datoCC_3:
  	sbis 	SPSR,SPIF
	rjmp 	datoCC_3
	
	ldi	R16,0b00011000    ;CS es 1 para desactivar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)
	nop
	nop
	ldi	R16,0b00001000    ;CS es 0 para activar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)

controlD_3:
	ldi	r29,0b00001101	
	out	SPDR,r29
	
controlDD_3:
	sbis  SPSR,SPIF         ;Espera por transmision completa
	rjmp  controlDD_3
	
datoD_3:
   out	SPDR,r21

datoDD_3:
  	sbis  SPSR,SPIF
	rjmp  datoDD_3
	
	ldi	R16,0b00011000    ;CS es 1 para desactivar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)
	nop
	nop
	ldi	R16,0b00001000    ;CS es 0 para activar DAC
	out	PORTC,R16	      ;Ldac es 1 para no actualizar registros   (aun)

ldac_3:

	ldi	r22,0b00000010
	ldi	r23,0b11111111
	out	spdr,r22
	
r22_3:
	sbis 	SPSR,SPIF
	rjmp 	r22_3
	out	spdr,r23
	
r23_3:
	sbis 	spsr,spif
	rjmp	r23_3
	ldi	r16,0b00011000    ; apaga el DAC
	out	portc,r16
	
compara:
	lds	r16, freq
	inc	r24
	cp		r24, r16
	brne	cero1
	rjmp	finale

cero1:
	rjmp cero
		
finale:
	rjmp start
					
;*********************************************************************
;*************************** PROGRAMA PRINCIPAL **********************
;*********************************************************************
Inicio:

	ldi 	R16,high(RAMEND)     ;Valor inicial del puntero de pila
	out 	SPH,R16
	ldi 	R16,low(RAMEND)
	out 	SPL,R16
	     	
	ldi	r17,0                ;inicio de variables en 0
	ldi	r18,0
	ldi	r19,0
	ldi	r20,0
	ldi	r21,0
	ldi	r22,0
	ldi	r23,0
	ldi	r24,0
	ldi	r25,0
	ldi	r26,0
	ldi	r27,0
	ldi	r28,0
	ldi	r29,0
	ldi	r30,0
	ldi	r31,0
	
	ldi	r16,128
	sts	ch1_h, r16
	sts	ch2_h, r16
	sts	ch3_h, r16
	sts	ch4_h, r16
	sts	ch1_l, r16
	sts	ch2_l, r16
	sts	ch3_l, r16
	sts	ch4_l, r16
	
	ldi	r16,0
	sts	n_01ms, r16
	sts	n_01msaux, r16
	sts	n_25ms, r16
	sts	n_seg, r16
	sts	bot_enter, r16
	sts	bot_sub, r16
	sts	bot_baj, r16
	sts	canal_eleg, r16	
	sts	elec_pred, r16
   sts	freq, r16
	sts	contrac, r16
	sts	reposo, r16
	sts	repet, r16
	
	rcall Configura_puertos		;Configuración de puertos
	rcall	config_SPI           ;Configuración comunicación SPI
	rcall	Inicio_dac           ;Inicialización del DAC nivel 0V a las salidas
	rcall RetardoXms
	rcall Configura_LCD        ;configuracion inicial del LCD
	rcall	config_timer1        ;Configuración Timer1

Siguiente:

	rcall	Clear					;pantalla limpia
	rcall	PInicial1    		;muestreo de la pantalla inicial
	rcall	Inicio_linea2  	;inicial en 2 lineas
	rcall	PInicial2
	rcall	t_retardo2s    	;retardo de 2 segundos
	rcall	Clear          	;limpia pantalla
	rcall Canal          	;muestra texto de eleccion de #canales
	rcall	Inicio_linea2  	;en 2 lineas de la pantalla
	rcall	Canal1
	rcall	Inicio_linea2
	rcall	Elige_canales		;subrutina para eleccion de #canales
	rcall	Clear
	
ver_predeterminados:	
	rcall	Elige_pred			;subrutina de eleccion de los programas
	rcall	Clear       		;predeterminados
	rcall	prog_pred         ;guarda en espacio de memoria los parametros
	rcall	mens_inicio       ;basicos de la señal de acuerdo al programa
	rjmp	ini_estimula      ;escogido
	
ini_estimula:
	rcall	enter             ;se espera pulsar enter para iniciar programa
	lds	R16, bot_enter
	cpi	R16, 1
	brne	ini_estimula
	rcall	Clear
	rcall	ejec_estimulo1   	;visualización de pantalla de ejecución del
	rcall	Inicio_linea2     ;programa de estimuación
	rcall	ejec_estimulo2
	rcall	val_ini	         ;configuración de valor de amplitud inicial
	rcall	conf_senal        ;subrutina de conformación de la señal EMS
	                        ;de acuerdo a sus parámetros
	rjmp	Fin

Fin:
 	rjmp Fin
 	
;***************************************************************************
;***********************************TABLAS**********************************
;***************************************************************************
	
tab_pinicial1:
.db "  ESTIMULADOR   "
tab_pinicial2:
.db "    MUSCULAR    "
tab_canales1:
.db "Nº de canales?  "
tab_canales2:
.db "1 Canal         "
tab_canales3:
.db "2 Canales       "
tab_canales4:
.db "4 Canales       "
tab_programas1:
.db "1. Resistencia  "
tab_programas2:
.db "2. Hipertrofia  "
tab_programas3:
.db "3. F.Maxima     "
tab_programas4:
.db "4. F.Explosiva  "
tab_inicio:
.db "  Pulse Start   "
tab_ejecutando1:
.db "   ESTIMULANDO  "
tab_ejecutando2:
.db "  AJUSTE NIVEL  "




