﻿/*	PROGRAMA: DMXRGBP.ASM
	DESCRIPCIÓN: RECEPTOR DMX - DIMMER RGB.
	REALIZACIÓN: VÍCTOR ALBERTO SALINAS REYES.
	EMPRESA: ASSIC MAQUILADORA.
	DIAGRAMA: DMC1.SCH .
	PARTE: U1 .
	VERSIÓN: 2.Y
	NOTAS: VERSIÓN PARA LOTE 1 .
===========================================================
2011-06-05 17:12 LIBERACIÓN VERSIÓN 2.Y .
2011-06-02 22:44 INICIO DESARROLLO VERSIÓN 2.Y .
2011-01-11 02:31 LIBERACIÓN VERSIÓN 2.Z .
2011-01-10 08:28 ENSAMBLE VERSIÓN 2.Z , VERSIÓN PARA LOTE 1 .
2010-12-21 00:22 REALIZACIÓN DE COMANDO "INICIO SIN SECUE".
2010-12-21 00:00 CAMBIO EN EL MENÚ, ELIMINACIÓN DE "SECUENCIA INICIAL", AGREGADO "INICIO SIN SECUE".
2010-12-20 23:49 SECUENCIA INICIAL, RESPALDO EN EEPROM.
2010-12-19 22:36 REALIZACIÓN DE COMANDO RAPIDEZ.
2010-12-19 12:38 REPECCIÓN DE TRAMA DMX DESHABILITA SECUENCIAS.
2010-12-19 01:39 FINALIZADAS 8 SECUENCIAS DE CONMUTADO.
2010-12-19 01:39 SERVICIO DE RUTINAS DE CONMUTADO POR INTERRUPCIÓN.
2010-12-18 10:35 FINALIZADAS 8 SECUENCIAS DE FUNDIDO.
2010-12-17 09:25 SERVICIO DE RUTINAS DE FUNDIDO POR INTERRUPCCIÓN.
2010-12-13 11:15 SERVICIO DE RUTINAS DE ESTROBO POR INTERRUPCCIÓN.
2010-11-28 16:12 FORTIFICACIÓN DE DETECCIÓN DE "BREAK" EN RSI DE USART.
2010-11-24 21:30 LIBERACIÓN DE PRODUCCIÓN, V2.0 .
2010-11-22 13:40 ASIGNACIÓN A LED COMO INDICADOR DE RECEPCIÓN DE TRAMA DMX.
2010-11-22 02:05 REVISIÓN DE LAS RUTINAS QUE NECESITAN DEL TEMPORIZADOR.
2010-11-22 00:35 CORRECCIÓN CAMBIO DE REGISTRO PARA CONTADOR DE SOBREFLUJOS DEL TEMPORIZADOR.
2010-11-21 09:53 CAMBIO DE FRECUENCIA DE PWM PARA COMPENSAR PARPADEO DE FRECUENCIA DE LÍNEA.
2010-11-21 09:52 CAMBIO DE MODO DE PWM DE FAST A PHASE CORRECT.
2010-11-19 01:25 DISEÑO DE SECUENCIAS DE FUNDIDO R G B, V 1.G .
2010-11-18 00:00 DISEÑO DE SECUENCIAS DE ESTROBO.
2010-11-15 23:49 VERIFICACIÓN DE RUTINAS DE CAMBIO DE CANALES DMX, V 1.F .
2010-11-15 20:03 REDISEÑO DE RUTINAS DE MODIFICACIÓN DE PARÁMETRO, V 1.E .
2010-11-15 00:54 REALIZACIÓN DE RUTINA DE CARGA DE INTENSIDAD INCIAL DE SALIDAS.
2010-11-14 22:37 ENSAMBLE PARA ATTINY4313, V 1.D .
2010-11-14 15:43 VERIFICACIÓN DE RUTINAS DE ASIGNACIÓN DE CANAL DMX PARA RGBX, V 1.D .
2010-11-13 22:46 PRIMERA VERSIÓN DE RUTINAS DE ASIGNACIÓN DE CANAL DMX.
2010-11-13 01:36 MODIFICACIÓN DE RUTINAS DEL MENÚ PARA EJECUCIÓN DE COMANDOS, V 1.C .
2010-11-10 02:27 RUTINA DEL SERVICIO DE INTERRUPCIÓN DEL SOBREFLUJO DEL CONTADOR 0.
2010-11-09 00:23 REDISEÑO DE RUTINAS DE MENÚ, REVISIÓN GENERAL DE RUTINAS, V 1.B .
2010-11-07 04:21 RESTRUCTURACIÓN DE TABLA DE MENÚ Y MODIFICACIÓN DE RUTINAS, V 1.A .
2010-11-04 22:22 DESARROLLO PARA EL MENÚ MODIFICACIÓN Y REALIZACIÓN DE RUTINAS.
2010-11-03 00:05 PREPARACIÓN PARA DMC1.SCH A1, CORRECCIÓN HARDWARE TECLADO-LCD, V 1.9 .
2010-11-02 23:34 PRIMERAS PRUEBAS CON DMC1.SCH A0 , INTERFERENCIA DEL TECLADO CON EL LCD V1.8 .
2010-11-02 22:42 SE INICIAN CAMBIOS PARA OPERAR CON DMC1.SCH A0 .
2010-11-02 22:40 MENÚ BÁSICO INCONCLUSO, SPIES.SCH C7 .
2010-10-26 01:29 SE EXHIBEN DIRECCIÓNES DE CANALES DMX.
2010-10-26 00:37 SE AÑADE RUTINA DE CONVERSIÓN DE BINARIO A BCD.
2010-10-24 23:33 EXHIBE CADENA DE IDENTIFICACIÓN Y DIRECCIONES DMX, (Y OCTETO DE TECLADO).
2010-10-24 21:19 DEFINICIÓN DE REGISTROS CONSTANTE K00 KFF.
2010-10-24 19:35 MODIFICACIONES PARA FUNCIONAR CON SPIES.SCH C7 , V1.6 .
2010-10-14 22:27 SPI CON REGISTRO DE CORRIMIENTO E/S FUNCIONANDO, V1.5 .
2010-10-12 00:40 MODIFICACIONES SOFTWARE Y HARDWARE PARA INTERFAZ LCD, C2 V1.3 .
2010-10-10 10:23 RUTINAS Y MODIFICACIONES PARA INTERFAZ DEL LCD, VERSIÓN 1.3 .
2010-10-07 00:40 CONSIDERACIONES DE HARDWARE PARA DIAGRAMA SPIES.SCH C1 , VERSIÓN 1.2 .
2010-09-30 21:52 ASIGNACIÓN USI COMO SPI DE E/S, VERSIÓN 1.1 .
2010-09-18 16:58 PRELIBERACIÓN VERSIÓN 1 .
2010-09-18 15:50 CORRECCIÓN DE FRECUENCIA FUNDAMENTAL DE PWM.
2010-09-18 14:50 CORRECCIÓN DE FRECUENCIA DE RELOJ, DMX TRABAJANDO.
2010-09-17 23:26 PRUEBAS DE UART CON DMX.
2010-09-05 05:36 INICIACIÓN DEL TEMPORIZADOR 1, 4 PWM FUNCIONANDO.
2010-08-31 01:26 INICIACIÓN DEL TEMPORIZADOR 0, PRUEBAS DE PWM.
2010-08-29 21:22 RUTINAS DE GRABACIÓN Y LECTURA DE EEPROM.
2010-08-29 03:49 REALIZACIÓN INICIAL.

PROPUESTAS:

2010-08-29 21:40
	RESPALDO DE DATOS DE EEPROM:
EEPROM 1/4 DATOS.
EEPROM 2/4 RESPALDO1.
EEPROM 3/4 RESPALDO2.
EEPROM 4/4 RESPALDO3.
REALIZAR PROGRAMA QUE COMPARE Y VERIFIQUE LA INTEGRIDAD DE DATOS.
EN CASO DE DATOS CORRUPTOS, EL PROGRAMA RECUPERE DE LOS RESPALDOS LOS DATOS.
EN CASO DE UN RESPALDO CORRUPTO, EL PROGRAMA DEBE DE CORREGIR EL RESPALDO.
MODIFICAR PROGRAMA DE ESCRITURA PARA ACTUALIZACIÓN DE LOS RESPALDOS.
2010-08-29 22:31
O CONSIDERAR CÓDIGO CRC (O SIMILAR) PARA VERIFICACIÓN DE INTEGRIDAD DE DATOS DE CONFIGURACIÓN.
*/
/*
	CONFIGURACIÓN:
 TENSIÓN DE OPERACIÓN:	5 V .
 RELOJ DE SISTEMA: EXTERIOR, CRISTAL DE CUARZO.	
 FRECUENCIA DE RELOJ: 8 MHz .
 IMPORTANTE: LA PROGRAMACIÓN DE LOS "FUSEBYTES" DE FABRICA NO ES LA MISMA PARA ESTE SISTEMA.
	EN CONCLUSIÓN; NO OMITIR REPROGRAMAR LOS "FUSEBYTES" COMO A CONTINUACIÓN SE INDICA.

* FUSEBYTES: 2010-09-18 14:19

	LOW = $FF , HIGH = $99 , EXTENDED = $FF .

1 SELFPRGEN

1 DWEN
0 EESAVE
0 SPIEN		;The SPIEN Fuse is not accessible in serial programming mode.
1 WDTON
1 BODLEVEL2	;BOD A 4.3 V
0 BODLEVEL1
0 BODLEVEL0	;.
1 RSTDISBL

1 CKDIV8
1 CKOUT
1 SUT1
1 SUT0
1 CKSEL3		;EXT. CRISTAL OSC. 8 MHz . STARTUP TIME 14CK + 65 ms
1 CKSEL2
1 CKSEL1
1 CKSEL0		;.

* TERMINALES PDIP/SOIC:	DMC1.SCH A1 2010-11-14 13:02

       -----_-----
   * -| 01     20 |- *
      |           |
   * -| 02     19 |- *
      |           |
   & -| 03     18 |- *
      |           |
   * -| 04     17 |- *
      |           |
   * -| 05     16 |- *
      |           |
   * -| 06     15 |- *
      |           |
   * -| 07     14 |- *
      |           |
   * -| 08     13 |- *
      |           |
   * -| 09     12 |- *
      |           |
   * -| 10     11 |- *
       -----------

01	RESET: REINICIO.
02	RXD: DMX RECEPCIÓN.
03	!TXD: DMX TRANSMISIÓN.
04	XTAL2: CRISTAL OSCILADOR.
05	XTAL1: CRISTAL OSCILADOR.
06	PD2: DRS , LCD RS.
07	PD3: DRW , LCD R/W.
08	PD4: DEN , LDC E.
09	OC0B: OX , PWM X.
10	GND: ALIMENTACIÓN -.
11	PD6: TEN	, HABILITACIÓN DEL TECLADO.
12	PB0: RLD	, HABILITACIÓN DE CARGA DE REGISTROS.
13	PB1: LED
14	OC0A: OR , PWM R.
15	OC1A: OG , PWM G.
16	OC1B: OB , PWM B.
17	MOSI: DI , SPI , PROGRAMACIÓN E INTERFAZ.
18	MISO: DO , SPI, PROGRAMACIÓN E INTERFAZ.
19	CLK: SCK , SPI, PROGRAMACIÓN E INTERFAZ.
20	VCC: ALIMENTACIÓN +.

! LIBRE SI NO SE UTILIZA TXD COMO TRANSMISOR.

2010-11-18 21:56

GPIOR0:
7
6
5
4
3	BANDERA INCREMENTO/DECREMENTO* FUNDIDO X
2	BANDERA INCREMENTO/DECREMENTO* FUNDIDO B
1	BANDERA INCREMENTO/DECREMENTO* FUNDIDO G
0	BANDERA INCREMENTO/DECREMENTO* FUNDIDO R

GPIOR1: BANDERAS DE ESTADO Y ERROR:
7	TRAMA DMX, OCTETO DE INICIO, DETECCIÓN.	
6	TRAMA DMX, SECCIÓN DE CONTROL, DETECCIÓN.
5
4	ACTUALIZACIÓN EN TIEMPO REAL DE REGISTRO DE ENTRADA/SALIDA.
3	LLAVE DE SEGURIDAD HABILITACIÓN DE CAMBIO DE PWM.
2
1
0	ERROR EN EEPROM.

GPIOR2: TECLADO ESTADO DE TRANSICIONES.

NOTAS:

*001 2010-11-21 08:32

EL TEMPORIZADOR 0 CUENTA PULSOS DEL CLKIO.
LOS PULSOS DEL CLKIO SE DIVIDEN EN EL PREESCALADOR CS02:CS01:CS00 .
LA FRECUENCIA DEL TEMPORIZADOR ES CLKIO ENTRE EL PREESCALADOR ENTRE 256 (LONGITUD DEL CONTADOR DEL TEMPORIZADOR 0).

COM0A1:0 = 10	Clear OC0A on Compare Match, set OC0A at TOP
COM0B1:0 = 10	Clear OC0B on Compare Match, set OC0B at TOP
WGM02:0 = 001 	Mode 1 PWM, Phase Correct [WGM02:0 = 011	Mode 3 Fast PWM CAMBIO DE MODO 2010-11-21 08:32]
CS02:0 = 010	ClkIO/8 (PWM 1953.125 Hz)
{
2010-11-22 00:26 ANTERIOR
CS02:0 = 100	clkI/O/64 (From prescaler) (PWM 244.140625 Hz) 2010-11-21 09:34 
[CS02:0 = 100	clkI/O/256 (From prescaler) (PWM 122.0703125 Hz)]
}

*002 2010-11-21 08:32

COM1A1:0 = 10	Clear OC1A on Compare Match, set OC1A at TOP
COM1B1:0 = 10	Clear OC1B on Compare Match, set OC1B at TOP
WGM13:0 = 0001	Mode 1 PWM, Phase Correct, 8-bit [WGM13:0 = 0101	Mode 5 Fast PWM, 8-bit CAMBIO DE MODO 2010-11-21 08:32]
CS12:0 = 010	ClkIO/8 (PWM 1953.125 Hz)
{
2010-11-22 00:26 ANTERIOR
CS12:0 = 100	clkI/O/256 (From prescaler) (PWM 244.140625 Hz) 2010-11-21 09:34 
[CS12:0 = 100	clkI/O/256 (From prescaler) (PWM 122.0703125 Hz)]
}

The extreme values for the OCR1x Register represents special cases when generating a PWM
waveform output in the fast PWM mode. If the OCR1x is set equal to BOTTOM (0x0000) the output
will be a narrow spike for each TOP+1 timer clock cycle. Setting the OCR1x equal to TOP
will result in a constant high or low output (depending on the polarity of the output set by the
COM1x1:0 bits.)

To do a 16-bit write, the high byte must be written before the low byte. For a 16-bit read, the low
byte must be read before the high byte.

*003 2010-09-18 01:38

0   0   0    0  0   0   0   0
RXC TXC UDRE FE DOR UPE U2X MPCM

1     0     0     1    0    0     0    0
RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8

00=ASÍNCRONO  00=NO_PAR 1    011=8BITS   0
UMSEL1 UMSEL0 UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL

RXC: USART Receive Complete
TXC: USART Transmit Complete
UDRE: USART Data Register Empty
FE: Frame Error
DOR: Data OverRun
UPE: USART Parity Error
U2X: Double the USART Transmission Speed
MPCM: Multi-processor Communication Mode
RXCIE: RX Complete Interrupt Enable
TXCIE: TX Complete Interrupt Enable
UDRIE: USART Data Register Empty Interrupt Enable
RXEN: Receiver Enable
TXEN: Transmitter Enable
RXB8: Receive Data Bit 8
TXB8: Transmit Data Bit 8
UMSEL1:0: USART Mode Select = 00 Asynchronous USART
UPM1:0: Parity Mode = 00 Disabled
USBS: Stop Bit Select = 1 2-bit (Solamente para transmisor)
UCSZ2:1:0: Character Size = 011 8-bit
UCPOL: Clock Polarity

*004 2010-09-18 16:16

	DIRECCIONES DMX:

DIRECCIÓN DE CANAL   1 = EN MEMORIA $000
DIRECCIÓN DE CANAL   2 = EN MEMORIA $001
DIRECCIÓN DE CANAL   3 = EN MEMORIA $002
	.		.
	.		.
	.		.
DIRECCIÓN DE CANAL 511 = EN MEMORIA $1FE
DIRECCIÓN DE CANAL 512 = EN MEMORIA $1FF

*005 2010-10-14 22:27 2010-10-11 00:37 2010-10-02 12:25

	ATtiny2313A DOC8246.PDF P157 Figure 16-3. Three-wire Mode, Timing Diagram.

  DI = PB5 CONFIGURAR COMO ENTRADA.
  DO = PB6 CONFIGURAR COMO SALIDA.
USCK = PB7 CONFIGURAR COMO SALIDA, ESTADO ALTO (/USCK). 

USICR - USI Control Register
USISIE USIOIE USIWM1 USIWM0 USICS1 USICS0 USICLK USITC
0      0      0      1      1      1      1      1

USISR - USI Status Register
USISIF USIOIF USIPF USIDC USICNT3 USICNT2 USICNT1 USICNT0
0      1      0     0     0       0       0       0

USISIE: Start Condition Interrupt Enable
USIOIE: Counter Overflow Interrupt Enable
USIWM1:0: Wire Mode ;01 Three-wire mode. Uses DO, DI, and USCK pins.
USICS1:0: Clock Source Select
USICLK: Clock Strobe
USITC: Toggle Clock Port Pin

USISIF: Start Condition Interrupt Flag
USIOIF: Counter Overflow Interrupt Flag
USIPF: Stop Condition Flag
USIDC: Data Output Collision
USICNT3:0: Counter Value

*006 2010-11-11 21:20

 INFORMACIÓN PARA INTERFAZ SPI E/S DIAGRAMA SPIES.SCH A1

  RELACIÓN; REGISTRO <=> DÍGITO

U3A <=> RMT D0
U3B <=> RMT D1
U3C <=> RMT D2
U3D <=> RMT D3
U3E <=> RMT D4
U3F <=> RMT D5
U3G <=> RMT D6
U3H <=> RMT D7

U4A <=> LCD DB0 TCD CANCELAR
U4B <=> LCD DB1 TCD SELECCIONAR
U4C <=> LCD DB2 TCD INCREMENTAR
U4D <=> LCD DB3 TCD DECREMENTAR
U4E <=> LCD DB4 TCD IZQUIERDA
U4F <=> LCD DB5 TCD DERECHA
U4G <=> LCD DB6 BTN RESTABLECER
U4H <=> LCD DB7

*007 2010-10-24 03:45

CONSIDERACIONES DE TEMPORIZACIÓN PARA EL CONTROLADOR HD44780 PARA UNA FRECUENICA DE "BUS" DE 2 MHz.

*008 2010-10-09 20:05

 INSTRUCCIONES DE CONTROLADOR DE LCD

0B0000_0001 Clear display
0B0000_001- Return home
0B0000_01!# Entry mode set . !=1:Increment !=0:Decrement #=1:Accompanies display shift
0B0000_1DCB Display on/off control . D=display C=cursor B=blinking
0B0001_$%-- Cursor or display shift . $=1:Display shift $=0:Cursor move %=1:Shift to the right %=0:Shift to the left
0B001&_/|-- Function set . &=1:8 bits &=0:4 bits /=1:2 lines /=0:1 line |=1:5 X 10 dots |=0:5 X 8 dots
0B01CC_CCCC Set CGRAM address
0B1DDD_DDDD Set DDRAM address

  - indicates no effect.

*009 2010-11-11 21:25

 CARGA "LOAD" DE LOS REGISTROS DE CORRIMIENTO

PARA CARGAR LOS REGISTROS DE CORRIMIENTO U3 Y U4 (HC299)
1 EL REGISTRO DE CORRIMIENTO DEBE DE ESTAR EN MODO CARGA.
2 EL REGISTRO DE CORRIMIENTO DEBE DE RECIBIR UNA TRANSICIÓN DE SUBIDA EN EL RELOJ.
   TÁCTICA:
	SE ENVÍA UN PAR DE TRANSICIONES DE RELOJ,

*010 2010-11-22 00:41
 UTLIZACIÓN DE CSF EN EXCLUSIVA COMO CONTADOR DE SOBREFLUJOS DEL TEMPORIZADOR 0.
 (CRISTAL 8 MHz CS02:0 = 010 PWM, Phase Correct SOBREFLUJO CADA 0.000512 s)
{ 2010-11-22 00:37
(CRISTAL 8 MHz CS02:0 = 100 SOBREFLUJO CADA 0.008192 s)
}
NO INICIADO EN $00, TÉCNICA DE USO: DIFERENCIAS DE CUENTAS.
	VINCULADO CON ANTIREBOTES DEL TECLADO.

*011 2010-12-08 08:18
ClkIO/8	SOBREFLUJO CADA : 1/(1953,125 Hz) = 0,512 ms . USADO PARA ALIMENTACIÓN PULSANTE.
ClkIO/256	SOBREFLUJO CADA : 1/(61.03515625 Hz) = 16,384 ms . USADO PARA ALIMENTACIÓN CONTINUA.
FACTOR = 256 / 8 = 32
POR TANTO:
REGISTRO DEFINIDO "CSX" CUENTA 32 SOBREFLUJOS PARA COMPENSAR.

*012 2010-12-10 00:13
CÓDIGO DE SECUENCIA EN INTERRUPCIÓN:

$00	DESHABILITADO
$01	ESTROBO
$02	CONMUTADO
$03	FUNDIDO (FADING)
$04.$FF	RESERVADO

*013 2010-12-17 11:26
LOCALIDADES DE MEMORIA NECESARIAMENTE CONSECUTIVAS.
DEBIDO AL CÓGIDO DE COPIA DE MEMORIA DE PROGRAMA A MEMORIA DE DATOS ES 
NECESARIO QUE LAS DIRECCIÓNES DE LAS LOCALIDADES DE MEMORIA SEAN CONSECUTIVAS.


*014 2011-01-10 09:34
FRECUENCIAS DE PWM CON CRISTAL DE 8 MHz

 CÓDIGO	512*	F/X	8 MHz

1	   1	   512	15625 Hz
2	   8	  4096	 1953,125 Hz
3	  64	 32768	  244,140625 Hz
4	 256	131072	   61,03515625
5	1024	524288	   15,2587890625 Hz

*/

