;TARJETA DE ENTRADA Y SALIDA, ANALOGO Y DIGITAL PARA PC ;HECHO Y PROGRAMADO POR FRANK ;LEE PUERTO ANALOGO, SET/RESET BIT DIGITAL, LEE PUERTO DIGITAL ;HACE LECTURAS CONTINUAS ;An LEE LA ENTRADA ANALOGA n ;RESPONDE POR RS232 EN HEX CONVERTIDO ;Sn PRENDE EL BIT n ;Rn APAGA EL BIT n ;D LEE EL BYTE DEL PUERTO DIGITAL ;RESPONDE POR RS232 EN HEX CONVERTIDO ;C PREPARA EL INTERFAZ PARA LECTURA CONTINUA ;CUALQUIER CARACTER DETIENE LA LECTURA CONTINUA ;INPUTS/OUTPUTS: ;DB ADC INPUT BUS ;P10 ADC A0 ;P11 ADC A1 ;P12 ADC A2 ;P13 ADC START/ALE ;P14 ;P15 ;P16 ;P17 RS232 OUT ;P20 I/O EXPANDER ;P21 I/O EXPANDER ;P22 I/O EXPANDER ;P23 I/O EXPANDER ;P24 ADC EOC ;P25 ;P26 ;P27 RS232 IN ;P4 LOW BITS DIGITAL OUTPUTS ;P5 HIGH BITS BIT DIGITAL OUTPUTS ;P6 LOW BITS DIGITAL INPUTS ;P7 HIGH BITS DIGITAL INPUTS ;RAM: ;R0,R1 ;R2 BINHEX, PROG, SET ;R3 RS232 ;R4 RS232, SET ;R5 BINHEX ;R6 ANALOG ;R7 FLAG DE LECTURA CONTINUA 0 = OFF ;SET PRIMARY JUMPS ORG 00H JMP INIT ; * * * * * P R O G R A M A P R I N C I P A L * * * * * ORG 10H INIT: CLR A ;BORRAR PUERTOS DE SALIDA DIGITAL MOVD P4,A MOVD P5,A MOV R7,A ;APAGAR FLAG DE LECTURA CONTINUA MOV R1,#10H ;MANDAR MENSAJE DE ARRANQUE INI1: MOV A,R1 MOVP3 A,@A ;TRAER CARACTER JZ PROG CALL TXHDATA ;MANDAR A RS232 INC R1 JMP INI1 PROG: CALL ANALOG JMP PROG CALL RXDATA ;ESPERAR CARACTER DE RS232 JZ PROG MOV R2,A ;GUARDAR CARACTER RECIBIDO XRL A,#'A' ;COMPARAR CON A ( LECTURA ANALOGA ) JNZ PRO1 PRO1: MOV A,R2 ;TRAER CARACTER RECIBIDO XRL A,#'S' ;COMPARAR CON S ( SET BIT ) JNZ PRO2 CALL BITSUB CALL SET JMP PROG PRO2: MOV A,R2 ;TRAER CARACTER RECIBIDO XRL A,#'R' ;COMPARAR CON R ( RESET BIT ) JNZ PRO3 CALL BITSUB CALL RESET JMP PROG PRO3: MOV A,R2 ;TRAER CARACTER RECIBIDO XRL A,#'D' ;COMPARAR CON D ( LECTURA DIGITAL ) JNZ PRO4 CALL DIGITAL JMP PROG PRO4: MOV A,R2 XRL A,#'C' ;COMPARAR CON C ( LECTURA CONTINUA ) JNZ PRO5 MOV R7,#01 ;PRENDER FLAG DE LECTURA CONTINUA PRO5: JMP PROG ;SUBRUTINA DE LECTURA DE PUERTO DIGITAL DIGITAL:MOV A,#' ' ;MANDAR ESPACIO CALL TXDATA MOVD A,P7 ;LEER HIGH BYTE SWAP A ;VOLTEAR NIBBLES MOV R2,A ;GUARDAR MOVD A,P6 ;LEER LOW BYTE ORL A,R2 ;SUMARLE HIGH BYTE CALL BINHEX ;CONVERTIR A HEX CALL TXDATA ;MANDAR A RS232 MOV A,R2 CALL TXDATA ;MANDAR A RS232 MOV A,#13 ;MANDAR UN CR CALL TXDATA MOV A,R7 ;REVISAR FLAG DE LECTURA CONTINUA JZ DIG1 CALL RXDATA ;ESPERAR ALGUN CARACTER DEL RS232 JZ DIGITAL MOV R7,#00 DIG1: RET ;SUBRUTINA DE ENTRADA DE NUMERO DE BIT Y CONVERSION BITSUB: CALL RXDATA ;ESPERAR NUMERO DE BIT JZ BITSUB ANL A,#07 ;FILTRAR MOV R2,A ;GUARDAR MOV A,#13 ;MANDAR UN CR CALL TXDATA MOV A,#01 ;INICIALIZAR BIT MOV R4,A BIT3: MOV A,R2 JZ BIT2 DEC R2 MOV A,R4 RL A MOV R4,A JMP BIT3 BIT2: RET ;SUBRUTINA DE RESET BIT RESET: MOV A,R4 ANL A,#0FH ;VER SI ESTA EN EL LOW BYTE JZ RES1 MOV A,R4 ;TRAER BIT XRL A,#FFH ;COMPLEMENTAR ANLD P4,A ;MANDAR A PUERTO RET RES1: MOV A,R4 ;TRAER BIT SWAP A ;VOLTEAR XRL A,#FFH ;COMPLEMENTAR ANLD P5,A ;MANDAR A PUERTO RET ;SUBRUTINA DE ESCRITURA DE BIT SET: MOV A,R4 ANL A,#0FH ;VER SI ESTA EN EL LOW BYTE JZ SET1 MOV A,R4 ;TRAER BIT ORLD P4,A ;MANDAR A PUERTO RET SET1: MOV A,R4 ;TRAER BIT SWAP A ;VOLTEAR ORLD P5,A ;MANDAR A PUERTO RET ;SUBRUTINA DE LECTURA DE ENTRADA ANALOGA ANALOG: CLR A MOV R6,A ;GUARDAR ANA3: ANL A,#07 ;FILTRAR ORL A,#80H ;SUMARLE BIT DE RS232 OUTL P1,A ;MANDAR A PUERTO ORL P1,#08 ;SUMARLE BIT DE ALE ANL P1,#87H ;INICIALIZAR CONVERSION ( APAGAR START ) ANA1: IN A,P2 ;TRAER ADC EOC ANL A,#10H ;FILTRAR BIT JZ ANA1 ;ESPERAR FIN DE CONVERSION INS A,BUS ;LEER CONVERSION CALL BINHEX ;CONVERTIR A HEX CALL TXHDATA ;MANDAR A RS232 MOV A,R2 CALL TXHDATA MOV A,R6 ;RECUPERAR NUMERO DE PUERTO JMP ANA3 ;CICLAR ANA4: MOV R7,#00 ANA2: RET ;SUBRUTINA DE CONVERSION BINARIO A HEXADECIMAL ;EN A ENTRA EL CODIGO BINARIO A CONVERTIR ;EN A REGRESA EL HIGH NIBBLE ;EN R2 REGRESA EL LOW NIBBLE ;ALTERA A, R2, R5 BINHEX: MOV R5,A ;GUARDAR PARA DESPUES ANL A,#0FH ;FILTRAR LOW NIBBLE ADD A,#00H ;OFFSET, ORIGEN DE TABLA MOVP3 A,@A ;HACER CONVERSION MOV R2,A ;GUARDAR LOW NIBBLE MOV A,R5 ;TRAER VALOR INICIAL SWAP A ;VOLTEAR NIBBLES ANL A,#0FH ;FILTRARA LOW NIBBLE ADD A,#00H ;OFFSET, ORIGEN DE TABLA MOVP3 A,@A ;HACER CONVERSION RET ORG 0100H ;SUBRUTINA DE TRANSMISION DE DATOS POR RS232 ;19200 BAUD = 21 MACHINE CYCLES CON UN XTAL DE 6 MHz ;TRANSMITE POR P17 ;EN A DEBE ESTAR EL CARACTER ASCII A TRANSMITIR ;ALTERA A, R3, R4 TXHDATA:MOV R3,#08 ;INICIALIZAR CONTADOR DE BITS MOV R4,A ;PASAR A REGISTRO DE CONVERSION P-S ANL P1,#7FH ;ENVIAR START BIT LOW DURANTE UN PERIODO MOV A,#2 ;2 TXH1: DEC A ;1 JNZ TXH1 ;2 3x2=6 NOP ;1 NOP ;1 TXH2: MOV A,R4 ;1 ;ENVIAR BITS DE CARACTER CLR C ;1 ;ROTAR POR CARRY RRC A ;1 MOV R4,A ;1 ;GUARDAR ROTACION NOP ;1 JC TXH5 ;2 ANL P1,#7FH ;2 ;MANDAR BIT LOW 2+6+13=21 JMP TXH6 ;2 TXH5: ORL P1,#80H ;2 ;MANDAR BIT HIGH JMP TXH6 ;2 TXH6: MOV A,#01 ;2 TXH3: DEC A ;1 JNZ TXH3 ;2 3x1=3 NOP ;1 DEC R3 ;1 MOV A,R3 ;1 JNZ TXH2 ;2 CONTINUE NEXT BIT 4+3+5+9=21 MOV A,#01 ;2 TXH7: DEC A ;1 JNZ TXH7 ;2 NOP ;1 NOP ;1 ORL P1,#80H ;2 END TRANSMITION WITH HIGH 4+3+5+2+3+4=21 MOV A,#06 ;2 PLACE ONE STOP BIT TXH4: DEC A ;1 JNZ TXH4 ;2 3x6=18 2+18=20 RET ;SUBRUTINA DE TRANSMISION DE DATOS POR RS232 ;1200 BAUD = 137 MACHINE CYCLES CON UN XTAL DE 2.4576 MHz = 6.1 us ;TRANSMITE POR P17 ;EN A DEBE ESTAR EL CARACTER ASCII A TRANSMITIR ;ALTERA A, R3, R4 TXDATA: MOV R3,#08 ;INICIALIZAR CONTADOR DE BITS MOV R4,A ;PASAR A REGISTRO DE CONVERSION P-S ANL P1,#7FH ;ENVIAR START BIT LOW DURANTE UN PERIODO MOV A,#42 ;2 TX1: DEC A ;1 JNZ TX1 ;2 3x42=126 NOP ;1 TX2: MOV A,R4 ;1 ;ENVIAR BITS DE CARACTER CLR C ;1 ;ROTAR POR CARRY RRC A ;1 MOV R4,A ;1 ;GUARDAR ROTACION NOP ;1 JC TX5 ;2 ANL P1,#7FH ;2 ;MANDAR BIT LOW JMP TX6 ;2 TX5: ORL P1,#80H ;2 ;MANDAR BIT HIGH JMP TX6 ;2 TX6: MOV A,#40 ;2 TX3: DEC A ;1 JNZ TX3 ;2 3x40=120 DEC R3 ;1 MOV A,R3 ;1 JNZ TX2 ;2 CONTINUE NEXT BIT ORL P1,#80H ;2 END TRANSMITION WITH HIGH MOV A,#100 ;2 PLACE STOP BITS TX4: DEC A ;1 JNZ TX4 ;2 3x100=300 RET ;SUBRUTINA DE RECEPCION DE DATOS POR RS232 ;REGRESA SI NO HAY DATOS O DESPUES DE RECIBIR UN CARACTER E IMPRIMIRLO ;1200 BAUD = 137 MACHINE CYCLES CON UN XTAL DE 2.4576 MHz ;RECIBE POR P27 ;ALTERA A, R3, R4 RXDATA: MOV R3,#08 ;INICIALIZAR CONTADOR DE BITS MOV R4,#00 ;BORRAR REGISTRO DE CONVERSION S-P IN A,P2 ;2 ;REVISAR COMIENZO DE START BIT ANL A,#80H ;2 JZ RX1 ;2 CLR A ;INDICAR NO RECEPCION RET RX1: MOV A,#20 ;2 = 8 ;DETECCION DE UN POSIBLE START BIT RX2: DEC A ;1 ;DELAY DE 1/2 BIT JNZ RX2 ;2 3x20=60+8=68 IN A,P2 ;2 ;REVISAR START BIT REAL ANL A,#80H ;2 JZ RX3 ;2 RET RX3: MOV A,#43 ;2 = 8 ;DELAY 1 BIT RX4: DEC A ;1 JNZ RX4 ;2 3x43=129+8=137 RX5: IN A,P2 ;2 ;LEER BIT Y PASAR A REGISTRO RLC A ;1 MOV A,R4 ;1 RRC A ;1 MOV R4,A ;1 DEC R3 ;1 MOV A,R3 ;1 JZ RX7 ;2 = 10 RX8: MOV A,#41 ;2 = 2 ;DELAY 1 BIT RX9: DEC A ;1 JNZ RX9 ;2 3x41=123 JMP RX5 ;2 = 2 10+2+123+2=137 RX7: MOV A,#45 ;2 = 2 ;DELAY 1 STOP BIT RX10: DEC A ;1 JNZ RX10 ;2 3x45=135+2=136 MOV A,R4 ;TRAER BYTE RECIBIDO RET ;TABLAS ORG 0300H DB '0123456789ABCDEF' DB 13,'PC-LINK OCT 1989',13 DB 'MADE BY FRANK ANGELI',13,13 DB 'COMMANDS ARE:',13,13 DB 'An READS ADC INPUT n',13 DB 'D READS DIGITAL BYTE',13 DB 'Sn SETS DIGITAL BIT n',13 DB 'Rn RESETS DIGITAL BIT n',13 DB 'C PREPARES FOR CONTINUOUS READING',13 DB ' THEN ENTER An or D',13 DB ' STOP WITH ANY LETTER',13,13,00 END