Autor Tema: AYUDA POR FAVOR CON RECEPCION DE BYTES EN dsPIC  (Leído 6686 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cvlaso

  • PIC10
  • *
  • Mensajes: 14
AYUDA POR FAVOR CON RECEPCION DE BYTES EN dsPIC
« en: 08 de Noviembre de 2021, 13:04:21 »
Código: [Seleccionar]
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
;****************************************************
]

Desconectado cvlaso

  • PIC10
  • *
  • Mensajes: 14
Re:AYUDA POR FAVOR CON RECEPCION DE BYTES EN dsPIC EN ASSEMBLER
« Respuesta #1 en: 08 de Noviembre de 2021, 16:58:00 »
Código: [Seleccionar]
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
;****************************************************
]

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:AYUDA POR FAVOR CON RECEPCION DE BYTES EN dsPIC
« Respuesta #2 en: 09 de Noviembre de 2021, 09:48:22 »
Eso de publicar todo un código grande y decir ayuda por favor es como decir "Se me cayó una aguja en un pajar", ayúdenme a buscarlo.

Tienes que publicar la parte donde tienes el problema.

Que has intentado para solucionarlo.

Indica como calculaste la velocidad del puerto serial.

Es muy poco probable que alguien te ayude con esa manera.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:AYUDA POR FAVOR CON RECEPCION DE BYTES EN dsPIC
« Respuesta #3 en: 10 de Noviembre de 2021, 23:24:14 »
Citar
Será la velocidad por favor díganme si el U1BRG está bien calculado.

El valor esta bien calculado, con 64, y un cristal de 20Mhz, tendrias una velocidad de 9615

Hay un par de cosas que no veo bien... especialmente en la configuracion de la UART.

Hay muchos bits que son solo lectura, y por lo tanto no es necesario modificarlos, por ejemplo los del U1STA,0
Activas la UART y todavia no terminaste de configurarla, es decir, esta instruccion:

    bset U1MODE,#15   ;bit 15=1,    HABILITA LA UAR

Deberia ser tu última de la rutina.

Por otro lado

    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

El bit 12 activa la recepcion

URXEN: UARTx Receive Enable bit(1)
1 = Receive is enabled, UxRX pin is controlled by UARTx

Y lo tenes en 0

El bit 13 y 15 es para interrupcion en TRANSMISION! no recepcion. Y el bit 14, si tenes el IREN en 0 (bit 12 de U1MODE) significa el estado idle del pin de transmisión.

https://ww1.microchip.com/downloads/en/DeviceDoc/70000582e.pdf (Paginas 6,7 y 8)

Desconectado cvlaso

  • PIC10
  • *
  • Mensajes: 14
Re:AYUDA POR FAVOR CON RECEPCION DE BYTES EN dsPIC
« Respuesta #4 en: 11 de Noviembre de 2021, 12:39:49 »
Código: [Seleccionar]
Hola KillerJc,  muchas gracias por tu ayuda.
Atento a lo que me dijiste, no tuve buenos resultados con la recepción de los byte asi que
Ahora estoy probando la transmisión con un programa que me muestra los caracteres recibidos en el PC a ver si esto me ayuda a resolver el problema de la recepción después.
También tengo problemas con la transmisión ojalá puedas ayudar con lo que estuviese mal. Te adjunto el código de la configuración.
Preguntas para la transmisión
El bit IREN,  U1MODE,#12 lo dejo en cero para no usar el modo IRDA, está bien?
EL bit UTXINV , U1STA,#14 tambien lo dejo en cero por lo mismo, esta bien?

Esta configuración transmite y no se por que me entrega los bytes diferentes

Al enviar haciendo el loop, mov #0b0000000001000001,w5

recibo en el Real term

00000000 00001100 11111100 00001100 11111100 00001100 11111100 00001100
11111100 00001100 11111100 00001100 11111100

Al enviar >> mov.b   #0xA,w5

recibe

00000000 01110000 00000000 01110000 00000000 01110000 00000000 01110000
00000000 01110000 00000000 01110000 00000000

al enviar , mov   #0x41,w5
 recibe
00000000 00001100 11111100 00001100 11111100 00001100 11111100 00001100
11111100 00001100 11111100 00001100 11111100 

No logro encontrar si recibe algun complemento u otra cosa

M Gracias de nuevo