.DEVICE ATtiny4313
.NOLIST
.INCLUDE "tn4313def.inc"
.LIST

#define _CDNIDN "ASSIC,DMC1,0,2.Y" ;IDENTIFICACIÓN.

;	******************
;	*** IGUALDADES ***
;	******************

		;2010-11-16 00:42
.EQU	_BAUDH	= 0B0000_0000	;250000 BAUDS; SYSTEM CLOCK=8MHz , U2X=0, CKDIV8=1
.EQU	_BAUDL	= 0B0000_0001	;.
;
;	*** TIMER 0 ***
;2010-11-17 20:24 SALIDAS PWM INVERTIDAS
;.EQU	_TCCR0A	= 0B1111_0001	;COM0A1 COM0A0 COM0B1 COM0B0 - - WGM01 WGM00 .
; FAST PWM 0B1111_0011 (ANTERIOR). 2010-11-21 08:18
;
;2010-11-21 01:16 SALIDAS PWM NO INVERTIDAS:
.EQU	_TCCR0A	= 0B1010_0001	;COM0A1 COM0A0 COM0B1 COM0B0 - - WGM01 WGM00 .
; FAST PWM 0B1010_0011 (ANTERIOR). 2010-11-21 08:18
;
;.EQU	_TCCR0B	= 0B0000_0100
;.EQU	_TCCR0B	= 0B0000_0011	;FOC0A FOC0B - - WGM02 CS02 CS01 CS00 . *001
.EQU	_TCCR0B	= 0B0000_0010	;clkI/O/8 (From prescaler)
; FAST PWM 0B0000_0100 (ANTERIOR). 2010-11-21 08:18
;
;	*** TIMER 1 ***
;2010-11-17 20:24 SALIDAS PWM INVERTIDAS
;.EQU	_TCCR1A	= 0B1111_0001	;COM1A1 COM1A0 COM1B1 COM1B0 - - WGM11 WGM10 .
;
;2010-11-21 01:16 SALINDAS PWM NO INVERTIDAS:
.EQU	_TCCR1A	= 0B1010_0001	;COM1A1 COM1A0 COM1B1 COM1B0 - - WGM11 WGM10 .
;
;.EQU	_TCCR1B	= 0B0000_0100
;.EQU	_TCCR1B	= 0B0000_0011	;ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10 . *002
.EQU	_TCCR1B	= 0B0000_0010	;clkI/O/8 (From prescaler)
; FAST PWM 0B0000_1100 (ANTERIOR). 2010-11-21 08:18
;
.EQU	_UCSRA	= 0B0000_0000	;RXC TXC UDRE FE DOR UPE U2X MPCM .
.EQU	_UCSRB	= 0B1001_0000	;RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8 .
.EQU	_UCSRC	= 0B0000_1110	;UMSEL1 UMSEL0 UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL . *003
.EQU	_LCDFS	= 0B0011_1000	;LCD FUNTION SET; 8 DÍGITOS, 2 LÍNEAS, 5X8 . *008
.EQU	_TIMSK	= 0B0000_0010	;TOIE0
;!! REVISAR Y CUESTIONAR EL NIVEL DE PROFUNDIDAD DE PILA DE MENÚ. 2010-11-10 02:25
.EQU	MNPLPF	= 4		;PROFUNDIDAD DE PILA DE MENÚ.
.EQU	CTAARB	= -5 ;2010-12-17 01:47 !! VERIFICAR		;2010-12-09 13:59 LAPSO ANTIRREBOTES 49.152 ms a 32.768 ms MÍNIMO (3*16,384 ms A 8 MHz). !
.EQU	IOSTART	= 0x0020		;INICIO DEL SEGMENTO DE REGISTROS DE ENTRADA SALIDA.

;	********************
;	*** ASIGNACIONES ***
;	********************

	;R0 USO EN INSTRUCCIÓN LPM.
	;R1:R0 USO EN ALMACENAR EN MEMORIA DE PROGRAMA.
.DEF	K00	= R2	;CONSTANTE $00.
.DEF	KFF	= R3	;CONSTANTE $FF.
.DEF	RTL	= R4	;SERVICIO COMANDO 2 OCTETOS
.DEF	RTH	= R5	;.
.DEF	CSF	= R6	;CONTADOR DE SOBREFLUJOS.
.DEF	CSX	= R7	;CONTADOR DE SOBREFLUJOS EXTRA. *011
.DEF	GXL	= R8	;GENERAL DE PROGRAMA EXTRA 2 OCTETOS
.DEF	GXH	= R9	;.
.DEF	GIL	= R10	;GENERAL DE INTERRUPCIÓN 2 OCTETOS
.DEF	GIH	= R11	;.
.DEF	GPL	= R12	;GENERAL DE PROGRAMA 2 OCTETOS
.DEF	GPH	= R13	;.
.DEF	GPP	= R14	;GENERAL DE PROGRAMA.
.DEF	RAI	= R15	;ALMACÉN DE SREG EN INTERRUPCIÓN.
.DEF	TPP	= R16	;TRABAJO DE PROGRAMA.
.DEF	TII	= R17	;TRABAJO DE INTERRUPCIÓN.
.DEF	TPL	= R18	;TRABAJO DE PROGRAMA 2 OCTETOS
.DEF	TPH	= R19	;.
.DEF	TIL	= R20	;TRABAJO DE INTERRUPCIÓN 2 OCTETOS
.DEF	TIH	= R21	;.
.DEF	TPX	= R22	;TRABAJO DE PROGRAMA EXTRA.
.DEF	TIX	= R23	;TRABAJO DE INTERRUPCIÓN EXTRA.
.DEF	TWL	= R24	;OPERACIÓN INMEDIATA 2 OCTETOS
.DEF	TWH	= R25	;.
	;R25:R24 OPERANDOS EN ADIW, SBIW.
	;R27:R26 X APUNTADOR GENERAL.
	;R29:R28 Y APUNTADOR GENERAL.
	;R31:R30 Z APUNTADOR GENERAL.

;	************************
;	*** MEMORIA DE DATOS ***
;	************************

.DSEG
DMXCTD:	.BYTE	2	;CONTADOR DIRECCIÓN DMX. *004
DMXD1:	.BYTE	2	;DIRECCIÓN DMX PWM1. *004
DMXD2:	.BYTE	2	;DIRECCIÓN DMX PWM2. *004
DMXD3:	.BYTE	2	;DIRECCIÓN DMX PWM3. *004
DMXD4:	.BYTE	2	;DIRECCIÓN DMX PWM4. *004
TCDETD:	.BYTE	1	;TECLADO ESTADO ANTERIOR.
TCCTAR:	.BYTE	1	;TECLADO CONTADOR ANTIRREBOTES.
MNUAPT:	.BYTE	2	;APUNTADOR A ACTUAL ELEMENTO EN LA TABLA DE MENÚ.
MNAPNV:	.BYTE	2	;APUNTADOR A NUEVO ELEMENTO EN LA TABLA DE MENÚ.
MNUPLA:	.BYTE	MNPLPF*4	;PILA DE MENÚ.
MNAPPL:	.BYTE	1	;APUNTADOR A PILA DE MENÚ.
MNUSEL:	.BYTE	1	;NÚMERO DE SELECCIÓN DE SUBMENÚ.
PMLI:	.BYTE	2	;MAGNITUD DE PARÁMTERO LÍMITE INFERIOR.
PMLS:	.BYTE	2	;MAGNITUD DE PARÁMETRO LÍMITE SUPERIOR.
ICMMNT:	.BYTE	1	;MAGNITUD DE INCREMENTO.
ICMAPT:	.BYTE	1	;APUNTADOR A SECUENCIA DE INCREMENTOS.
INCSCC:	.BYTE	8	;SECUENCIA DE INCREMENTOS.
SCCRPD:	.BYTE	1	;RAPIDEZ DE SECUENCIAS.
RPDCTD:	.BYTE	1	;RAPIDEZ CONTADOR.
DMRSCC:	.BYTE	1	;CÓDIGO DE SECUENCIA EN INTERRUPCIÓN. *012
FDDR:	.BYTE	4	;BIOCTETO DE ILUMINACIÓN, LÍMITE INFERIOR, LÍMITE SUPERIOR PARA PWM R. *013
FDDG:	.BYTE	4	;BIOCTETO DE ILUMINACIÓN, LÍMITE INFERIOR, LÍMITE SUPERIOR PARA PWM G. *013
FDDB:	.BYTE	4	;BIOCTETO DE ILUMINACIÓN, LÍMITE INFERIOR, LÍMITE SUPERIOR PARA PWM B. *013
FDDX:	.BYTE	4	;BIOCTETO DE ILUMINACIÓN, LÍMITE INFERIOR, LÍMITE SUPERIOR PARA PWM X. *013
SCCAPT:	.BYTE	2	;APUNTADOR A SECUENCIA DE ESTROBO.
STBCTD:	.BYTE	1	;CONTADOR DE SECUENCIA DE ESTROBO.
SCCLGT:	.BYTE	1	;LONGITUD DE SECUENCIA EN EL RECOLECTOR.
SCCELM:	.BYTE	1	;ELEMENTO ACTUAL DE SECUENCIA EN EL RECOLECTOR.
SCCRPT:	.BYTE	1	;REPETICION DE COLOR.
SCCDTL:	.BYTE	1	;DESTELLO DE REPETICIÓN DE COLOR.
SCCRCL:	.BYTE	8*4	;RECOLECTOR DE SECUENCIAS RGBX.
CSXINC:	.BYTE	1	;CUENTA DE COMPESACIÓN 2011-01-10 10:08 .
CSTP:	.BYTE	1	;ASIGNACIÓN PARA PRESCALADORES.

;	**************
;	*** EEPROM ***
;	**************

.ESEG
.ORG 0
;/*
DMXD1E:	.BYTE	2	;DIRECCIÓN DMX R INTERVALO: 0 - 511.
DMXD2E:	.BYTE	2	;DIRECCIÓN DMX G INTERVALO: 0 - 511.
DMXD3E:	.BYTE	2	;DIRECCIÓN DMX B INTERVALO: 0 - 511.
DMXD4E:	.BYTE	2	;DIRECCIÓN DMX X INTERVALO: 0 - 511.
ITINRE:	.BYTE	1	;INTENSIDAD INICIAL SALIDA R.
ITINGE:	.BYTE	1	;INTENSIDAD INICIAL SALIDA G.
ITINBE:	.BYTE	1	;INTENSIDAD INICIAL SALIDA B.
ITINXE:	.BYTE	1	;INTENSIDAD INICIAL SALIDA X.
SCINRE:	.BYTE	1	;SECUENCIA RAPIDEZ INICIAL.
SCINEX:	.BYTE	2	;DIRECCIÓN DE EJECUCIÓN DE SECUENCIA INICIAL.
SCINRP:	.BYTE	2	;RESPALDO DE DIRECCIÓN DE EJECUCIÓN DE SECUENCIA INICIAL.
CSTPEE:	.BYTE	1	;ASIGNACIÓN PARA PRESCALADORES.
;*/
/*
DMXD1E:	.DW	0	;DIRECCIÓN DMX R INTERVALO: 0 - 511.
DMXD2E:	.DW	1	;DIRECCIÓN DMX G INTERVALO: 0 - 511.
DMXD3E:	.DW	2	;DIRECCIÓN DMX B INTERVALO: 0 - 511.
DMXD4E:	.DW	8	;DIRECCIÓN DMX X INTERVALO: 0 - 511.
ITINRE:	.DB	$55	;INTENSIDAD INICIAL SALIDA R.
ITINGE:	.DB	$55	;INTENSIDAD INICIAL SALIDA G.
ITINBE:	.DB	$55	;INTENSIDAD INICIAL SALIDA B.
ITINXE:	.DB	$00	;INTENSIDAD INICIAL SALIDA X.
SCINRE:	.DB	$01	;SECUENCIA RAPIDEZ INICIAL.
SCINEX:	.DW	$FFFF	;DIRECCIÓN DE EJECUCIÓN DE SECUENCIA INICIAL.
SCINRP:	.DW	$FFFF	;RESPALDO DE DIRECCIÓN DE EJECUCIÓN DE SECUENCIA INICIAL.
CSTPEE:	.DB	$02	;ASIGNACIÓN PARA PRESCALADORES.
*/
;	***************************
;	*** MEMORIA DE PROGRAMA ***
;	***************************

.CSEG
.ORG 0
	RJMP	RESET		; RESET HANDLER
	RETI	;RJMP	INT0		; EXTERNAL INTERRUPT0 HANDLER
	RETI	;RJMP	INT1		; EXTERNAL INTERRUPT1 HANDLER
	RETI	;RJMP	TIM1_CAPT		; TIMER1 CAPTURE HANDLER
	RETI	;RJMP	TIM1_COMPA	; TIMER1 COMPAREA HANDLER
	RETI	;RJMP	TIM1_OVF		; TIMER1 OVERFLOW HANDLER
	RJMP	TIM0_OVF		; TIMER0 OVERFLOW HANDLER
	RJMP	USART0_RXC	; USART0 RX COMPLETE HANDLER
	RETI	;RJMP	USART0_DRE	; USART0,UDR EMPTY HANDLER
	RETI	;RJMP	USART0_TXC	; USART0 TX COMPLETE HANDLER
	RETI	;RJMP	ANA_COMP		; ANALOG COMPARATOR HANDLER
	RETI	;RJMP	PCINT0		; PCINT0 HANDLER
	RETI	;RJMP	TIMER1_COMPB	; TIMER1 COMPARE B HANDLER
	RETI	;RJMP	TIMER0_COMPA	; TIMER0 COMPARE A HANDLER
	RETI	;RJMP	TIMER0_COMPB	; TIMER0 COMPARE B HANDLER
	RETI	;RJMP	USI_START		; USI START HANDLER
	RETI	;RJMP	USI_OVERFLOW	; USI OVERFLOW HANDLER
	RETI	;RJMP	EE_READY		; EEPROM READY HANDLER
	RETI	;RJMP	WDT_OVERFLOW	; WATCHDOG OVERFLOW HANDLER
	RETI	;RJMP	PCINT1		; PCINT1 HANDLER
	RETI	;RJMP	PCINT2		; PCINT2 HANDLER

;	*******************************************
;	*** RUTINAS DE SERVICIO DE INTERRUPCIÓN ***
;	*******************************************

TIM0_OVF:		;TIMER0 OVERFLOW HANDLER 2010-11-22 13:40 *011
	IN	RAI,SREG		;RESPALDO REGISTRO DE ESTADO.
	DEC	CSX		;CONTADOR DE COMPENSAR, ACTUALIZAR.
	BRNE	T0OA			;¿LÍMITE?. NO, SALTA.
	LDS	CSX,CSXINC	;RECARGAR CONTADOR DE COMPENSAR 2011-01-10 11:57.
	INC	CSF		;UTILIZAR CSF COMO CONTADOR DE SOBREFLUJOS DE T0. *010
	SBI	PORTB,1		;APAGAR LED.
	LDS	TII,RPDCTD	;CONTADOR DE RAPIDEZ, ACTUALIZAR.
	DEC	TII
	STS	RPDCTD,TII	;.
	BRNE	T0OA			;ESPERAR, SALTA.
	LDS	TII,SCCRPD	;REINICIAR CONTADOR DE RAPIDEZ
	STS	RPDCTD,TII	;.
	LDS	TII,DMRSCC	;CARGAR DATO DE SECUENCIA INICIAL.
	CPI	TII,$01		;¿CÓDIGO 1?
	BRNE	T0O1			;NO SALTA
	RCALL	SCCETB		;LLAMAR SECUENCIA ESTROBO.
	RJMP	T0OA
T0O1:	CPI	TII,$02		;¿CÓDIGO 2?
	BRNE	T0O2			;NO SALTA
	RCALL	SCCCMT		;LLAMAR SECUENCIA CONMUTADO.
	RJMP	T0OA
T0O2:	CPI	TII,$03		;¿CÓDIGO 3?
	BRNE	T0O3			;NO SALTA
	RCALL	SCCFDD		;LLAMAR SECUENCIA FUNDIDO.
;	RJMP	T0OA
T0O3:;	CPI	TII,$04		;¿CÓDIGO 4?
;	BRNE	T0O4			;NO SALTA
;
T0OA:	OUT	SREG,RAI		;RECUPERAR REGISTRO DE ESTADO.
	RETI

USART0_RXC:	;USART0 RX COMPLETE HANDLER 2010-12-19 12:38
	IN	RAI,SREG		;RESPALDO REGISTRO DE ESTADO.
	IN	TIX,UCSRA		;LEER ESTADO DE ERROR.
	IN	TII,UDR		;EXTRAER DATO RECIBIDO EN USART.
	SBRC	TIX,4		;¿"BREAK" DETECCIÓN?.
	RJMP	URXBK			;SÍ, ATENDER "BREAK".
	SBIC	GPIOR1,6		;¿CONTROL DETECCIÓN?.
	RJMP	URXCT			;SÍ, ATENDER CONTROL.
	SBIC	GPIOR1,7		;¿INICIO DETECCIÓN?.
	RJMP	URXDI			;SÍ, ATENDER INICIO.
	RJMP	URXF			;ESPURIO, TERMINAR.	
URXBK:	SBI	GPIOR1,7		;PRESTABLECER; ACTIVAR BANDERA DE INICIO.
	CPSE	TII,K00			;CONFIRMAR "BREAK". SI ES SALTA.
	CBI	GPIOR1,7		;BORRAR BANDERA DE INICIO.
	CBI	GPIOR1,6		;BORRAR BANDERA DE CONTROL.
	RJMP	URXF			;TERMINAR.
