Autor Tema: Problema en ensamblador  (Leído 3822 veces)

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Problema en ensamblador
« en: 06 de Julio de 2011, 16:10:25 »
Hola, antes que nada, siempre eh mirado el foro y me parece muy interensante, estoy empezando por los dsPIC, ya tuve experiencia en los PIC16F pero jamas los tuve en estos, siempre me maneje en ASM y la verdad que me siento comodo en este lenguaje. Mire por todos lados en el foro y todos utilizan C30, aunque ami me parece mas complejo que ASM :S.. Tengo un problema y la verdad es que no se como solucionarlo probe varias cosas y nada.. Lo primero que intento hacer es prender y apagar un simple led sin demoras ni nada por el estilo. Asi que armando el archivo termine con este codigo:

Código: [Seleccionar]
       .include "p33fj32mc202.inc"

;..............................................................................
; Configuracion, Palabras sacadas del include.
; Primero va el registro con 2 guion bajo (__FOSC) por ejemplo y luego la
; configuracion del mismo
;..............................................................................

config __FOSCSEL, FNOSC_FRCDIV16 & IESO_ON
config __FOSC, POSCMD_NONE & OSCIOFNC_ON & FCKSM_CSDCMD
config __FWDT, FWDTEN_OFF
config __FPOR, FPWRT_PWR1 & ALTI2C_OFF & LPOL_OFF & PWMPIN_OFF
config __FGS, GCP_OFF


;..............................................................................
;Declaraciones Globales:
;Aca declaramos las etiquetas que pueden ser usadas por otros archivos y
;tambien los vectores de interrupcion, los nombres de estos se peuden ver en
;el archivo de linker p33fj32mc202.gld para este caso
;..............................................................................

        .global _wreg_init                                    

        .global __reset         ;Indicador del vector de reset.


;..............................................................................
;Iniciacion de Puntero de pila y registros W
;..............................................................................

.text                               ;Indicador para el compilador de inicio
__reset:                            ;de codigo de programa, para ubicarlo en la memoria
        MOV #__SP_init, W15         ;Inicializacion del puntero de pila, valor dado por
        MOV #__SPLIM_init, W0       ;el linker p33fj32mc202.gld
        MOV W0, SPLIM
        NOP                         ;Necesario un NOP luego de inicializar

_wreg_init:                         ;Limpieza de registros de W0 a W14
        CLR W0                      ;Siendo W0 la direccion 0x0000 del SFR
        MOV W0, W14
        REPEAT #12                  ;Se repite la instruccion que le sigue
        MOV W0, [++W14]             ;Con un pre incremento para ir borrando uno
        CLR W14                     ;por uno hasta W13 y luego se borra W14
                                    ;que sirvio de puntero


;..............................................................................
;Configuracion de pines
;..............................................................................

        mov #0x0000, W0
        mov W0, LATB        ; Limpio los valores de los latch
        mov W0, TRISB       ; Ponemos todos los pines de salida RB0-15
        mov W0, ODCB        ; Se configuran los pines para no trabajar como
                            ; como colector abierto.

MainLoop:

        btg LATB,LATB0      ; Alterno el valor de RB0
        bra MainLoop        ; Inicio nuevamente
 
;----------------- Fin del codigo ---------------------------------------------

.end    

El problema viene cuando intento compilarlo, para mi a simple vista y habiendo trabajado en los otros PICs me parece que esta bien el codigo.

El LATB esta declarado en el include, al igual que los demas tales como LATB0, PORTB ... etc etc etc...

El compilador me tira el siguiente error:

Código: [Seleccionar]
newmainasm33.s: Assembler messages:
newmainasm33.s:67: Error: Invalid operands specified ('btg LATB,LATB0').
newmainasm33.s:67:        Check operand #2. Operand must be between 0 and 15, inclusive.
make[2]: *** [build/default/production/newmainasm33.o] Error 255
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

