TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: pibe 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.
(http://img.photobucket.com/albums/v165/carlyvalente/muestra.jpg)
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:
-
Hola Pibe. Lamentalemente es la única forma de hacerlo. Borrar banco por banco, y ajustando el bit IRP.
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.
-
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
-
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
-
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.
-
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.
-
Cuál es la diferencia empírica? :mrgreen:
-
Estas en tu casa .. vas a almorzar ... tienes en la mesa palitos chinos y una cuchara ... cual escoges para comer?
Javicho.
-
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
-
:D :D
-
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:
facil, no??? :D :D :D