URXDI:	CBI	GPIOR1,7		;BORRAR BANDERA DE DMX INICIO.
	TST	TII		;$00 VALIDA SECCIÓN DE CONTROL EN TRAMA.
	BRNE	URXF			;NO ES TRAMA DE CONTROL, TERMINAR.
	STS	(DMXCTD+0),K00	;REINICIAR CONTADOR DE DIRECCIÓN DE DMX
	STS	(DMXCTD+1),K00	;. *004
	SBI	GPIOR1,6		;ACTIVAR BANDERA DE CONTROL.
	CBI	PORTB,1		;ENCENDER LED.
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIAS.
	RJMP	URXF			;TERMINAR.
URXCT:	MOVW	GIH:GIL,TWH:TWL	;RESPALDO REGISTROS TW.
	LDS	TWL,(DMXCTD+0)	;CARGAR CONTADOR DE DIRECCIÓN DMX
	LDS	TWH,(DMXCTD+1)	;.
	LDS	TIL,(DMXD1+0)	;CARGAR DIRECCIÓN DMX DE CONTROL PARA PWM
	LDS	TIH,(DMXD1+1)	;.
	CP	TIL,TWL		;¿CORRESPONDE?
	CPC	TIH,TWH		;.
	BRNE	URX1			;NO, IGNORAR.
	MOV	R0,TII;*+
	LSR	R0;*+
	OUT	OCR0A,R0		;SÍ, ASIGNAR OCTETO DE CONTROL A PWM R.
URX1:	LDS	TIL,(DMXD2+0)	;CARGAR DIRECCIÓN DMX DE CONTROL PARA PWM
	LDS	TIH,(DMXD2+1)	;.
	CP	TIL,TWL		;¿CORRESPONDE?
	CPC	TIH,TWH		;.
	BRNE	URX2			;NO, IGNORAR.
	MOV	R0,TII;*+
	LSR	R0;*+
	OUT	OCR1AL,R0		;SÍ, ASIGNAR OCTETO DE CONTROL A PWM G.
URX2:	LDS	TIL,(DMXD3+0)	;CARGAR DIRECCIÓN DMX DE CONTROL PARA PWM
	LDS	TIH,(DMXD3+1)	;.
	CP	TIL,TWL		;¿CORRESPONDE?
	CPC	TIH,TWH		;.
	BRNE	URX3			;NO, IGNORAR.
	MOV	R0,TII;*+
	LSR	R0;*+
	OUT	OCR1BL,R0		;SÍ, ASIGNAR OCTETO DE CONTROL A PWM B.
URX3:	LDS	TIL,(DMXD4+0)	;CARGAR DIRECCIÓN DMX DE CONTROL PARA PWM
	LDS	TIH,(DMXD4+1)	;.
	CP	TIL,TWL		;¿CORRESPONDE?
	CPC	TIH,TWH		;.
	BRNE	URX4			;NO, IGNORAR.
	MOV	R0,TII;*+
	LSR	R0;*+
	OUT	OCR0B,R0		;SÍ, ASIGNAR OCTETO DE CONTROL A PWM X.
URX4:	ADIW	TWH:TWL,$01	;INDICAR SIGUIENTE OCTETO DE LA TRAMA.
	SBRC	TWH,1			;¿DIRECCIÓN DE CANAL MAYOR A 512?. *004
	CBI	GPIOR1,6		;SÍ, BORRAR BANDERA DE DMX CONTROL.
	STS	(DMXCTD+0),TWL	;ACTUALIZAR CONTADOR DE DIRECCIÓN DE DMX
	STS	(DMXCTD+1),TWH	;.
	MOVW	TWH:TWL,GIH:GIL	;RECUPERAR REGISTROS IW.
URXF:	OUT	SREG,RAI		;RECUPERAR REGISTRO DE ESTADO.
	RETI

;	*******************************
;	*** SERVICIOS DE SECUENCIAS ***
;	*******************************

SCCFDD:	;DESCRIPCIÓN: SECUENCIA DE FUNDIDO.
	;UTILIZA:  ZH ZL TII TIH
	;ETIQUETAS: SCCFDD: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-12-18 11:11
	PUSH	ZH		;RESGUARDAR REGISTRO Z
	PUSH	ZL		.
	IN	TII,GPIOR0	;RECUPERAR SREG(T) PARA R
	BST	TII,0		;.
	LDI	ZL,LOW(FDDR)	;APUNTAR A PARÁMETROS DE FUNDIDO DE PWM R
	LDI	ZH,HIGH(FDDR)	;.
	RCALL	FDDITS
	OUT	OCR0A,TIH		;ASIGNAR PWM R.
	IN	TII,GPIOR0	;RESGUARDAR SREG(T) PARA R
	BLD	TII,0
	OUT	GPIOR0,TII	;.
	IN	TII,GPIOR0	;RECUPERAR SREG(T) PARA G
	BST	TII,1		;.
	LDI	ZL,LOW(FDDG)	;APUNTAR A PARÁMETROS DE FUNDIDO DE PWM G
	LDI	ZH,HIGH(FDDG)	;.
	RCALL	FDDITS
	OUT	OCR1AL,TIH	;ASIGNAR PWM G.
	IN	TII,GPIOR0	;RESGUARDAR SREG(T) PARA G
	BLD	TII,1
	OUT	GPIOR0,TII	;.
	IN	TII,GPIOR0	;RECUPERAR SREG(T) PARA B
	BST	TII,2		;.
	LDI	ZL,LOW(FDDB)	;APUNTAR A PARÁMETROS DE FUNDIDO DE PWM B
	LDI	ZH,HIGH(FDDB)	;.
	RCALL	FDDITS
	OUT	OCR1BL,TIH	;ASIGNAR PWM B.
	IN	TII,GPIOR0	;RESGUARDAR SREG(T) PARA B
	BLD	TII,2
	OUT	GPIOR0,TII	;.
	IN	TII,GPIOR0	;RECUPERAR SREG(T) PARA X
	BST	TII,3		;.
	LDI	ZL,LOW(FDDX)	;APUNTAR A PARÁMETROS DE FUNDIDO DE PWM X
	LDI	ZH,HIGH(FDDX)	;.
	RCALL	FDDITS
	OUT	OCR0B,TIH		;ASIGNAR PWM X.
	IN	TII,GPIOR0	;RESGUARDAR SREG(T) PARA X
	BLD	TII,3
	OUT	GPIOR0,TII	;.
	POP	ZL		;RECUPERAR REGISTRO Z
	POP	ZH		;.
	RET

FDDITS:	;DESCRIPCIÓN: ALGORITMO DE SECUENCIA DE FUNDIDO.
	;UTILIZA:  Z GIL GIH TII TIL TIH TIX
	;ETIQUETAS: FDDITS: FDDITS5: FDDITS2: FDDITS1: FDDITS6: FDDITS3: FDDITS4: 
	;ENTRADA: ZH:ZL = APUNTADOR A TABLA DE DATOS , SREG(T) = INCREMENTO*/DECREMENTO .
	;SALIDA: TIH:TIL = INTENSIDAD DE COLOR ACTUALIZADA.
	;USO:
	;NOTAS: 2010-12-17 07:38
	LDD	TIL,Z+0		;RECUPERAR PARÁMETROS
	LDD	TIH,Z+1
	LDD	TII,Z+2
	LDD	TIX,Z+3		;.
	MOVW	GIH:GIL,TIH:TIL	;DIVISIÓN ENTRE 64
	LSR	GIH
	ROR	GIL
	LSR	GIH
	ROR	GIL
	LSR	GIH
	ROR	GIL
	LSR	GIH
	ROR	GIL
	LSR	GIH
	ROR	GIL
	LSR	GIH
	ROR	GIL		;.
	BRTS	FDDITS1			;DECREMENTO ACTIVO, SALTA.
	ADD	TIL,GIL		;SUMA PARA OBTENER MULTIPLICACIÓN POR FACTOR (65/64) 2011-06-04 16:09
	ADC	TIH,GIH		;.
	BRCS	FDDITS5			;DESBORDAMIENTO, SALTA.
	CP	TIH,TIX		;¿EN EL LÍMITE SUPERIOR?.
	BRLO	FDDITS2			;NO, SALTA.
FDDITS5:	MOV	TIH,TIX		;LIMITAR.
	SET			;INDICAR DECREMENTO.
FDDITS2:	RJMP	FDDITS4		;TERMINAR.
FDDITS1:	SUB	TIL,GIL		;RESTA PARA OBTENER MULTIPLICACIÓN POR FACTOR (63/64) 2011-06-04 16:09
	SBC	TIH,GIH		;.
	BRCS	FDDITS6			;DESBORDAMIENTO, SALTA.
	CP	TIH,TII		;¿EN EN LÍMITE INFERIOR?.
	BREQ	FDDITS3			;NO, TERMINAR
	BRSH	FDDITS4			;.
FDDITS6:	MOV	TIH,TII		;LIMITAR.
FDDITS3:	CLT			;INDICAR INCREMENTO.
FDDITS4:	STD	Z+0,TIL		;RESGUARDAR PARÁMETROS
	STD	Z+1,TIH		;.
	RET			;TERMINAR.

SCCETB:	;DESCRIPCIÓN: SECUENCIA DE ESTROBO.
	;UTILIZA:  ZH ZL GIL GIH TII
	;ETIQUETAS: SCCETB: SCCETB3: SCCETB1: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	; INICIAR ANTES DE HABILITAR SECUENCIAS:
	; SCCRCL
	; SCCLGT
	; SCCRPT
	; SCCAPT = &SCCRCL
	; SCCELM = SCCLGT
	; SCCDTL = SCCRPT
	;NOTAS: 2010-12-18 22:31
	LDS	TII,STBCTD	;SERVICIO DEL CONTADOR DE SECUENCIA DE ESTROBO
	DEC	TII		; DECREMENTAR PARA INDICAR SIGUIENTE PASO.
	BRNE	SCCETB1		; ¿FIN DE PASOS?. NO, SALTA.
	LDI	TII,$03		; REINICIAR PASOS.
	STS	STBCTD,TII	;ACTUALIZAR CONTADOR.
	MOVW	GIH:GIL,ZH:ZL	;RESPALDO DE Z.
	LDS	ZL,(SCCAPT+0)	;OBTENER APUNTADOR A SECUENCIA
	LDS	ZH,(SCCAPT+1)	;.
	RCALL	ILMETB		;ESTABLECER NIVEL DE ILUMINACIÓN.
	LDS	TII,SCCDTL	;ATENDER NÚMERO DE DESTELLOS DEL MISMO COLOR
	DEC	TII		;.
	BRNE	SCCETB3			;¿TODOS?. NO, SALTA.
	RCALL	SECAXL		;AUXILIAR DE SECUENCIA CONMUTADO Y ESTROBO.
	LDS	TII,SCCRPT	;RECARGAR CONTADOR DE NÚMERO DE DESTELLOS.
SCCETB3:	STS	SCCDTL,TII	;ACTUALIZAR CONTADOR DE NÚMERO DE DESTELLOS.
	MOVW	ZH:ZL,GIH:GIL	;RECUPERACIÓN DE Z.
	RET
SCCETB1:	STS	STBCTD,TII	;ACTUALIZAR CONTADOR.
	RCALL	ILMOCR		;ILUMINACIÓN OBSCURO.
	RET			;TERMINAR.

SCCCMT:	;DESCRIPCIÓN: SECUENCIA DE CONMUTADO.
	;UTILIZA:  ZH ZL GIL GIH
	;ETIQUETAS: SCCCMT: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	; INICIAR ANTES DE HABILITAR SECUENCIAS:
	; SCCRCL
	; SCCLGT
	; SCCAPT = &SCCRCL
	; SCCELM = SCCLGT
	;NOTAS: 2010-12-18 22:31
	MOVW	GIH:GIL,ZH:ZL	;RESPALDO DE Z.
	LDS	ZL,(SCCAPT+0)	;OBTENER APUNTADOR A SECUENCIA
	LDS	ZH,(SCCAPT+1)	;.
	RCALL	ILMETB		;ESTABLECER NIVEL DE ILUMINACIÓN.
	RCALL	SECAXL		;AUXILIAR DE SECUENCIA CONMUTADO Y ESTROBO.
	MOVW	ZH:ZL,GIH:GIL	;RECUPERACIÓN DE Z.
	RET

SECAXL:	;DESCRIPCIÓN: AUXILIAR DE SECUENCIA CONMUTADO Y ESTROBO.
	;UTILIZA:  ZH ZL TII
	;ETIQUETAS: SECAXL: SECAXL1: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-12-18 22:31
	LDS	TII,SCCELM	;OBTENER CONTADOR DE ELEMENTO ACTUAL.
	DEC	TII		;CALCULAR CONTADOR.
	BRNE	SECAXL1			;¿LÍMITE DE ELEMENTOS DE SECUENCIA?. NO, SALTA.
	LDI	ZL,LOW(SCCRCL)	;APUNTAR A INICIO DE SECUENCIA
	LDI	ZH,HIGH(SCCRCL)	;.
	LDS	TII,SCCLGT	;REINICIAR CONTADOR.
SECAXL1:	STS	SCCELM,TII	;ACTUALIZAR CONTADOR.
	STS	(SCCAPT+0),ZL	;ESTABLECER APUNTADOR A SECUENCIA
	STS	(SCCAPT+1),ZH	;.
	RET

ILMOCR:	;DESCRIPCIÓN: ILUMINACIÓN ESTABLECER OBSCURO.
	;UTILIZA:  K00
	;ETIQUETAS: ILMOCR: 
	;ENTRADA:	NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-12-10 01:04
	OUT	OCR0A,K00		;APAGADO A PWM R.
	OUT	OCR1AL,K00	;APAGADO A PWM G.
	OUT	OCR1BL,K00	;APAGADO A PWM B.
	OUT	OCR0B,K00		;APAGADO A PWM X.
	RET

ILMETB:	;DESCRIPCIÓN: ILUMINACIÓN ESTABLECER.
	;UTILIZA:  Z TII
	;ETIQUETAS: ILMETB: 
	;ENTRADA:	Z = APUNTADOR A TABLA DE DATOS DE INTENSIDAD.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-12-10 01:04
	LD	TII,Z+		;CARGAR OCTETO DE CONTROL R
	LSR	TII;*+
	OUT	OCR0A,TII		;OCTETO DE CONTROL A PWM R.
	LD	TII,Z+		;CARGAR OCTETO DE CONTROL G
	LSR	TII;*+
	OUT	OCR1AL,TII	;OCTETO DE CONTROL A PWM G.
	LD	TII,Z+		;CARGAR OCTETO DE CONTROL B
	LSR	TII;*+
	OUT	OCR1BL,TII	;OCTETO DE CONTROL A PWM B.
	LD	TII,Z+		;CARGAR OCTETO DE CONTROL X
	LSR	TII;*+
	OUT	OCR0B,TII		;OCTETO DE CONTROL A PWM X.
	RET

;	***************************
;	*** INICIO DEL PROGRAMA ***
;	***************************

RESET:		;2010-12-10 09:59
	LDI	TPP,LOW(RAMEND)	;APUNTADOR DE PILA, INICIAR
	OUT	SPL,TPP		;.
	CLR	K00		;INICIAR REGISTROS GENERAL CONSTANTE
	CLR	KFF
	DEC	KFF		;.
	RCALL	ITSINI		;CARGAR INTENSIDAD INICIAL PARA LAS SALIDAS.
	RCALL	DMXDIE		;INICIAR ASIGNACIÓN DE DIRECCIONES DMX.
	RCALL	DIMINI		;INICIAR TEMPORIZADORES PARA DIMMER.
	LDI	TPP,_TIMSK	;CONFIGURAR INTERRUPCIONES DE LOS TEMPORIZADORES
	OUT	TIMSK,TPP		;.
	RCALL	USAINI		;CONFIGURAR USART.
	LDI	TPP,0B1010_0010	;CONFIGURAR OCTETOS DE CONTROL DE PUERTOS
	OUT	PORTB,TPP		; (PB7 EN ESTADO ALTO PROTOCOLO SPI) *005
	LDI	TPP,0B1101_1111
	OUT	DDRB,TPP
	LDI	TPP,0B0100_1010
	OUT	PORTD,TPP
	LDI	TPP,0B0111_1100
	OUT	DDRD,TPP		;.
	OUT	GPIOR1,K00	;BORRAR BANDERAS DE ESTADO Y ERROR.
	OUT	GPIOR2,K00	;BORRAR ESTADO DEL TECLADO.
	LDI	TPP,MNPLPF*4	;LIMPIA PILA DE MENÚ
	LDI	ZL,LOW(MNUPLA)
	LDI	ZH,HIGH(MNUPLA)
RESET1:	ST	Z+,K00
	DEC	TPP
	BRNE	RESET1		;.
	LDI	TPP,MNUPLA	;INICIAR APUNTADOR DE PILA DE MENÚ
	STS	MNAPPL,TPP	;.
	STS	ICMAPT,K00	;INICIAR APUNTADOR A SECUENCIA DE INCREMENTOS.
	LDI	TPP,$01		;INCREMENTO INICIAL = 1
	STS	ICMMNT,TPP	;.
	RCALL	SCINCP		;COPIA SECUENCIA DE INCREMENTOS.
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIA INICIAL.
	LDI	TPP,$01		;INICIAR CONTADOR DE SECUENCIA DE ESTROBO
	STS	STBCTD,TPP	;.
	LDI	TPL,SCINRE	;OBTENER RAPIDEZ INICIAL
	RCALL	EER		;.
	STS	SCCRPD,TPP	;ESTABLECER RAPIDEZ INICIAL
	STS	RPDCTD,TPP	;.
	RCALL	SCINET		;ESTABLECER SECUENCIA INICIAL.
	SEI			;ACTIVAR INTERRUPCIONES.
	LDI	TPP,_LCDFS	;LCD CONFIGURAR "FUNTION SET"
	RCALL	LCDIRW		;.
	RCALL	LCDLPR		;LIMPIAR LCD.
	STS	TCCTAR,CSF	;ACTUALIZAR CONTADOR ANTIRREBOTES.

;	************************
;	*** RUTINA PRINCIPAL ***
;	************************

PCP:		;2010-11-14 13:02
;EXHIBICIÓN DE INICIO.
PCPIDT:	LDI	TPP,0B0000_0001	;LCD "CLEAR DISPLAY"
	RCALL	LCDIRW		;.
	LDI	ZH,HIGH(2*IDNCDN)	;APUNTAR A IDENTIFICACIÓN
	LDI	ZL,LOW(2*IDNCDN)	;.
	RCALL	LCDCDN		;EXHIBIR CADENA DE IDENTIFICACIÓN.
	RCALL	LDCLDR		;EXHIBIR DIRECCIONES DE CANALES DMX.
PCPEPR:	RCALL	TCDATL		;ACTUALIZAR ESTADO DE TRANSICIONES DEL TECLADO.
;!!! INDAGAR ENTRADA POR CONTROL REMOTO.
	SBIC	GPIOR2,1		;BOTÓN S2 (SLC).
	RJMP	PCPEPR			;NO PULSADO, REITERAR.
	LDI	TPL,LOW(2*MN)	;INICIAR APUNTADOR DE SUBMENÚ
	LDI	TPH,HIGH(2*MN)
	STS	(MNAPNV+0),TPL
	STS	(MNAPNV+1),TPH	;.
	RJMP	PCPBS1			;IR A MENÚ.
PCPTR:	RCALL	TCDATL		;ACTUALIZAR ESTADO DE TRANSICIONES DEL TECLADO.
;!!! INDAGAR ENTRADA POR CONTROL REMOTO.
PCPB0:	SBIC	GPIOR2,0		;BOTÓN S1 (CCL).
	RJMP	PCPB1			;NO PULSADO, SALTA.