Probe de todas formas, poniendo
btg LATB, 0x0000
btg LATB,0
btg 0x2cc,0x0000
btg #0x2cc,#0x0000
Usando el portb con todas las variantes.. ya no se que probar, por eso recurro a ustedes.. es simplemente para simular y empezar de principio..

Tengo en cuenta lo del LATCH y el PORT con respecto escrituras y lecturas, tambien tengo en cuenta que el datasheet especifica que se debe agregar un NOP entre lectura y escritura seguidas de un PORT, pero aca tengo un salto y no deberia afectar.

Código: [Seleccionar]
One instruction cycle is required between a port direction change or port write operation and a read operation of the same port. Typically this instruction would be an NOP
Probe poniendole un NOP antes y despues pero nada,, el problema viene por ese comando. Me pase a usar el MPLAB X Beta ,, espero que este no sea el problema. Pero lo raro que todo lo demas me lo considera bien.

Hasta probe configurar los registros ADPCFG para ponerlos digital.




************************************************************************************************EDIT****************************************************************************

Disculpen las molestias, ya solucione el problema.

Mi problema era el siguiente:

Tuve que ponerlo de la siguiente forma:

Código: [Seleccionar]
btg LATB,#LATB0
Sin el # no me lo tomaba,,  espero seguir avanzando en esto. Vi ejemplos en ensamblador pero son bastantes complicados y no empiezan de cero, entonces espero que este codigo sirva para algunos.
« Última modificación: 06 de Julio de 2011, 16:16:00 por KILLERJC »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problema en ensamblador
« Respuesta #1 en: 09 de Julio de 2011, 02:06:28 »
Hola a todos de vuelta.... Estuve jugando un poco mas y esta vez con los timers... configure el dsPIC para que funcionase con el el LPFRC (32,768Khz) para poder obtener una salida que cambie cada 1 segundo manejada por interrupciones...

Ahora mi pregunta es mas matematica que otra cosa... Primero voy con el codigo..

Código: [Seleccionar]
       .include "p33fj32mc202.inc"

;..............................................................................
; Configuracion, Palabras sacadas del include.
; Primero va el registro con 2 guion bajo (__FOSC) por ejemplo y luego la
; configuracion del mismo
;..............................................................................

config __FOSCSEL, FNOSC_LPRC & IESO_OFF
config __FOSC, POSCMD_NONE & OSCIOFNC_ON & FCKSM_CSDCMD
config __FWDT, FWDTEN_OFF
config __FPOR, FPWRT_PWR1 & ALTI2C_OFF & LPOL_OFF & PWMPIN_OFF
config __FGS, GCP_OFF


;..............................................................................
;Declaraciones Globales:
;Aca declaramos las etiquetas que pueden ser usadas por otros archivos y
;tambien los vectores de interrupcion, los nombres de estos se peuden ver en
;el archivo de linker p33fj32mc202.gld para este caso
;..............................................................................

        .global _wreg_init      ;No es necesario pero esta por si algun otro
                                ;archivo desea usarlo

        .global __reset         ;Indicador del vector de interrupcion.

        .global __T1Interrupt   ;Vector de interrupcion del TM1

;..............................................................................
;Iniciacion de Puntero de pila y registros W
;..............................................................................

.text                               ;Indicador para el compilador de inicio
__reset:                            ;de codigo de programa, para ubicarlo en la memoria
        MOV #__SP_init, W15         ;Inicializacion del puntero de pila, valor dado por
        MOV #__SPLIM_init, W0       ;el linker p33fj32mc202.gld
        MOV W0, SPLIM
        NOP                         ;Necesario un NOP luego de inicializar

_wreg_init:                         ;Limpieza de registros de W0 a W14
        CLR W0                      ;Siendo W0 la direccion 0x0000 del SFR
        MOV W0, W14
        REPEAT #12                  ;Se repite la instruccion que le sigue
        MOV W0, [++W14]             ;Con un pre incremento para ir borrando uno
        CLR W14                     ;por uno hasta W13 y luego se borra W14
                                    ;que sirvio de puntero


