Autor Tema: La ram se me rebela  (Leído 4798 veces)

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

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
La ram se me rebela
« en: 09 de Febrero de 2009, 12:52:54 »
Holases!

A ver, que tengo tantas cosas en la cabeza que se me está haciendo un cacao.  :mrgreen:

Tengo un 16f877a

Como consta en el susodicho datasheet el mismo consta de 4 bancos, muy bien.



AAAhoraaa... por ejemplo quiero limpiar la ram del banco 0:

Borra_Ram0 bcf      STATUS,IRP
       movlw   0x20
      movwf   FSR
   
Borra_next0 clrf   INDF
      incf   FSR,1
      BTFSS FSR,4 ;all done?
      goto   Borra_next0
      return

Todo muy bien. Llegamos al byte 80h (que sería 7f+1) y listo. Muy prolijo todo.
Pasamos a la parte 2:
Vamos a limpiar el banco 1:

Borra_Ram1 bcf      STATUS,IRP
       movlw   0xA0
      movwf   FSR
      
Borra_next1
      clrf   INDF
      incf   FSR,F
      movf   FSR,W
      btfss   STATUS,Z
      goto   Borra_next1
      RETURN

Aqui , al pasarse de FF a 00 produce el deseado flag Z del status. Creo que vamos bien.

Paso 3: (Aqui las cosas se complicaron)
Pibe se empieza a rascar la cabeza, tiene que direccionar un byte de 3 cifras (110) y el MPLAB le dice que de eso nada. Que si quiere jugar que juegue al x3 terran conflict.
Pibe mira el datasheet y ve con esperanza que puede usar el bit IRP del registro STATUS para molestar al banco 2 y 3. Así que cree que si quitamos el bit mas alto de la dirección y le mete 10h a su programita:

Borra_Ram2 bsf      STATUS,IRP
       movlw   0x10
      movwf   FSR
Borra_next2
      clrf   INDF
      incf   FSR,F
      movf   FSR,W
      sublw   0x70
      btfss   STATUS,Z
      goto   Borra_next2
      return

y lo mismo con el banco 3.

Es correcto o al Pibe se le va la castaña?
No hay un comando que por ejemplo le digamos al MPLAB: "oye cariño, quiero borrar toda la RAM. Y lo quiero YA!"
si en vez de ir cambiandonos de bancos y toda la parafernalia, le ponemos que borre de la 20h (inicio) hasta el fin de la memoria (es que ya no se ni que dirección es, porque se me mezclan) no vale?


Bueno, esto por un lado. Ahora siguiendo con la bendita memoria:
Quiero usar gran parte de la memoria como un buffer de 256 bytes, empezando por el A0h del banco 1 tengo 80+96+96 bytes jugosos y listos para ser llenados con bytes sacrílegos.
La directiva:

 CBLOCK A0h
Estos_256_bytes_son_miiioooos:256
ENDC

Es correcta? No tengo que direccionar? No tengo que indicarle cambio de bancos? No creo que sea tan facil, sería demasiado bello.
Hay alguna otra manera de indicarle al micro que yo soy su amigo y quiero usar su memoria en provecho de la humanidad?


Por favor, para aquellos iluminados que sabeis los oscuros y pérfidos secretos de las RAM de los pics, llenar este vacío de desesperación con una somera explicación y/o ejemplito de como coger las riendas de dicha memoria y poder cabalgar... uyyy.... estoy muy afectado... este proyecto me está matando  :mrgreen:
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: La ram se me rebela
« Respuesta #1 en: 09 de Febrero de 2009, 13:25:48 »
Hola Pibe. Lamentalemente es la única forma de hacerlo. Borrar banco por banco, y ajustando el bit IRP.

Citar
CBLOCK A0h
Estos_256_bytes_son_miiioooos:256
ENDC

Lo que acabás de hacer, es nombrar la pocición A0h con el nombre Estos_256_bytes_son_miiioooos:256 No estas haciendo reserva de memoria, en ASM que yo sepa no existe ya que el usuario tiene total control del CP y del PIC en  cuestión. (Por eso me gusta mucho el ASM)