;RUTINA BOTÓN S1 (CCL).
;!!2010-11-13 16:00 UNA VEZ EJECUTANDA LA RUTINA DE SERVICIO DE ELEMENTO DE MENÚ,
;AL PRESIONAR BOTÓN S1 (CCL) ¡EL MENÚ SE REGRESA 2 NIVELES!; CORREGIR.
	RCALL	MNPLSC		;SACAR APUNTADOR DE LA PILA.
	BRLO	PCPIDT			;PILA VACÍA, SALTA.
	STS	(MNUAPT+0),TWL
	STS	(MNUAPT+1),TWH	;.
	RCALL	MNSMEH		;MOSTRAR MENÚ Y SUBMENÚ.
	RJMP	PCPTR			;INDAGAR SIGUIENE ENTRADA.
PCPB1:	SBIC	GPIOR2,1		;BOTÓN S2 (SLC).
	RJMP	PCPB2			;NO PULSADO, SALTA.
;RUTINA BOTÓN S2 (SLC).
;!!;!!2010-11-13 16:00 AL SELECCIONAR NUEVO ELEMENTO DE MENÚ A TRAVÉS DE LOS BOTONES 
;INCREMETAR Y DECREMENTAR, AL ENTRAR EN EL NUEVO ELEMENTO SELECCIONADO, SE PRESETAN EL 
;ELEMENTO DE SUBMENÚ CORRESPONDIENTE AL NÚMERO DE ELEMENTO DE SUBMENÚ DE LA SELECCIÓN ANTERIOR,
;CORREGIR PARA QUE EL RESULTADO SEA QUE SE PRESENTE EL ELEMENTO DE SUBMENÚ NÚMERO 0.
	LDS	TWL,(MNUAPT+0)	;OBTENER ACTUAL ELEMENTO DE MENÚ
	LDS	TWH,(MNUAPT+1)	;.
	RCALL	MNPLMT		;METER EN PILA DE MENÚ.
	BRSH	PCPBS2			;PILA LLENA, SALTA.
PCPBS1:	LDS	TWL,(MNAPNV+0)	;OBTENER NUEVO ELEMENTO DE MENÚ
	LDS	TWH,(MNAPNV+1)	;.
	STS	(MNUAPT+0),TWL	;ACTUALIZAR ELEMENTO DE MENÚ
	STS	(MNUAPT+1),TWH	;.
	RCALL	MNSMEH		;MOSTRAR MENÚ Y SUBMENÚ.
	BRTC	PCPBS2			;NO SE EXHIBE COMANDO, SALTA.
	RCALL	MNPLSC		;CORREGIR; SACAR APUNTADOR DE LA PILA.
	MOVW	ZH:ZL,GPH:GPL	;EJECUTAR COMANDO
	ICALL			;.
PCPBS2:	RJMP	PCPTR			;INDAGAR SIGUIENE ENTRADA.
PCPB2:	SBIC	GPIOR2,2		;BOTÓN S3 (ARB).
	RJMP	PCPB3			;NO PULSADO, SALTA.
;RUTINA BOTÓN S3 (ARB).
	LDS	TPP,MNUSEL	;LISTAR HACIA ARRIBA EL MENÚ
	DEC	TPP
	STS	MNUSEL,TPP	;.
	RCALL	MNSMEH		;MOSTRAR MENÚ Y SUBMENÚ.
	RJMP	PCPTR			;INDAGAR SIGUIENE ENTRADA.
PCPB3:	SBIC	GPIOR2,3		;BOTÓN S4 (ABJ).
	RJMP	PCPB4			;NO PULSADO, SALTA.
;RUTINA BOTÓN S4 (ABJ).
	LDS	TPP,MNUSEL	;LISTAR HACIA ABAJO EL MENÚ
	INC	TPP
	STS	MNUSEL,TPP	;.
	RCALL	MNSMEH		;MOSTRAR MENÚ Y SUBMENÚ.
	RJMP	PCPTR			;INDAGAR SIGUIENE ENTRADA.
PCPB4:	SBIC	GPIOR2,4		;BOTÓN S5 (IQD).
	RJMP	PCPB5			;NO PULSADO, SALTA.
;RUTINA BOTÓN S5 (IQD).
	RJMP	PCPTR			;INDAGAR SIGUIENE ENTRADA.
PCPB5:	SBIC	GPIOR2,5		;BOTÓN S6 (DRC).
	RJMP	PCPB6			;NO PULSADO, SALTA.
;RUTINA BOTÓN S6 (DRC).
	RJMP	PCPTR			;INDAGAR SIGUIENE ENTRADA.
PCPB6:	SBIC	GPIOR2,6		;BOTÓN S7 (RTB).
	RJMP	PCPTR			;NO PULSADO, SALTA.
;RUTINA BOTÓN S7 (RTB).
	CBI	PORTB,1		;ENCENDER LED.
	SBI	GPIOR1,3		;HABILITAR LLAVE DE SEGURIDAD.
	RJMP	PCPTR			;INDAGAR SIGUIENE ENTRADA.

;	******************************
;	*** CONFIGURACIÓN E INICIO ***
;	******************************

SCINET:	;DESCRIPCIÓN: ESTABLECER SECUENCIA INICIAL.
	;UTILIZA:  ZH ZL KFF GPL GPH TPP TPL
	;ETIQUETAS: SCINET: SCINET2: SCINET1: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-12-20 23:34
	LDI	TPL,(SCINEX+0)	;REANUDAR DIRECCIÓN DE EJECUCIÓN INICIAL
	RCALL	EER
	MOV	ZL,TPP
	LDI	TPL,(SCINEX+1)
	RCALL	EER
	MOV	ZH,TPP		;.
	LDI	TPL,(SCINRP+0)	;COMPRBAR DIRECCIÓN DEJECUCIÓN INICIAL
	RCALL	EER
	MOV	GPL,TPP
	LDI	TPL,(SCINRP+1)
	RCALL	EER
	MOV	GPH,TPP
	CP	ZL,GPL
	CPC	ZH,GPH		;.
	BREQ	SCINET1			;IGUAL, SALTA.
	SBI	GPIOR1,0		;INDICAR; ERROR EN EEPROM.
;	RCALL	LEE033		;EXHIBIR MENSAJE DE ERROR 033 "33:! MEM. EEPROM"
SCINET2:	RET
SCINET1:	CP	ZL,KFF		;¿SIN DIRECCIÓN INICIAL DE EJECUCIÓN?
	CPC	ZL,KFF		;.
	BREQ	SCINET2			;SÍ, TERMINAR SIN REALIZAR NADA.
	IJMP			;EJECUTAR COMANDO INICIAL.

ITSINI:	;DESCRIPCIÓN: CARGAR INTENSIDAD INICIAL PARA LAS SALIDAS.
	;UTILIZA:  TPP TPL
	;ETIQUETAS: ITSINI: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-11-15 00:50
	LDI	TPL,ITINRE	;OBTENER INTENSIDAD INICIAL R
	RCALL	EER		;.
	MOV	R0,TPP;*+
	LSR	R0;*+
	OUT	OCR0A,R0		;OCTETO DE CONTROL R.
	LDI	TPL,ITINGE	;OBTENER INTENSIDAD INICIAL G
	RCALL	EER		;.
	MOV	R0,TPP;*+
	LSR	R0;*+
	OUT	OCR1AL,R0		;OCTETO DE CONTROL G.
	LDI	TPL,ITINBE	;OBTENER INTENSIDAD INICIAL B
	RCALL	EER		;.
	MOV	R0,TPP;*+
	LSR	R0;*+
	OUT	OCR1BL,R0		;OCTETO DE CONTROL B.
	LDI	TPL,ITINXE	;OBTENER INTENSIDAD INICIAL X
	RCALL	EER		;.
	MOV	R0,TPP;*+
	LSR	R0;*+
	OUT	OCR0B,R0		;OCTETO DE CONTROL X.
	RET

DMXDIE:	;DESCRIPCIÓN: INICIAR ASIGNACIONES DE DIRECCIONES DMX.
	;UTILIZA:  Z ZH ZL TPP TPL TPH
	;ETIQUETAS: DMXDIE: DMXDIE1: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-11-14 12:17
	LDI	TPH,$04		;CONTADOR 4 PARES DE LOCALIDADES CONSECUTIVAS.
	LDI	ZL,LOW(DMXD1)	;DIRECCIÓN EN SRAM
	LDI	ZH,HIGH(DMXD1)	;.
	LDI	TPL,DMXD1E	;DIRECCIÓN EN EEPROM.
DMXDIE1:	RCALL	EER		;LEER DATO DE EEPROM.
	ST	Z+,TPP		;ESCRIBIR EN SRAM.
	INC	TPL		;APUNTAR A SIGUIENTE LOCALIDAD.
	RCALL	EER		;LEER DATO DE EEPROM.
	CPI	TPP,$02		;¿FUERA DE INTERVALO?.
	BRLO	DMXDIE2			;NO, SALTA.
	SBI	GPIOR1,0		;INDICAR; ERROR EN EEPROM.
	LDI	TPP,$01		;VALOR TEMPORAL.
DMXDIE2:	ST	Z+,TPP		;ESCRIBIR EN SRAM.
	INC	TPL		;APUNTAR A SIGUIENTE LOCALIDAD.
	DEC	TPH		;ACTUALIZAR CONTADOR.
	BRNE	DMXDIE1			;¿TERMINADO?. NO, SALTA.
	RET			;TERMINAR.

DIMINI:	;DESCRIPCIÓN: INICIAR TEMPORIZADORES PARA PWM.
	;UTILIZA:  K00 TPP
	;ETIQUETAS: DIMINI: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-10-24 21:09
	LDI	TPP,_TCCR0A	;CONFIGURAR OCTETOS DE CONTROL TEMPORIZADOR 0
	OUT	TCCR0A,TPP
	LDI	TPX,_TCCR0B
	RCALL	DIMINIP
	OUT	TCCR0B,TPX	;.
	LDI	TPP,_TCCR1A	;CONFIGURAR OCTETOS DE CONTROL TEMPORIZADOR 1
	OUT	TCCR1A,TPP
	LDI	TPX,_TCCR1B
	RCALL	DIMINIP
	OUT	TCCR1B,TPX	;.
	OUT	TCNT1H,K00	;ASIGNAR 0 A REGISTRO TEMP.
	RCALL	CSXIEE		;EXTRAER CUENTA DE COMPENSACIÓN.
	RET			;TERMINA.
DIMINIP:	LDI	TPL,CSTPEE	;CARGAR RESPALDO DE ASIGNACIÓN DE PRESCALADORES
	RCALL	EER		;.
	CP	TPP,KFF		;¿SIN DATOS?.
	BREQ	DIMINIP1			;SÍ, REGRESAR.
	ANDI	TPX,0B1111_1000	;ENMASCARAR.
	OR	TPX,TPP		;REASIGNAR.
DIMINIP1:	RET			;REGRESAR.

CSXIEE:	;DESCRIPCIÓN: EXTRAER CUENTA DE COMPENSACIÓN.
	;UTILIZA:
	;ENTRADA:
	;SALIDA:
	;USO:
	;NOTAS:
	LDI	TPL,CSTPEE	;CARGAR RESPALDO DE ASIGNACIÓN DE PRESCALADORES
	RCALL	EER		;.
	CP	TPP,KFF		;¿CON DATOS?.
	BRNE	CSXIEE1			;SÍ, CONTINUAR.
	LDI	TPP,32		;ESTABLECER POR OMISIÓN CUENTA DE COMPENSACIÓN
	STS	CSXINC,TPP	;.
	RET			;REGRESAR.
CSXIEE1:	LDI	ZL,LOW(CSXVLR*2)	;APUNTAR A BASE DE CADENA
	LDI	ZH,HIGH(CSXVLR*2)	;.
	DEC	TPP		;COMPENSACIÓN DE INTERVALO (CSX-1)
	ADD	ZL,TPP		;RECALCULAR APUNTADOR
	ADC	ZH,K00		;.
	LPM	TPP,Z		;CARGAR CUENTA.
	STS	CSXINC,TPP	;ASIGNAR CUENTA.
	RET

USAINI:	;DESCRIPCIÓN: CONFIGURAR USART.
	;UTILIZA:  TPP TPL TPH
	;ETIQUETAS: USAINI: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-09-18 16:11
	LDI	TPH,_BAUDH	;USART BAUD RATE
	LDI	TPL,_BAUDL
	OUT	UBRRH,TPH
	OUT	UBRRL,TPL		;.
	LDI	TPP,_UCSRA	;CONFIGURAR OCTETOS DE CONTROL DE USART
	OUT	UCSRA,TPP
	LDI	TPP,_UCSRB
	OUT	UCSRB,TPP
	LDI	TPP,_UCSRC
	OUT	UCSRC,TPP		;.
	RET

SCINCP:	;DESCRIPCIÓN: COPIA DE MEMORIA DE PROGRAMA A MEMORIA DE DATOS SECUENCIA DE INCREMENTOS.
	;UTILIZA:  X Z XH XL ZH ZL TPP TPX
	;ETIQUETAS: SCINCP: SCINCP1: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-11-15 20:00
	LDI	TPP,8		;CONTADOR DE LONGTUD DE SECUENCIA (8).
	LDI	ZL,LOW(INCSCCE*2)	;APUNTAR A MEMORIA DE PROGRAMA
	LDI	ZH,HIGH(INCSCCE*2)	;.
	LDI	XL,LOW(INCSCC)	;APUNTAR A MEMORIA DE DATOS
	LDI	XH,HIGH(INCSCC)	;.
SCINCP1:	LPM	TPX,Z+		;COPIAR
	ST	X+,TPX		;.
	DEC	TPP		;¿ES EL ÚLTIMO?.
	BRNE	SCINCP1			;NO, REITERAR.
	RET			;TERMINAR.

;	************
;	*** MENÚ ***
;	************

MNPLMT:	;DESCRIPCIÓN: METER EN PILA DE MENÚ
	;UTILIZA:  X XH XL TPP TWL TWH
	;ETIQUETAS: MNPLMT: MNPLMT1: 
	;ENTRADA: TWH:TWL = DATO A METER .
	;SALIDA: BANDERA(C) = INDICADOR DE SATURACIÓN DE LA PILA .
	;USO: C = 1 ;PILA NO LLENA , C = 0 ;PILA LLENA .
	;NOTAS: 2010-11-13 15:37
	;	DA MANTENIMIENTO A MNUSEL.
	CLR	XH		;OBTENER APUNTADOR A PILA
	LDS	XL,MNAPPL		;.
	CPI	XL,MNUPLA+MNPLPF*3	;¿PILA LLENA?.
	BRSH	MNPLMT1			;SÍ, TERMINAR.
	ST	X+,TWL		;METER EN LA PILA
	ST	X+,TWH		;.
	LDS	TPP,MNUSEL	;RESPALDAR SELECCIONADOR DE MENÚ ACTUAL
	ST	X+,TPP		;.
	LD	TPP,X+		;RECUPERAR SELECCIONADOR DE MENÚ DE AVANCE
	STS	MNUSEL,TPP	;.
	STS	MNAPPL,XL		;ACTUALIZAR APUNTADOR.
MNPLMT1:	RET

MNPLSC:	;DESCRIPCIÓN: SACAR DE PILA DE MENÚ.
	;UTILIZA:  X XH XL TPP TWL TWH
	;ETIQUETAS: MNPLSC: MNPLSC1: 
	;ENTRADA: NINGUNA.
	;SALIDA: TWH:TWL = DATO SACADO , BANDERA(C) = INDICACOR DE PILA VACÍA .
	;USO: C = 0; , C = 1; .
	;NOTAS: 2010-11-13 15:37
	;	DA MANTENIMIENTO A MNUSEL.
	CLR	XH		;OBTENER APUNTADOR A PILA
	LDS	XL,MNAPPL		;.
	CPI	XL,MNUPLA+1	;¿PILA VACÍA?.
	BRLO	MNPLSC1			;SÍ, TERMINAR.
	LDS	TPP,MNUSEL	;RESPALDAR SELECCIONADOR DE MENÚ ACTUAL (PRÓXIMO AVANCE)
	ST	-X,TPP		.
	LD	TPP,-X		;RECUPARAR SELECCIONADOR DE MENÚ ANTERIOR
	STS	MNUSEL,TPP	;.
	LD	TWH,-X		;SACAR DE LA PILA
	LD	TWL,-X		;.
	STS	MNAPPL,XL		;ACTUALIZAR APUNTADOR.
MNPLSC1:	RET

MNSMEH:	;DESCRIPCIÓN: EXHIBIR MENÚ Y ELEMENTO SELECCIONADO DEL SUBMENÚ.
	;UTILIZA:  Z ZH ZL K00 GPL GPP TPP TWL TWH
	;ETIQUETAS: MNSMEH: MNSMEH1: MNSMEH3: MNSMEH2: 
	;ENTRADA: NINGUNA.
	;SALIDA: 	ZH:ZL = APUNTADOR A SUBMENÚ EN LA TABLA .
	;	SI SREG(T) = 1 ; GPH:GPL CONTIENE APUNTADOR DE EJECUCIÓN .
	;USO: MNUAPT = APUNTADOR A TABLA , MNUSEL = NÚMERO DE ELEMENTO DEL SUBMENÚ .
	;NOTAS: 	2010-11-13 01:14
	LDI	TPP,0B0000_0001	;LCD "CLEAR DISPLAY"
	RCALL	LCDIRW		;.
	LDS	ZL,(MNUAPT+0)	;OBTENER APUNTADOR A LA TABLA DE ELEMENTOS DEL MENÚ
	LDS	ZH,(MNUAPT+1)	;.
	MOVW	TWH:TWL,ZH:ZL	;RESPALDAR APUNTADOR A LA TABLA DE ELEMENTOS DEL MENÚ.
	RCALL	MNELEH		;EXHIBIR NOMBRE DE ELEMENTO DEL MENÚ.
	BRTC	MNSMEH4
	RET			;COMANDO, TERMINAR.
MNSMEH4:	LDI	TPP,($80+$40)	;LCD INICIO DE SEGUNDO RENGLÓN
	RCALL	LCDIRW		;.
	LDS	GPP,MNUSEL	;OBTENER SELECCIÓN DEL SUBMENÚ.
	LSL	GPP		;AJUSTE PARA INSTRUCCIÓN LPM.
	CP	GPP,K00		;¿FUERA DE LÍMITE INFERIOR?.
	BRGE	MNSMEH1			;NO, SALTA.
	MOV	GPP,GPL		;CORREGIR
	LSR	GPP
	DEC	GPP
	RJMP	MNSMEH3			;(CONCLUIR ADELANTE).
MNSMEH1:	CP	GPP,GPL		;¿FUERA DE LÍMITE SUPERIOR?.
	BRLT	MNSMEH2			;NO, SALTA.
	MOV	GPP,K00		;CORREGIR
MNSMEH3:	STS	MNUSEL,GPP
	LSL	GPP		;.
MNSMEH2:	MOVW	ZH:ZL,TWH:TWL	;RECUPERAR APUNTADOR A LA TABLA DE ELEMENTOS DEL MENÚ.
	ADIW	ZH:ZL,2		;APUNTAR A APUNTADOR DE SUBMENÚ
	ADD	ZL,GPP
	ADC	ZH,K00		;.
	LPM	TWL,Z+		;CARGAR APUNTADOR
	LPM	TWH,Z+		;.
	STS	(MNAPNV+0),TWL	;RESPALDAR NUEVO APUNTADOR
	STS	(MNAPNV+1),TWH	;.
	MOVW	ZH:ZL,TWH:TWL	;REAPUNTAR
	RCALL	MNELEH		;EXHIBIR NOMBRE DE ELEMENTO DEL MENÚ.
	CLT			;ELEMENTO EN SEGUNDO RENGLÓN, INDICAR NO EJECUTABLE.
	RET

