Autor Tema: Migración de código problemas  (Leído 2106 veces)

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

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Migración de código problemas
« en: 09 de Agosto de 2020, 02:00:59 »
Que tal colegas, espero se encuentren bien. Bueno pues esta ocasión les pido su valioso apoyo para hacer varias consultas. Verán tengo un circuito que replique y el hardware ya quedo el problema radica en el firmware ya que esta hecho en un PIC16F872 por cierto ya bastante maduro y viene protegido el codigo contra lectura, por este motivo no puedo replicarlo resulta que me pidieron realizar el código y con ayuda de un analizador lógico obtuve buenos resultados ya que casi tengo la estructura completa del codigo, pero el principal problema es que incorpora comunicación serial e I2C. Pero no lo hacen con hardware ya que me lo estan moviendo de pines a donde no esta el periferico, y el reto a cumplir es este, ya que como primer propuesta quise usar un PIC18F26K40 que tiene la opcion PPS y el serial ya quedo, pero el I2C no me funciona he intentado de muchas maneras manejarlo con el MCC y ejemplos que genera pero no puedo conseguir buenos resultados, tengo que leer y escribir una memori EEPROM 24FC256.

Para mi se me facilita mucho ASM pero para este micro en particular se me esta complicando demasiado ya que la manera tradicional en como programo no me cuadra con muchos registros que tiene este micro nuevo, al intentarlo en XC8 fue "mas rápido" sin embargo me sorprende que no pueda usar los mismos codigos que me da el MCC.

Alguno de ustedes me daria una mano para solucionar esto?

Mis opciones son pedir ayuda con ustedes para implementar una rutina en XC8 para comunicación I2C en el puerto RC4 como SCL y RC5 como SDA.

O que me puedan asesorar sobre como configurar en ASM esos perifericos, I2C RC4 y RC5. Serial en RC3 RX y RC2 TX.

Porque mi ultimo y menos deseado es implementar esto por software pero al tener un micro con PPS no me gustaria dejarlo sub utilizado.

Aca el ejemplo de donde me atoro que es en recepcion serial sin interrupcion:

Código: ASM
  1. STARTw
  2.     BTFSS   PIR3,RC1IF
  3.     GOTO    STARTw
  4.     MOVFF   RC1REG,LATB    
  5.     MOVLW   0XAA
  6.     CALL    TX_DATO
  7.     GOTO    STARTw

ya probe con otros registros de RC1STA y no me funciona de ninguna manera.

