Autor Tema: No funciona el direccionamiento indirecto en CCS  (Leído 3138 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
No funciona el direccionamiento indirecto en CCS
« en: 12 de Julio de 2008, 04:33:46 »
Este es un ejemplo de empleo de direccionamiento indirecto en ensamblador. Si se ensambla con MPASMWIN va perfecto, sin embargo al compilar con CCS dá error, es como si CCS no lo contemplara.

Código: C
  1. //¡¡¡ Con CCS no funciona bien el direccionamiento indirecto, dá error !!!
  2.  
  3. //Se usan dos registros FSR0 y FSR1 donde estaran contenidos secuencialmente
  4. //en RSR0 las salidas y en FSR1 los indices
  5.  
  6. #include <18F4550.h>
  7.  
  8. #byte TRISB=0xF93
  9. #byte PORTB=0xF81
  10. #byte FSR0L=0xFE9
  11. #byte FSR1L=0xFE1
  12.  
  13. #byte salida1=0x20
  14. #byte salida2=0x21
  15. #byte salida3=0x22
  16. #byte salida4=0x23
  17. #byte salida5=0x24
  18. #byte salida6=0x25
  19. #byte salida7=0x26
  20. #byte salida8=0x27
  21.  
  22. #byte indice1=0x30
  23. #byte indice2=0x31
  24. #byte indice3=0x32
  25. #byte indice4=0x33
  26. #byte indice5=0x34
  27. #byte indice6=0x35     
  28. #byte indice7=0x36
  29. #byte indice8=0x37
  30.  
  31. #byte contador=0x40
  32.  
  33. main()
  34. {
  35.  
  36. #asm
  37.  
  38.         movlw   0x00                   
  39.         movwf   TRISB
  40.  
  41.         //movlw b'11111100'     ;RB0
  42.         movlw   0xFC            //RB0                                  
  43.         movwf   salida1
  44.         movlw   0x01            ;Apuntaría a RB2
  45.         ;movlw  0x02            ;Apuntaría a RB3
  46.         ;movlw  0x03            ;Apuntaría a RB4
  47.         ;movlw  0x04            ;Apuntaría a RB5              
  48.         movwf   indice1        
  49.                                                
  50.                
  51.         //movlw b'11111101'     ;RB1
  52.         movlw   0xFD            ;RB1                                           
  53.         movwf   salida2
  54.         movlw   0x00                   
  55.         movwf   indice2
  56.                
  57.         //movlw b'11111011'     ;RB2
  58.         movlw   0xFB    ;RB2                                   
  59.         movwf   salida3
  60.         movlw   0x00                   
  61.         movwf   indice3
  62.                
  63.         //movlw b'11100111'     ;RB3
  64.         movlw   0xE7    ;RB3                                           
  65.         movwf   salida4
  66.         movlw   0x01            ;Apuntaría a RB5                      
  67.         movwf   indice4
  68.                
  69.         //movlw b'11101111'     ;RB4
  70.         movlw   0xEF    ;RB4                                                   
  71.         movwf   salida5
  72.         movlw   0x00                   
  73.         movwf   indice5
  74.                
  75.         //movlw b'11011111'     ;RB5
  76.         movlw   0xDF    ;RB5                                   
  77.         movwf   salida6
  78.         movlw   0x00                   
  79.         movwf   indice6        
  80.                
  81.         //movlw b'10111111'     ;RB6
  82.         movlw   0xBF    ;RB6                                   
  83.         movwf   salida7
  84.         movlw   0x00                   
  85.         movwf   indice7
  86.                
  87.         //movlw b'01111111'     ;RB7
  88.         movlw   0x7F    ;RB7                                           
  89.         movwf   salida8
  90.         movlw   0x00                   
  91.         movwf   indice8
  92.        
  93. Inicio: movlw   0xFF                   
  94.           movwf PORTB
  95.        
  96.           movlw 0x20
  97.           movwf FSR0L
  98.           movlw 0x30
  99.           movwf FSR1L
  100.                                
  101. Bucle: movf     INDF0,w      ;Mueve el contenido del FSR0 (salidas) al W
  102.           andwf PORT
  103.                
  104.           incf  FSR0L
  105.           movf  INDF1,w         ;Mueve el contenido del FSR1 (índices) al W
  106.           incf  FSR1L
  107.           addwf FSR0L,1         ;FSR0=FSR0+indice(FSR1)
  108.           addwf FSR1L,1         ;FSR1=FSR1+indice(FSR1)
  109.                                                
  110.           btfsc PORTB,7
  111.           goto    Bucle
  112.           goto    Inicio
  113.                                                                                
  114. #endasm
  115.  
  116. }


El error que tira es:  " Expression must evaluate to a constant  INDF0 "

¡ Ojala fuese error mío, porque tengo atrancao un proyecto por culpa de esto !
« Última modificación: 12 de Julio de 2008, 04:37:59 por pocher »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: No funciona el direccionamiento indirecto en CCS
« Respuesta #1 en: 12 de Julio de 2008, 20:05:45 »
Hola.

Pense que era yo el que no podia embeber codigo asm en el CCS!!!!!! :D :D Me salio el mismo error ( con otro registro ) cuando estaba tratando de cargar un valor a un registro en un PIC12 ... nunca me dio ... asi que lo mande para el p**** :-) Ahora ya se porque es.