MNELEH:	;DESCRIPCIÓN: EXHIBIR ELEMENTO DEL MENÚ
	;UTILIZA:  Z ZH ZL GPL GPH
	;ETIQUETAS: MNELEH: MNELEH1: 
	;ENTRADA: ZH:ZL = APUNTADOR DE LA TABLA DEL ELEMENTO DEL MENU .
	;SALIDA: GPH:GPL = DESPLAZAMIENTO O APUNTADOR DE EJECUCIÓN , SREG(T).
	;USO:	SREG(T) = 0 ; GPH:GPL CONTIENE DESPLAZAMIENTO .
	;	SREG(T) = 1 ; GPH:GPL CONTIENE APUNTADOR DE EJECUCIÓN .
	;NOTAS: 2010-11-13 01:09
	LPM	GPL,Z+		;OBTENER DESPLAZAMIENTO O APUNTADOR DE EJECUCIÓN
	LPM	GPH,Z+		;.
	TST	GPH		;¿ES APUNTADOR DE EJECUCIÓN?.
	SET			;PREASIGNACIÓN; ES APUNTADOR DE EJECUCIÓN.
	BRNE	MNELEH1			;SÍ, SALTA.
	CLT			;CORRECCIÓN; ES DESPLAZAMIENTO.
	ADD	ZL,GPL		;SUMAR DESPLAZAMIENTO PARA APUNTAR A CADENA
	ADC	ZH,GPH		;.
MNELEH1:	RJMP	LCDCDN		;EXHIBIR MENSAJE Y TERMINAR.

;	**********************
;	*** ENTRADA/SALIDA ***
;	**********************

LEM020:	;DESCRIPCIÓN: EXHIBIR MENSAJE 020 "CANCELADO".
	;UTILIZA:  ZH ZL TPP
	;ETIQUETAS: LEM020: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-11-15 22:25
	RCALL	RGN2BI		;RENGLÓN 2 BORRAR Y APUNTAR A INICIO DE ÉL.
	LDI	ZH,HIGH(2*MSJ020)	;"CANCELADO"
	LDI	ZL,LOW(2*MSJ020)	;.
	RJMP	LCDCDN		;EXHIBIR CADENA.

LEM030:	;DESCRIPCIÓN: EXHIBIR MENSAJE 030 "GRABADO".
	;UTILIZA:  ZH ZL TPP
	;ETIQUETAS: LEM030: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-11-15 22:25
	RCALL	RGN2BI		;RENGLÓN 2 BORRAR Y APUNTAR A INICIO DE ÉL.
	LDI	ZH,HIGH(2*MSJ030)	;"GRABADO"
	LDI	ZL,LOW(2*MSJ030)	;.
	RJMP	LCDCDN		;EXHIBIR CADENA Y TERMINAR.

LEE033:	;DESCRIPCIÓN: EXHIBIR MENSAJE DE ERROR 033 "33:! MEM. EEPROM"
	;UTILIZA:  ZH ZL
	;ETIQUETAS: LEE033: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-11-15 23:15
	SBI	GPIOR1,0		;INDICAR; ERROR EN EEPROM.
	RCALL	RGN2BI		;RENGLÓN 2 BORRAR Y APUNTAR A INICIO DE ÉL.
	LDI	ZH,HIGH(2*ERR033)	;"33:! MEM. EEPROM"
	LDI	ZL,LOW(2*ERR033)	;.
	RJMP	LCDCDN		;EXHIBIR CADENA Y TERMINAR.

LEE050:	;DESCRIPCIÓN: EXHIBIR MENSAJE DE ERROR 050 "50:! DESHABILIT."
	;UTILIZA:  ZH ZL
	;ETIQUETAS:
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-11-15 23:15
	SBI	GPIOR1,0		;INDICAR; ERROR EN EEPROM.
	RCALL	RGN2BI		;RENGLÓN 2 BORRAR Y APUNTAR A INICIO DE ÉL.
	LDI	ZH,HIGH(2*ERR050)	;"50:! DESHABILIT."
	LDI	ZL,LOW(2*ERR050)	;.
	RJMP	LCDCDN		;EXHIBIR CADENA Y TERMINAR.

	;EXHIBIR MENSAJE DE ERROR 200 "200:! DESHABILITADO"

RGN2BI:	;DESCRIPCIÓN: RENGLÓN 2 BORRAR Y APUNTAR A INICIO DE ÉL.
	;UTILIZA:  TPP
	;ETIQUETAS: RGN2BI: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-11-15 22:31
	RCALL	LDRG2BR		;BORRAR RENGLÓN 2.
	LDI	TPP,($80+$40)	;LCD INICIO DE SEGUNDO RENGLÓN
	RJMP	LCDIRW		;Y TERMINAR.

TCDATL:	;DESCRIPCIÓN: TECLADO ACTUALIZACIÓN DE ESTADO.
	;UTILIZA:  KFF CSF GPP TPP TPH
	;ETIQUETAS: TCDATL: TCDATLF: 
	;ENTRADA: NINGUNA.
	;SALIDA: TPH = ESTADO DE TRANSICIONES , GPIOR2 = TPH .
	;USO: GPIOR2 CONTIENE LOS ESTADOS DE TRANSICIONES DEL TECLADO.
	;NOTAS: 2010-11-14 13:02
	LDS	TPP,TCCTAR	;CARGAR CONTADOR ANTIRREBOTES.
	SUB	TPP,CSF		;OBTENER DIFERENCIA CON CUENTA ACTUAL.
	CPI	TPP,CTAARB	;¿LAPSO CONCLUIDO?.
	BRSH	TCDATLF			;LAPSO AÚN NO CONCLUIDO, SALTA.
	STS	TCCTAR,CSF	;ALMACENAR CUENTA ACTUAL.
	RCALL	PTEXLT		;LEER PUERTOS XA Y XB.
	LDS	GPP,TCDETD	;RECUPERAR ESTADO ANTERIOR DEL TECLADO.
	STS	TCDETD,TPH	;ALMACENAR ESTADO ACTUAL DEL TECLADO.
	EOR	GPP,KFF		;DETECTAR TRANSICIÓN DE PULSADO (V*)+N=P
	OR	TPH,GPP		;(ESTADO VIEJO)* OR (ESTADO NUEVO) = TRANSICIÓN DE PULSADO.
	OUT	GPIOR2,TPH	;ACTUALIZAR ESTADO DE TRANSICIONES.
	RET
TCDATLF:	OUT	GPIOR2,KFF	;INDICAR NO TRANSICIONES.
	RET

LCDLPR:	;DESCRIPCIÓN: LIMPIAR LCD.
	;UTILIZA:  TPP
	;ETIQUETAS: LCDLPR: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-10-30 13:58
	LDI	TPP,0B0000_0001	;LCD "CLEAR DISPLAY"
	RCALL	LCDIRW		;.
	LDI	TPP,0B0000_1100	;LCD "DISPLAY ON"
	RCALL	LCDIRW		;.
	LDI	TPP,0B0000_0110	;LCD "ENTRY MODE SET, INCREMENT"
	RJMP	LCDIRW		; Y TERMINAR.

LDRG1BR:	;DESCRIPCIÓN: LCD BORRAR RENGLÓN 1.
	;UTILIZA:  TPP
	;ETIQUETAS: LDRG1BR: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-10-30 23:01
	LDI	TPP,($80+$00)	;LCD INICIO DE PRIMER RENGLÓN.
	RJMP	LDRG2BR2		;PROSEGUIR EN LDRG2BR2.

LDRG2BR:	;DESCRIPCIÓN: LCD BORRAR RENGLÓN 2.
	;UTILIZA:  TPP TPL
	;ETIQUETAS: LDRG2BR: LDRG2BR2: LDRG2BR1: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-10-30 23:01
	LDI	TPP,($80+$40)	;LCD INICIO DE SEGUNDO RENGLÓN
LDRG2BR2:	RCALL	LCDIRW		;.
	LDI	TPL,40		;ESCRIBIR ESPACIOS (BORRAR) 40 CARACTERES.
LDRG2BR1:	LDI	TPP,' '		;ESPACIO SEPARACIÓN
	RCALL	LCDDRW		;.
	DEC	TPL		;APUNTAR AL SIGUIENTE.
	BRNE	LDRG2BR1			;TERMINADO?. NO, SALTA.
	RET			;SÍ, FIN.

LDCLDR:	;DESCRIPCIÓN: EXHIBIR DIRECCIONES DE CANALES DMX.
	;UTILIZA:  TPP TPL TPH
	;ETIQUETAS: LDCLDR: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-10-30 15:46
	LDI	TPP,($80+$40)	;LCD INICIO DE SEGUNDO RENGLÓN
	RCALL	LCDIRW		;.
	LDS	TPL,(DMXD1+0)	;CARGAR DIRECCIÓN DMX1 DESDE MEMORIA DE DATOS
	LDS	TPH,(DMXD1+1)	;.
	RCALL	LDCLER		;CANAL DMX EXHIBIR.
	LDS	TPL,(DMXD2+0)	;CARGAR DIRECCIÓN DMX2 DESDE MEMORIA DE DATOS
	LDS	TPH,(DMXD2+1)	;.
	RCALL	LDCLER		;CANAL DMX EXHIBIR.
	LDS	TPL,(DMXD3+0)	;CARGAR DIRECCIÓN DMX2 DESDE MEMORIA DE DATOS
	LDS	TPH,(DMXD3+1)	;.
	RCALL	LDCLER		;CANAL DMX EXHIBIR.
	LDS	TPL,(DMXD4+0)	;CARGAR DIRECCIÓN DMX2 DESDE MEMORIA DE DATOS
	LDS	TPH,(DMXD4+1)	;.
	RJMP	LDCLER		;CANAL DMX EXHIBIR Y TERMINAR.

LDCLER:	;DESCRIPCIÓN: CANAL DMX EXHIBIR.
	;UTILIZA:  GPL GPH TPP TPL TPH
	;ETIQUETAS: LDCLER: LDCLER1: 
	;ENTRADA: TPH:TPL = DIRECCIÓN DMX .
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-11-14 23:26
	; SE AÑADE UN ESPACIO DE SEPARACIÓN EN EL EXHIBIDOR.
	INC	TPL		;CALCULAR DIRECCIÓN DE CANAL
	BRNE	LDCLER1
	INC	TPH		;.
LDCLER1:	RCALL	LCD03D		;EXHIBIR NÚMERO [ 001 - 512 ].
	LDI	TPP,' '		;ESPACIO SEPARACIÓN
	RJMP	LCDDRW		; Y TERMINAR.

LCD03D:	;DESCRIPCIÓN: EXHIBIR NÚMERO [ 000 - 999 ] EN EL LCD
	;UTILIZA:  GPL GPH TPP TPL TPH
	;ETIQUETAS: LCD03D: 
	;ENTRADA: TPH:TPL = NÚMERO A EXIBIR (BINARIO) .
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-11-14 23:20
	RCALL	BNRBCD		;CONVERTIR DE BINARIO A BCD (16 DÍGITOS).
	MOV	TPP,GPH		;CONVERTIR DE BCD A ASCII (LSB)
	RCALL	HEXASC		;.
	MOV	TPP,TPL		;EXHIBIR DÍGITO MÁS SIGNIFICATIVO
	RCALL	LCDDRW		;.
	MOV	TPP,GPL		;CONVERTIR DE BCD A ASCII (MSB)
	RCALL	HEXASC		;.
	MOV	TPP,TPH		;EXHIBIR DÍGITO INTERMEDIO
	RCALL	LCDDRW		;.
	MOV	TPP,TPL		;EXHIBIR DÍGITO MENOS SIGNIFICATIVO
	RJMP	LCDDRW		;Y TERMINAR.

LCDCDN:	;DESCRIPCIÓN: EXHIBE UNA CADENA EN EL LCD.
	;UTILIZA:  Z K00 GPP TPP
	;ETIQUETAS: LCDCDN: LCDCDNF: 
	;ENTRADA: ZH:ZL = (DIRECCIÓN DE CADENA)*2 .
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-10-30 13:58
	;$00 INDICA FIN DE CADENA.
LCDCDN1:	LPM	GPP,Z+		;CARGAR DATO ASCII A EXHIBIDIR DESDE MEMORIA DE PROGRAMA.
	CP	GPP,K00		;¿ES FIN DE CADENA?.
	BREQ	LCDCDNF			;SÍ, TERMINAR.
	MOV	TPP,GPP		;ENVIAR CARACTER AL LCD
	RCALL	LCDDRW		;.
	RJMP	LCDCDN1		;REITERAR
LCDCDNF:	RET

LCDBFE:	;DESCRIPCIÓN: ESPERAR CONTROLADOR DE LCD DISPONIBLE.
	;UTILIZA:  TPP
	;ETIQUETAS: LCDBFE: LCDBFE1: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-10-09 20:09
LCDBFE1:	RCALL	LCDIRR		;LECTURA DE BF Y AC.
	SBRC	TPP,7			;¿DESOCUPADO?, SÍ SALTA.
	RJMP	LCDBFE1		;ESPERAR.
	RET

LCDIRR:	;DESCRIPCIÓN: LCD BANDERA DE OCUPADO Y CONTADOR DE DIRECCIÓN (BF & AC) LECTURA (R).
	;UTILIZA: 
	;ETIQUETAS: LCDIRR: LCDLTR: 
	;ENTRADA: NINGUNA.
	;SALIDA: TPP = IR .
	;USO:
	;NOTAS:  2010-11-08 23:42
	; RS = 0 , R/W = 1 .
	; BF AC AC AC AC AC AC AC
	CBI	PORTD,2		;RS = 0.
LCDLTR:	SBI	PORTD,3		;R/W = 1.
	SBI	PORTD,4		;E = 1.
	RCALL	SPICGA		;CARGA DE REGISTROS DE CORRIMIENTO.
	CBI	PORTD,4		;E = 0.
	RCALL	SPITFR		;TRANSFERIR.
	RJMP	SPITFR		;TRANSFERIR (DESCARTAR U3) Y TERMINAR.

LCDDRR:	;DESCRIPCIÓN: LCD REGISTRO DE DATOS (DR) LECTURA (R).
	;UTILIZA: 
	;ETIQUETAS: LCDDRR: 
	;ENTRADA: NINGUNA.
	;SALIDA: TPP = DR .
	;USO:
	;NOTAS: 2011-01-06 22:51
	; RS = 1 , R/W = 1 .
;!!!	RCALL	LCDBFE		;ESPERAR CONTROLADOR DE LCD DISPONIBLE.
	SBI	PORTD,2		;RS = 1.
	RJMP	LCDLTR		;CONTINUAR.

LCDIRW:	;DESCRIPCIÓN: LCD REGISTRO DE INSTRUCCIONES (IR) ESCRITURA (W).
	;UTILIZA:  GPP TPP
	;ETIQUETAS: LCDIRW: LCDECT: 
	;ENTRADA: TPP = IR .
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-10-30 13:46
	; RS = 0 , R/W = 0 .
	MOV	GPP,TPP		;RESGUARDAR TPP.
	RCALL	LCDBFE		;ESPERAR CONTROLADOR DE LCD DISPONIBLE.
	MOV	TPP,GPP		;RECUPERAR TPP.
	CBI	PORTD,2		;RS = 0.
LCDECT:	CBI	PORTD,3		;R/W = 0.
	SBI	PORTD,4		;E = 1.
	RCALL	SPITFR		;TRANSFERIR.
	CBI	PORTD,4		;E = 0.
	SBI	PORTD,3		;R/W = 1.
	RET

LCDDRW:	;DESCRIPCIÓN: LCD REGISTRO DE DATOS (DR) ESCRITURA (W).
	;UTILIZA:  GPP TPP
	;ETIQUETAS: LCDDRW: 
	;ENTRADA: TPP = DR .
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-10-30 13:46
	; RS = 1 , R/W = 0 .
	MOV	GPP,TPP		;RESGUARDAR TPP.
	RCALL	LCDBFE		;ESPERAR CONTROLADOR DE LCD DISPONIBLE.
	MOV	TPP,GPP		;RECUPERAR TPP.
	SBI	PORTD,2		;RS = 1.
	RJMP	LCDECT		;CONTINUAR.

PTEXLT:	;DESCRIPCIÓN: LEER PUERTOS XA Y XB.
	;UTILIZA:  TPP TPL TPH
	;ETIQUETAS: PTEXLT: 
	;ENTRADA: NINGUNA.
	;SALIDA: TPL = PXA , TPH = PXB.
	;USO:
	;NOTAS: 2010-11-02 23:02
	CBI	PORTD,6		;HABILITAR TECLADO.
	RCALL	SPICGA		;CARGA DE REGISTROS DE CORRIMIENTO.
	SBI	PORTD,6		;DESHABILITAR TECLADO.
	RCALL	SPITFR		;TRANSFERIR PXA.
	MOV	TPL,TPP		;MOVER A TPL.
	RCALL	SPITFR		;TRANSFERIR PXB.
	MOV	TPH,TPP		;MOVER A TPH.
	RET

SPICGA:	;DESCRIPCIÓN: SPI CARGA DE REGISTROS DE CORRIMIENTO.
	;UTILIZA:  TPP
	;ETIQUETAS: SPICGA: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-10-24 03:52
	SBI	PORTB,0		;AVRL = 1.
	LDI	TPP,0B0001_0001	;GENERAR TRANSICIÓN DE RELOJ PARA CARGA "LOAD"
	OUT	USICR,TPP
	NOP			; (AGREGADO, OSCILOSCOPIO AB = 20 MHz, MEDICIÓN, APRECIACIÓN DE LECTURA)
	OUT	USICR,TPP		;. *009
	CBI	PORTB,0		;AVRL = 0.
	RET

SPITFR:	;DESCRIPCIÓN: SPI TRANSFERENCIA DE DATOS.
	;UTILIZA:  TPP TPX
	;ETIQUETAS: SPITFR: SPIT1: 
	;ENTRADA: TPP = OCTETO A ENVIAR .
	;SALIDA: TPP = OCTETO RECIBIDO .
	;USO:
	;NOTAS: 2010-10-14 22:27 2010-10-02 13:03
	OUT	USIDR,TPP		;OCTETO A ENVIAR A REGISTRO DE SALIDA.
	LDI	TPP,0B0100_0000	;CONFIGURAR USI PARA SPI
	OUT	USISR,TPP		;. *005
	LDI	TPX,0B0001_1111	;CONFIGURAR USI PARA SPI Y REALIZAR TRANSMISIÓN
SPIT1:	OUT	USICR,TPX		;. *005
	IN	TPP, USISR	;INDAGAR SI ES FIN DE TRANFERENCIA.
	SBRS	TPP, USIOIF	;¿FIN DE TRANSFERENCIA?.
	RJMP	SPIT1			;NO, REITERAR.
	IN	TPP,USIDR		;REGISTRO DE ENTRADA A OCTETO RECIBIDO.
	RET

;	*******************
;	*** MATEMÁTICAS ***
;	*******************

BNRBCD:	;DESCRIPCIÓN: CONVERTIR DE BINARIO A BCD (16 DÍGITOS).
	;UTILIZA:  GPL GPH GPP TPP TPL TPH TPX
	;ETIQUETAS: BNRBCD: BNRBCD1: BNRBCDF: BNRBCDA: 
	;ENTRADA: TPH:TPL = NUMERO BINARIO (16 DÍGITOS) .
	;SALIDA: GPP:GPH:GPL = BCD , TPH:TPL = $0000 .
	;USO:
	; 2010-09-16 12:21
	LDI	TPX,16		;PREPARAR CONTADOR DE REITERACIÓN.
	CLR	GPP		;LIMPIAR OCTETOS DE RESULTADOS
	CLR	GPH
	CLR	GPL		;.
BNRBCD1:	LSL	TPL		;DESPLAZAR DÍGITOS DE LOS OCTETOS.
	ROL	TPH
	ROL	GPL
	ROL	GPH
	ROL	GPP		;.
	DEC	TPX		;DECREMENTAR CONTADOR DE REITERACIÓN.
	BREQ	BNRBCDF		;¿FIN DE PROCESO?, SÍ SALTA.
	MOV	TPP,GPP		;COPIA DE OCTETO.
	RCALL	BNRBCDA		;RUTINA AUXILAR DE CORRECCIÓN PARCIAL.
	MOV	GPP,TPP		;	SÍ, SOBRESCRIBIR OCTETO.
	MOV	TPP,GPH		;COPIA DE OCTETO.
	RCALL	BNRBCDA		;RUTINA AUXILAR DE CORRECCIÓN PARCIAL.
	MOV	GPH,TPP		;	SÍ, SOBRESCRIBIR OCTETO.
	MOV	TPP,GPL		;COPIA DE OCTETO.
	RCALL	BNRBCDA		;RUTINA AUXILAR DE CORRECCIÓN PARCIAL.
	MOV	GPL,TPP		;	SÍ, SOBRESCRIBIR OCTETO.
	RJMP	BNRBCD1		;CONTINUAR CON DESPLAZAMIENTOS.