;..............................................................................
;Configuracion de pines
;..............................................................................

        mov #0xffff, W0
        mov W0, ADPCFG
        mov W0, TRISA
        bclr ADPCFG,#PCFG0  ;Configuro AN0 como entrada analogica
        mov #0x0000, W0
        mov W0, TRISB       ; Ponemos todos los pines de salida RB0-15
        mov W0, ODCB        ; Se configuran los pines para no trabajar como
                            ; como colector abierto.
        mov W0, PORTB       ; Limpio los valores del PuertoB , probando.
        mov W0, LATB        ; Limpio los valores de los latch

;..............................................................................
;Configuracion del Timer
;..............................................................................

; Registro de interrupcion IEC0

        bset IEC0,#T1IE ; Habilito interrupcion del TM1
        bclr IFS0,#T1IF ; Limpio Flag TM1 por las dudas

;Registro TMR1
    
        clr TMR1 ; Limpio registro del TM1

;Registro PR1

        mov #0x3FF8,W0 ; Cargo periodo en PR1
        mov W0, PR1

; Registro T1CON

        clr T1CON ; Selecciono prescaler 1:1
        bset T1CON,#TON ; Activo TM1 para la cuenta
;..............................................................................
;Programa Principal
;..............................................................................

MainLoop:

        nop
        bra MainLoop        ; Inicio nuevamente

;..............................................................................
;Rutina de interrupcion
;..............................................................................

__T1Interrupt: ; Vector de interrupcion del TM1
        bclr IFS0,#T1IF ; Limpio bandera de interrupcion
        clr TMR1 ; Limpio registro de cuenta del TM1
        btg LATB,#LATB0 ; Mi codigo, cambio valor del PortB.RB0
retfie ; Vuelta de la interrupcion

;----------------- Fin del codigo ---------------------------------------------

.end

Bueno mi pregunta es la siguiente...... Puede parecer media inutil la pregunta pero hay va...

Yo configuro mi oscilador de 32,768 KHz que seria la frecuencia de entrada del TM1,, sin prescaler deberia contar 32.768 y luego saltar la interrupcion para llegar al segundo.. lo cual el valor hexa seria 0x8000 a cargar en PR1..

Pero usando el stopwatch del mplab me da un poco mas que 2 segundos, pense en la mitad, o sea 0x4000 pero tampoco daba exacto al segundo,, sino que me lo da con el valor 0x3FF8 , 16.376 en decimal. Esto entre una interrupcion y otra....

Yo pensaria que fuera un divisor entero de la frecuencia (ejemplo 2, 4) pero no solo que es la mitad (0x4000) sino que ademas son casi 8 ciclos de reloj que no se por que se toman.. (0x3FF8) alguien sabria explicarlo ?

Se que es en ASM,, y casi diferencias este codigo con C no tiene... o es facil de comprender. Muchas gracias por todo.. Al final nadie contesto si les sirve que ponga codigos en ASM con cosas faciles a medida que voy probando.. Como asi tambien que los explique masomenos en los comentarios.

Probe este mismo codigo con el MPLAB X y no me funciono en una simulacion realizada con Proteus, pero con el MPLAB 8.60 anduvo a la perfeccion... siendo el mismo codigo y mismos archivos incluidos.



********************************** EDIT **********************************************

Encontre parte de la respuesta,,,

Código: [Seleccionar]
The FOSC source is divided by 2 to produce the internal instruction cycle clock. In this document, the instruction cycle clock is denoted by FCY, esto me deja en el valor 0x4000, me queda de conocer por que la diferencia con 0x3FF8

Creo que acabo de dar con la solucion,,

Código: [Seleccionar]
The interrupt process takes four instruction cycles

Tanto como la llamada a interrupcion como el retfie toman 4 ciclos cada uno, y alli tendria los 8 ciclos faltantes que me faltaban, aunque sigo pensando que los ciclos de la instruccion RETFIE me los deberia contar igual.

