TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: mammoli en 15 de Noviembre de 2007, 12:01:59
-
Hola a todos, tengo un problema: tengo que guardar en la memoria del pic un valor de tipo word, y leerlo en caso de que se reinicie, concretamente es un contador de explosiones en una rampa de gas, este valor puede ser entre 1 y 9000, mas o menos, puede variar.
El codigo que uso es:
ADCON1 = %0110 ' Segun el datashett, puerto a digital
..
..
..
Detonan var word ' Contador del tiempo de detonacion
Comando var byte ' Comandos recibidos serialmente
Bandera var bit ' Bandera de apagado
Inicio: read 1,Detonan
read 2,Bandera
serout transmi,4,["*",detonan,"*",#bandera,13]
El tema es que lee cualquier valor, no el que ha sido almacenadom por ejemplo, ahora se que se almaceno 5690 y leo algo asi como 128 ??? :shock:
Alguna idea??
-
Si no me equivoco, solo puedes guardar bytes en la memoriadel PIC por lo cual deberas partir tu valor en 2 y guardarlo en 2 posiciones cuando lo quieras leer deberas leerlo tambien en 2 y juntarlo. Quizas por ello no lees el valor que es.
-
Hola:
en realidad son 8 bits que corresponden a un byte.
De donde recibes el valor que corresponde al tiempo de detonación?
-
mammoli,
Efectivamente como te comenta navaismo tienes que descomponer la variable Detonan en dos variables tipo byte, esto es:
Detonan Var word
Detonan_H Var Detonan.HighByte
Detonan_L Var Detonan.LowByte
Ahora bien cuando incrementas la cuenta de Detonana,me imagino que haces algo asi:
Detonan = Detonan + 1
Ahora bien para guardar el valor en la eeprom de datos, haces esto:
write 0,Detonan_H
write 1,Detonan_L
Y para leerlo haces esto:
read 0,Detonan_H
read 1,Detonan_L
y para mostrarlo en el puerto serial:
serout2 transmi,396,[DEC Detonan]
Saludos.
Elreypic.
-
Hola:
Que bien, de paso sirvió el ejemplo del highbyte y lowbyte, nunca lo había utilizado, muy útil, gracias elreypic2 :mrgreen:
-
Hola:
en realidad son 8 bits que corresponden a un byte.
De donde recibes el valor que corresponde al tiempo de detonación?
El pic cuenta las detonaciones de un cañon antigranizo, tiene un microfono, que cada vez que "escucha" la detonacion, genera un pulso, yo cuento estos pulsos, ya que son un valor indispensable para conocer la efectividad del sistema y el gas restante en las rampas, se utiliza aceitileno.
-
mammoli,
Efectivamente como te comenta navaismo tienes que descomponer la variable Detonan en dos variables tipo byte, esto es:
Detonan Var word
Detonan_H Var Detonan.HighByte
Detonan_L Var Detonan.LowByte
Ahora bien cuando incrementas la cuenta de Detonana,me imagino que haces algo asi:
Detonan = Detonan + 1
Ahora bien para guardar el valor en la eeprom de datos, haces esto:
write 0,Detonan_H
write 1,Detonan_L
Y para leerlo haces esto:
read 0,Detonan_H
read 1,Detonan_L
y para mostrarlo en el puerto serial:
serout2 transmi,396,[DEC Detonan]
Saludos.
Elreypic.
No funciono, te cuento que como son varias las variables que debo guardar me hice un par de rutinas que te muestro a continuacion, antes de llamarla pongo los valores adecuados en las variables adress y dato:
..
..
adress var byte
dato var word
datoL var dato.highbyte
datoH var dato.lowbyte
..
..
Leer: read adress,datoh
adress = adress + 1
read adress,datol
return
Escribir: write adress,datoh
adress = adress + 1
write adress,datol
return
..
..
' ejemplo uso leer variable temperatura
adress = 0
gosub leer
temperatura = dato
' ejemplo uso escribir temperatura
adress = 0
dato = temperatura
gosub escribir
..
lo estoy probando en el isis (proteus) y los resultados son : escribo 5000, leo 65535 !!! :shock: :shock: :shock:
-
Detonan Var word
Detonan_H Var Detonan.HighByte
Detonan_L Var Detonan.LowByte
write 0,Detonan_H
write 1,Detonan_L
Y para leerlo haces esto:
read 0,Detonan_H
read 1,Detonan_L
Si no recuerdo mal, también se puede hacer:
Detonan VAR WORD
WRITE 0,Detonan.1
WRITE 0,Detonan.0
READ 0,Detonan.1
READ 0,Detonan.0
Te ahorras el estar sumando a cada variable (además de otros dos registros de RAM).
Algo asi.
-
Detonan Var word
Detonan_H Var Detonan.HighByte
Detonan_L Var Detonan.LowByte
write 0,Detonan_H
write 1,Detonan_L
Y para leerlo haces esto:
read 0,Detonan_H
read 1,Detonan_L
Si no recuerdo mal, también se puede hacer:
Detonan VAR WORD
WRITE 0,Detonan.1
WRITE 0,Detonan.0
READ 0,Detonan.1
READ 0,Detonan.0
Te ahorras el estar sumando a cada variable (además de otros dos registros de RAM).
Algo asi.
:-/Buenisimo, te agradezco mucho porque me estaba volviendo loco, te cuento que tengo que leer y escribir la friolera de 8 variables y me faltan mas ... y los recursos se empiezan a agotar ... :-)
-
Alguna vez hice algo asi para recibir datos.
Detonan VAR BYTE[6]
Y cada uno se escribía o leía así:
Detonan[0] = lo que quiero escribir en el byte 0
lo que quiero que se guarde del byte 5 = Detonan[5]
Quizá te sirva para esas múltiples variables.
-
Hola, mira que interesante lo del cañon, como es el circuito del microfono?, hace mucho tiempo hice algo igual, pero al que se lo fabrique lo queria regalado, por lo que desde esa epoca anda buscando quien le haga el firmware, no laburo con pbp
pero te dejo el codigo ejemplo de C de como guardar una variable word, solo que deberas replicar este proceso en basic qu eno es muy dificil, y espero que no sea tu cliente la basura que me toco a mi porque si que te puedo asegurar que no vas cobrar nada.
saludos
ARIEL/PIKMAN
// Recuperacion de registros de la eeprom a la RAM
void read_counter (){
for (i=0;i<2;i++) // recupera el valor de contador
*(&contador + i) = read_eeprom(i + 0x05); // lee la eeprom variable de 16 bits
}
// Salva los registros de Ram a la eeprom
void write_counter (){
for (i=0;i<2;i++) // guarda 16 bits en la
write_eeprom(i + 0x05, *(&contador + i)); // eeprom del micro del contador de explosiones.
}
-
Hola, mira que interesante lo del cañon, como es el circuito del microfono?, hace mucho tiempo hice algo igual, pero al que se lo fabrique lo queria regalado, por lo que desde esa epoca anda buscando quien le haga el firmware, no laburo con pbp
pero te dejo el codigo ejemplo de C de como guardar una variable word, solo que deberas replicar este proceso en basic qu eno es muy dificil, y espero que no sea tu cliente la basura que me toco a mi porque si que te puedo asegurar que no vas cobrar nada.
saludos
ARIEL/PIKMAN
// Recuperacion de registros de la eeprom a la RAM
void read_counter (){
for (i=0;i<2;i++) // recupera el valor de contador
*(&contador + i) = read_eeprom(i + 0x05); // lee la eeprom variable de 16 bits
}
// Salva los registros de Ram a la eeprom
void write_counter (){
for (i=0;i<2;i++) // guarda 16 bits en la
write_eeprom(i + 0x05, *(&contador + i)); // eeprom del micro del contador de explosiones.
}
Esperemos que no sea entonces :shock: ... yo estoy en Mendoza, Argentina ... ya quedo solucionado el tema de guardar variables word, muchas gracias a todos los que me han ayudado . :-/ .. con respecto al circuito del microfono, simplemente se usa un LM538 que genera un pulso alto cada vez que "escucha" un sonido, y el sonido se regula a traves de un preset para determinar que nivel de sonido genera o no el pulso. Esto no lo desarrolle yo, a mi me pidieron el nuevo firmware solamente ...
Despues contame si tu clente era de esta zona, para tener mas cuidado ... :lol:
-
Bueno, te conteste por privado, pues no es un lugar para debatir ciertos temas, yo tambien soy de mendoza, y la placa del LM358 la diseñe yo, de hecho, fue algo que hice experimentalmente, pues cualquier ruido lo activa y no se puede saber si es o no efectivo el equipo, ahora utilizo algo mas elaborado que ademas controla el tiempo de ingicion de gas para corregir la potencia.
saludos
ARIEL
-
De acuerdo con lo que no es el lugar, pido perdon a los demas. Con respecto a tu circuito tambien te mande un privado porque mi cliente ha cambiado varias veces de placa y no se si estamos hablando de la misma. De nuevo muchas gracias a todos por su ayuda y quedo a su disposición.