BNRBCDF:	RET

BNRBCDA:	;DESCRIPCIÓN: AUXILIAR CONVERTIR DE BINARIO A BCD (16 DÍGITOS).
	;UTILIZA:  TPP
	;ETIQUETAS: BNRBCDA: 
	;ENTRADA: TPP = CORECCIÓN PARCIAL DE BINARIO A BCD .
	;SALIDA: TPP = OCTETO CORREGIDO PARCIALMENTE .
	;USO:
	;NOTAS: EN EL ALGORITMO EL RESULTADO DEBE SER MULTIPLICADO POR 2.
	; 2010-09-16 12:21
	SUBI	TPP,-$03		;SUMAR $03 (CUARTETO INFERIOR).
	SBRS	TPP,3		;¿ES CORRECTO?.
	SUBI	TPP,$03		;NO, DESHACER SUMA.
	SUBI	TPP,-$30		;SUMAR $30 (CUARTETO SUPERIOR).
	SBRS	TPP,7		;¿ES CORRECTO?.
	SUBI	TPP,$30		;NO, DESHACER SUMA.
	RET			;FIN DE PROCESO.

HEXASC:	;DESCRIPCIÓN: REPRESENTAR UN OCTETO EN ASCII.
	;UTILIZA:  TPP TPL TPH
	;ETIQUETAS: HEXASC: HXAS: HXAS1: 
	;ENTRADA: TPP = OCTETO A REPRESENTAR .
	;SALIDA: TPH:TPL = ASCII DEL OCTETO .
	;USO:
	;NOTAS: 2010-10-13 22:52
	MOV	TPH,TPP		;RESPALDO DE PT.
	RCALL	HXAS		;REPRESENTAR PRIMER CUARTETO.
	MOV	TPL,TPP		;GUARDAR.
	SWAP	TPH		;PREPARAR PARA REPRESENTAR SEGUNDO CUARTETO
	MOV	TPP,TPH		;.
	RCALL	HXAS		;REPRESENTAR SEGUNDO CUARTETO.
	MOV	TPH,TPP		;TRASLADAR A REGISTRO DE SALIDA.
	RET			;TERMINAR.
HXAS:	ANDI	TPP,$0F		;ENMÁSCARAR CUARTETO MENOS SIGNIFICATIVO.
	ORI	TPP,'0'		;REPRESENTAR EN ASCII INTERVALO $0-$9.
	CPI	TPP,'9'+1		;¿MENOR O IGUAL A $9?
	BRLO	HXAS1			;SÍ, A TERMINAR.
	SUBI	TPP,-7		;NO, CORREGIR REPRESENTACIÓN.
HXAS1:	RET			;TERMINAR.

;	*******************
;	*** MISCELÁNEAS ***
;	*******************

EEW:	;DESCRIPCIÓN: GRABA UN OCTETO EN EEPROM.
	;UTILIZA:  K00 TPP TPL
	;ETIQUETAS: EEW: EEW1: 
	;ENTRADA: TPL = DIRECCIÓN DE EEPROM , TPP = OCTETO A GRABAR.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-08-29 21:23
EEW1:	SBIC	EECR,EEPE		;ESPERAR FIN DE ESCRITURA ANTERIOR
	RJMP	EEW1		;.
	OUT	EECR,K00		;EEPM1 = 0 EEPM0 = 0 , ATOMIC OPERATION.
	OUT	EEARL,TPL		;DIRECCIÓN DE EEPROM.
	OUT	EEDR,TPP		;DATO A GRABAR.
	CLI			;DESACTIVAR INTERRUPCIONES.
	SBI	EECR,EEMPE	;ACTIVAR PROCESO DE GRABACIÓN
	SBI	EECR,EEPE		;.
	SEI			;ACTIVAR INTERRUPCIONES.
	RET

EER:	;DESCRIPCIÓN: LEE UN OCTETO DE EEPROM.
	;UTILIZA: TPP TPL
	;ETIQUETAS: EER: EER1: 
	;ENTRADA: TPL = DIRECCIÓN DE EEPROM .
	;SALIDA: TPP = OCTETO LEÍDO .
	;USO:
	;NOTAS: 2010-08-29 21:23
EER1:	SBIC	EECR,EEPE		;ESPERAR FIN DE ESCRITURA ANTERIOR
	RJMP	EER1		;.
	OUT	EEARL,TPL		;DIRECCIÓN DE EEPROM.
	SBI	EECR,EERE		;ACTIVAR PROCESO DE LECTURA.
	IN	TPP,EEDR		;OBTENER DATO.
	RET

;	*****************************
;	*** SERVICIOS DE COMANDOS ***
;	*****************************

MDPR:	;DESCRIPCIÓN: MODIFICACIÓN DE PARÁMETROS.
	;UTILIZA:  RTL RTH TPP TPL TPH TPX
	;ETIQUETAS: MDPR: MDPRB6: MDPRB1: MDPRB2: MDPRB3: MDPRB4: MDPRB41: MDPRB5: MDPRB51: 
	;ENTRADA:
; EN MEMORIA DE DATOS:
;RTH:RTL	MAGNITUD PROPUESTA INICIAL.
;PMLI	MAGNITUD DE PARÁMTERO LÍMITE INFERIOR.
;PMLS	MAGNITUD DE PARÁMTERO LÍMITE SUPERIOR.
;GPIOR1,4	INDICADOR DE MODIFICACIÓN DE DATO EN MEMORIA.
;XH:XL	APUNTADOR A DATO EN MEMORIA A MODIFICAR.
	;SALIDA:
;RTH:RTL	MAGNITUD PROPUESTA SELECCIONADA.
;SREG(T) = 0	CANCELADO.
;SREG(T) = 1	ACEPTADO.
	;USO:
; AL SALIR SI LA PROPUESTA DE MODIFICACIÓN ES CANCELADA; MUESTRA MENSAJE "CANCELADO".
; AL SALIR SI LA PROPUESTA DE MODIFICACIÓN ES ACEPTADA; NO MUESTRA MENSAJE.
;   EXHIBIDOR:
;  0123456789ABCDEF
;  NNN  +III  !AAA 
;  DONDE; NNN = NUEVO PROPUESTA (EDITABLE) , III = INCREMENTO (EDITABLE) , AAA = MAGNITUD ANTERIOR .
	;NOTAS: 2010-11-15 22:47
	RCALL	LDRG2BR		;BORRAR RENGLÓN 2.
	LDI	TPP,($80+$4B)	;LCD DIRECCIÓN DE INDICADOR DE MAGINITUD ACTUAL.
	RCALL	LCDIRW		;.
	LDI	TPP,'!'		;ENVIAR "!" AL LCD
	RCALL	LCDDRW		;.
	MOVW	TPH:TPL,RTH:RTL	;EXHIBIR MAGNITUD ACTUAL
	RCALL	LCD03D		;.
	RCALL	PPTMDFE		;EXHIBIR MAGNITUD DE PARÁMETRO.
	LDI	TPP,($80+$45)	;LCD DIRECCIÓN DE INDICADOR DE INCREMENTO.
	RCALL	LCDIRW		;.
	LDI	TPP,'+'		;ENVIAR "+" AL LCD
	RCALL	LCDDRW		;.
	RCALL	ICMMDFE		;EXHIBIR MAGNITUD DE INCREMENTO.
MDPRB6:	RCALL	TCDATL		;ACTUALIZAR ESTADO DE TRANSICIONES DEL TECLADO.
	SBIC	GPIOR2,0		;BOTÓN S1 (CCL).
	RJMP	MDPRB1			;NO PULSADO, SALTA.
	RCALL	LEM020		;EXHIBIR MENSAJE 020 "CANCELADO".
	CLT			;INDICADOR DE CANCELADO.
	CBI	GPIOR1,4		;DESHABILITAR ACTUALIZACIÓN DE REGISTRO E/S.
	RET			;TERMINAR.
MDPRB1:	SBIC	GPIOR2,1		;BOTÓN S2 (SLC).
	RJMP	MDPRB2			;NO PULSADO, SALTA.
	SET			;INDICADOR DE GRABADO.
	CBI	GPIOR1,4		;DESHABILITAR ACTUALIZACIÓN DE REGISTRO E/S.
	RET
MDPRB2:	SBIC	GPIOR2,2		;BOTÓN S3 (ARB).
	RJMP	MDPRB3			;NO PULSADO, SALTA.
	LDS	TPP,ICMMNT		;INCREMENTAR LA PROPUESTA
	CLR	TPX
	RCALL	PPTMDF		;.
	RJMP	MDPRB6		;REITERAR.
MDPRB3:	SBIC	GPIOR2,3		;BOTÓN S4 (ABJ).
	RJMP	MDPRB4			;NO PULSADO, SALTA.
	LDS	TPP,ICMMNT	;DECREMENTAR LA PROPUESTA
	NEG	TPP
	SER	TPX
	RCALL	PPTMDF		;.
	RJMP	MDPRB6		;REITERAR.
MDPRB4:	SBIC	GPIOR2,4		;BOTÓN S5 (IQD).
	RJMP	MDPRB5			;NO PULSADO, SALTA.
	LDS	TPP,ICMAPT	;CARGAR APUNTADOR A SECUENCIA.
	CPI	TPP,(8-1)		;¿EN EL LÍMITE SUPERIOR?.
	BRSH	MDPRB41			;SÍ, SALTA, NO PROCESAR.
	INC	TPP		;APUNTAR A SIGUIENTE ELEMENTO DE LA SECUENCIA.
	RCALL	ICMMDF		;MAGNITUD DE INCREMENTO MODIFICAR.
MDPRB41:	RJMP	MDPRB6		;REITERAR.
MDPRB5:	SBIC	GPIOR2,5		;BOTÓN S6 (DRC).
	RJMP	MDPRB6			;NO PULSADO, SALTA.
	LDS	TPP,ICMAPT	;CARGAR APUNTADOR A SECUENCIA.
	TST	TPP		;¿EN EL LÍMITE INFERIOR?.
	BREQ	MDPRB51			;SÍ, SALTA, NO PROCESAR.
	DEC	TPP		;APUNTAR A SIGUIENTE ELEMENTO DE LA SECUENCIA.
	RCALL	ICMMDF		;MAGNITUD DE INCREMENTO MODIFICAR.
MDPRB51:	RJMP	MDPRB6		;REITERAR.

ICMMDF:	;DESCRIPCIÓN: MAGNITUD DE INCREMENTO MODIFICAR.
	;UTILIZA:  Z ZH ZL K00 TPP TPL TPH
	;ETIQUETAS: ICMMDF: ICMMDFE: 
	;ENTRADA: TPP = APUNTADOR A ELEMENTO DE SECUENCIA DE INCREMENTOS .
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-11-15 22:47
	; MODIFICA; ICMMNT , ICMAPT .
	STS	ICMAPT,TPP	;ACTUALIZAR APUNTADOR A SECUENCIA.
	LDI	ZL,LOW(INCSCC)	;CARGAR DIRECCIÓN BASE DE SECUENCIA
	LDI	ZH,HIGH(INCSCC)	;.
	ADD	ZL,TPP		;CALCULAR DIRECCIÓN
	ADC	ZH,K00		;.
	LD	TPP,Z		;CARGAR ELEMENTO DE LA SECUENCIA.
	STS	ICMMNT,TPP	;MODIFICAR INCREMENTO.
	LDI	TPP,($80+$46)	;LCD DIRECCIÓN DE INCREMENTO EN SEGUNDO RENGLÓN
	RCALL	LCDIRW		;.
ICMMDFE:	LDS	TPL,ICMMNT	;CARGAR MAGNITUD DE INCREMENTO
	MOV	TPH,K00		;.
	RCALL	LCD03D		;EXHIBIR NÚMERO [ 000 - 999 ] EN EL LCD.	
	RET			;TERMINAR.

PPTMDF:	;DESCRIPCIÓN: MAGNITUD PROPUESTA MODIFICAR.
	;UTILIZA:  X RTL RTH GPL GPH TPP TPL TPH TPX
	;ETIQUETAS: PPTMDF: PPTMDFE: PPTMDF1: 
	;ENTRADA:
;PMLI; MAGNITUD DE PARÁMTERO LÍMITE INFERIOR.
;PMLS; MAGNITUD DE PARÁMTERO LÍMITE SUPERIOR.
	;SALIDA:
	;USO:
;OPERA CON NÚMEROS SIGNADOS EN INTERVALO (MÁXIMO - MÍNIMO].
;NO SE MODIFICA SI;
; VALOR NUEVO MENOR AL LÍMITE INFERIOR ,
; VALOR NUEVO IGUAL O MAYOR AL LÍMITE SUPERIOR .
;SOLAMENTE NÚMEROS SIGNADOS, IMPLICA QUE;
; LÍMITE INFERIOR DEBE SER MAYOR A -32768
; LÍMITE SUPERIOR DEBE SER MENOR A +32767
;EJEMPLO DE LÍMITES:
; SI EL INTERVALO ES CERRADO ENTRE 50 Y 100 ENTONCES; PMLI = 50 , PMLS = 101 .
	;NOTAS: 2010-11-15 22:47
	MOVW	TPH:TPL,RTH:RTL	;MOVER A REGISTRO DE TRABAJO.
	ADD	TPL,TPP		;OPERAR EN REGISTRO DE TRABAJO
	ADC	TPH,TPX		;.
	LDS	GPL,(PMLI+0)	;COMPARAR NUEVA PROPUESTA CON EL LÍMITE INFERIOR
	LDS	GPH,(PMLI+1)
	CP	TPL,GPL
	CPC	TPH,GPH		;.
	BRLT	PPTMDF1			;¿FUERA DE INTERVALO?. SÍ, SALTA.
	LDS	GPL,(PMLS+0)	;COMPARAR NUEVA PROPUESTA CON EL LÍMITE SUPERIOR
	LDS	GPH,(PMLS+1)
	CP	TPL,GPL
	CPC	TPH,GPH		;.
	BRGE	PPTMDF1			;¿FUERA DE INTERVALO?. SÍ, SALTA.
	MOVW	RTH:RTL,TPH:TPL	;ACTUALIZAR MAGNITUD PROPUESTA.
	SBIC	GPIOR1,4			;SALTA, SI ACTUALIZACIÓN DE REGISTRO DE E/S DESHABILITADO.
	ST	X,RTL		;MODIFICAR REGISTRO DE E/S.
PPTMDFE:	LDI	TPP,($80+$40)	;LCD AL INICIO DEL SEGUNDO RENGLÓN
	RCALL	LCDIRW		;.
	MOVW	TPH:TPL,RTH:RTL	;MOSTRAR MAGNITUD PROPUESTA
	RCALL	LCD03D		;EXHIBIR NÚMERO [ 000 - 999 ] EN EL LCD.	
PPTMDF1:	RET			;TERMINAR.

DMXMDF:	;DESCRIPCIÓN: CANAL DMX MODIFICAR.
	;UTILIZA:  Y XH XL RTL RTH TPP TPL TPH TWL TWH
	;ETIQUETAS: DMXMDF: DMXMDF1: 
	;ENTRADA: 
;YH:YL = LOCALIDAD DE DIRECCIÓN DMX EN SRAM ,
;XH:XL = LOCALIDAD DE DIRECCIÓN DMX EN EEPROM .
	;SALIDA: SREG(T) = ACEPTADO/CANCELADO* .
	;USO:
	;NOTAS: 2010-11-16 00:06
	LDD	TWL,Y+0		;CARGAR DIRECCIÓN DMX1 DESDE MEMORIA DE DATOS
	LDD	TWH,Y+1		;.
	ADIW	TWH:TWL,1		;COMPENSAR PARA EXHIBIR
	MOVW	RTH:RTL,TWH:TWL	;. *004
	LDI	TPL,LOW(1)	;ESTABLECER LÍMITES PARA CANAL DMX
	LDI	TPH,HIGH(1)
	STS	(PMLI+0),TPL
	STS	(PMLI+1),TPH
	LDI	TPL,LOW(512+1)
	LDI	TPH,HIGH(512+1)
	STS	(PMLS+0),TPL
	STS	(PMLS+1),TPH	;.
	RCALL	MDPR		;EDITAR PROPUESTA.
	BRTC	DMXMDF1			;CANCELADO, SALTA.
	MOVW	TWH:TWL,RTH:RTL	;REEQUILIBRAR PROPUESTA AL SALIR DE EXHIBIR
	SBIW	TWH:TWL,1
	MOVW	RTH:RTL,TWH:TWL	;. *004
	MOV	TPP,RTL		;GRABAR DIRECCIÓN DMX1 EN EEPROM
	MOV	TPL,XL
	RCALL	EEW
	MOV	TPP,RTH
	MOV	TPL,XH
	RCALL	EEW		;.
	MOV	TPL,XL		;	VERIFICAR
	RCALL	EER		;LEER DATO DE EEPROM.
	CPSE	TPP,RTL			;¿IGUALES?, SÍ SALTA.
	RJMP	LEE033		;EXHIBIR MENSAJE DE ERROR 033 "33:! MEM. EEPROM"
	MOV	TPL,XH		;	VERIFICAR
	RCALL	EER		;LEER DATO DE EEPROM.
	CPSE	TPP,RTH			;¿IGUALES?, SÍ SALTA.
	RJMP	LEE033		;EXHIBIR MENSAJE DE ERROR 033 "33:! MEM. EEPROM"
	STD	Y+0,RTL		;ALMACENAR DIRECCIÓN DMX1 EN MEMORIA DE DATOS
	STD	Y+1,RTH		;.
	RCALL	LEM030		;EXHIBIR MENSAJE 030 "GRABADO".
DMXMDF1:	RET

ITIMDF:	;DESCRIPCIÓN: INTENSIDAD INICIAL MODIFICAR.
	;UTILIZA:  X YH YL RTL RTH TPP TPL TPH
	;ETIQUETAS: ITIMDF: ITIMDFC: 
	;ENTRADA:
; YL = DIRECCIÓN EN EERPROM DE MAGNITUD INICIAL ,
; XH:XL = DIRECCIÓN DE DATO EN MEMORIA A MODIFICAR .
	;SALIDA: SREG(T) = ACEPTADO/CANCELADO* .
	;USO:
	;NOTAS: 2010-11-16 01:18
	MOV	TPL,YL		;OBTENER INTENSIDAD DESDE EEPROM
	RCALL	EER
	MOV	RTL,TPP
	CLR	RTH		;.
	MOV	YH,TPP		;RESPALDO DE INTENSIDAD GRABADA.
	LDI	TPL,LOW(0)	;ESTABLECER LÍMITES PARA INTENSIDAD DE SALIDA
	LDI	TPH,HIGH(0)
	STS	(PMLI+0),TPL
	STS	(PMLI+1),TPH
	LDI	TPL,LOW(255+1)
	LDI	TPH,HIGH(255+1)
	STS	(PMLS+0),TPL
	STS	(PMLS+1),TPH	;.
	SBI	GPIOR1,4		;INDICAR ACTUALIZACIÓN DE REGISTRO E/S.
	RCALL	MDPR		;EDITAR PROPUESTA.
	CBI	GPIOR1,4		;DESHABILITAR ACTUALIZACIÓN DE REGISTRO E/S.
	BRTC	ITIMDFC			;CANCELADO, SALTA.
	MOV	TPP,RTL		;GRABAR INTENSIDAD EN EEPROM
	MOV	TPL,YL
	RCALL	EEW		;.
	MOV	TPL,YL		;VERIFICAR
	RCALL	EER		;LEER DATO DE EEPROM.
	CPSE	TPP,RTL			;¿IGUALES?, SÍ SALTA.
	RJMP	LEE033		;EXHIBIR MENSAJE DE ERROR 033 "33:! MEM. EEPROM"
	RJMP	LEM030		;EXHIBIR MENSAJE 030 "GRABADO".
