RAM EQU $0080 ROM EQU $F600 ; Valid for all JL3, JK3, JK1 VECTOR EQU $FFDE OUTADC EQU $0081 ;REGISTRO DE SALIDA AL ADC INADCH EQU $0082 ;REGISTRO DE ENTRADA DEL ADC ALTO INADCL EQU $0083 ;REGISTRO DE ENTRADA DEL ADC BAJO CONT1 EQU $0084 ;CONTADOR DE LOS DATOS DE CONFIGURACION CONF EQU $0085 ;PALABRA DE ENTRADA PARA CONFIGURACION DE LOS CANALES Y EL MODO(SIMPLE O DIFERENCIAL) AUTOCAL EQU $0008 ;PALABRA PARA AUTOCALIBRACION AUTOZERO EQU $0009 ;PALABRA PARA AUTOCERO READSTAT EQU $000C ;PALABRA PARA LEER EL REGISTRO DE STATUS CCLK_ACQ EQU $004E ;TIEMPO DE ADQUISICION 10 CICLOS DE CCLK NO_SIGN EQU $000D ;PALABRA PARA CONFIGURAR SALIDA SIN SIGNO SIGN EQU $008D ;PALABRA PARA CONFIGURAR SALIDA CON SIGNO SIMPLE EQU $0002 ;PALABRA PARA CONVERSION SIMPLE \ START EQU $0003 ;PALABRA PARA CONVERSION CONTINUA|COMANDOS DEL USUARIO DE LA PC PARA EL MANEJO DE LA CONVERSION STOP EQU $0006 ;PALABRA PARA PARAR CONVERSION / DEFECTO EQU $0084 ;CONFIGURACION POR DEFECTO (CANAL 0, MODO SIMPLE, 12 BIT + BIT DE SIGNO, LSB PRIMERO) $Include 'jl3regs.inc' ; For the 68HC908JL3, 68HC908JK3, 68HC908JK1 ORG ROM INI: MOV #$11,CONFIG1 ;REGISTRO DE CONFIGURACION ;cop deshabilitado ;lvi deshabilitado MOV #$00,CONFIG2 ;REGISTRO DE CONFIGURACION ;PULL-UP IRQ CONECTADA MOV #$00,INTSCR ;CONFIGURACION DE LA INTERRUCION POR IRQ MOV #$33,DDRA ;BIT 0=OUT_SCLK \ ;BIT 1=OUT_DI | ESTE PUERTO ;BIT 2=IN_DO | CONTROLA EL ADC ;BIT 3=IN_EOC | ;BIT 4=OUT_CS | ;BIT 5=OUT_LED / BSET 4,PORTA ;ACTIVO CS MOV #$00,DDRB ;PUERTO PARA LOS DATOS (BIDIRECCIONAL) MOV #$0F,DDRD ;BIT 0=OUT_OE-LATCH(ACTIVO POR BAJO) ENTRADA DE DATOS \ESTE PUERTO CONTROLA LA ;BIT 1=OUT_CLK-LATCH(ACTIVO POR ALTO) SALIDA LATCH LSB |COMUNICACION CON LA PC ;BIT 2=OUT_CLK-LATCH(ACTIVO POR ALTO) SALIDA LATCH MSB | ;BIT 3=OUT_IRQPC (ESTA CONECTADO A LA IRQ DE LA PC) / ;BIT 4=IN_LECTURA DE DATO MOV #$03,TMODH ;CONFIGURA EL MODULO DEL TIMER MOV #$E8,TMODL ;CONFIGURA EL MODULO DEL TIMER MOV #$05,PORTD ;PONGO EN 1 EL OUT ENABLE DEL LATCH DE ENTRADA DE DATOS (SE ACTIVA POR BAJO) CLRX CLRA CLR PORTB CLR INADCH CLR INADCL CLR CONT1 MOV #AUTOCAL,OUTADC ;GUARDO PARA ENVIAR AUTOCALIBRACION BSR ENVIAR ;ENVIO Y RECIBO LOS DATOS LOOP4 BRCLR 3,PORTA,LOOP4 ;ESPERO EOC MOV #READSTAT,OUTADC BSR ENVIAR1 ;ENVIO PALABRA PARA LEER STATUS LOOP5 BRCLR 3,PORTA,LOOP5 ;ESPERO EOC MOV #READSTAT,OUTADC BSR ENVIAR1 ;ENVIO PALABRA PARA LEER STATUS LOOP6 BRCLR 3,PORTA,LOOP6 ;ESPERO EOC MOV #CCLK_ACQ,OUTADC BSR ENVIAR1 ;ENVIO PALABRA PARA CONFIGURAR EL TIEMPO DE ADQUISICION EN 10 CICLOS DE CCLK LOOP7 BRCLR 3,PORTA,LOOP7 ;ESPERO EOC MOV #SIGN,OUTADC BSR ENVIAR1 ;ENVIO PALABRA PARA CONFIGURAR SALIDA CON SIGNO LOOP8 BRCLR 3,PORTA,LOOP8 ;ESPERO EOC MOV #AUTOZERO,OUTADC BSR ENVIAR1 ;ENVIO PALABRA DE AUTOCERO LOOP9 BRCLR 3,PORTA,LOOP9 ;ESPERO EOC MOV #DEFECTO,CONF ;GUARDO EN LA PALABRA DE CONFIGURACION DE LA PC CANAL CERO MODO SIMPLE MOV #$10,CONT1 VU3 BCLR 5,PTA ;APAGA EL LED BSR DELAY BSET 5,PTA ;ENCIENDE LED BSR DELAY DEC CONT1 LDA CONT1 BNE VU3 CLR CONT1 CLI NADA NOP NOP JMP NADA DELAY: LDX #$FF VU2 NOP LDA #$FF VU1 NOP DBNZA VU1 DBNZX VU2 RTS *******************************RUTINA DEL IRQ PARA LA ENTRADA DE DATOS**************************************** INT_IRQ: BSET 5,PORTA ;ENCIENDE EL LED LDA CONT1 CBEQA #$00,CONFIG CBEQA #$01,TIMERL CBEQA #$02,TIMERH RTI *************************SUBRUTINA SETEO DEL TIEMPO ENTRE MUESTREOS LSB************************************ TIMERL: MOV #$00,DDRB ;CONFIGURO EL PUERTO DE DATOS COMO ENTRADA BCLR 0,PORTD ;HABILITO LAS SALIDAS DEL LATCH DE ENTRADA DE DATOS NOP NOP NOP LDA PORTB ;GUARDO LA PALABRA DE ENTRADA BSET 0,PORTD ;DESHABILITO LAS SALIDAS DEL LATCH DE ENTRADA STA TMODL ;CONFIGURO EL MODULO DEL TIMER LSB INC CONT1 ;INCREMENTO CONTADOR RTI ENVIAR1: BSR ENVIAR2 RTS *************************SUBRUTINA SETEO DEL TIEMPO ENTRE MUESTREOS MSB************************************** TIMERH: MOV #$00,DDRB ;CONFIGURO EL PUERTO DE DATOS COMO ENTRADA BCLR 0,PORTD ;HABILITO LAS SALIDAS DEL LATCH DE ENTRADA DE DATOS NOP NOP NOP LDA PORTB ;GUARDO LA PALABRA DE ENTRADA BSET 0,PORTD ;DESHABILITO LAS SALIDAS DEL LATCH DE ENTRADA STA TMODH ;CONFIGURO EL MODULO DEL TIMER LSB CLR CONT1 ;RESETEO CONTADOR RTI ***SUBRUTINA DE CONFIGURACION*** CONFIG: MOV #$00,DDRB ;CONFIGURO EL PUERTO DE DATOS COMO ENTRADA BCLR 0,PORTD ;HABILITO LAS SALIDAS DEL LATCH DE ENTRADA DE DATOS NOP NOP NOP LDA PORTB ;GUARDO LA PALABRA DE ENTRADA BSET 0,PORTD ;DESHABILITO LAS SALIDAS DEL LATCH DE ENTRADA CMP #SIMPLE BNE SALTO_1 MOV CONF,OUTADC BSR ENVIAR2 ;ENVIO PALABRA DE CONVERSION ESP1 BRCLR 3,PORTA,ESP1 ;ESPERO EOC MOV CONF,OUTADC BSR ENVIAR2 ;ENVIO PALABRA DE CONVERSION PARA LEER CONVERSION ANTERIOR ESP2 BRCLR 3,PORTA,ESP2 ;ESPERO EOC MOV INADCL,PORTB ;PONGO LA PARTE BAJA DEL DATO EN EL PUERTO MOV #$FF,DDRB ;CONFIGURO EL PUERTO DE DATOS COMO SALIDA BSET 1,PORTD ;LATCHEO EL DATO LSB NOP NOP NOP BCLR 1,PORTD MOV INADCH,PORTB ;PONGO LA PARTE ALTA DEL DATO EN EL PUERTO BSET 2,PORTD ;LATCHEO EL DATO MSB NOP NOP NOP BCLR 2,PORTD ;WAIT1 BRSET 4,PORTD,WAIT1 ;VERIFICA QUE LA PC LEYO EL DATO ANTERIOR, A TRAVES DEL FLIP-FLOP BCLR 3,PORTD ;INTERRUMPO A LA PC NOP NOP NOP NOP BSET 3,PORTD CLR CONT1 ;PONGO EN CERO EL CONTADOR PORQUE NO SE VA A SETEAR EL TIEMPO ENTRE MUESTREOS RTI SALTO_1 CMP #AUTOCAL BNE SALTO_2 MOV #AUTOCAL,OUTADC BSR ENVIAR ;MANDO PALABRA PARA AUTOCALIBRACON ESP3 BRCLR 3,PORTA,ESP3 ;ESPERO EOC MOV #$FF,DDRB ;CONFIGURO EL PUERTO DE DATOS COMO SALIDA MOV #$FF,PORTB ;ENVIO FFFF PARA CONFIRMAR AUTO CALIBRACION BSET 1,PORTD ;LATCHEO DATO LSB NOP NOP NOP BCLR 1,PORTD BSET 2,PORTD ;LATCHEO DATO MSB NOP NOP NOP BCLR 2,PORTD BCLR 3,PORTD ;INTERRUMPO LA PC NOP NOP NOP BSET 3,PORTD CLR CONT1 ;PONGO EN CERO EL CONTADOR PORQUE NO SE VA A SETEAR EL TIEMPO ENTRE MUESTREOS RTI ENVIAR2 BSR ENVIAR RTS SALTO_2 CMP #AUTOZERO BNE SALTO_3 MOV #AUTOZERO,OUTADC BSR ENVIAR ;MANDO PALABRA PARA AUTOCERO ESP4 BRCLR 3,PORTA,ESP4 ;ESPERO EOC MOV #$FF,DDRB ;CONFIGURO EL PUERTO DE DATOS COMO SALIDA MOV #$FF,PORTB ;ENVIO FFFF PARA CONFIRMAR AUTO CERO BSET 1,PORTD ;LATCHEO DATO LSB NOP NOP NOP BCLR 1,PORTD BSET 2,PORTD ;LATCHEO DATO MSB NOP NOP NOP BCLR 2,PORTD BCLR 3,PORTD ;INTERRUMPO LA PC NOP NOP NOP BSET 3,PORTD CLR CONT1 ;PONGO EN CERO EL CONTADOR PORQUE NO SE VA A SETEAR EL TIEMPO ENTRE MUESTREOS RTI SALTO_3 CMP #START BNE SALTO_4 ;ESTA RUTINA CONFIGURA Y PRENDE EL TIMER MOV #$60,TSC ;CONFIGURA EL TIMER(TOIE,TSTOP,PRESCALER/1) BCLR 5,TSC ;SACA EL BIT DE STOP CLR CONT1 ;PONGO EN CERO EL CONTADOR PORQUE NO SE VA A SETEAR EL TIEMPO ENTRE MUESTREOS CLI RTI SALTO_4 CMP #STOP BNE SALTO_5 ;ESTA RUTINA APAGA EL TIMER BSET 5,TSC ;PARO EL CONTADOR LDX TSC ;PARA PODER PONER EN CERO EL TOF HAY QUE LEER EL TSC BCLR 7,TSC ;PONGO EN CERO EL TOF BSET 4,TSC ;RESETEO EL CONTADOR MOV #$00,TSC ;DESHABILITO LA INTERRUPCION BSET 5,TSC ;PARO EL CONTADOR CLR CONT1 ;PONGO EN CERO EL CONTADOR PORQUE NO SE VA A SETEAR EL TIEMPO ENTRE MUESTREOS RTI SALTO_5 STA CONF ;GUARDO LA CONFIGURACION DE LOS CANALES Y EL MODO INC CONT1 ;INCREMENTO CONTADOR RTI ;/////////////////////RUTINA PARA ENVIAR Y RECIBIR DATOS AL Y DESDE EL ADC //////////////////// ENVIAR: BCLR 0,PORTA ;LIMPIO SCLK BCLR 4,PORTA ;PONGO EN 0 CS BCLR 1,PORTA ;LIMPIO DI LDA #$08 ; 8 BITS ES EL PRIMER BYTE NOP NOP NOP LOOP1 BCLR 0,PORTA ;FLANCO DE BAJADA DEL SCLK BRSET 2,PORTA,SETC ;\ CLC ; | GUARDO EL DATO FIN_SETC ROR INADCL ;/ ROL OUTADC ;\ BCC CLRDI ; | PONGO EN EL PUERTO EL DATO A ENVIAR BSET 1,PORTA ;/ NOP NOP NOP NOP FIN_CLRDI BSET 0,PORTA ; FLANCO DE SUBIDA DEL SCLK DBNZA LOOP1 ; DECREMENTO Y SALTO SI NO ES CERO LDA #$05 ; 5 BITS PARA COMPLETAR LOS 13 NOP NOP NOP LOOP2 BCLR 0,PORTA ;FLANCO DE BAJADA DEL SCLK BRSET 2,PORTA,SET1 ;\ CLC ; | GUARDO EL DATO FIN_SET1 ROR INADCH ;/ BCLR 1,PORTA ;LIMPIO DI PORQUE NO ES NECESARIO ENVIAR DATOS NOP NOP BSET 0,PORTA ; FLANCO DE SUBIDA DEL SCLK NOP NOP DBNZA LOOP2 ; DECREMENTO Y SALTO SI NO ES CERO BCLR 0,PORTA LDA #$03 ;LOS TRES RESTANTES PARA COMPLETAR LOS 2 BYTES LOOP3 CLC ;LOS PONGO A TODOS EN CERO ROR INADCH DBNZA LOOP3 BSET 4,PORTA ;LEVANTO EL CS BCLR 5,PORTA ;APAGA EL LED RTS SETC: SEC JMP FIN_SETC CLRDI: BCLR 1,PORTA JMP FIN_CLRDI SET1: SEC JMP FIN_SET1 ;///////////////////////////////////////////////////////////////////////////////// TIMER: BSET 5,TSC ;PARO EL CONTADOR DEL TIMER MOV #$10,TSC ;RESETEO EL TIMER BSET 5,TSC MOV CONF,OUTADC BSR ENVIAR ;ENVIO PALABRA DE CONVERSION ESP5 BRCLR 3,PORTA,ESP5 ;ESPERO EOC MOV CONF,OUTADC BSR ENVIAR ;ENVIO PALABRA DE CONVERSION PARA LEER CONVERSION ANTERIOR ESP6 BRCLR 3,PORTA,ESP6 ;ESPERO EOC MOV #$FF,DDRB ;CONFIGURO EL PUERTO DE DATOS COMO SALIDA MOV INADCL,PORTB ;PONGO LA PARTE BAJA DEL DATO EN EL PUERTO BSET 1,PORTD ;LATCHEO EL DATO LSB NOP NOP NOP BCLR 1,PORTD MOV INADCH,PORTB ;PONGO LA PARTE ALTA DEL DATO EN EL PUERTO BSET 2,PORTD ;LATCHEO EL DATO MSB NOP NOP NOP BCLR 2,PORTD ;WAIT2 BRSET 4,PORTD,WAIT ;VERIFICA QUE LA PC LEYO EL DATO ANTERIOR, A TRAVES DEL FLIP-FLOP BCLR 3,PORTD ;INTERRUMPO A LA PC NOP NOP NOP BSET 3,PORTD MOV #$40,TSC ;HABILITO LA INTERRUPCION RTI dummy_isr: rti ; return ORG VECTOR dw dummy_isr ; ADC Conversion Complete Vector dw dummy_isr ; Keyboard Vector dw dummy_isr ; (No Vector Assigned $FFE2-$FFE3) dw dummy_isr ; (No Vector Assigned $FFE4-$FFE5) dw dummy_isr ; (No Vector Assigned $FFE6-$FFE7) dw dummy_isr ; (No Vector Assigned $FFE8-$FFE9) dw dummy_isr ; (No Vector Assigned $FFEA-$FFEB) dw dummy_isr ; (No Vector Assigned $FFEC-$FFED) dw dummy_isr ; (No Vector Assigned $FFEE-$FFEF) dw dummy_isr ; (No Vector Assigned $FFF0-$FFF1) dw TIMER ; TIM1 Overflow Vector dw dummy_isr ; TIM1 Channel 1 Vector dw dummy_isr ; TIM1 Channel 0 Vector dw dummy_isr ; (No Vector Assigned $FFF8-$FFF9) dw INT_IRQ ; ~IRQ1 dw dummy_isr ; SWI Vector dw INI ; Reset Vector