Este es todo el codigo que estoy construyendo en ASM:
Código: ASM
  1. #include "p18f26k40.inc"
  2.  
  3. ; CONFIG1L
  4.   CONFIG  FEXTOSC = XT          ; External Oscillator mode Selection bits (XT (crystal oscillator) above 100 kHz, below 8 MHz; PFM set to medium power)
  5.   CONFIG  RSTOSC = EXTOSC_4PLL  ; Power-up default value for COSC bits (EXTOSC with 4x PLL, with EXTOSC operating per FEXTOSC bits)
  6.  
  7. ; CONFIG1H
  8.   CONFIG  CLKOUTEN = OFF        ; Clock Out Enable bit (CLKOUT function is disabled)
  9.   CONFIG  CSWEN = ON            ; Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
  10.   CONFIG  FCMEN = OFF            ; Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
  11.  
  12. ; CONFIG2L
  13.   CONFIG  MCLRE = EXTMCLR       ; Master Clear Enable bit (If LVP = 0, MCLR pin is MCLR; If LVP = 1, RE3 pin function is MCLR )
  14.   CONFIG  PWRTE = OFF           ; Power-up Timer Enable bit (Power up timer disabled)
  15.   CONFIG  LPBOREN = OFF         ; Low-power BOR enable bit (ULPBOR disabled)
  16.   CONFIG  BOREN = SBORDIS       ; Brown-out Reset Enable bits (Brown-out Reset enabled , SBOREN bit is ignored)
  17.  
  18. ; CONFIG2H
  19.   CONFIG  BORV = VBOR_2P45      ; Brown Out Reset Voltage selection bits (Brown-out Reset Voltage (VBOR) set to 2.45V)
  20.   CONFIG  ZCD = OFF             ; ZCD Disable bit (ZCD disabled. ZCD can be enabled by setting the ZCDSEN bit of ZCDCON)
  21.   CONFIG  PPS1WAY = ON          ; PPSLOCK bit One-Way Set Enable bit (PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle)
  22.   CONFIG  STVREN = ON           ; Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
  23.   CONFIG  DEBUG = OFF           ; Debugger Enable bit (Background debugger disabled)
  24.   CONFIG  XINST = OFF           ; Extended Instruction Set Enable bit (Extended Instruction Set and Indexed Addressing Mode disabled)
  25.  
  26. ; CONFIG3L
  27.   CONFIG  WDTCPS = WDTCPS_31    ; WDT Period Select bits (Divider ratio 1:65536; software control of WDTPS)
  28.   CONFIG  WDTE = OFF             ; WDT operating mode (WDT enabled regardless of sleep)
  29.  
  30. ; CONFIG3H
  31.   CONFIG  WDTCWS = WDTCWS_7     ; WDT Window Select bits (window always open (100%); software control; keyed access not required)
  32.   CONFIG  WDTCCS = SC           ; WDT input clock selector (Software Control)
  33.  
  34. ; CONFIG4L
  35.   CONFIG  WRT0 = OFF            ; Write Protection Block 0 (Block 0 (000800-003FFFh) not write-protected)
  36.   CONFIG  WRT1 = OFF            ; Write Protection Block 1 (Block 1 (004000-007FFFh) not write-protected)
  37.   CONFIG  WRT2 = OFF            ; Write Protection Block 2 (Block 2 (008000-00BFFFh) not write-protected)
  38.   CONFIG  WRT3 = OFF            ; Write Protection Block 3 (Block 3 (00C000-00FFFFh) not write-protected)
  39.  
  40. ; CONFIG4H
  41.   CONFIG  WRTC = OFF            ; Configuration Register Write Protection bit (Configuration registers (300000-30000Bh) not write-protected)
  42.   CONFIG  WRTB = OFF            ; Boot Block Write Protection bit (Boot Block (000000-0007FFh) not write-protected)
  43.   CONFIG  WRTD = OFF            ; Data EEPROM Write Protection bit (Data EEPROM not write-protected)
  44.   CONFIG  SCANE = ON            ; Scanner Enable bit (Scanner module is available for use, SCANMD bit can control the module)
  45.   CONFIG  LVP = OFF             ; Low Voltage Programming Enable bit (HV on MCLR/VPP must be used for programming)
  46.  
  47. ; CONFIG5L
  48.   CONFIG  CP = OFF              ; UserNVM Program Memory Code Protection bit (UserNVM code protection disabled)
  49.   CONFIG  CPD = OFF             ; DataNVM Memory Code Protection bit (DataNVM code protection disabled)
  50.  
  51. ; CONFIG5H
  52.  
  53. ; CONFIG6L
  54.   CONFIG  EBTR0 = OFF           ; Table Read Protection Block 0 (Block 0 (000800-003FFFh) not protected from table reads executed in other blocks)
  55.   CONFIG  EBTR1 = OFF           ; Table Read Protection Block 1 (Block 1 (004000-007FFFh) not protected from table reads executed in other blocks)
  56.   CONFIG  EBTR2 = OFF           ; Table Read Protection Block 2 (Block 2 (008000-00BFFFh) not protected from table reads executed in other blocks)
  57.   CONFIG  EBTR3 = OFF           ; Table Read Protection Block 3 (Block 3 (00C000-00FFFFh) not protected from table reads executed in other blocks)
  58.  
  59. ; CONFIG6H
  60.   CONFIG  EBTRB = OFF           ; Boot Block Table Read Protection bit (Boot Block (000000-0007FFh) not protected from table reads executed in other blocks)
  61.  
  62. ;*****************************************************************************************
  63. ;************** ZONA DE DECLARACIÓN DE VARIABLES PARA PROGRAMA ***************************
  64. ;*****************************************************************************************  
  65.    CBLOCK
  66.    W_TEMP        
  67.    STATUS_TEMP    
  68.    BSR_TEMP  
  69.    PAUSE
  70.    PAUSE2
  71.    ENDC
  72. ;*****************************************************************************************
  73. ;*****************************************************************************************
  74. ;*****************************************************************************************
  75.     ORG 0X00
  76.     GOTO    RES_VECT
  77.     ORG 0x008                       ; ORIGEN ISR ALTA PRIORIDAD
  78.     GOTO    BAJA_PRIORIDAD
  79.     ORG 0x018                       ; ORIGEN ISR BAJA PRIORIDAD
  80. BAJA_PRIORIDAD
  81.     MOVWF   W_TEMP                  ; MUEVO EL ULTIMA VALOR DE W
  82.     MOVFF   STATUS,STATUS_TEMP      ; DE STATUS Y DE BSR
  83.     MOVFF   BSR,BSR_TEMP            ; PARA RESTAURARLOS AL VALOR ANTES DE LA INTERRUPCION
  84. FIN_INTER
  85.     MOVWF   W_TEMP                  ; MUEVO EL ULTIMA VALOR DE W
  86.     MOVFF   STATUS,STATUS_TEMP      ; DE STATUS Y DE BSR
  87.     MOVFF   BSR,BSR_TEMP            ; PARA RESTAURARLOS AL VALOR ANTES DE LA INTERRUPCION
  88.     RETURN  FAST                    ; REGRESO DE INTERRUPCION
  89. RES_VECT                            ; processor reset vector
  90. ; LOS REGISTROS PMD ESTAN ASOCIADOS A LOS PERIFERICOS Y EN ESTA SECCION SE PUEDEN DESHABILITAR
  91. ; CON EL OBJETIVO DE CONSEGUIR UN MENOR CONSUMO DE CORRIENTE
  92.     CLRF    PMD0                    ; LIMPIO REGISTRO PDM
  93.     CLRF    PMD1                    ; LIMPIO REGISTRO PDM
  94.     CLRF    PMD2                    ; LIMPIO REGISTRO PDM
  95.     CLRF    PMD3                    ; LIMPIO REGISTRO PDM
  96.     CLRF    PMD4                    ; LIMPIO REGISTRO PDM
  97.     CLRF    PMD5                    ; LIMPIO REGISTRO PDM
  98.     MOVLW   0X20                    ; CARGO LA CONFIGURACION
  99.     MOVWF   OSCCON1                 ; AL REGISTRO OSCCON1
  100.     CLRF    OSCCON3                 ; LIMPIO OSCCON3
  101.     CLRF    OSCEN                   ; LIMPIO REGISTRO
  102.     MOVLW   0X02                    ; ASIGNO EL VALOR QUE INDICA 4 MHZ
  103.     MOVWF   OSCFRQ                  ; PARA CONTROL DEL MICRO
  104.     CLRF    OSCTUNE                 ; LIMPIO ESTE REGISTRO PARA VELOCIDAD NOMINAL
  105. ;PLL_READY
  106. ;    BTFSC  OSCSTAT,PLLR            ; ESPERO A QUE SE ESTABILICE EL PLL
  107. ;    BRA    PLL_READY               ; ME REGRESO HASTA QUE SEA ESTABLE
  108. ;*****************************************************************************************
  109. ;**************** ZONA DE INICIALIZACION DE LOS PUERTOS Y PERIFERICOS ********************
  110. ;*****************************************************************************************
  111.     CLRF    LATA                    ; LIMPIO EL LATCH A
  112.     CLRF    LATB                    ; LIMPIO EL LATCH B
  113.     CLRF    LATC                    ; LIMPIO EL LATCH C
  114.     CLRF    TRISA                   ; CONFIGURACION PUERTO A
  115.     CLRF    TRISB                   ; CONFIGURACION PUERTO B
  116.     CLRF    TRISC                   ; CONFIGURACION PUERTO C
  117.     CLRF    ANSELA                  ; LIMPIO REGISTRO DE ADC PUERTO A
  118.     CLRF    ANSELB                  ; LIMPIO REGISTRO DE ADC PUERTO B
  119.     CLRF    ANSELC                  ; LIMPIO REGISTRO DE ADC PUERTO C
  120.     CLRF    WPUA                    ; APAGO RESISTENCIAS PULL UP
  121.     CLRF    WPUB                    ; APAGO RESISTENCIAS PULL UP
  122.     CLRF    WPUC                    ; APAGO RESISTENCIAS PULL UP    
  123.     CLRF    ODCONA                  ; REGISTRO OPEN DRAIN DE PUERTO
  124.     CLRF    ODCONB                  ; REGISTRO OPEN DRAIN DE PUERTO
  125.     CLRF    ODCONC                  ; REGISTRO OPEN DRAIN DE PUERTO
  126.     CLRF    SLRCONA                 ; AJUSTO EL SLEW RATE AL MAXIMO PUERTO A
  127.     CLRF    SLRCONB                 ; AJUSTO EL SLEW RATE AL MAXIMO PUERTO B    
  128.     CLRF    SLRCONC                 ; AJUSTO EL SLEW RATE AL MAXIMO PUERTO C    
  129.     MOVLW   0XFF                    ; CONFIGURACION DEL NIVEL DE ENTRADA EN REGISTRO
  130.     MOVWF   INLVLA                  ; ASOCIADO AL PUERTO A
  131.     MOVLW   0XFF                    ; CONFIGURACION DEL NIVEL DE ENTRADA EN REGISTRO
  132.     MOVWF   INLVLB                  ; ASOCIADO AL PUERTO B
  133.     MOVLW   0XFF                    ; CONFIGURACION DEL NIVEL DE ENTRADA EN REGISTRO
  134.     MOVWF   INLVLC                  ; ASOCIADO AL PUERTO C
  135.     MOVLW   0X08                    ; CONFIGURACION DEL NIVEL DE ENTRADA EN REGISTRO
  136.     MOVWF   INLVLE                  ; ASOCIADO AL PUERTO E
  137.    
  138. ;*****************************************************************************************
  139. ;**************** ZONA DE INICIALIZACION DE PUERTO SERIE A 2400 BAUDIOS ******************
  140. ;*****************************************************************************************    
  141.     MOVLW   0X08                    ; CONFIGURO LA GENERACION DE BAUDIOS A 16 BITS
  142.     MOVWF   BAUD1CON                ; CON EL REGISTRO ASOCIADO A SERIAL 1
  143.     MOVLW   0X90                    ; CONFIGURO LA RECEPCION DE 8 BITS
  144.     MOVWF   RC1STA                  ;
  145.     MOVLW   B'00100100';0X24                ; B'10010000'
  146.     MOVWF   TX1STA                  ;
  147.     MOVLW   0X82                    ; VAOR BAJO
  148.     MOVWF   SP1BRGL                 ; DE GENERADOR DE BAUDIOS
  149.     MOVLW   0X06                    ; VALOR ALTO DE
  150.     MOVWF   SP1BRGH                 ; GENERADOR DE BAUDIOS
  151.     BSF     TRISC,3                 ; CONFIGURO COMO ENTRADA EL PIN RC3 RX
  152.  
  153.     MOVLW  B'00010011'              ; CONFIGURO EL PUERTO RC3 COMO RX
  154.     MOVWF  RX1PPS                   ; DEL PUERTO SERIAL    
  155.    
  156. ;*******************************************************************************
  157.     BCF    INTCON,GIE               ; Disable interrupts:
  158.     BANKSEL PPSLOCK                 ; Bank to PPSLOCK register
  159.     MOVLW  0X55                     ; Required sequence, next 4 instructions
  160.     MOVWF  PPSLOCK                  ;
  161.     MOVLW  0XAA                     ;
  162.     MOVWF  PPSLOCK                  ; Clear PPSLOCKED bit to enable writes
  163.     BCF    PPSLOCK,PPSLOCKED        ; Only a BCF instruction will work
  164. ;*******************************************************************************  
  165. ;    MOVLW  B'00010011'             ; CONFIGURO EL PUERTO RC3 COMO RX
  166. ;    MOVWF  RX1PPS                  ; DEL PUERTO SERIAL
  167.     MOVLW  0X14                     ;
  168.     MOVWF  SSP1CLKPPS               ;
  169.     MOVLW  0X0F                     ;
  170.     MOVWF  RC4PPS                   ;
  171.     MOVLW   0X09                    ; CONFIGURO EL REGISTRO RC2 PPS
  172.     MOVWF   RC2PPS                  ; COMO TRANSMISION SERIAL TX  
  173.     MOVLW   0X10                    ; CONFIGURO EL REGISTRO RC5 PPS
  174.     MOVWF   RC5PPS                  ; COMO CANAL SDA DEL PUERTO I2C
  175.     MOVLW   0X15                    ;
  176.     MOVWF   SSP1DATPPS              ;
  177. ;*******************************************************************************    
  178.     BCF INTCON,GIE                  ;
  179.     BANKSEL PPSLOCK                 ; Bank to PPSLOCK register
  180.     MOVLW 0X55                      ; Required sequence, next 4 instructions
  181.     MOVWF PPSLOCK
  182.     MOVLW 0XAA
  183.     MOVWF PPSLOCK                   ; Set PPSLOCKED bit to disable writes
  184.     BSF PPSLOCK,PPSLOCKED           ; Only a BSF instruction will work
  185. ;   ;BSF INTCON,GIE                 ; Enable Interrupts
  186. ;*******************************************************************************
  187. ;*******************************************************************************
  188. ;*******************************************************************************
  189.     #DEFINE     REC_LED     LATC,6
  190.     #DEFINE     PLAY_LED    LATC,7
  191.     #DEFINE     PROGRAMA    PORTA,0
  192.     #DEFINE     START       PORTC,0
  193.     #DEFINE     ACCION      PORTA,1
  194. ;*******************************************************************************
  195. ;*******************************************************************************
  196. ;*******************************************************************************    
  197.     CALL    CONFIG_RETARDO
  198. ;*******************************************************************************
  199. ; MAIN PROGRAM
  200. ;*******************************************************************************
  201.  
  202. STARTw
  203.     BTFSS   PIR3,RC1IF
  204.     GOTO    STARTw
  205.     MOVFF   RC1REG,LATB    
  206.     MOVLW   0XAA
  207.     CALL    TX_DATO
  208.     GOTO    STARTw
  209.    
  210.    
  211.    
  212.     BTFSC   PIR3,RC1IF
  213.     BRA     RECIBIDO
  214.     BTFSS   RC1STA,OERR
  215.     GOTO    STARTw
  216.     BCF     RC1STA,SREN
  217.     NOP
  218.     BSF     RC1STA,SREN
  219.     GOTO    STARTw
  220.    
  221. RECIBIDO    
  222.  
  223.     ;CALL    RX_DATO
  224.     ;MOVWF   LATB
  225.                      
  226.  
  227.    
  228. TX_DATO
  229.     MOVWF   TX1REG
  230. TX_DAT
  231.     BTFSS   PIR3,TX1IF
  232.     GOTO    TX_DAT
  233.     BCF     PIR3,TX1IF
  234.     RETURN    
  235. RX_DATO
  236.  
  237.     BTFSS   PIR3,RC1IF
  238.     GOTO    RX_DATO
  239. ;    BTFSC   RC1STA,OERR
  240. ;    RETURN;LW   0XFF
  241. ;;    
  242.  
  243.     MOVF    RC1REG,W
  244.     BCF     PIR3,RC1IF
  245.     RETURN
  246.    
  247.    
  248.     ; SYNC SERIAL = 1
  249. ;#INCLUDE<RET.INC>    
  250.    
  251.     END