ITIMDFC:	ST	X,YH		;RESTABLECER REGISTRO DE E/S.
	RET

ETBCFG:	;DESCRIPCIÓN: CONFIGURACIÓN PARA ESTROBO.
	;UTILIZA:  X Z XH XL K00 TPP TPL TPH
	;ETIQUETAS: ETBCFG: ETBCFG1: 
	;ENTRADA: TPL = NÚMERO DE ELEMETOS DE LA SECUENCIA , TPH = CONTADOR DE DESTELLOS , Z = APUNTADOR A TABLA .
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-12-18 21:59
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIAS.
	STS	SCCRPT,TPH	;LIMITADOR Y CONTADOR DE NÚMERO DE DESTELLOS
	STS	SCCDTL,TPH	;.
	RCALL	ECSAXL		;AUXILIAR PARA ETBCFG Y CMTCFG .
	LDI	TPP,$01		;HABILITAR SECUENCIA ESTROBO
	STS	DMRSCC,TPP	;.
	RET			;TERMINAR.

CMTCFG:	;DESCRIPCIÓN: CONFIGURACIÓN PARA CONMUTADO.
	;UTILIZA:  K00 TPP
	;ETIQUETAS: CMTCFG: 
	;ENTRADA: TPL = NÚMERO DE ELEMETOS DE LA SECUENCIA , Z = APUNTADOR A TABLA .
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-12-18 21:59
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIAS.
	RCALL	ECSAXL		;AUXILIAR PARA ETBCFG Y CMTCFG .
	LDI	TPP,$02		;HABILITAR SECUENCIA CONMUTADO
	STS	DMRSCC,TPP	;.
	RET			;TERMINAR.

ECSAXL:	;DESCRIPCIÓN: AUXILIAR PARA ETBCFG Y CMTCFG .
	;UTILIZA:  X Z XH XL TPP TPL
	;ETIQUETAS: ECSAXL: ECSAXL1: 
	;ENTRADA: TPL = NÚMERO DE ELEMETOS DE LA SECUENCIA , Z = APUNTADOR A TABLA .
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-12-18 21:59
	STS	SCCLGT,TPL	;INICIAR CONTADOR Y NÚMERO DE ELEMENTOS
	STS	SCCELM,TPL	;.
	LDI	XL,LOW(SCCRCL)	;APUNTAR A INICIO DE SECUENCIA
	LDI	XH,HIGH(SCCRCL)	;.
	STS	(SCCAPT+0),XL	;ESTABLECER APUNTADOR A SECUENCIA
	STS	(SCCAPT+1),XH	;.
	LSL	TPL		;MULTIPLICAR POR CUATRO
	LSL	TPL		;.
ECSAXL1:	LPM	TPP,Z+		;COPIA DE MEMORIA DE PROGRAMA A MEMORIA DE DATOS
	ST	X+,TPP		;.
	DEC	TPL		;¿FIN?.
	BRNE	ECSAXL1			;NO, SALTA.
	RET			;TERMINAR.

FDDCFG:	;DESCRIPCIÓN: CONFIGURACIÓN PARA FUNDIDO.
	;UTILIZA:  X Z XH XL K00 TPP TPX
	;ETIQUETAS: FDDCFG: FDDCFG1: 
	;ENTRADA: TPP = CÓDIGO DE INCREMENTO/DECREMENTO , Z = APUNTADOR A TABLA DE SECUENCIA .
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-12-17 12:09
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIAS.
	IN	TPX,GPIOR0	;ESTABLECER INCREMENTOS/DECREMENTOS DE FUNDIDO
	ANDI	TPX,0B11110000
	OR	TPX,TPP
	OUT	GPIOR0,TPX	;.
	LDI	XL,LOW(FDDR)	;APUNTAR A INICIO DE DATOS PARA SECUENCIA
	LDI	XH,HIGH(FDDR)	;. *013
	LDI	TPX,$10		;16 DATOS A COPIAR.
FDDCFG1:	LPM	TPP,Z+		;COPIA DE MEMORIA DE PROGRAMA A MEMORIA DE DATOS
	ST	X+,TPP		;. *013
	DEC	TPX		;¿FIN?.
	BRNE	FDDCFG1			;NO, SALTA.
	LDI	TPP,$03		;HABILITAR SECUENCIA FUNDIDO
	STS	DMRSCC,TPP	;.
	RET

SCCINI:	;DESCRIPCIÓN: ESTABLECER COMO EJECUCIÓN INICIAL.
	;UTILIZA:  ZH ZL TPP TPL
	;ETIQUETAS: SCCINI: 
	;ENTRADA:	ZH:ZL = DIRECCIÓN DE EJECUCIÓN A GRABAR EN EEPROM.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-12-20 23:22
	LDI	TPL,(SCINEX+0)	;ALMACENAR DIRECCIÓN DE EJECUCIÓN
	MOV	TPP,ZL
	RCALL	EEW
	LDI	TPL,(SCINEX+1)
	MOV	TPP,ZH
	RCALL	EEW		;.
	LDI	TPL,(SCINRP+0)	;RESPALDAR DIRECCIÓN DE EJECUCIÓN
	MOV	TPP,ZL
	RCALL	EEW
	LDI	TPL,(SCINRP+1)
	MOV	TPP,ZH
	RJMP	EEW		; Y TERMINAR.

;	****************
;	*** COMANDOS ***
;	****************

ET00EXE:	;DESCRIPCIÓN: ESTROBO RGB.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-10 10:50
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	TPH,1		;NÚMERO DE DESTELLOS DE CADA ELEMENTO.
ET00EXEE:	LDI	TPL,3		;NÚMERO DE ELEMENTOS DE LA SECUENCIA.
	LDI	ZL,LOW(ETRGBSC*2)	;APUNTAR A SECUENCIA EN MEMORIA DE PROGRAMA
	LDI	ZH,HIGH(ETRGBSC*2)	;.
	RJMP	ETBCFG		;CONFIGURAR Y ACCIONAR.

ET01EXE:	;DESCRIPCIÓN: ESTROBO RGB10.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-10 10:50
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	TPH,10		;NÚMERO DE DESTELLOS DE CADA ELEMENTO.
	RJMP	ET00EXEE		;CONFIGURAR Y ACCIONAR.

ET02EXE:	;DESCRIPCIÓN: ESTROBO RGB5.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-10 10:50
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	TPH,25		;NÚMERO DE DESTELLOS DE CADA ELEMENTO.
	RJMP	ET00EXEE		;CONFIGURAR Y ACCIONAR.

ET03EXE:	;DESCRIPCIÓN: ESTROBO R.G.B.RG.RB.GB.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-10 10:50
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	TPH,1		;NÚMERO DE DESTELLOS DE CADA ELEMENTO.
ET03EXEE:	LDI	TPL,6		;NÚMERO DE ELEMENTOS DE LA SECUENCIA.
	LDI	ZL,LOW(ETRGBPSC*2)	;APUNTAR A SECUENCIA EN MEMORIA DE PROGRAMA
	LDI	ZH,HIGH(ETRGBPSC*2)	;.
	RJMP	ETBCFG		;CONFIGURAR Y ACCIONAR.

ET04EXE:	;DESCRIPCIÓN: ESTROBO R.G.B.RG.RB.GB2.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-10 10:50
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	TPH,10		;NÚMERO DE DESTELLOS DE CADA ELEMENTO.
	RJMP	ET03EXEE		;CONFIGURAR Y ACCIONAR.

ET05EXE:	;DESCRIPCIÓN: ESTROBO R.G.B.RG.RB.GB5.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-10 10:50
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	TPH,25		;NÚMERO DE DESTELLOS DE CADA ELEMENTO.
	RJMP	ET03EXEE		;CONFIGURAR Y ACCIONAR.

ET06EXE:	;DESCRIPCIÓN: ESTROBO EMERGENCIA.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-10 10:50
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	TPH,1		;NÚMERO DE DESTELLOS DE CADA ELEMENTO.
	LDI	TPL,1		;NÚMERO DE ELEMENTOS DE LA SECUENCIA.
	LDI	ZL,LOW(ET06SC*2)	;APUNTAR A SECUENCIA EN MEMORIA DE PROGRAMA
	LDI	ZH,HIGH(ET06SC*2)	;.
	RJMP	ETBCFG		;CONFIGURAR Y ACCIONAR.

ET07EXE:	;DESCRIPCIÓN: ESTROBO PATRULLA.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-10 10:50
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	TPH,2		;NÚMERO DE DESTELLOS DE CADA ELEMENTO.
	LDI	TPL,4		;NÚMERO DE ELEMENTOS DE LA SECUENCIA.
	LDI	ZL,LOW(ET07SC*2)	;APUNTAR A SECUENCIA EN MEMORIA DE PROGRAMA
	LDI	ZH,HIGH(ET07SC*2)	;.
	RJMP	ETBCFG		;CONFIGURAR Y ACCIONAR.

CM00EXE:	;DESCRIPCIÓN: CONMUTADO R RG G GB B BR .
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-19 01:19
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	TPL,6		;NÚMERO DE ELEMENTOS DE LA SECUENCIA.
	LDI	ZL,LOW(CM00SC*2)	;APUNTAR A SECUENCIA EN MEMORIA DE PROGRAMA
	LDI	ZH,HIGH(CM00SC*2)	;.
	RJMP	CMTCFG		;CONFIGURAR Y ACCIONAR.

CM01EXE:	;DESCRIPCIÓN: CONMUTADO R RG G GR .
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-19 01:19
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	TPL,4		;NÚMERO DE ELEMENTOS DE LA SECUENCIA.
	LDI	ZL,LOW(CM01SC*2)	;APUNTAR A SECUENCIA EN MEMORIA DE PROGRAMA
	LDI	ZH,HIGH(CM01SC*2)	;.
	RJMP	CMTCFG		;CONFIGURAR Y ACCIONAR.

CM02EXE:	;DESCRIPCIÓN: CONMUTADO R RB B BR .
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-19 01:19
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	TPL,4		;NÚMERO DE ELEMENTOS DE LA SECUENCIA.
	LDI	ZL,LOW(CM02SC*2)	;APUNTAR A SECUENCIA EN MEMORIA DE PROGRAMA
	LDI	ZH,HIGH(CM02SC*2)	;.
	RJMP	CMTCFG		;CONFIGURAR Y ACCIONAR.

CM03EXE:	;DESCRIPCIÓN: CONMUTADO G GB B BG .
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-19 01:19
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	TPL,4		;NÚMERO DE ELEMENTOS DE LA SECUENCIA.
	LDI	ZL,LOW(CM03SC*2)	;APUNTAR A SECUENCIA EN MEMORIA DE PROGRAMA
	LDI	ZH,HIGH(CM03SC*2)	;.
	RJMP	CMTCFG		;CONFIGURAR Y ACCIONAR.

CM04EXE:	;DESCRIPCIÓN: CONMUTADO PSICODELIA.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-19 01:19
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	TPL,6		;NÚMERO DE ELEMENTOS DE LA SECUENCIA.
	LDI	ZL,LOW(CM04SC*2)	;APUNTAR A SECUENCIA EN MEMORIA DE PROGRAMA
	LDI	ZH,HIGH(CM04SC*2)	;.
	RJMP	CMTCFG		;CONFIGURAR Y ACCIONAR.

CM05EXE:	;DESCRIPCIÓN: CONMUTADO BOSQUE.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-19 01:19
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	TPL,4		;NÚMERO DE ELEMENTOS DE LA SECUENCIA.
	LDI	ZL,LOW(CM05SC*2)	;APUNTAR A SECUENCIA EN MEMORIA DE PROGRAMA
	LDI	ZH,HIGH(CM05SC*2)	;.
	RJMP	CMTCFG		;CONFIGURAR Y ACCIONAR.

CM06EXE:	;DESCRIPCIÓN: CONMUTADO GALAXIA.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-19 01:19
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	TPL,4		;NÚMERO DE ELEMENTOS DE LA SECUENCIA.
	LDI	ZL,LOW(CM06SC*2)	;APUNTAR A SECUENCIA EN MEMORIA DE PROGRAMA
	LDI	ZH,HIGH(CM06SC*2)	;.
	RJMP	CMTCFG		;CONFIGURAR Y ACCIONAR.

CM07EXE:	;DESCRIPCIÓN: CONMUTADO INFIERNO.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-19 01:19
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	TPL,6		;NÚMERO DE ELEMENTOS DE LA SECUENCIA.
	LDI	ZL,LOW(CM07SC*2)	;APUNTAR A SECUENCIA EN MEMORIA DE PROGRAMA
	LDI	ZH,HIGH(CM07SC*2)	;.
	RJMP	CMTCFG		;CONFIGURAR Y ACCIONAR.

FD00EXE:	;DESCRIPCIÓN: FUNDIDO 00.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-17 12:15
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	ZL,LOW(FD00SC*2)
	LDI	ZH,HIGH(FD00SC*2)
	LDI	TPP,0B00000000
	RJMP	FDDCFG

FD01EXE:	;DESCRIPCIÓN: FUNDIDO 01.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-11-19 01:13
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	ZL,LOW(FD01SC*2)
	LDI	ZH,HIGH(FD01SC*2)
	LDI	TPP,0B00000000
	RJMP	FDDCFG

FD02EXE:	;DESCRIPCIÓN: FUNDIDO 02.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-11-19 01:13
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	ZL,LOW(FD02SC*2)
	LDI	ZH,HIGH(FD02SC*2)
	LDI	TPP,0B00000000
	RJMP	FDDCFG

FD03EXE:	;DESCRIPCIÓN: FUNDIDO 03.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-11-19 01:13
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	ZL,LOW(FD03SC*2)
	LDI	ZH,HIGH(FD03SC*2)
	LDI	TPP,0B00000100
	RJMP	FDDCFG

FD04EXE:	;DESCRIPCIÓN: FUNDIDO 04.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-11-19 01:13
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	ZL,LOW(FD04SC*2)
	LDI	ZH,HIGH(FD04SC*2)
	LDI	TPP,0B00000001
	RJMP	FDDCFG

FD05EXE:	;DESCRIPCIÓN: FUNDIDO 05.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-11-19 01:13
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	ZL,LOW(FD05SC*2)
	LDI	ZH,HIGH(FD05SC*2)
	LDI	TPP,0B00000000
	RJMP	FDDCFG

FD06EXE:	;DESCRIPCIÓN: FUNDIDO 06.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-11-19 01:13
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	ZL,LOW(FD06SC*2)
	LDI	ZH,HIGH(FD06SC*2)
	LDI	TPP,0B00000000
	RJMP	FDDCFG

FD07EXE:	;DESCRIPCIÓN: FUNDIDO 07.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-11-19 01:13
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	LDI	ZL,LOW(FD07SC*2)
	LDI	ZH,HIGH(FD07SC*2)
	LDI	TPP,0B00000000
	RJMP	FDDCFG

CT00EXE:	;DESCRIPCIÓN: ROJO CONTINUO.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-10 09:45
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIAS.
	MOV	R0,KFF;*+		;100%
	LSR	R0;*+
	OUT	OCR0A,R0		;OCTETO DE CONTROL A PWM R.
	OUT	OCR1AL,K00	;OCTETO DE CONTROL A PWM G.
	OUT	OCR1BL,K00	;OCTETO DE CONTROL A PWM B.
	OUT	OCR0B,K00		;OCTETO DE CONTROL A PWM X.
	RET

CT01EXE:	;DESCRIPCIÓN: VERDE CONTINUO.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-10 09:45
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIAS.
	OUT	OCR0A,K00		;OCTETO DE CONTROL A PWM R.
	MOV	R0,KFF;*+		;100%
	LSR	R0;*+
	OUT	OCR1AL,R0		;OCTETO DE CONTROL A PWM G.
	OUT	OCR1BL,K00	;OCTETO DE CONTROL A PWM B.
	OUT	OCR0B,K00		;OCTETO DE CONTROL A PWM X.
	RET

CT02EXE:	;DESCRIPCIÓN: AZUL CONTINUO.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-10 09:45
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIAS.
	OUT	OCR0A,K00		;OCTETO DE CONTROL A PWM R.
	OUT	OCR1AL,K00	;OCTETO DE CONTROL A PWM G.
	MOV	R0,KFF;*+		;100%
	LSR	R0;*+
	OUT	OCR1BL,R0		;OCTETO DE CONTROL A PWM B.
	OUT	OCR0B,K00		;OCTETO DE CONTROL A PWM X.
	RET

CT03EXE:	;DESCRIPCIÓN: ROJO + VERDE CONTINUO.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-10 09:45
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIAS.
	LDI	TPP,$7F		;50% + 50%
	MOV	R0,TPP;*+
	LSR	R0;*+
	OUT	OCR0A,R0		;OCTETO DE CONTROL A PWM R.
	OUT	OCR1AL,R0		;OCTETO DE CONTROL A PWM G.
	OUT	OCR1BL,K00	;OCTETO DE CONTROL A PWM B.
	OUT	OCR0B,K00		;OCTETO DE CONTROL A PWM X.
	RET

CT04EXE:	;DESCRIPCIÓN: ROJO + AZUL CONTINUO.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-10 09:45
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIAS.
	LDI	TPP,$7F		;50% + 50%
	MOV	R0,TPP;*+
	LSR	R0;*+
	OUT	OCR0A,R0		;OCTETO DE CONTROL A PWM R.
	OUT	OCR1AL,K00	;OCTETO DE CONTROL A PWM G.
	OUT	OCR1BL,R0		;OCTETO DE CONTROL A PWM B.
	OUT	OCR0B,K00		;OCTETO DE CONTROL A PWM X.
	RET

CT05EXE:	;DESCRIPCIÓN: VERDE + AZUL CONTINUO.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-10 09:45
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIAS.
	OUT	OCR0A,K00		;OCTETO DE CONTROL A PWM R.
	LDI	TPP,$7F		;50% + 50%
	MOV	R0,TPP;*+
	LSR	R0;*+
	OUT	OCR1AL,R0		;OCTETO DE CONTROL A PWM G.
	OUT	OCR1BL,R0		;OCTETO DE CONTROL A PWM B.
	OUT	OCR0B,K00		;OCTETO DE CONTROL A PWM X.
	RET

CT06EXE:	;DESCRIPCIÓN: BLANCO CONTINUO.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-10 09:45
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIAS.
	LDI	TPP,$55		;33% + 33% + 33%
	MOV	R0,TPP;*+
	LSR	R0;*+
	OUT	OCR0A,R0		;OCTETO DE CONTROL A PWM R.
	OUT	OCR1AL,R0		;OCTETO DE CONTROL A PWM G.
	OUT	OCR1BL,R0		;OCTETO DE CONTROL A PWM B.
	OUT	OCR0B,K00		;OCTETO DE CONTROL A PWM X.
	RET

CT07EXE:	;DESCRIPCIÓN: EXTRA CONTINUO.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-10 09:45
	RCALL	SCCINI		;ESTABLECER COMO EJECUCIÓN INICIAL.
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIAS.
	OUT	OCR0A,K00		;OCTETO DE CONTROL A PWM R.
	OUT	OCR1AL,K00	;OCTETO DE CONTROL A PWM G.
	OUT	OCR1BL,K00	;OCTETO DE CONTROL A PWM B.
	MOV	R0,KFF;*+		;100%
	LSR	R0;*+
	OUT	OCR0B,R0		;OCTETO DE CONTROL A PWM X.
	RET