A proposito ... me ha sucedido que cuando la RAM va mas de 45% el CCS me manda un error cuando uso punteros, por ejemplo, al incluir la libreria touch.c, genera un error de "Codigo no tiene efecto" y me remite a las funciones shift_right o shift_left .. o cualquiera que tenga el simbolo "&" ... no se que es, en otros programas va muy bien .. te ha pasado Pocher?

Saludos
El papel lo aguanta todo

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: No funciona el direccionamiento indirecto en CCS
« Respuesta #2 en: 14 de Julio de 2008, 02:24:30 »
Hola MLO.

No, ese tipo de error no lo he visto, seguramente porque no he usado tanta RAM y a la vez punteros.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: No funciona el direccionamiento indirecto en CCS
« Respuesta #3 en: 19 de Julio de 2008, 03:50:42 »
Voy a intentar compilarlo con mikroC.

¿Alguién sabe como se hace esto en mikroC: #byte salida1=0x20?

Es decir asignar un nombre a una dirección de memoria.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: No funciona el direccionamiento indirecto en CCS
« Respuesta #4 en: 19 de Julio de 2008, 04:12:59 »
He visto que le das un uso similar al #byte TRISB dentro del código asm,pero lo que no veo es que hayas definido el #byte INDF0.
Si  funcina el uno es de suponer que debería funcionar el otro

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: No funciona el direccionamiento indirecto en CCS
« Respuesta #5 en: 19 de Julio de 2008, 04:17:01 »
Bueno,el volcado del dato lo haces en sentido contrario.
Creo que yo también he tenido ese problema alguna vez.
Puede valerte declarar INDF0 como variable y ubicarla donde debe ir con la directiva #locate

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: No funciona el direccionamiento indirecto en CCS
« Respuesta #6 en: 19 de Julio de 2008, 04:17:56 »
El INDF0 no es un registro, se usa para mover de forma indirecta el contenido del FSR0L al acumulador. Por eso no le puedo asignar un nombre.

Un saludo Modulay

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: No funciona el direccionamiento indirecto en CCS
« Respuesta #7 en: 19 de Julio de 2008, 04:24:13 »
Pues es verdad

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: No funciona el direccionamiento indirecto en CCS
« Respuesta #8 en: 19 de Julio de 2008, 05:43:50 »
Uf, uf, uf que me dá un yu, yu al traducir el programa de CCS a mikroC.

Todavía no sé como se hace #byte salida1=0x20 en mikroC pero gracias a PROTEUS he conseguido averiguar la dirección de memoria de la variable salida1 y de todas las otras (en mikroC he puesto unsigned char salida1).

He conseguido compilar.  :-/

Total:  ¡¡¡ En mikroC  SI  que funciona el direccionamiento indirecto !!!
« Última modificación: 19 de Julio de 2008, 05:46:15 por pocher »

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: No funciona el direccionamiento indirecto en CCS
« Respuesta #9 en: 19 de Julio de 2008, 06:09:23 »
En CCS,tras compilar, puedes ver las direcciones de datos y rutinas desde el menú Compile - Symbol map

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: No funciona el direccionamiento indirecto en CCS
« Respuesta #10 en: 19 de Julio de 2008, 06:59:17 »
El problema era que no dejaba compilar (daba error).