El XC8 lo construyo con el MCC. Y es mucho. La libreria RET.inc la implementare despues como una libreria de retardos.

Espero me puedan dar una mano. Saludos


Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:Migración de código problemas
« Respuesta #1 en: 11 de Agosto de 2020, 01:01:57 »
O alguna referencia que tengan del uso de estos pics con PPS?

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Migración de código problemas
« Respuesta #2 en: 12 de Agosto de 2020, 12:42:43 »
Siempre fue complejo el tema del PPS, no es algo sencillo de armar, pero no veo malo al codigo auto-generado del datasheet pude obtener que debo rellenar los registros con estos valores:

Entradas
10011 - 0x13 RC3 RX1PPS
10100 - 0x14 RC4 SSP1CLKPPS
10101 - 0x15 RC5 SSP1DATPPS


Salidas
RC2PPS 0x09    EUSART1 (TX/CK)
RC4PPS 0x0F    MSSP1 (SCK/SCL)
RC5PPS 0x10    MSSP1 (SDO/SDA)

Lo cual es parecido a lo que tenes en tu codigo.


Respecto a los pines bidireccionales:

Citar
PPS selections for peripherals with bidirectional signals on a single pin must be made so that the PPS input and PPS output select the same pin.
• EUSART (DT/RXxPPS and TX/CKxPPS pins for synchronous operation)
• MSSP (I2C SDA/SSPxDATPPS and SCL/SSPxCLKPPS)
Por eso mismo lo del I2C esta como entrada y salida, mientras que el EUSART como es asincrono no hace falta, solo defino entrada y salida por otro lado.

Solo a tener en cuenta:

Citar
The I2C default inputs, and a limited number of other alternate pins, are I2C and SMBus compatible. Clock and data signals can be routed to any pin, however pins without I2C compatibility will operate at standard TTL/ST logic levels as selected by the INLVL register. See the INLVL register for each port to determine which pins are I2C and SMBus compatible.

Esto no quiere decir que no vaya a funcionar en otros pines, solo que en estos los valores de "alto" y "bajo" no van a ser los estandar que especifica el I2C y el SMBus

-------------------------------

Una cosita mas, supuestamente lo primero que tenes que hacer es modificar el PPS, antes de activar los modulos. Asi que intenta cambiar el orden por las dudas
« Última modificación: 12 de Agosto de 2020, 12:44:48 por KILLERJC »


 

anything