SCRPEXE:	;DESCRIPCIÓN: RAPIDEZ CAMBIO.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-19 22:19
RPDMDF:	;DESCRIPCIÓN: RAPIDEZ INICIAL MODIFICAR.
	;UTILIZA:  X XH XL YH RTL RTH TPP TPL TPH
	;ETIQUETAS: RPDMDF: RPDMDF1: 
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2010-12-19 22:16
	LDI	XL,(SCCRPD+0)	;CARGAR DIRECCIÓN DE CONTROL DE RAPIDEZ
	LDI	XH,(SCCRPD+1)	;.
	LDI	TPL,SCINRE	;OBTENER RAPIDEZ DESDE EEPROM
	RCALL	EER
	MOV	RTL,TPP
	CLR	RTH		;.
	MOV	YH,TPP		;RESPALDO DE RAPIDEZ GRABADA.
	LDI	TPL,LOW(1)	;ESTABLECER LÍMITES PARA RAPIDEZ
	LDI	TPH,HIGH(1)
	STS	(PMLI+0),TPL
	STS	(PMLI+1),TPH
	LDI	TPL,LOW(25+1)
	LDI	TPH,HIGH(25+1)
	STS	(PMLS+0),TPL
	STS	(PMLS+1),TPH	;.
	SBI	GPIOR1,4		;INDICAR ACTUALIZACIÓN DE REGISTRO E/S.
	RCALL	MDPR		;EDITAR PROPUESTA.
	CBI	GPIOR1,4		;DESHABILITAR ACTUALIZACIÓN DE REGISTRO E/S.
	BRTC	RPDMDF1			;CANCELADO, SALTA.
	MOV	TPP,RTL		;GRABAR RAPIDEZ EN EEPROM
	LDI	TPL,SCINRE
	RCALL	EEW		;.
	LDI	TPL,SCINRE		;VERIFICAR
	RCALL	EER		;LEER DATO DE EEPROM.
	CPSE	TPP,RTL			;¿IGUALES?, SÍ SALTA.
	RJMP	LEE033		;EXHIBIR MENSAJE DE ERROR 033 "33:! MEM. EEPROM"
	RJMP	LEM030		;EXHIBIR MENSAJE 030 "GRABADO".
RPDMDF1:	ST	X,YH		;RESTABLECER DATO DE CONTROL.
	RET

DXOREXE:	;DESCRIPCIÓN: ASIGNAR CANAL DMX A SALIDA R.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-11-15 21:34
	LDI	YL,LOW(DMXD1)	;LOCALIDAD DE DIRECCIÓN DMX PARA R EN SRAM
	LDI	YH,HIGH(DMXD1)	;.
	LDI	XL,(DMXD1E+0)	;LOCALIDAD DE DIRECCIÓN DMX PARA R EN EEPROM
	LDI	XH,(DMXD1E+1)	;.
	RJMP	DMXMDF		;CANAL DMX MODIFICAR Y TERMINAR.

DXOGEXE:	;DESCRIPCIÓN: ASIGNAR CANAL DMX A SALIDA G.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-11-14 14:50
	LDI	YL,LOW(DMXD2)	;LOCALIDAD DE DIRECCIÓN DMX PARA G EN SRAM
	LDI	YH,HIGH(DMXD2)	;.
	LDI	XL,(DMXD2E+0)	;LOCALIDAD DE DIRECCIÓN DMX PARA G EN EEPROM
	LDI	XH,(DMXD2E+1)	;.
	RJMP	DMXMDF		;CANAL DMX MODIFICAR Y TERMINAR.

DXOBEXE:	;DESCRIPCIÓN: ASIGNAR CANAL DMX A SALIDA B.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-11-14 14:50
	LDI	YL,LOW(DMXD3)	;LOCALIDAD DE DIRECCIÓN DMX PARA B EN SRAM
	LDI	YH,HIGH(DMXD3)	;.
	LDI	XL,(DMXD3E+0)	;LOCALIDAD DE DIRECCIÓN DMX PARA B EN EEPROM
	LDI	XH,(DMXD3E+1)	;.
	RJMP	DMXMDF		;CANAL DMX MODIFICAR Y TERMINAR.

DXOXEXE:	;DESCRIPCIÓN: ASIGNAR CANAL DMX A SALIDA X.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-11-14 14:50
	LDI	YL,LOW(DMXD4)	;LOCALIDAD DE DIRECCIÓN DMX PARA X EN SRAM
	LDI	YH,HIGH(DMXD4)	;.
	LDI	XL,(DMXD4E+0)	;LOCALIDAD DE DIRECCIÓN DMX PARA X EN EEPROM
	LDI	XH,(DMXD4E+1)	;.
	RJMP	DMXMDF		;CANAL DMX MODIFICAR Y TERMINAR.

CFSSEXE:	;DESCRIPCIÓN: BORRAR SECUENCIA INICIAL.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-21 00:12
	LDI	TPL,(SCINEX+0)	;BORRAR DIRECCIÓN DE EJECUCIÓN
	MOV	TPP,KFF
	RCALL	EEW
	LDI	TPL,(SCINEX+1)
	MOV	TPP,KFF
	RCALL	EEW		;.
	LDI	TPL,(SCINRP+0)	;BORRAR RESPALDO DE DIRECCIÓN DE EJECUCIÓN
	MOV	TPP,KFF
	RCALL	EEW
	LDI	TPL,(SCINRP+1)
	MOV	TPP,KFF
	RCALL	EEW		;.
	RJMP	LEM030		;EXHIBIR MENSAJE 030 "GRABADO". Y TERMINAR.

CIOREXE:	;DESCRIPCIÓN: CONFIGURACIÓN INTENSIDAD INICIAL SALIDA R.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-11-14 22:57
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIAS.
	RCALL	ILMOCR		;ILUMINACIÓN OBSCURO.
	LDI	XL,LOW(IOSTART+OCR0A) ;DIRECCIÓN DE REGISTRO E/S
	LDI	XH,HIGH(IOSTART+OCR0A) ;.
	LDI	YL,ITINRE		;DIRECCIÓN EN EERPROM DE MAGNITUD INICIAL.
	RJMP	ITIMDF		;INTENSIDAD INICIAL MODIFICAR Y TERMINAR.

CIOGEXE:	;DESCRIPCIÓN: CONFIGURACIÓN INTENSIDAD INICIAL SALIDA G.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-19 14:32
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIAS.
	RCALL	ILMOCR		;ILUMINACIÓN OBSCURO.
	LDI	XL,LOW(IOSTART+OCR1AL) ;DIRECCIÓN DE REGISTRO E/S
	LDI	XH,HIGH(IOSTART+OCR1AL) ;.
	LDI	YL,ITINGE		;DIRECCIÓN EN EERPROM DE MAGNITUD INICIAL.
	RJMP	ITIMDF		;INTENSIDAD INICIAL MODIFICAR Y TERMINAR.

CIOBEXE:	;DESCRIPCIÓN: CONFIGURACIÓN INTENSIDAD INICIAL SALIDA B.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-19 14:32
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIAS.
	RCALL	ILMOCR		;ILUMINACIÓN OBSCURO.
	LDI	XL,LOW(IOSTART+OCR1BL) ;DIRECCIÓN DE REGISTRO E/S
	LDI	XH,HIGH(IOSTART+OCR1BL) ;.
	LDI	YL,ITINBE		;DIRECCIÓN EN EERPROM DE MAGNITUD INICIAL.
	RJMP	ITIMDF		;INTENSIDAD INICIAL MODIFICAR Y TERMINAR.

CI0XEXE:	;DESCRIPCIÓN: CONFIGURACIÓN INTENSIDAD INICIAL SALIDA X.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2010-12-19 14:32
	STS	DMRSCC,K00	;DESHABILITAR SECUENCIAS.
	RCALL	ILMOCR		;ILUMINACIÓN OBSCURO.
	LDI	XL,LOW(IOSTART+OCR0B) ;DIRECCIÓN DE REGISTRO E/S
	LDI	XH,HIGH(IOSTART+OCR0B) ;.
	LDI	YL,ITINXE		;DIRECCIÓN EN EERPROM DE MAGNITUD INICIAL.
	RJMP	ITIMDF		;INTENSIDAD INICIAL MODIFICAR Y TERMINAR.

CFRMEXE:
	RET

CFFCEXE:	;DESCRIPCIÓN: CONFIGURACIÓN DE PWM.
	;USO: SERVICIO DE COMANDO.
	;NOTAS: 2011-01-11 00:29
	;DESCRIPCIÓN: MODIFICAR CONFIGURACIÓN DE PRESCALADOR DE PWM.
	;UTILIZA:
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	;USO:
	;NOTAS: 2011-01-11 01:22
	SBIS	GPIOR1,3		;VERIFICAR LLAVE DE SEGURIDAD DE CAMBIO DE PWM.
	RJMP	LEE050		;EXHIBIR MENSAJE DE ERROR 050 "50:! DESHABILIT."
	LDI	TPL,CSTPEE	;CARGAR RESPALDO DE ASIGNACIÓN DE PRESCALADORES
	RCALL	EER
	CP	TPP,KFF		; ¿CON DATOS?.
	BRNE	CFFCEXE1			; SÍ, SALTA.
	LDI	TPP,2		; PRESTABLECER POR OMISIÓN.
CFFCEXE1:	MOV	RTL,TPP
	CLR	RTH		;.
	LDI	TPL,LOW(2)	;ESTABLECER LÍMITES PARA CONTROL DE PWM
	LDI	TPH,HIGH(2)
	STS	(PMLI+0),TPL
	STS	(PMLI+1),TPH
	LDI	TPL,LOW(5+1)
	LDI	TPH,HIGH(5+1)
	STS	(PMLS+0),TPL
	STS	(PMLS+1),TPH	;.
	RCALL	MDPR		;EDITAR PROPUESTA.
	BRTS	CFFCEXE2			;ACEPTADO, SALTA.
	RET			;TERMINAR.
CFFCEXE2:	MOV	TPP,RTL		;GRABAR ASIGNACIÓN DE PRESCALADOR EN EEPROM
	LDI	TPL,CSTPEE
	RCALL	EEW		;.
	LDI	TPL,CSTPEE	;VERIFICAR
	RCALL	EER		;LEER DATO DE EEPROM.
	CPSE	TPP,RTL			;¿IGUALES?, SÍ SALTA.
	RJMP	LEE033		;EXHIBIR MENSAJE DE ERROR 033 "33:! MEM. EEPROM"
	RJMP	LEM030		;EXHIBIR MENSAJE 030 "GRABADO".

;	**************
;	*** TABLAS ***
;	**************
;	2010-11-06 17:30

MN:	.DW $03*2,MNSC*2,MNDX*2,MNCF*2
	.DB "MENU",0,0
MNSC:	.DW  $05*2,SCET*2,SCCM*2,SCFD*2,SCCT*2,SCRP*2
	.DB  "SECUENCIAS",0,0
SCET:	.DW   $08*2,ET00*2,ET01*2,ET02*2,ET03*2,ET04*2,ET05*2,ET06*2,ET07*2
	.DB   "ESTROBO",0
ET00:	.DW    ET00EXE
	.DB    "RGB",0
ET01:	.DW    ET01EXE
	.DB    "RGB10",0
ET02:	.DW    ET02EXE
	.DB    "RGB25",0
ET03:	.DW    ET03EXE
	.DB    "R.RG.G.GB.B.BR",0,0
ET04:	.DW    ET04EXE
	.DB    "R.RG.G.GB.B.BR10",0,0
ET05:	.DW    ET05EXE
	.DB    "R.RG.G.GB.B.BR25",0,0
ET06:	.DW    ET06EXE
	.DB    "EMERGENCIA",0,0
ET07:	.DW    ET07EXE
	.DB    "PATRULLA",0,0
SCCM:	.DW   $08*2,CM00*2,CM01*2,CM02*2,CM03*2,CM04*2,CM05*2,CM06*2,CM07*2
	.DB   "CONMUTADO",0
CM00:	.DW    CM00EXE
	.DB    "R RG G GB B BR",0,0
CM01:	.DW    CM01EXE
	.DB    "R RG G GR",0
CM02:	.DW    CM02EXE
	.DB    "R RB B BR",0
CM03:	.DW    CM03EXE
	.DB    "G GB B BG",0
CM04:	.DW    CM04EXE
	.DB    "PSICODELIA",0,0
CM05:	.DW    CM05EXE
	.DB    "BOSQUE",0,0
CM06:	.DW    CM06EXE
	.DB    "GALAXIA",0
CM07:	.DW    CM07EXE
	.DB    "INFIERNO",0,0
SCFD:	.DW   $08*2,FD00*2,FD01*2,FD02*2,FD03*2,FD04*2,FD05*2,FD06*2,FD07*2
	.DB   "FUNDIDO",0
FD00:	.DW    FD00EXE
	.DB    "R+",0,0
FD01:	.DW    FD01EXE
	.DB    "G+",0,0
FD02:	.DW    FD02EXE
	.DB    "B+",0,0
FD03:	.DW    FD03EXE
	.DB    "RGB",0
FD04:	.DW    FD04EXE
	.DB    "BGR",0
FD05:	.DW    FD05EXE
	.DB    "BLANCO",0,0
FD06:	.DW    FD06EXE
	.DB    "ARCO IRIS",0
FD07:	.DW    FD07EXE
	.DB    "MIL UNO",0
SCCT:	.DW   $08*2,CT00*2,CT01*2,CT02*2,CT03*2,CT04*2,CT05*2,CT06*2,CT07*2
	.DB   "CONTINUO",0,0
CT00:	.DW    CT00EXE
	.DB    "R",0
CT01:	.DW    CT01EXE
	.DB    "G",0
CT02:	.DW    CT02EXE
	.DB    "B",0
CT03:	.DW    CT03EXE
	.DB    "RG",0,0
CT04:	.DW    CT04EXE
	.DB    "RB",0,0
CT05:	.DW    CT05EXE
	.DB    "GB",0,0
CT06:	.DW    CT06EXE
	.DB    "BLANCO",0,0
CT07:	.DW    CT07EXE
	.DB    "SOLAMENTE EXTRA",0
SCRP:	.DW   SCRPEXE
	.DB   "RAPIDEZ",0
MNDX:	.DW  $04*2,DXOR*2,DXOG*2,DXOB*2,DXOX*2
	.DB  "DMX CANALES",0
DXOR:	.DW   DXOREXE
	.DB   "CANAL R",0
DXOG:	.DW   DXOGEXE
	.DB   "CANAL G",0
DXOB:	.DW   DXOBEXE
	.DB   "CANAL B",0
DXOX:	.DW   DXOXEXE
	.DB   "CANAL X",0
MNCF:	.DW  $04*2,CFSS*2,CFIT*2,CFRM*2,CFFC*2
	.DB  "CONFIGURACION",0
CFSS:	.DW   CFSSEXE
	.DB   "INICIO SIN SECUE",0,0
CFIT:	.DW   $04*2,CIOR*2,CIOG*2,CIOB*2,CIOX*2
	.DB   "INTENSIDAD INI",0,0
CIOR:	.DW    CIOREXE
	.DB    "R INICIAL",0
CIOG:	.DW    CIOGEXE
	.DB    "G INICIAL",0
CIOB:	.DW    CIOBEXE
	.DB    "B INICIAL",0
CIOX:	.DW    CI0XEXE
	.DB    "X INICIAL",0
CFRM:	.DW   CFRMEXE
	.DB   "CONTROL REMOTO",0,0
CFFC:	.DW   CFFCEXE
	.DB   "! FREC. PWM",0

;	***************************
;	*** CADENAS MISCELÁNEAS ***
;	***************************
;	2010-11-17 02:21

;SECUENCIA DE INCREMENTOS.
;
INCSCCE:	.DB	1,2,5,10,20,50,100,200

;SECUENCIA DE ILUMINACIÓN
;
ETRGBSC:
	;	 X B G R
	.DD	$000000FF
	.DD	$0000FF00
	.DD	$00FF0000

ETRGBPSC:
	;	 X B G R
	.DD	$000000FF
	.DD	$00007F7F
	.DD	$0000FF00
	.DD	$007F7F00
	.DD	$00FF0000
	.DD	$007F007F

ET06SC:
	;	 X B G R
	.DD	$00007F7F

ET07SC:
	;	 X B G R
	.DD	$000000FF
	.DD	$00000000
	.DD	$00FF0000
	.DD	$00000000

CM00SC:
	;	 X B G R
	.DD	$000000FF
	.DD	$00007F7F
	.DD	$0000FF00
	.DD	$007F7F00
	.DD	$00FF0000
	.DD	$007F007F

CM01SC:
	;	 X B G R
	.DD	$000000FF
	.DD	$00007F7F
	.DD	$0000FF00
	.DD	$00007F7F

CM02SC:
	;	 X B G R
	.DD	$000000FF
	.DD	$007F007F
	.DD	$00FF0000
	.DD	$007F007F

CM03SC:
	;	 X B G R
	.DD	$0000FF00
	.DD	$007F7F00
	.DD	$00FF0000
	.DD	$007F7F00

CM04SC:
	;	 X B G R
	.DD	$00AF1977
	.DD	$00EBDF15
	.DD	$001425B1
	.DD	$0021B4FA
	.DD	$00A04856
	.DD	$001E4AB5

CM05SC:
	;	 X B G R
	.DD	$002B9C7A
	.DD	$00215A59
	.DD	$002B68AA
	.DD	$008B5D34

CM06SC:
	;	 X B G R
	.DD	$00412618
	.DD	$00082E94
	.DD	$0039506A
	.DD	$00816D34

CM07SC:
	;	 X B G R
	.DD	$000F10EA
	.DD	$00010669
	.DD	$002A28EC
	.DD	$00200114
	.DD	$002989FD
	.DD	$00000034

FD00SC:
	;	 S I ITSD
	.DD	$FF001000	;R
	.DD	$FF000000	;G
	.DD	$FF000000	;B
	.DD	$FF000000	;X

FD01SC:
	;	 S I ITSD
	.DD	$FF000000	;R
	.DD	$FF001000	;G
	.DD	$FF000000	;B
	.DD	$FF000000	;X

FD02SC:
	;	 S I ITSD
	.DD	$FF000000	;R
	.DD	$FF000000	;G
	.DD	$FF001000	;B
	.DD	$FF000000	;X

FD03SC:
	;	 S I ITSD
	.DD	$FF010206	;R
	.DD	$FF013040	;G
	.DD	$FF013435	;B
	.DD	$FF000000	;X

FD04SC:
	;	 S I ITSD
	.DD	$FF013435	;R
	.DD	$FF013040	;G
	.DD	$FF010206	;B
	.DD	$FF000000	;X

FD05SC:
	;	 S I ITSD
	.DD	$FF001000	;R
	.DD	$FF001000	;G
	.DD	$FF001000	;B
	.DD	$FF000000	;X

FD06SC:
	;	 S I ITSD
	.DD	$55101000	;R
	.DD	$550F1000	;G
	.DD	$55111000	;B
	.DD	$FF000000	;X

FD07SC:
	;	 S I ITSD
	.DD	$55000502	;R
	.DD	$55010501	;G
	.DD	$55020500	;B
	.DD	$FF000000	;X

; 
;
CSXVLR:	.DB	256,32,4,1,1,0

;	*************************
;	*** CADENAS  DE TEXTO ***
;	*************************
;	2010-11-17 02:21

; CADENA DE IDENTIFICACIÓN DEL SISTEMA
IDNCDN:	.DB _CDNIDN,0,0
; CADENAS DE MENSAJES DE ERROR
;ERR000:	.DB "00! CABAL",0
;ERR010:	.DB "10! INICIO",0
;ERR020:	.DB "20! SISTEMA",0
;ERR030:	.DB "30! MEMORIA",0
ERR033:	.DB "33! MEM. EEPROM",0
;ERR035:	.DB "35! MEM. SRAM",0
;ERR037:	.DB "37! MEM. FLASH",0
ERR050:	.DB "50! DESHABILIT.",0
; CADENAS DE MENSAJES DEL SISTEMA
;MSJ000:	.DB "DISPONIBLE",0,0
;MSJ010:	.DB "ACEPTADO",0,0
MSJ020:	.DB "CANCELADO",0
MSJ030:	.DB "GRABADO",0

.EXIT

=======================================
=======================================
