Hola a todos
Este código assembler , lo uso en un dsPIC 33fj64MC506, para recibir bytes desde mi PC enviados con el programa consola TERA TERM, el pic conectado a un MaX 232, el puerto Com3 funciona ok. En el código activo la rutina de interrupción cuando recibo un byte desde el pc y lo muestro en el display bit a bit
Mi problema es que recibo 00000011 cuando envío A, o B o C y recibo 00000010 cuando envío una D.
Esperaria ver el byte es ASCII, un decimal 65 == A o Hexadecimal 41.
Será la velocidad por favor díganme si el U1BRG está bien calculado.
Muchas Gracias por su ayuda
[code
.equ __p33FJ64MC506, 1
.include "F: \PROG_CONTROL\p33FJ64MC506.inc"
.include "F: \PROG_CONTROL\V_DETECTOR.inc"
;/******************************************************************************/
;/* Configuration bits */
;/******************************************************************************/
;................................................................
;CONFIGURACIÓN DEL DSPIC33FJ64MC506
config __FOSCSEL,FNOSC_PRI ;//Primary oscillator (XT, HS, EC)sin pll
config __POSCMD_HS ;//Cristal HS.;POSCMD_HS=HS oscillator 20 MHZ
config __FBS, BWRP_WRPROTECT_OFF ; Proteccion de codigo desabilitado
config __FGS, GSS_OFF & GWRP_OFF ;
config __FWDT, FWDTEN_OFF & WINDIS_OFF ;Desabilitado Watchdog Timer
config __FPOR, PWMPIN_OFF & FPWRT_PWR16 ; EL dspic empieza a funcionar despues de 16ms
.global __reset
.global __U1RXInterrupt ;Declaracion de Interrupción para recepcion de caracter
.text ;Start of Code section
goto START
;///////////////////////////////////////
;RUTINA DE INTERRUPCION
__U1RXInterrupt:
PUSH.S
bclr IEC0,#11 ;DESHABILITA INTERRUPCIÓN POR RECEPCION DE
;CARACTER DE LA UART1, pág 99
mov U1RXREG,W9
; mov #5,W9 PARA PRUEBAS DEL DESPLIEGUE EN DISPLAY
BCLR IFS0, #U1RXIF ;Clear the U1RXIF Interrupt flag Status bit.
;****CONTROL DEL DISPLAY PARA MOSTRAR BYTE RECIBIDO
;**************************************************
call CLEAR ;limpia el display
mov #0,w0 ;cursor a posicion 21 primer lugar linea 2
mov w0,pos_car ;PARA pos_car = 21 pone cursor en primer lugar linea 2
CALL P_CURSOR1 ;PARA pos_car = 0 pone cursor en primer lugar linea 1
CALL E_BYTE ;ESCRIBE BYTE
SALIR:
bclr U1MODE,#15 ;BORRA U1RXREG
BSET U1MODE,#15
POP.S
BCLR IFS0, #U1RXIF ;Clear the U1RXIF Interrupt flag Status bit.
bset IEC0,#11 ;HABILITA INTERRUPCIÓN POR RECEPCION DE
;CARACTER DE LA UART1, pág 99
RETFIE
;////////////////////////////////
;INICIO PROGRAMA
;////////////////////////////////////
__reset:
START:
CALL INICIALIZA ;INICIALIZA PORTS
CALL ON_TXRX1 ;INICIALIZA PUERTO RX
CALL _INI_INTERRUPTS ;INICIALIZA INTERRUPCIONES
BSET U1MODE,#15 ;UART HABILITADA
CALL INI_DISPLAY ;INICIALIZA DISPLAY, SE OMITE ESTA RUTINA EN ESTE ARCHIVO
CALL DISPLAY_INICIAL ;ESCRIBE DISPLAY INICIAL ,SE OMITE ESTA RUTINA EN ESTE ARCHIVO
Espera_byte: ;ESPERA DE BYTES DE RECEPCION
bra espera_byte
;FIN PROGRAMA
;*************************************************
;RUTINA PARA ESCRIBIR BYTE RECIBIDO EN DISPLAY
;*************************************************
E_BYTE:
BTSS W9,#15 ;ESCRIBE DATA RECIBIDA
CALL ESC_CERO
BTSC W9,#15 ;ESCRIBE DATA RECIBIDA
CALL ESC_UNO
BTSS W9,#14 ;ESCRIBE DATA RECIBIDA
CALL ESC_CERO
BTSC W9,#14 ;ESCRIBE DATA RECIBIDA
CALL ESC_UNO
BTSS W9,#13 ;ESCRIBE DATA RECIBIDA
CALL ESC_CERO
BTSC W9,#13 ;ESCRIBE DATA RECIBIDA
CALL ESC_UNO
BTSS W9,#12 ;ESCRIBE DATA RECIBIDA
CALL ESC_CERO
BTSC W9,#12 ;ESCRIBE DATA RECIBIDA
CALL ESC_UNO
BTSS W9,#11 ;ESCRIBE DATA RECIBIDA
CALL ESC_CERO
BTSC W9,#11 ;ESCRIBE DATA RECIBIDA
CALL ESC_UNO
BTSS W9,#10 ;ESCRIBE DATA RECIBIDA
CALL ESC_CERO
BTSC W9,#10 ;ESCRIBE DATA RECIBIDA
CALL ESC_UNO
BTSS W9,#9 ;ESCRIBE DATA RECIBIDA
CALL ESC_CERO
BTSC W9,#9 ;ESCRIBE DATA RECIBIDA
CALL ESC_UNO
BTSS W9,#8 ;ESCRIBE DATA RECIBIDA
CALL ESC_CERO
BTSC W9,#8 ;ESCRIBE DATA RECIBIDA
CALL ESC_UNO
BTSS W9,#7 ;ESCRIBE DATA RECIBIDA
CALL ESC_CERO
BTSC W9,#7 ;ESCRIBE DATA RECIBIDA
CALL ESC_UNO
BTSS W9,#6 ;ESCRIBE DATA RECIBIDA
CALL ESC_CERO
BTSC W9,#6 ;ESCRIBE DATA RECIBIDA
CALL ESC_UNO
BTSS W9,#5 ;ESCRIBE DATA RECIBIDA
CALL ESC_CERO
BTSC W9,#5 ;ESCRIBE DATA RECIBIDA
CALL ESC_UNO
BTSS W9,#4 ;ESCRIBE DATA RECIBIDA
CALL ESC_CERO
BTSC W9,#4 ;ESCRIBE DATA RECIBIDA
CALL ESC_UNO
BTSS W9,#3 ;ESCRIBE DATA RECIBIDA
CALL ESC_CERO
BTSC W9,#3 ;ESCRIBE DATA RECIBIDA
CALL ESC_UNO
BTSS W9,#2 ;ESCRIBE DATA RECIBIDA
CALL ESC_CERO
BTSC W9,#2 ;ESCRIBE DATA RECIBIDA
CALL ESC_UNO
BTSS W9,#1 ;ESCRIBE DATA RECIBIDA
CALL ESC_CERO
BTSC W9,#1 ;ESCRIBE DATA RECIBIDA
CALL ESC_UNO
BTSS W9,#0 ;ESCRIBE DATA RECIBIDA
CALL ESC_CERO
BTSC W9,#0 ;ESCRIBE DATA RECIBIDA
CALL ESC_UNO
return
;*************************************************
;RUTINAS DE INICIALIZACIÓN
;*************************************************
ON_TXRX1: ;VER PAG 216 UART TX MODE REGISTER
;XTAL OSCILADOR 20 MHZ = FOSC
mov #64,W0 ;CARGO BAUD RATE 9600 BAUD CON BRGH=0, PAGINA 214 MANUAL DSPIC
mov W0,U1BRG ;CON BRGH=0 ENTONCES U1BRG= ((FCY/(16* BAUDRATE))-1
; FCY = FOSC/2 = 10MHZ, ENTONCES U1BRG= (10.000.000/(16*9600))-1 = 64…
bclr U1MODE,#3 ;bit 3, =0 BRGH HIGH BAUD RATE ENABLE BIT
bclr U1MODE,#0 ;bit 0, =0 UNO O DOS STOP BITS, SOLO UNO =0
bclr U1MODE,#1 ;bit 1, =0 SIN BIT DE DATA SIN PARIDAD
bclr U1MODE,#2 ;bit 2, =0 SIN PARIDAD
bclr U1MODE,#4 ;bit 4, =0 RECIEVED POLARITY INVERSION BIT
bclr U1MODE,#5 ;bit 5, =0 AUTO BAUD RATE DESHABILITADO
bclr U1MODE,#6 ;bit 6, =0 LOPBACK DESHABILITADO
bclr U1MODE,#7 ;bit 7, =0 WAKE UP DESHABILITADO
bclr U1MODE,#8 ;bit 8, =0 U1RTS Y U1CTS DESHABILITADOS
bclr U1MODE,#9 ;bit 9, =0 U1RTS Y U1CTS DESHABILITADOS
bclr U1MODE,#10 ;bit 10, no implementado
bclr U1MODE,#11 ;bit 11=0, UxRTS EN SIMPLEX MODE
bclr U1MODE,#12 ;bit 12=0, iRda DEHABILITADO = 0
bclr U1MODE,#13 ;bit 13=0, CONTINUA OPERANDO EN en IDLE MODE
bclr U1MODE,#14 ;bit 14, no implementado
bset U1MODE,#15 ;bit 15=1, HABILITA LA UART
;VER PAG 216 UART TX STATUS AND CONTROL REGISTER
bclr U1STA,#0 ;bit 0, =0 BIT RECEPCION DE UN CARACTER EN EL BUFFER DE ENTRADA
bclr U1STA,#1 ;bit 1, =0 BUFFER DE RECEPCIÓN LLENO
bclr U1STA,#2 ;bit 2, =0 BIT DE ERROR DE FRAMING
bclr U1STA,#3 ;bit 3, =0 BIT DE ERROR DE PARIDAD
bclr U1STA,#4 ;bit 4, =0 RECIEVED IDLE BIT
bclr U1STA,#5 ;bit 5, =0 ADRESS DETECT MODE
bclr U1STA,#6 ;bit 6, =0 RECEIVED INTERRUPT MODE SELECTION BIT
bclr U1STA,#7 ;bit 7, =0 RECEIVED INTERRUPT MODE SELECTION BIT
bclr U1STA,#8 ;bit 8, =1 TRANSMISIÓN EN PROCESO=0 O TERMINADA =1 (DE LECTURA)
bclr U1STA,#9 ;bit 9, =1 BUFFER DE TX LLENO = 1 (DE LECTURA)
bclr U1STA,#10 ;bit 10=1 TRANSMIT ENABLE BIT (se habilita despues)
bclr U1STA,#11 ;bit 11=0 sin BREAK BIT
bclr U1STA,#12 ;bit 12=0, NC
bset U1STA,#13 ;bit 13=0, SIN INTERRUPC CUANDO SE TRANSMITE UN CHAR
bclr U1STA,#14 ;bit 14=0 IRDA
bset U1STA,#15 ;bit 15=1, CON INTERRUPC CUANDO SE RECIBE UN CHAR
RETURN
;///////////////////////////////////////////////
;INICIALIZACIÓN DE INTERRUPCIONES, ver pág 81, y 127 manual
_INI_INTERRUPTS:
;******** INDICADORES DE OCURRENCIA
;INTCON1: INTERRUPT CONTROL REGISTER 1, PAG 87
bset INTCON1,#15 ;Sin Interrupciones anidadas
;IFS0: INTERRUPT FLAG STATUS REGISTER 0, PAG 90
;bit de aviso de ocurrencia de interrupción
bclr IFS0,#12
bclr IFS0,#11 ;RESET DEL BIT INDICADOR DE OCURRENCIA DE INTERRUPCIÓN POR RECEPCIÓN
;*********HABILITACIÓN DE LA INTERRUPCIÓN
; IEC0: INTERRUPT ENABLE CONTROL REGISTER 0, PAG 99
bclr IEC0,#12 ;deshabilito interrupciones por transmisión
bset IEC0,#11 ;HABILITA INTERRUPCIÓN POR RECEPCION DE
;CARACTER DE LA UART1, pág 99
;********* PRIORIDAD DE LA INTERRUPCIÓN, PAG 108
;La CPU comienza en el reset con una prioridad igual a 0, y todas las interrupciones con una prioridad igual a 4
bset IPC2,#12 ;Set de prioridad de la interrupción por recepcion de caracter, pág 110
bclr IPC2,#13 ;PAG 108
bclr IPC2,#14
;INTTREG: INTERRUPT CONTROL AND STATUS REGISTER, PAG 126
;**********valores de un nueva prioridad de CPU y las interrupciones pendientes
;**********Esto lo maneja el controlador de interrupciones
; SR: CPU STATUS REGISTER(1), PAG 86
;- Registro STATUS, mantiene los bits STATUS de la ALU, del DSP y el valor de prioridad del nucleo actual.
;CORCON: CORE CONTROL REGISTER, PAG 86
;Aqui hay un solo bit que permite la seleccion de una prioridad mayor a 7 o menor o igual a 7 para la CPU
;bclr IEC1,#15 ;DESHABILITA INTERRUPCIÓN POR TX UART2
;bclr IEC1,#14 ;DESHABILITA INTERRUPCIÓN POR RECEPCION DE
RETURN
;*********************************************************
;***INICIALIZACIÓN DE PORTS Y OTROS***
;**************************************************
INICIALIZA:
;CARACTER DE LA UART2, pág 98, 99
CLR Comandos
CLR IC6CON
CLR IC6BUF
CLR OC6CON
CLR OC6R
CLR OC6RS
CLR CNEN1
CLR CNEN2
CLR CNPU2
CLR CNPU1
;**************************************************************************************************
;//////////////////////////////////////////////////////////////////////////////////////////////////
;**RUTINA DE INICIALIZACION DE PUERTOS**
INI_PUERTOS:
;PUERTO D
;/////////////////////////////
;********
;clr LATD
;EXISTEN RD0 AL RD11
mov #0b1111000010000000,W0 ;INICIALIZACION DEL PORTD (RD0 AL RD6 >> DB0 AL DB7 DEL DISPLAY)
nop ;SALIDAS PARA INICIALIZAR DISPLAY
mov W0,TRISD ;PORTD7 ENTRADA PARA EL BUSY CHECK DEL DISPLAY
clr PORTD ;SE CAMBIA A SALIDA P CONTROL DEL DISPLAY EN RUTINA BUS CHECK
;mov #0b0000000000000000,W0
;bset TRISD,#1
;nop
nop ;
;SALIDA OPEN DRAIN
;CLR ODCD
;9876543210
;mov #0b0000111100000000,W0
;mov W0, ODCD
;PUERTO E
;********
;clr PWMCON1 ;NO DESHABILITA FUNCION PWM DEL PORTE, PAG 177 MANUAL
;clr PWMCON2
clr CNEN1
clr CNEN2
clr CNPU1
clr CNPU2
clr LATE
mov #0b0000000000000000,W0 ;INICIALIZACION DEL PORTE
mov W0,TRISE ;RE
nop
nop
clr PORTE
mov #0b0000000000000000,W0 ;TODOS EN CERO
and.b LATE
;PUERTO B
;********
mov #0b1111111111111111,W0;
nop
nop
mov W0,AD1PCFGL ;PORTB COMO DIGITALES NO DEL CONVERSOR AD
; ;PAG 150 MANUAL
mov W0,AD1PCFGH
;COL 4, RB15 ENTRADA DE TECLADO
;SALIDA OPEN DRAIN, COLECTOR ABIERTO NO SE USA CON ESTE TECLADO
;CLR ODCD
;mov #0b0000000011110000,W0
;mov W0, ODCD
;CLR ODCF
nop
clr LATB
nop
mov #0b1111111111111100,W0 ;INICIALIZACION DEL PORTB, SALIDAS
nop ;RBO ; ENABLE DRIVER MOTOR ELEVADOR PELOTAS
;RB1 ;
mov W0,TRISB ;RB10 AL RB13 ENTRADAS DESDE TECLADO
nop
clr PORTB
;PUERTO C ;EXISTEN RC13 Y RC14
;///////////////////////////////////
;********
clr LATC
mov #0b1001111111111111,W0 ; INICIALIZACION DEL PORTC
nop ; PORTC,14 SALIDA RS DEL DISPLAY
mov W0,TRISC ; PORTC,13 SALIDA TEST LED DE TARJETA
;PUERTO F ;EXISTEN RF0 AL RF6
;********
clr LATF
mov #0b1111111111010100,W0 ;INICIALIZACION DEL PORTF ,
mov W0,TRISF ;PORTF,0 SALIDA ENABLE DEL DISPLAY
nop ;PORTF,1 SALIDA R/W DEL DISPLAY
nop
clr PORTF
CLR ODCF
;PUERTO F ;EXISTEN RF0 AL RF6
;/////////////////////////////////
;******** ;RF2 SOLO COMUNICACION U1RX, ENTRADA
;RF3 SOLO COMUNICACION U1TX, SALIDA TX
;RF4 SOLO COMUNICACION U1RX,ENTRADA RX
;RF5 SOLO COMUNICACION U1TX, SALIDA TX
;PUERTO G ;EXISTEN SOLO RG2,RG3, RG6, RG7, RG8 Y RG9
;////////////////////////////////
;********
clr LATG
clr PORTG
mov #0b0000000001000000,W0 ;INICIALIZACION DEL PORTG
mov W0,TRISG ;RG2 Y 3 SALIDAS A TECLADO
nop ;RG7 Y 8 SALIDAS A TECLADO
nop ;RG6 ENTRADA SENSOR CONTADOR DE VUELTAS
;SALIDA OPEN DRAIN, COLECTOR ABIERTO DEL PORTG
;PARA PORTG2,3,7 Y 8
CLR ODCG
mov #0b0000000110001100,W0
mov W0, ODCG
nop
nop
nop
clr PORTG
CLR LATG
;****************************************************
]