TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Cryn en 14 de Junio de 2008, 12:48:27
-
saludos amigos acá de molestón otra vez, y encontrando un bug en proteus o quiza en ccs :z), un bug q me volvio loco y hasta el día de hoy que volvi a ver la memo descubrí el fallo, les cuento:
hago este codigo de ejemplo usando la directiva #rom, para preescribir en la rom:
#include <18f2550.h>
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN,USBDIV,PLL5,CPUDIV1
#rom 0xf00000={1,5,0,8}
void main(){
}
el asm es:
Configuration Fuses:
Word 1: 0E24 NOIESO NOFCMEN HSPLL PLL5 CPUDIV1 USBDIV
Word 2: 1E18 NOBROWNOUT NOWDT BORV20 PUT WDT32768 NOVREGEN RESERVED
Word 3: 0100 NOPBADEN CCP2C1 NOMCLR NOLPT1OSC RESERVED
Word 4: 0081 STVREN NODEBUG NOLVP NOXINST RESERVED
Word 5: C00F NOPROTECT NOCPD NOCPB
Word 6: E00F NOWRT NOWRTD NOWRTC NOWRTB
Word 7: 400F NOEBTR NOEBTRB
ROM data:
F00000: 01 00 05 00 00 00 08 00
como se darán cuenta en rom data aparecen 8 bytes, lo cual esta mal, porque en mi codigo en c solo coloque 4, por tanto aparecieron unos ceros en medio de cada dato, y nose de donde salieron :D
en simulación tb aparecen esos ceros extra:
(http://img225.imageshack.us/img225/171/eepromal6.jpg)
pero en winpic800 no :shock: :shock::
(http://img366.imageshack.us/img366/4821/winpicef9.jpg)
entonces concluyo q el bug es de proteus, pero el asm :shock:
nose no entendí, confusión total, alguien me ayuda a comprender q paso y si se puede arreglar para poder simular bien, porque la posición en la eeprom es muy importante.
muchas gracias
-
Hola
Tienes que definir que los datos son de 8 bits, ya que por default los pic 18 toman los datos para guardar 16 bits.
Prueba asi a ver que sucede:
#rom int8 0xf00000={1,5,0,8}
Saludos
-
si era eso :mrgreen: muchas gracias por la ayuda :-/, no lo hubiera descubierto talvez nunca, de verdad muchas gracias, por q en el manual de ccs no dice algo especifico como eso, porque donde buscaba no decía eso :(
ahora quizá puedan ayudarme en un otro problema q tengo con el tamaño de la memo eeprom del 4550 y/o 2550 que solo son de 256 bytes y pues quizá utilice muchos mas datos, en el peor de los casos hasta 7 veces el tamaño de esta eeprom osea 7x256bytes (talvez menos) y pues para ello necesitaré utilizar la memoria flash, se de la existencia de las instrucciones de ccs para leer y escribir sobre posiciones de flash, que sugerencia me dais para dar el orden.
me explico, el programa esta en desarrollo y nose cuanta memoria de programa llegue a utilizar pero quiza sea grande y para ubicar esos datos en la flash nose en que posición debo comenzar o el programa o la seccion de datos, de tal forma que no se choquen, y como establezco esos limites, la direcctiva #org sirve?
serán datos que un usuario externo podrá modificar, la flash puede ser usada y q no hayan problemas?
un saludo y muchas gracias por la info
-
Hola.
Pues creo que con la directiva #reserve se puede hacer eso
Saludos
-
me fije el #reserve en el manual y al parecer solo acepta reservas en la memo ram, pero nose si en la flash, o crees q colocando una dirección de la flash se reserve en la memo de programa, bueno, hare pruebas, un saludo y gracias por la respuesta :mrgreen:
-
Hola.
Y que tal con #org??
(http://img185.imageshack.us/img185/4730/orgbm3.jpg)
Saludos.
-
:mrgreen: en ese mismo me estaba fijando ahora
alguna vez haz utilizado las funciones:
write_program_eeprom();
read_program_eeprom();
sirven para grabar en la flash, cierto? pero con lo q he probado no me ha guardado bytes, sino 16bits hay alguna forma de hacerlo a 8 bits?
sabes como funcionan las otras dos funciones?
write_program_memory();
read_program_memory();
no las entendí muy bien en el manual, mi ingles no es muy bueno :(
gracias por la pronta respuesta, un saludo
-
Hola.
Pues nunca las he utilizado, pero monte el ejemplo del CCS y solo escribe el dato en la memoria de datos, en la memoria de programas no se ve ninguna modificacion
(http://img170.imageshack.us/img170/6744/eeprom2mo8.jpg).
Adjunto la simulacion y el codigo.
Saludos
-
La función write_program_eeprom(); sí que va bien. Puedes guardar datos de a 8, o de a 16 bits.
La función write_program_memory(); no la he probado nunca ¿como funciona?
-
saludos pocher, sabes como utilizar la funcion write_program_eeprom para 8 bits? no encuentro al manera de hacerlo en el manual, solo he logrado escribir 16 bits.
MLO_ probe, nose si bien el write_program y a mi si me grabó en la memoria de programa, estoy utilizando un 4550, lo que hace es utilizar un bloque de programa creo, pero no logro comprender como va todo.
y quiza en este caso opte por hacer paso a paso, osea byte por byte, porque algunas veces se podrá modificar uno o unos cuantos, pero talvez sea muy conveniente lo de grabar por bloques
gracias por las respuestas, seguire buscando info y tratando de descifrar el ingles del ccs :mrgreen:
-
Sí, lo expresé mal. Realmente escribe solo datos de 16 bits, puedes darle un único byte (el LSB) y él te rellena el MSB con 0x00.
Puedes mandarle los datos de 2 en 2:
write_program_eeprom(0x0100,0xBBAA) --> Escribe 0xAA en la dirección 0x0100 de la flash y 0xBB en la dirección 0x0101 de la flash.
Estas usando PROTEUS? Como has usado el write_program_memory() para que te escriba?
-
Vale, ya sé como funciona write_program_memory() para que escriba 1byte ó más ... hay que darle la dirección en lugar del dato.
-
Hola.
write_program_memory( address, dataptr, count );
La variable count no indica el numero de bytes que se van a escribir? sera que si se hace 1 escribira 1 byte?. El dato les aparece en el en PIC18 CPU Program memory? porque a mi me aparece en el PIC18 CPU Data memory.
Saludos
-
Efectivamente, count es el nº de bytes que se van a escribir en address a partir de la dirección &x (dataptr) .
Pongo un ejemplo:
int x;
x=0x33;
write_program_memory( 0x0200, &x, 1 ); ---> Escribiria 0x33 en la dirección 0x2000 de la flash
Otro:
long x;
x=0x4433;
write_program_memory( 0x0200, &x, 2 ); ---> Escribiria 0x33 en la dirección 0x2000 de la flash y 0x44 en la 0x0201
Todo esto es fácilmente transportable a tablas.
Los datos aparecen en la flash de programa (Programm memory) de PROTEUS.
Todo esto funcionando en PROTEUS con PICs18. Con PICs16 no me va bien. ¿Alguién lo ha hecho con PICs16 en PROTEUS?
-
gracis por las respuestas, me son de mucha ayuda.
tb he probado el wite_program_memory, y con el 1 si escribe solamente un byte, pero además borra todo un bloque de una cantidad de bytes, y pues por eso supuse q trabaja tb directamente con bloques.
y creen q sea bueno escribir con write_program_memory (8 bits) y leer con read__program_eeprom (16 bits??) creen q se pueda leer 8 bits con eeprom?
bueno yo tb lo probare, muchas gracias por la ayuda, un saludo.
ahhh se me olvidaba estoy usando tb un 18f (el 18f4550 y 2550), no he tocado los 16, porque recuerdo haber leído en un hilo anterior q esas funciones son solo para los 18f, y ambas funciones ...memory y ...eprom me dan los resultados en la memoria de programa
-
En la versión CCS 3.245 sí que en el manual habla de las funciones (write_program_memory()) aplicadas a PCM y PCH, sin embargo en la versión CCS 4.065 ya no habla ni de PCM ni PCH. Cosa más rara.