De echo, yo utilizo nombrar de esa manera las pociciones de la RAM y a veces utilizo una pocición que le asigne a una demora para salvar momentaneamente otro dato ya que al momento de utilizarlo en la demora, no lo utilizo para otra cosa. Ojo, esto no es nuevo. Todos los que programan en ASM hacen esto para ahorrar pociciones de RAM.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: La ram se me rebela
« Respuesta #2 en: 09 de Febrero de 2009, 14:10:04 »
Y esta?:
 
buffer res 64 ; reserve 64 address locations of storage

Claro, es muy facil reservar 64 bytes de los 96 bytes u 80 bytes disponibles en un banco
Pero si quiero reservar 256 bytes de memoria. Como lo hago? Tengo que ir llenando banco por banco , mirando con un contador y saltando al siguiente como una vil langosta?

El ejemplo con CBLOCK lo he sacado del help del mplab

CBLOCK  0x20            ;Define a block of variables
                          ;starting at 20H in data memory.
    perimeter:2           ;The label perimeter is 2 bytes
                          ;wide. Address 20H and 21H is
                          ;assigned to the label perimeter.
    length                ;Address 22H is assigned to the
                          ;label length.
    width                 ;Address 23H is assigned to the
                          ;label width.
  ENDC                    ;This directive must be supplied
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: La ram se me rebela
« Respuesta #3 en: 09 de Febrero de 2009, 15:25:11 »
Claro, es muy facil reservar 64 bytes de los 96 bytes u 80 bytes disponibles en un banco
Pero si quiero reservar 256 bytes de memoria. Como lo hago? Tengo que ir llenando banco por banco , mirando con un contador y saltando al siguiente como una vil langosta?

Si eso es exactamente lo que debes  hacer, pequeño saltamontes.

Sobre el CBLOCK como yo lo veo en realidad no reserva memoria, ya que,  no da algun mensaje de error cuando  usas mas bytes para una variable que definiste o, por lo menos yo no vi ninguno. para eso utilizas el UDATA que si reserva ,pero solo puedes usar esa directiva con codigo reusable (relocatable).

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: La ram se me rebela
« Respuesta #4 en: 09 de Febrero de 2009, 16:04:27 »
Esto se soluciona fácil: Pic16f877A al tarrito de "ya te usaré pa otras menudencias", meto la mano en el tarrito "WARNING - ACHTUNG ! pics de gama alta here!" y saco un 18f4550 que me va a hacer más felíz que perro con 2 colas.
El mismísimo no necesita que ande saltando entre bancos como si estuviese en una carrera de 100 metros con vallas.
Es que voy corto de time , y si me pongo a hacer contadores y controles de llenado de bancos pues me paso a gama alta y podré dormir por las noches.
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: La ram se me rebela
« Respuesta #5 en: 11 de Febrero de 2009, 12:54:43 »
Cuando compares hazlo mejor con el xorlw/xorwf, por ejemplo:

movf     FSR,w
xorlw    H'7F'
btfss     STATUS,Z
goto      Aun_no_es_igual
goto      Ya_es_igual

Javicho.

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: La ram se me rebela
« Respuesta #6 en: 11 de Febrero de 2009, 13:36:06 »
Cuál es la diferencia empírica?  :mrgreen:
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: La ram se me rebela
« Respuesta #7 en: 12 de Febrero de 2009, 12:55:50 »
Estas en tu casa .. vas a almorzar ... tienes en la mesa palitos chinos y una cuchara ... cual escoges para comer?

Javicho.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: La ram se me rebela
« Respuesta #8 en: 12 de Febrero de 2009, 14:55:48 »
Estas en tu casa .. vas a almorzar ... tienes en la mesa palitos chinos y una cuchara ... cual escoges para comer?

Javicho.

Si es carne ninguno.A menos que con los palitos me haga unas brochetas xD :D

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: La ram se me rebela
« Respuesta #9 en: 12 de Febrero de 2009, 15:21:13 »
 :D :D

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: La ram se me rebela
« Respuesta #10 en: 12 de Febrero de 2009, 15:51:51 »
El formato que dice Javicho te permite usar el mismo codigo pasandole el inicio y final del area de memoria a borrar...

En CCS esto se hace con:

Código: C++
  1. #zero_ram

facil, no??? :D :D :D
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything