TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: mammoli en 15 de Noviembre de 2007, 12:01:59

Título: Pic basic pro comandos read, write y data
Publicado 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:

Citar
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??
Título: Re: Pic basic pro comandos read, write y data
Publicado por: navaismo en 15 de Noviembre de 2007, 12:07:21
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.
Título: Re: Pic basic pro comandos read, write y data
Publicado por: LordLafebre en 15 de Noviembre de 2007, 12:28:05
Hola:

en realidad son 8 bits que corresponden a un byte.

De donde recibes el valor que corresponde al tiempo de detonación?

Título: Re: Pic basic pro comandos read, write y data
Publicado por: elreypic2 en 15 de Noviembre de 2007, 12:31:33
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.
Título: Re: Pic basic pro comandos read, write y data
Publicado por: LordLafebre en 15 de Noviembre de 2007, 12:49:24
Hola:

Que bien, de paso sirvió el ejemplo del highbyte y lowbyte, nunca lo había utilizado, muy útil, gracias elreypic2  :mrgreen:
Título: Re: Pic basic pro comandos read, write y data
Publicado por: mammoli en 15 de Noviembre de 2007, 18:33:51
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.
Título: Re: Pic basic pro comandos read, write y data
Publicado por: mammoli en 15 de Noviembre de 2007, 18:40:57
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:

Citar
..
..
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:
Título: Re: Pic basic pro comandos read, write y data
Publicado por: Mario en 16 de Noviembre de 2007, 03:54:14
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.
Título: Re: Pic basic pro comandos read, write y data
Publicado por: mammoli en 16 de Noviembre de 2007, 16:33:59
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 ... :-)
Título: Re: Pic basic pro comandos read, write y data
Publicado por: Mario en 16 de Noviembre de 2007, 17:30:20
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.
Título: Re: Pic basic pro comandos read, write y data
Publicado por: pikman en 19 de Noviembre de 2007, 00:02:27
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

Código: [Seleccionar]

// 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.
                }

Título: Re: Pic basic pro comandos read, write y data
Publicado por: mammoli en 19 de Noviembre de 2007, 19:17:19
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

Código: [Seleccionar]

// 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:
Título: Re: Pic basic pro comandos read, write y data
Publicado por: pikman en 20 de Noviembre de 2007, 02:56:35
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
Título: Re: Pic basic pro comandos read, write y data
Publicado por: mammoli en 20 de Noviembre de 2007, 08:57:32
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.