Tengo otra pregunta,,, no logro poner todo el puerto B a 0 .... en el simulador del MPLAB me anda de 10 pero en proteus no,, dejo una imagen, obviamente estoy aprendiendo a programarlo asi que todavia no lo poseo al integrado.. por eso es todo a base de simulacion.



YA LO SOLUCIONE!, el problema es que en el reset los registros del PWM no estan configurados para que esas salidas sean GP i/o sino que estan desigandas para que funcione como el PWM en modo complementario, es por eso que se puede ver que
PWMxH = ~PWMxL

Con agregarle esto a la configuracion de pines por las dudas y cambiar las palabras de configuracion del registro FPOR basta...

Código: [Seleccionar]
clr PWM1CON1
clr PWM2CON2

Código: [Seleccionar]
config __FPOR, FPWRT_PWR1 & ALTI2C_OFF & LPOL_ON & HPOL_ON & PWMPIN_ON
Lei mal y pense que poner PWMPIN en 0 era que desactivaba el PWM, y era totalmente lo contrario.

« Última modificación: 13 de Julio de 2011, 14:26:57 por KILLERJC »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problema en ensamblador
« Respuesta #2 en: 12 de Julio de 2011, 22:52:54 »
Traigo mas y mas problemas xD para ustedes.. aunque no me han respondido nada todavia.... Despues de probar los puertos, de jugar con los timers , intentar usar el A/D cosa que me quedo pendiente... Dije,, por que no probar I2C,,, ya que nunca lo habia usado.. estuve viendo los datasheets que hablan sobre este tema, incluso un archivo en C30 que hace el trabajo mediante maquinas de estado... Intente implementarlo de cierta manera a ASM para una direccion de 7 bits, y esto es lo que resulto:

La parte de I2C lo saque del diagrama de tiempo para Maestro y de 7-bit  que esta en el siguiente datasheet.

