asm:
;; De bit
DMXok EQU 00H ; PARA LA RUTINA SERIE
Input EQU 02H ; para serie
Conf EQU 03h ; para serie
bloquenuevo EQU 05h
HADR EQU 06h ; para llegar a los 512
Pata256 EQU 07h ; Esta es para llegar a los 256, lo dejaremos a cero de momento
ms20 EQU 08h ; Si han pasado 20 ms
SalvaRB8 EQU 0d5h ; es F0, de proposito general, para recibir DMX si esta a uno
; De Byte
DecDirDMX EQU 08H ; Para no cambiar la dirección, la ponemos aqui y contamos
Direccion EQU 09h ; para guardar la dirección de los interruptores
GuardaASerie EQU 0Ah ; para guardar A en la interrupción serie
GuardaPSWSerie EQU 0Bh ; para guardar la palabra de estado en IRQ serie
DAtoDACA EQU 0Ch ; Dato que coge la rutina para el canal A
DAtoDACB EQU 0Dh ; Dato que coge la rutina para el canal B
DatoAnterior01 EQU 0Eh ; Para saber si hay que mandar o no
DatoAnterior02 EQU 0Eh ; Para saber si hay que mandar o no
DatoAnterior03 EQU 0Eh ; Para saber si hay que mandar o no
; Puertos
DOUT EQU P3.7
CLKDAC EQU P3.4
CSDAC EQU P3.5
PWM01 EQU 50h ; // Primer byte para PWM
PWM02 EQU 51h ; // Primer byte para PWM
PWM03 EQU 52h ; // Primer byte para PWM
PWM04 EQU 33h ; // Primer byte para PWM
PWM05 EQU 34h ; // Primer byte para PWM
PWM06 EQU 35h ; // Primer byte para PWM
PWM07 EQU 36h ; // Primer byte para PWM
PWM08 EQU 37h ; // Primer byte para PWM
PWM09 EQU 38h ; // Primer byte para PWM
PWM10 EQU 39h ; // Primer byte para PWM
PWM11 EQU 3Ah ; // Primer byte para PWM
PWM12 EQU 3Bh ; // Primer byte para PWM
PWM13 EQU 3Ch ; // Primer byte para PWM
PWM14 EQU 3Dh ; // Primer byte para PWM
PWM15 EQU 3Eh ; // Primer byte para PWM
PWM16 EQU 3Fh ; // Ultimo byte para PWM
DMX01 EQU 40h ; // Primer byte que recibe DMX
DMX02 EQU 41h ; //
DMX03 EQU 42h ; //
DMX04 EQU 43h ; //
DMX05 EQU 44h ; //
DMX06 EQU 45h ; //
DMX07 EQU 46h ; //
DMX08 EQU 47h ; //
DMX09 EQU 48h ; //
DMX10 EQU 49h ; //
DMX11 EQU 4Ah ; //
DMX12 EQU 4Bh ; //
DMX13 EQU 4Ch ; //
DMX14 EQU 4Dh ; //
DMX15 EQU 4Eh ; //
DMX16 EQU 4Fh ; // Ultimo byte que recibe DMX
;DatoRecibido EQU 50H ; aqui esta el dato real, lo siguiente es "un puntero"
PrimeroDMX EQU 50H ; es para poner un inmediato, asi siempre apunta bien
UltimoDMX EQU 50H+3 ; es para poner un inmediato, asi siempre apunta bien
ContadorPWM EQU 60h ; Es el que lleva la cuenta de hasta donde debe llegar
Pila EQU 68h ; Es para dejar sitio
DatoA EQU 00100001b
DAtoB EQU 00100010b
RecargaTH0 EQU 256-55
ORG 0000h
LJMP INICIO
ORG 00BH ; timer 0, se encargara de contar los 255 hasta llegar a 20 ms
LJMP BuclePWM ; Mide el minimo pulso 20 / 256
ORG 0013H ; Externa 0, pata 12
RETI
; CLR IE1
LJMP Externa1_PasoPorCero ; Paso Por 0 de la tensión
ORG 0023h
Serie:
MOV GuardaAserie, A
MOV GuardaPSWSerie, PSW
; SETB RecibiDMX
; LJMP LRecepDMX
; *************************************************** RUTINA SERIE
LRecepDMX:
MOV A, SBUF ;RECEPCION : 1EAD
MOV C, RB8
MOV SalvaRB8, C
CLR RI
JB Bloquenuevo, LDMXOFF ; Si aun no se ha hecho caso del otro, no recibas nada
JB DMXok, rec1old
CJNE A, #00H, LDMXOFF
JB SalvaRB8, LDMXOFF
SETB DMXok
SJMP LRETORNO
rec1old: JB Conf, Rec2old
CJNE A, #00H, LDMXOFF
JNB RB8, LDMXOFF
SETB Conf
MOV DecDirDMX, Direccion
MOV C, Pata256 ; Para que el DMX sea a partir de 256
CPL C
MOV HADR, C
SJMP LRETORNO
rec2old: JB Input, L1EF2
JNB SalvaRB8, LDMXOFF
DJNZ DecDirDMX, LRETORNO
JBC HADR, LRETORNO
SETB Input
L1EF2: JNB SalvaRB8, LDMXOFF
MOV @R0, A
Lnadas: INC R0
Lnadar: CLR C
CJNE R0, #UltimoDMX, L1F05 ;; Antes #6bH
SETB Bloquenuevo
CPL P3.5
SJMP LDMXOFF
L1F05: JC LRETORNO
LDMXOFF:
MOV R0, #PrimeroDMX
CLR DMXok
CLR Conf
CLR Input
LRETORNO: ; 1F17
MOV A, GuardaAserie
MOV PSW, GuardaPSWSerie
RETI
; ***************************************************************************************
INICIO:
ANL P3, #E9h ;; Solo P3.4, P3.2 y P3.1 a cero
MOV R0, #00H
Lacero: INC R0 ; Este bucle es para poner TODA la memoria
MOV @R0, #00H ; interna a 00H
CJNE R0, #7FH, Lacero
yaacero:
MOV P1, #0FFH ;; Aqui P1 sirvira para la salida de datos por display
MOV R0, #PrimeroDMX ;; para la recepcion serie
; MOV R1, #PrimeroDMX
MOV SP, #Pila ;; La pila solo va a tener 16 posiciones
MOV SCON, #090H ;; SCON Modo 2 ( 9 bits ); REN =1, Preparado
MOV PCON, #00H ;; SMOD = 0
MOV TMOD, #00100010B ;; TMOD Timers 0 y 1 en modo 2 ( 8 bits CON )
MOV TCON, #04H ;; Externa 1 por flanco
MOV TH0, #RecargaTH0
MOV TL0, TH0
; SETB TR0
MOV IP, #10H ;; IP, Prioridad serie
SETB ES
SETB EA
SETB ET0 ; tIMER 0
; SETB EX1 ; eXTERNA 1
SETB PS ; Prioridad serie, de momento
; SETB PX1 ; Y Tambien Externa 1
; MOV Direccion, #1 ;; Aunque sea el canal 0, es el 1
SETB Pata256 ; Simula la pata del puerto a 1
;TARDAMASPWM:
; SETB BloqueNuevo
;BUCLEDAC:
; NOP
; NOP
; NOP
; NOP
; NOP
SIMISMO:
JB P3.6, SiMismo ; P1.0 es la + y P1.1 - del operacional, P3.6 es la salida
ANL P3, #E9h ;; Solo P3.4, P3.2 y P3.1 a cero
CLR TR0
Esperaeluno: ;
JNB P3.6, Esperaeluno ; Asi esperamos que se ponga a uno, y ahora si que entramos
SETB P3.3
CLR Bloquenuevo ; Para Poder recibir más datos
MOV COntadorPWM, #0 ;; No tenemos externa 1
MOV TL0, TH0
SETB TR0
MOV A, P1 ; Esperamos que se ponga abajo
RRC A ; Pasamos de lo que diga P1.0 en la direccion
RRC A
ORL A, #C0H ;; Pasamos de P1.0 y P1.1
CPL A
JNZ YaEsta
INC A ; Para que el cero sea 1
YaEsta:
MOV Direccion, A
CLR P3.3
ANL P3, #E9h ;; Solo P3.4, P3.2 y P3.1 a cero
SJMP SiMismo
; JNB BloqueNuevo, BUCLEPWM ;BUCLEDAC
; MOV A, DatoDACA
; CJNE A, PWM01, MandaDato
; MOV A, DatoDACB
; CJNE A, PWM02, MandaDato
; SJMP BuclePWM ;BucleDAC
;MandaDato:
; MOV DatoDACA, PWM01
; MOV DatoDACB, PWM02
; LCALL LMandar
;; CLR BloqueNuevo
;; SJMP BUCLEDAC
; ************************************** Cada Cierto Tiempo
BUCLEPWM:
MOV A, ContadorPWM
CJNE A, PWM01, P01
P01:
MOV P3.1, C
CJNE A, PWM02, P02
P02:
MOV P3.2, C
CJNE A, PWM03, P03
P03:
MOV P3.4, C
; CJNE A, PWM04, P04
;P04:
; MOV P1.3, C
; CJNE A, PWM05, P05
;P05:
; MOV P1.4, C
; CJNE A, PWM06, P06
;P06:
; MOV P1.5, C
; CJNE A, PWM07, P07
;P07:
; MOV P1.6, C
; CJNE A, PWM08, P08
;P08:
; MOV P1.7, C
; CJNE A, PWM09, P09
;P09:
; MOV P2.0, C
; CJNE A, PWM10, P10
;P10:
; MOV P2.1, C
; CJNE A, PWM11, P11
;P11:
; MOV P2.2, C
; CJNE A, PWM12, P12
;P12:
; MOV P2.3, C
; CJNE A, PWM13, P13
;P13:
; MOV P2.4, C
; CJNE A, PWM14, P14
;P14:
; MOV P2.5, C
; CJNE A, PWM15, P15
;P15:
; MOV P2.6, C
; CJNE A, PWM16, P16
;P16:
; MOV P2.7, C
FindelBucle:
; ADD A, #4 ;; Voy de 4 en 4 para no tener que dividir por 4 todos los demas
; MOV ContadorPWM, A
SETb P3.7
INC ContadorPWM
MOV A, ContadorPWM
JNZ FinBuclePWM
ANL P3, #E9h ;; Solo P3.4, P3.2 y P3.1 a cero
CLR TR0
; CLR ms20
; MOV P1, #0
; MOV P2, #0
; MOV PWM01, DatoRecibido
; CLR Bloquenuevo ; Para Poder recibir más datos sino lo resetea el paso por cero
FinBuclePWM:
CLR P3.7
RETI
; *********************************************** Se produce una interrupción en el paso por cero
Externa1_PasoPorcero:
ANL P3, #E9h ;; Solo P3.4, P3.2 y P3.1 a cero
MOV ContadorPWM, #0
CLR Bloquenuevo ; Para Poder recibir más datos
CPL P3.5
RETI
; **************************************** RUTINA DAC *************
LMandar:
MOV A, #DatoA ;; Primero le decimos el canal, Ahora El A
CLR CSDAC
RLC A
MOV Dout, C
1bit: SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
2Bit SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
3Bit SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
4Bit SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
5Bit SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
6Bit SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
7Bit SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
8Bit SETB CLKDAC
MOV A, DatoDACA ; Ahora el DATO De A
CLR C ; Para meter un cero
; RLC A ; Para poner ACC.7 en C
; MOV FaseA, C ; y mandarlo a la fase
CLR CLKDAC
RLC A
MOV Dout, C
1bit2: SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
2Bit2 SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
3Bit2 SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
4Bit2 SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
5Bit2 SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
6Bit2 SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
7Bit2 SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
8Bit2 SETB CLKDAC
NOP
CLR CLKDAC
NOP
SETB CSDAC
NOP
CLR CSDAC
MOV A, #DatoB ;; Ahora le decimos el canal B
RLC A
MOV Dout, C
1bitB: SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
2BitB SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
3BitB SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
4BitB SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
5BitB SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
6BitB SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
7BitB SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
8BitB SETB CLKDAC
MOV A, DatoDACB
CLR CLKDAC
CLR C ; Para meter un cero
; RLC A ; Para poner ACC.7 en C
; MOV FaseB, C ; y mandarlo a la fase
RLC A
MOV Dout, C
1bitB2: SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
2Bit2B SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
3Bit2B SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
4Bit2B SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
5Bit2B SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
6Bit2B SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
7Bit2B SETB CLKDAC
RLC A
CLR CLKDAC
MOV Dout, C
8Bit2B SETB CLKDAC
NOP
CLR CLKDAC
NOP
SETB CSDAC
FinMandar:
RET