[code***CONFIGURACION***

 ON_TXRX1:
   mov #64,W0 ;CARGO BAUD RATE 9600 BAUD CON BRGH=0
   mov W0,U1BRG 

    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 8 BIT DE DATA SIN PARIDAD
    bclr U1MODE,#2 ;bit 2, =0 8 BIT DE DATA SIN PARIDAD   
    bclr U1MODE,#3 ;bit 3, =0     BRGH HIGH BAUD RATE ENABLE BIT
    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,    IREN, iRda DEHABILITADO = 0
    bclr U1MODE,#13 ;bit 13=0,    CONTINUA OPERANDO EN en IDLE MODE
    bclr U1MODE,#14 ;bit 14,        no implementad
    bclr U1MODE,#15 ;bit 15=1,    HABILITA LA UART

;VER PAG 216 UART TX STATUS AND CONTROL REGISTER
   
    bclr U1STA,#0 ;bit 0, =0 AVISO DE 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
    bclr U1STA,#13 ;bit 13=0,    SIN INTERRUPC CUANDO SE TRANSMITE UN CHAR
    bclr U1STA,#14 ;bit 14=0     UTXINV. IRDA
    bclr U1STA,#15 ;bit 15=1,    CON/SIN INTERRUPC CUANDO SE TRANSMITE UN CHAR
 

bclr    IEC0,#12 ;BIT U1TXIE, DESHABILITA INTERRUPCIÓN POR TRANSMISION DE
          ;CARACTER DE LA UART1, pág 99
bclr    IEC0,#11 ;BIT U1RXIE, DESHABILITA INTERRUPCIÓN POR RECEPCION DE
          ;CARACTER DE LA UART1, pág 99
 
bclr U1MODE,#15 ;BORRA BUFFER
bset U1MODE,#15

    bset U1MODE,#15 ;bit 15=1,    HABILITA LA UART
  bset U1STA,#10 ;bit 10=1 TRANSMIT ENABLE BIT (se habilita)

    call TPO_RET_T23_6 ;retardo
    call RET_T23_GEN

   RETURN

 **********LOOP DE TRANSMISION

MANDA_A:
mov      #65,W5 ; L
; mov #0b0000000001000001,w5

     call TPO_RET_T23_6  ;RETARDO
        call RET_T23_GEN
DISPON:
    btsc  U1STA,#9        ;BUFFER DISPONIBLE??
    BRA  DISPON

   
 call TPO_RET_T23_6  ; RETARDO
    call RET_T23_GEN
    CALL   TX_FIN
    call TPO_RET_T23_6
    call RET_T23_GEN

BRA MANDA_A


TX_FIN:
    mov      w5,U1TXREG
LP_TXFIN:
    btss U1STA,#8 ;TRANSMISIÓN TERMINADA ?? =1 => terminada  (DE LECTURA)
    BRA LP_TXFIN
    RETURN 

]
« Última modificación: 12 de Noviembre de 2021, 15:43:11 por cvlaso »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:AYUDA POR FAVOR CON RECEPCION DE BYTES EN dsPIC
« Respuesta #5 en: 14 de Noviembre de 2021, 10:59:52 »
Disculpa la demora, porque tengo bastante cosas para hacer y casi no puedo dedicarme al foro..

En todo caso comenza con lo mas sencillo posible, crea un programa nuevo, con solo configurar los puertos como corresponde. Y luego crear un loopback para la UART, por ahora sin interrupciones. Y si todo funciona, luego le agregas las interrupciones.

Código: ASM
  1. INICIALIZAR_UART:  
  2.  
  3.     clr U1MODE              ; Todo a 0, todos los bits por igual, aunque inicien a 0
  4.     clr U1STA               ; Me aseguro que este en 0
  5.  
  6.     mov  #0x40,W0           ;CARGO BAUD RATE 9600 BAUD CON BRGH=0 decimal 64
  7.     mov  W0,U1BRG
  8.  
  9.     bset U1STA,URXEN        ; Si tenes el .inc incorporado deberias poder usar esto. Sino buscalo dentro del .inc,  HABILITO LA RECEPCION
  10.     bset U1STA,UTXEN        ; Habilito la transmision
  11.  
  12.  
  13.     ;bclr    IFS0,U1RXIF     ; Por las dudas borro el flag
  14.     ;bset    IEC0,U1RXIF     ; Habilito la interrupcion por RX
  15.  
  16.  
  17.     bset    U1MODE,UARTEN   ;Habilito la UART
  18.  
  19.     call    TPO_RET_T23_6   ;retardo
  20.     call    RET_T23_GEN
  21.  
  22.    RETURN
  23.  
  24.  ;********** MAIN LOOP - INFINITO
  25.  
  26. LOOP:
  27.    
  28.     BTSS    IFS0,U1RXIF    ;A pesar que no esta activa la interrupcion puedo usar el flag para saber si llego
  29.     BRA     LOOP
  30.     MOV     U1RXREG,W0
  31.     MOV     W0, U1TXREG
  32.     BCLR    IFS0,U1RXIF
  33.     BRA     LOOP

El programa solo haria de enviar lo que recibe. Es decir en tu terminal verias el doble, envias una "a", recibis una "a".
Eso es lo minimo.

Desconectado cvlaso

  • PIC10
  • *
  • Mensajes: 14
Re:AYUDA POR FAVOR CON RECEPCION DE BYTES EN dsPIC
« Respuesta #6 en: 14 de Noviembre de 2021, 20:06:09 »
Gracias por reponder
Lo veo y te cuento
Saludos


 

anything