Código: [Seleccionar]
http://ww1.microchip.com/downloads/en/DeviceDoc/70195D.pdf
Código: ASM
  1. .include "p33fj32mc202.inc"
  2.  
  3. ;..............................................................................
  4. ; Configuracion, Palabras sacadas del include.
  5. ; Primero va el registro con 2 guion bajo (__FOSC) por ejemplo y luego la
  6. ; configuracion del mismo
  7. ;..............................................................................
  8.  
  9. config __FOSCSEL, FNOSC_PRI & IESO_OFF
  10. config __FOSC, POSCMD_XT & OSCIOFNC_OFF & FCKSM_CSDCMD
  11. config __FWDT, FWDTEN_OFF
  12. config __FPOR, FPWRT_PWR16 & ALTI2C_OFF & LPOL_ON & HPOL_ON & PWMPIN_ON
  13. config __FGS, GCP_OFF
  14.  
  15.  
  16. ;..............................................................................
  17. ;Declaraciones Globales:
  18. ;Aca declaramos las etiquetas que pueden ser usadas por otros archivos y
  19. ;tambien los vectores de interrupcion, los nombres de estos se peuden ver en
  20. ;el archivo de linker p33fj32mc202.gld para este caso
  21. ;..............................................................................
  22.  
  23.         .global _wreg_init      ;No es necesario pero esta por si algun otro
  24.                                 ;archivo desea usarlo
  25.  
  26.         .global __reset         ;Indicador del vector de interrupcion.
  27.  
  28.         .global __MI2C1Interrupt   ;Vector de interrupcion del I2C
  29.  
  30. ;..............................................................................
  31. ; Variable no inicializadas
  32. ;..............................................................................
  33.  
  34. .section .data
  35.  
  36. Direccion: .word 0x01
  37.  
  38. Dato: .word 0x02
  39.  
  40. Estado: .word 0x03
  41.  
  42. ;..............................................................................
  43. ;Iniciacion de Puntero de pila y registros W
  44. ;..............................................................................
  45.  
  46. .text                               ;Indicador para el compilador de inicio
  47. __reset:                            ;de codigo de programa, para ubicarlo en la memoria
  48.         MOV #__SP_init, W15         ;Inicializacion del puntero de pila, valor dado por
  49.         MOV #__SPLIM_init, W0       ;el linker p33fj32mc202.gld
  50.         MOV W0, SPLIM
  51.         NOP                         ;Necesario un NOP luego de inicializar
  52.  
  53. _wreg_init:                         ;Limpieza de registros de W0 a W14
  54.         CLR W0                      ;Siendo W0 la direccion 0x0000 del SFR
  55.         MOV W0, W14
  56.         REPEAT #12                  ;Se repite la instruccion que le sigue
  57.         MOV W0, [++W14]             ;Con un pre incremento para ir borrando uno
  58.         CLR W14                     ;por uno hasta W13 y luego se borra W14
  59.                                     ;que sirvio de puntero
  60.  
  61.  
  62. ;..............................................................................
  63. ;Configuracion de pines
  64. ;..............................................................................
  65.  
  66.         mov #0xffff, W0                 ; Pongo las I/O a digitales
  67.         mov W0, ADPCFG          ;
  68.         mov W0, TRISA                   ; Pongo el puerto A como entrada
  69.         nop
  70.         clr LATB
  71.         nop
  72.         bclr ADPCFG,#PCFG0      ; Configuro AN0 como entrada analogica
  73.         clr ODCB                                ; Se configuran los pines para no trabajar como
  74.                                                 ; como colector abierto.
  75.         bset ODCB,#ODCB8                ; Ponemos como colector abierto los pines de I2C
  76.         bset ODCB,#ODCB9                ; Pines: SDA1, SCL1
  77.  
  78. ;..............................................................................
  79. ;Configuracion del I2C
  80. ;..............................................................................
  81.  
  82. ; Registro I2C1MSK & I2C1ADD
  83.                
  84.                 clr I2C1MSK                                     ; Desenmascro los bits de direccion
  85.                 clr I2C1ADD                                     ; Direccion de esclavo
  86.  
  87. ; Registro I2C1BRG ( Baud Rate Generator)
  88.  
  89.                 mov #0x015,W0                           ; Valor tomado del Seccion I2C de dspic
  90.                 mov W0,I2C1BRG                          ; Para FCY = 10Mhz y Fscl = 400Khz
  91.  
  92. ; Registro IEC1 y IFS1
  93.  
  94.                 bclr IFS1,#MI2C1IF                      ; Limpio bandera de interrupcion
  95.                 bset IEC1,#MI2C1IE                      ; Habilito interrupcion
  96.  
  97. ; Registro I2C1CON
  98.  
  99.                 clr I2C1CON                             ; Configuro a 7 bit
  100.                 bset I2C1CON,#SCLREL            ; Libero el reloj
  101.                 bset I2C1CON,#I2CEN             ; Inicio modulo I2C
  102.  
  103.                 mov #0x10,W0                            ; A modo de ejemplo doy
  104.                 mov W0, Dato                            ; los valores a Dato y Direccion
  105.                 mov #0x20,W0                            ; Dato: 0x10
  106.                 mov W0, Direccion                       ; Direccion: 0x20
  107.                 clr Estado                                      ; Limpio variable Estado
  108. ;..............................................................................
  109. ;Programa Principal
  110. ;..............................................................................
  111.  
  112. MainLoop:
  113.                         cp0 Estado                      ; Comparo Estado con literal = 0
  114.                         btsc SR,#Z                      ; Salta si no es cero
  115.                         call LeerI2C            ; Llamada a rutina de lectura
  116.                         bra MainLoop        ; Inicio nuevamente
  117.  
  118. ;..............................................................................
  119. ;Rutina de interrupcion I2C
  120. ;..............................................................................
  121.  
  122. __MI2C1Interrupt:                               ; Vector de interrupcion del I2C
  123.         bclr IFS1,#MI2C1IF                      ; Limpieza de bandera de I2C
  124.                 cp0 Estado                              ; Compar Estado con 0x0000
  125.                 btsc SR,#Z                      ; Si lo es, es por que fue recibido la interrupcion de stop
  126.                 retfie                                  ; Vuelvo al programa
  127.                 rlnc Estado,WREG                ; En caso que sea distinto a 0. W0 = Estado * 2
  128.                 add PCL,WREG                    ; Y sumo W0 = W0 + PCL
  129.                 goto WREG0                      ; Voy a la direccion que me indica W0
  130.                 bra SendAddress         ; Dependiendo de la variable estado SALTO
  131.                 bra Ackaddr                     ; n cantidad de posiciones, como el PC aumenta de a 2
  132.                 bra Ackdata                     ; hizo falta el rotate left sin carry.
  133.                 bra Sendack                     ; En caso que hubiera un error habria q limpiar el valor
  134.                 bra     Stop                            ; de Estado para poder usarlo de nuevo
  135.                 retfie                                  ; Vuelta de la interrupcion, al programa inicial, por las dudas.
  136.  
  137. LeerI2C:                                       
  138.         rlnc Direccion                          ; Acomodo la direccion
  139.         bset Direccion,#0                       ; Y seteo el bit 0 para indicar lectura
  140.         bra Start                                       ; Salto a la rutina de comienzo
  141.  
  142. EscribirI2C:
  143.         rlnc Direccion                          ; Acomodo la direccion
  144.         bclr Direccion,#0                       ; limpio bit 0 para indicar escritura
  145.  
  146. Start:                                          ; Estado 0
  147.         bset I2C1CON,#SEN                       ; Pongo a 1 el bit de start
  148.         inc Estado                                      ; Incremento estado
  149.         return                                  ; Vuelvo a programa principal mientras espero
  150.                                                         ; La interrupcion
  151.  
  152. SendAddress:                                    ; Estado 1
  153.         mov Direccion, W0                       ; Cargo la direccion y la escribo
  154.         mov W0, I2C1TRN                 ; en el registro de transmision
  155.         inc Estado                                      ; Automaticamente envia el mismo
  156.         retfie                                          ; Vuelvo a programa principal mientras espero
  157.                                                         ; que me indica el ACK de la direccion
  158.        
  159. Ackaddr:                                                ; Estado 2
  160.         btsc I2C1STAT,#ACKSTAT          ; Recibi el ack de la direccion?
  161.         bra StopE                                       ; Si no lo recibi, detengo con error.
  162.         btsc Direccion,#0                       ; Si es escritura (mandar dato) salta
  163.         bra Recdata                             ; Si es lectura preparo para recibir el dato
  164.        
  165. Senddata:
  166.         mov Dato,W0                             ; Escribo dato en el registro de transmision
  167.         mov W0, I2C1TRN                 ; Esto habilita de por si la TX en modo maestro
  168.         inc Estado                                      ; Incremento Estado
  169.         retfie                                          ; Vuelvo a programa principal mientras espero
  170.                                                         ; que me indica el ACK del dato enviado
  171.  
  172. Recdata:                                                ; Seccion. habilitacion de entrada de datos
  173.         bset I2C1CON,#RCEN                      ; Pongo a uno el bit, lo cual empieza a funcionar el clk
  174.         inc2 Estado                             ; incremento el Estado en 2
  175.         retfie                                          ; Vuelvo a programa principal mientras espero
  176.                                                         ; la interrupcion para dar el NACK
  177.  
  178. Ackdata:                                                ; Estado 3
  179.         btsc I2C1STAT,#ACKSTAT          ; Recibi el ack del dato en la escritura?
  180.         bra StopE                                       ; Si no lo recibi, detengo con error.
  181.         bra Stop                                        ; Si lo recibi detengo bien.
  182.  
  183. Sendack:                                                ; Estado 4
  184.         inc Estado                                      ; Incremento Estado
  185.         bset I2C1CON,#ACKEN             ; Pongo al bit para mandar un NACK al esclavo
  186.         retfie                                          ; Vuelvo a programa principal mientras espero
  187.                                                         ; la interrupcion que indica que fue enviado el NACK
  188. StopE:
  189.         clr Estado                                      ; Cargo con el valor 0xFFFF
  190.         dec Estado                                      ; En caso que haya un error en el envio
  191.         goto $+4                                        ; Salto hasta la inrtuccion bset i2c1con,#pen
  192. Stop:                                                   ; **** Estado 5 ****
  193.         clr Estado                                      ; Pongo a 0 la variable estado, indicando bus libre
  194.         bset I2C1CON,#PEN                       ; Activo la parada del I2C
  195.         retfie                                          ; Vuelvo a programa principal mientras espero
  196.                                                         ; la interrupcion que indica que fue recibido la parada.
  197.        
  198.  
  199.  
  200. ;----------------- Fin del codigo ---------------------------------------------
  201.  
  202. .end

