;*********************************************;***********EXPORTACION DE SIMBOLOS***********;********************************************* XDEF CICLO ;EXPORTA EL SIMBOLO CICLO ABSENTRY CICLO ;UTILIZADO PARA EL EMSAMBLE TOTAL INCLUDE 'mc9s12e128.inc' ;INCLUDE DEL MICRO A UTILIZAR ROMStart EQU $4000 ;DIRECCION DE MEMORIA FLASH DE PROGRAMA ;PARA ESTE MICRO ES DE $4000 A $FEFF;*********************************************;***********MEMORIA RAM***********************;********************************************* ORG RAMStart ;ORIGEN DE MEMORIA RAM DE USUARIO ;PARA ESTE MICRO ES DE $0400 A $0FFFAUX EQU $2000 ;AUX ES UBICADO EN LA LOCALIDAD $2000AUX1 EQU $2001 ;AUX1 ES UBICADO EN LA LOCALIDAD $2001AUX2 EQU $2004 ;AUX2 ES UBICADO EN LA LOCALIDAD $2004AUX3 EQU $2005 ;AUX3 ES UBICADO EN LA LOCALIDAD $2005LCD EQU $2006 ;LCD ES UBICADO EN LA LOCALIDAD $2006UNIDAD EQU $2007 ;UNIDAD ES UBICADO EN LA LOCALIDAD $2007DECIMA EQU $2008 ;DECIMA ES UBICADO EN LA LOCALIDAD $2008CENTESIMA EQU $2009 ;CENTESIMA ES UBICADO EN LA LOCALIDAD $2009MILESIMA EQU $200A ;MILESIMA ES UBICADO EN LA LOCALIDAD $200ADIEZMILESIMA EQU $200B ;DIEZMILESIMA ES UBICADO EN LA LOCALIDAD $200BTEMPORAL_H EQU $200C ;TEMPORAL_H ES UBICADO EN LA LOCALIDAD $200CTEMPORAL_L EQU $200D ;TEMPORAL_L ES UBICADO EN LA LOCALIDAD $200D ;A PARTIR DE AQUI DECLARAN LOS REGISTROS ;DE USUARIO;*********************************************;***********MEMORIA FLASH DE PROGRAMA*********;********************************************* ORG ROMStart ;ORIGEN DE MEMORIA DE PROGRAMA FLASH ;A PARTIR DE AQUI SE ESCRIBE EL CODIGO CICLO: LDS #$23FF ;INICIALIZA EL STACK CLR DDRA ;CONFIGURA EL PUERTO A COMO SALIDA LDAA #$FF STAA DDRB ;CONFIGURA EL PUERTO B COMO SALIDA CLR PORTB LDAA #$FF STAA DDRU ;CONFIGURA EL PUERTO U COMO SALIDA ;LDAA #$0A ;STAA DDRS ;CONFIGURA EL PUERTO S LDAA #$28 ;* JSR COMANDO ;** LDAA #$01 ;*** JSR COMANDO ;**** LDAA #$06 ;***** JSR COMANDO ;CONFIGURA LDAA #$0C ;LCD DE 32x2 JSR COMANDO ;***** LDAA #$81 ;**** JSR COMANDO ;*** LDAA #$08 ;** JSR COMANDO ;* JSR MENSAJE LDD #$001A ;* STD SCI1BDH ;CONFIGURA LDD #$0008 ;SCI COMUNICACION SERIAL RS232 STD SCI1CR1 ;* LDAA #$10 ;* STAA ATDDIEN0 ;** CLR ATDDIEN1 ;*** LDAA #$80 ;**** STAA ATDCTL2 ;***** LDAA #$08 ;CONFIGURA CONVERTIDOR ANALOGICO-DIGITAL STAA ATDCTL3 ;***** LDAA #$01 ;**** STAA ATDCTL4 ;***CONVERSION: LDAA #$CC ;** STAA ATDCTL5 ;* LDD ATDDR0H STAB PTU ;EL RESULTADO DE LA CONVERSION (10 BITS) ES UBICADO EN PORT U ;PARA QUE EL RESULTADO DE LA CONVERSION ESTE RELACIONADO LDY #$0031 ;CON EL VOLTAJE A REPRESENTAR,LA LECTURA DEL CAD SE EMUL ;MULTIPLICA POR 49, ES DECIR,CADA CAMBIO EN EL CAD SIGNIFICA EXG D,X ;0.0049V DE CAMBIO Y PARA MANEJAR CIFRAS ENTERAS SE OCUPA EL 49 JSR HEXTOBCD ;SALTA A LA SUBRUTINA HEXTOBCD JSR CHECK JSR MENSAJESER LDAA #$D1 JSR COMANDO LDAA UNIDAD ;DE LA SUBRUTINA HEXTOBCD SE OBTIENE UNIDAD Y LDAB #$30 ;SUMA 30 PARA OBTENER EL ASCCII DEL VALOR ENTRE 0 Y 10 ABA ;QUE SE OBTUVO Y PODERLO MANDAR AL DISPLAY STAA UNIDAD STAA SCI1DRL ;ENVIA UNIDAD AL PUERTO SERIAL JSR CHECK JSR DATO LDAA #$D3 JSR COMANDO LDAA DECIMA ;DE LA SUBRUTINA HEXTOBCD SE OBTIENE DECIMA Y LDAB #$30 ;SUMA 30 PARA OBTENER EL ASCCII DEL VALOR ENTRE 0 Y 10 ABA ;QUE SE OBTUVO Y PODERLO MANDAR AL DISPLAY STAA DECIMA STAA SCI1DRL ;ENVIA DECIMA AL PUERTO SERIAL JSR CHECK JSR DATO LDAA CENTESIMA ;DE LA SUBRUTINA HEXTOBCD SE OBTIENE CENTESIMA Y LDAB #$30 ;SUMA 30 PARA OBTENER EL ASCCII DEL VALOR ENTRE 0 Y 10 ABA ;QUE SE OBTUVO Y PODERLO MANDAR AL DISPLAY STAA CENTESIMA STAA SCI1DRL ;ENVIA CENTESIMA AL PUERTO SERIAL JSR CHECK JSR DATO LDAA MILESIMA ;DE LA SUBRUTINA HEXTOBCD SE OBTIENE MILESIMA Y LDAB #$30 ;SUMA 30 PARA OBTENER EL ASCCII DEL VALOR ENTRE 0 Y 10 ABA ;QUE SE OBTUVO Y PODERLO MANDAR AL DISPLAY STAA MILESIMA STAA SCI1DRL ;ENVIA MILESIMA AL PUERTO SERIAL JSR CHECK JSR DATO LDAA DIEZMILESIMA ;DE LA SUBRUTINA HEXTOBCD SE OBTIENE MILESIMA Y LDAB #$30 ;SUMA 30 PARA OBTENER EL ASCCII DEL VALOR ENTRE 0 Y 10 ABA ;QUE SE OBTUVO Y PODERLO MANDAR AL DISPLAY STAA DIEZMILESIMA STAA SCI1DRL ;ENVIA DIEZMILESIMA AL PUERTO SERIAL JSR CHECK JSR DATO JMP CONVERSION ;*********************************************;***********SUBRUTINAS************************;********************************************* HEXTOBCD: CLR UNIDAD ;*SUBRUTINA HEXTOBCD CLR DECIMA ;* CLR CENTESIMA ;*ESTA SUBRUTINA PERMITE CONVERTIR EL RESULTADO CLR MILESIMA ;*OBTENIDO DEL CAD A CUATRO DIGITOS EN FORMATO CLR DIEZMILESIMA ;*BCD DE LA SIGUEINTE FORMA CLR TEMPORAL_H ;*UNIDAD, PUNTO DECIMAL, DECIMA, CENTESIMA, MILESIMA, DIEZMILESIMA CLR TEMPORAL_L ;*AQUI SE CHECA QUE EL RESULTADO DEL CAD NO CPX TEMPORAL_H ;*SEA CERO, PARA NO DECREMENTAR UNO DE CERO Y CON BEQ SALIDA ;*ESTO NOS ENVIE UN RESULTADO EN EL LCD EQUIVOCADO LOOP: DEX ;*PRIMERAMENTE DE DECREMENTA X (RESULTADO DEL CAD) INC DIEZMILESIMA ;*SE INCREMENTA DIEZMILESIMA LDAA #$0A CMPA DIEZMILESIMA ;*SE CHECA SI DIEZMILESIMA SEA IGUAL A 10 BEQ UNO ;*SI DIEZMILESIMA ES IGUAL A 10 SALTA A UNO CPX TEMPORAL_H ;*SE CHECA SI X ES IGUAL A TEMPORAL_H O IGUAL A CERO BEQ SALIDA ;*SI X ES IGUAL A CERO SALTA A SALIDA BRA LOOP ;*SE SALTA A LOOP EN CASO DE QUE DIEZMILESIMA ES MENOR QUE DIEZ Y X ES MAYOR QUE CERO UNO: CLR DIEZMILESIMA ;*DIEZMILESIMA ES IGUAL A CERO INC MILESIMA ;*SE INCREMENTA MILESIMA LDAA #$0A CMPA MILESIMA ;*SE CHECA SI MILESIMA SEA IGUAL A 10 BEQ DOS ;*SI MILESIMA ES IGUAL A 10 SALTA A DOS CPX TEMPORAL_H ;*SE CHECA SI X ES IGUAL A TEMPORAL_H O IGUAL A CERO BEQ SALIDA ;*SI X ES IGUAL A CERO SALTA A SALIDA BRA LOOP ;*SE SALTA A LOOP EN CASO DE QUE MILESIMA ES MENOR QUE DIEZ Y X ES MAYOR QUE CERODOS: CLR MILESIMA ;*MILESIMA ES IGUAL A CERO INC CENTESIMA ;*SE INCREMENTA CENTESIMA LDAA #$0A CMPA CENTESIMA ;*SE CHECA SI CENTESIMA SEA IGUAL A 10 BEQ TRES ;*SI CENTESIMA ES IGUAL A 10 SALTA A TRES CPX TEMPORAL_H ;*SE CHECA SI X ES IGUAL A TEMPORAL_H O IGUAL A CERO BEQ SALIDA ;*SI X ES IGUAL A CERO SALTA A SALIDA BRA LOOP ;*SE SALTA A LOOP EN CASO DE QUE CENTESIMA ES MENOR QUE DIEZ Y X ES MAYOR QUE CEROTRES: CLR CENTESIMA ;*CENTESIMA ES IGUAL A CERO INC DECIMA ;*SE INCREMENTA DECIMA LDAA #$0A CMPA DECIMA ;*SE CHECA SI DECIMA SEA IGUAL A 10 BEQ CUATRO ;*SI DECIMA ES IGUAL A 10 SALTA A CUATRO CPX TEMPORAL_H ;*SE CHECA SI X ES IGUAL A TEMPORAL_H O IGUAL A CERO BEQ SALIDA ;*SI X ES IGUAL A CERO SALTA A SALIDA BRA LOOP ;*SE SALTA A LOOP EN CASO DE QUE DECIMA ES MENOR QUE DIEZ Y X ES MAYOR QUE CEROCUATRO CLR DECIMA ;*CENTESIMA ES IGUAL A CERO INC UNIDAD ;*SE INCREMENTA UNIDAD CPX TEMPORAL_H ;*SE CHECA SI X ES IGUAL A TEMPORAL_H O IGUAL A CERO BEQ SALIDA ;*SI X ES IGUAL A CERO SALTA A SALIDA BRA LOOP SALIDA: RTS TIEMPO: LDY #$8000 ;*SUBRUTINA DE TIEMPOFLAG: DEY BNE FLAG RTS MENSAJESER: LDAA #$56 ;V STAA SCI1DRL JSR CHECK LDAA #$4F ;O STAA SCI1DRL JSR CHECK LDAA #$4C ;L STAA SCI1DRL JSR CHECK LDAA #$54 ;T STAA SCI1DRL JSR CHECK LDAA #$41 ;A STAA SCI1DRL JSR CHECK LDAA #$4A ;J STAA SCI1DRL JSR CHECK LDAA #$45 ;E STAA SCI1DRL JSR CHECK LDAA #$3A ;: STAA SCI1DRL JSR CHECK RTS CHECK: BRCLR SCI1SR1,$80,CHECK RTS ;*SUBRUTINA DE MENSAJE, ENVIA LOS SIGUIENTES CARACTERES PARA UN LCD DE 32x2MENSAJE: LDAA #$43 ;C JSR DATO LDAA #$4F ;O JSR DATO LDAA #$4E ;N JSR DATO LDAA #$56 ;V JSR DATO LDAA #$45 ;E JSR DATO LDAA #$52 ;R JSR DATO LDAA #$54 ;T JSR DATO LDAA #$49 ;I JSR DATO LDAA #$44 ;D JSR DATO LDAA #$4F ;O JSR DATO LDAA #$52 ;R JSR DATO LDAA #$8E JSR COMANDO LDAA #$41 ;A JSR DATO LDAA #$4E ;N JSR DATO LDAA #$41 ;A JSR DATO LDAA #$4C ;L JSR DATO LDAA #$4F ;O JSR DATO LDAA #$47 ;G JSR DATO LDAA #$49 ;I JSR DATO LDAA #$43 ;C JSR DATO LDAA #$4F ;O JSR DATO LDAA #$2D ;- JSR DATO LDAA #$44 ;D JSR DATO LDAA #$49 ;I JSR DATO LDAA #$47 ;G JSR DATO LDAA #$49 ;I JSR DATO LDAA #$54 ;T JSR DATO LDAA #$41 ;A JSR DATO LDAA #$4C ;L JSR DATO LDAA #$C9 JSR COMANDO LDAA #$56 ;V JSR DATO LDAA #$4F ;O JSR DATO LDAA #$4C ;L JSR DATO LDAA #$54 ;T JSR DATO LDAA #$41 ;A JSR DATO LDAA #$4A ;J JSR DATO LDAA #$45 ;E JSR DATO LDAA #$D2 JSR COMANDO LDAA #$2E ;. JSR DATO LDAA #$0C JSR COMANDO RTS ;*PARA OTRO TAMAÑO DE LCD SE RECOMIENDA CAMBIAR ;*EL TEXTO DE MENSAJE PARA PODER SER VISIBLE COMANDO: STAA AUX ;*SUBRUTINA COMANDO STAA AUX1 ;************************************* LDAA #$F0 ;ESTA SUBRUTINA PERMITE ENVIAR COMANDOS ANDA AUX ;O INSTRUCCIONES AL LCD STAA AUX2 ;ESTA DISEÑADA PARA 4 BITS ORAA #$08 ;Y EN ESTE CASO ENVIA LOS 4 BITS MAS STAA AUX ;SIGNIFICATIVOS PRIMERO, ACCIONA EL ASL AUX1 ;ENABLE DEL LCD; ENVIA LOS 4 BITS MENOS ASL AUX1 ;SIGNIFICATIVOS Y POR ULTIMO ACCIONA ASL AUX1 ;************************************** ASL AUX1 ;* LDAA AUX1 STAA AUX3 ORAA #$08 STAA AUX1 LDAA AUX STAA PORTB JSR TIEMPO LDAA AUX2 STAA PORTB JSR TIEMPO LDAA AUX1 STAA PORTB JSR TIEMPO LDAA AUX3 STAA PORTB RTS ;*SUBRUTINA DATODATO: STAA AUX ;************************************* STAA AUX1 ;ESTA SUBRUTINA PERMITE ENVIAR DATOS O LDAA #$F0 ;O EL CARACTER A DEPLEGAR AL LCD ANDA AUX ;ESTA DISEÑADA PARA 4 BITS STAA AUX ;Y EN ESTE CASO ENVIA LOS 4 BITS MAS ASL AUX1 ;SIGNIFICATIVOS PRIMERO, ACCIONA EL ASL AUX1 ;ENABLE DEL LCD; ENVIA LOS 4 BITS MENOS ASL AUX1 ;SIGNIFICATIVOS Y POR ULTIMO ACCIONA ASL AUX1 ;NUEVAMENTE EL ENABLE DEL LCD LDAA #$0A ;************************************** ORAA AUX ;* STAA AUX LDAA #$0A ORAA AUX1 STAA AUX1 LDAA #$F2 ANDA AUX STAA AUX2 LDAA #$F2 ANDA AUX1 STAA AUX3 LDAA AUX STAA PORTB JSR TIEMPO LDAA AUX2 STAA PORTB JSR TIEMPO LDAA AUX1 STAA PORTB JSR TIEMPO LDAA AUX3 STAA PORTB RTS ;*********************************************;***********INTERUPCIONES*********************;********************************************* ORG $FFFE ;ORIGEN DEL VECTOR DE INTERRUPCIONES FDB CICLO ;PARA ESTE MICRO ES DE $FF00 A $FFFF END
Could you perhaps try to write to the Baud Rate and Control registers as two 8-bit writes instead of one 16-bit write. For the Baud Rate register the writing order of the Hi and Lo bytes is significant. This initialision routine works for me (HCS12DT):
Code:
#define BAUD_REG_VAL 65 /* 20MHz / 16 / 65 = 19231 bps => 0.16% error */void SCI_init(void) { SCI0BDH = BAUD_REG_VAL >> 8; /* Set the bit-rate */ SCI0BDL = BAUD_REG_VAL & 0xFF; SCI0CR1 = 0; /* 1 start, 8 data, 1 stop, no parity */ SCI0CR2 = 0; /* disable receiver, transmitter and interrupts */ SCI0CR2_RE = 1; /* enable receiver */ SCI0CR2_RIE = 1; /* enable receiver interrupt */ SCI0CR2_TE = 1; /* enable transmitter */}