TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: marcoscab1166 en 25 de Julio de 2015, 21:35:55
-
la cosa es simple, tengo 20 variables que cambian de 0 a 1 y viceversa y quiero enviar sus valores de forma inalambrica a otro pic. intente hacerlo con un string, pero no me sale. el problema es que el pic que recibe los datos debe tratar a cada variable individualmente, por lo que necesito accesar a el valor de cualquier variable sin tocar las otras. si me pueden ayudar se los agradeceria mucho
-
Sea lo que sea que envies podes verlo bit a bit, no se cual es el problema.
Tomando un ejemplo de 20 variables de 1 bit, son 20 ( 24bits - 4 no se usan) y se guardan en 3 registros de 8 bits,
Si queres por ejemplo conocer el estado de la variable 3 (bit 3 del 1er byte supongamos)
if ( dato1 & 0x08 )
{
//Aca hago lo que sea si esta en 1 esa vriable
}
Ahi tomaria dato1 (el primer byte ) y le haria una AND con 0000 1000,
si por ejemplo dato1 era:
0001 0101 , el resultado queda en 0000 0000 ( 0 y no entra al if )
0001 1101 , el resultado queda en 0000 1000 ( distinto de 0 y entra al if )
Creo que CCS tiene una funcion que se llame bit_test(variable,bit); deberias buscarla en el manual y haria lo mismo que hice con el if de ahi.
el valor minimo a enviar inalambricamente es de 20 bits ( 24 si redondeas, o 3 bytes) depende de la forma que lo envies o si usas algun dispositivo intermedio podes ver si hay errores o no en la trama y pedir que se envie de nuevo, esto agrega mas bits, si ademas queres corregir los errores y no pedir la retrasmision entonces se agregan aun mas bits. Pero algunos protocolos eso ya lo implementan por eso decia depende de con que lo envies. Pero de la forma de arriba vas a poder discriminar cada una de las variables.
-
gracias lo voy a intentar
-
che lo intente, pero lo simule en isis y no funciona, te explico por que:
tengo 20 interruptores conectados al primer pic, y quiero enviar los estados de los mismos inalambricamente a otro pic que, segun el estado de algunos de esos interruptores realiza distintas funciones, lo probe con encender un led, pero el led permanece siempre encendido sin importar el estado del interruptor. lo que yo hice es enviar un string llamado "dato" con el comando puts(dato), y en el pic receptor con el comando gets(dato). A cada posicion del string le asigne un nombre pero cuando intento tratarlo no funciona si me podes decir como hacerlo te lo agradeceria o si sabes de algun programa ya hecho.
-
Que tal marcoscab116,
Podrias subir tu codigo, yo creo que lo estas implementando mal. Porque yo he hecho algo como lo que tú intentas hacer y utilicé el método que te sugiere KILLERJC. Lo que yo utilizo es una variable extra de respaldo de 8 bits (llamada valor_anterior, por ejemplo) y al estar leyendo el estado de los puertos lo comparo con ese variable. De esa manera puedo saber cuando una variable ha cambiado de estado.
Saludos,
Elreypic.
-
che lo intente, pero lo simule en isis y no funciona, te explico por que:
tengo 20 interruptores conectados al primer pic, y quiero enviar los estados de los mismos inalambricamente a otro pic que, segun el estado de algunos de esos interruptores realiza distintas funciones, lo probe con encender un led, pero el led permanece siempre encendido sin importar el estado del interruptor. lo que yo hice es enviar un string llamado "dato" con el comando puts(dato), y en el pic receptor con el comando gets(dato). A cada posicion del string le asigne un nombre pero cuando intento tratarlo no funciona si me podes decir como hacerlo te lo agradeceria o si sabes de algun programa ya hecho.
Como dijo elreypic2, algo estas haciendo mal, creo que el primer paso seria ver que todo este llegando correctamente y en orden, y luego si comenzar a preguntar bit por bit.
-
este es el programa emisor
seguro hay muchas cosas que estan mal, yo no soy un genio y puedo admitirlo, por eso si alguno me da una forma de hacer lo mismo que quiero hacer aca pero bien se lo voy a agradecer
-
Por lo que veo estas enviando por UART sin entrar en detalles con el codigo.
puts() imagino que la funcion espera encontrar un caracter nulo para terminar de enviar (caracter nulo que posee toda string al ultimo, busca en google como esta formada una string en C), lo cual veo 2 problemas:
- Que posiblemente tome como caracter nulo alguna variable que sea igual a 0
- O que todas sean 1 y no exista un caracter nulo al final
Otro tema a hablar, estas usando un BYTE completo ( 8bits ) para solo tener el estado de 0 o 1, lo cual podrias compactarlo todo y que quede en 3 bytes como habiamos dicho.
Con respecto al receptor es claro el por que no te funciona.
Estas asginando al reves las variables, lo que recibis va a al array dato[], pero vos estas copiando las otras variables en el array. es decir sobreescribiendo los datos.
Ademas hay otras cosas mas
En fin estas:
- Desperdiciando memoria a lo loco, creaste 2 varaibles de 8 bits para guardar el mismo resultado. en total en el receptor usas 20 + 20 variables de 8 bits, es decir 40 bytes, y solo necesitarias 3 bytes, 6 si deseas tenerlos mientras lo trabajas y va llegando la nueva informacion, Ademas hace mas corta la transmision de los datos el que sean menos.
- Estas usando delays cuando existe una transmision por UART y sin interrupciones, lo cual significa que vas a sobreescribir muchos datos de los que llegan, eso para vos significa que los datos que lleguen van a venir en cualqueir orden.
En realidad estas usando delays por demas, es una locura de delays, en pocas palabras: los delays son MALOS. Lo ideal serian interrupciones.
- Esta el problema del caracter nulo que ya comente ( Aunque en el receptor no creo que exista problema alguno, pero si en el transmisor ).
- Usando goto, cuando no deberias, para eso tenes las funciones en C como el while(1) si queres hacer un bucle infinito
PD:
Te recomiendo primero hacer una transmision simple de 1 byte por UART (entre los 2 PICs), en el receptor usa interrupciones, luego de ahi en adelante se le va agregando el ADC, y todas las demas entradas.
Y con respecto a que sea inalambrica no se como pensas enviar esos datos con la UART asi. A no ser que poseas un modulo que se comunique mediante la UART. Pero al menos por ahora para la simulacion y que esten unidos por cables, si todo eso funciona entonces quiere decir que el envio y tratado de los datos esta bien y solo te faltaria trabajar en la interface para enviarlo por RF.
-
entiendo, me podrias hacer el favor de mostrarme como editar el codigo?