Problema 1:

Lo simule lentamente en MPLAB y todo perfecto,, aunque no se como darle con el Stimulus para poder simular el I2C. Asi que en ves de esperar la interrupcion lo probe como si fuera todo seguido... Para mi caso hace todo lo que deberia.. y funciona correctamente. Ahora cuando lo intente pasar a Proteus empezaron los problemas.. cargue el .cof para ir depurandolo paso a paso. y resulto de dos formas distintas segun el codigo que se encuentra dentro de la interrupcion:

1)
Código: [Seleccionar]
goto WREG0 ; Voy a la direccion que me indica W0
Con esta parte del codigo, el cual hace una especie de tabla,, en el Proteus tengo el problema que cuando llega a esta instancia el programa vuelve al vector de RESET.

2)
Código: [Seleccionar]
goto W0 ; Voy a la direccion que me indica W0
Ahora si lo cambio por su equivalente, ambos funcionan igual en MPLAB, cuando llega aca se cuelga el programa y no sale de ahi.

SOLUCIONADO: Problemas con el Proteus:

Para el primer caso me resetea el programa a pesar que estaba bien,, pero para el segundo caso quedaba justo en el lugar lo q me dio a pensar que el MPLAB y el Proteus funcionan distintos, mientras uno me sumaba esos 2 cuando pasaba a la intruccion GOTO, el Proteus NO LO HACE, asi que la solucion fue incrementarlo en 4 antes del GOTO y con eso empezo a funcionar. Aunque no del todo bien por fallas en la programacion, pero al menos logre Enviar direccion y datos con sus respectivos ACK. Por primera vez en mi vida xD

Problema 2:

Otra cosa que me llamo la atencion que use un CALL, y cuando le di RETURN en ves de volver a mi programa principal, fue directo al vector de interrupcion del I2C ...

SOLUCIONADO lo del CALL- RETURN: Ocurria esto por que al estar mal configurados los pines, o sea en modo complementario el PWM, las salidas correspondian al PWM, entonces habia una en 1 y la otra en 0 lo cual saltaba directamente a la interrupcion.

La verdad es que estoy medio desconcertado con estos resultados.. este jueves tengo pensado comprarme un dsPIC33f y un PIC32MX , y de armarme con toda la paciencia del mundo para soldar el TQFP de 100 pines..

P.D: ta muy bueno el code para ponerlo en ASM,, faltaria ASM30 xD je

Duda 1:

Sigo preguntando y nadie puede ayudarme... Tonces voy a preguntar algo mas facil ...Alguien sabe como funciona el comando .align ... que particularidad tiene,, por que cuando defini mi seccion de datos.. puse .align 2 , probe con 4 y 8, y seguia siendo lo mismo en la memoria de datos..

Entre las cosas que me quedan por probar terminado este son: El modulo DSP ( sea el multiplicador con sus redondeos y overflow, y como el barrel shifter), el PWM y el A/D que me quedo pendiente...
« Última modificación: 13 de Julio de 2011, 15:51:48 por KILLERJC »


 

anything