Autor Tema: Programación de un intercomunicador unidireccional  (Leído 3303 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado sabina77

  • PIC10
  • *
  • Mensajes: 4
Programación de un intercomunicador unidireccional
« en: 05 de Agosto de 2004, 10:42:00 »
Buenas picadictos!!!

Vamos a ver, estoy realizando un proyecto (trabajo de la universidad), con el pic 16F877A.
Se trata de un intercomunicador unidireccional. Me explico: Se trata de diseñar un comunicador desde una placa central hacia una habitacion o hacia varias habitaciones a la vez.

Unicamente nos piden diseñar la placa central y una de las periféricas. Cuando se pide hablar con una de las habitaciones se pincha en un teclado la habitación, en ese momento se escucha un mensaje de 4 segundos y después se puede hablar unidireccionalmente de la placa central hacia la habitacion. Pinchando en otro boton del teclado se podría hablar con todas las habitaciones a la vez, previa escucha del mensaje. Mediante otra tecla se podría grabar ese mensaje de 4 segundos.

A ver si algun forero me puede dar algun consejo, pista porque no se por donde pillarlo.

Muy Agradecido.

Desconectado Juanse_

  • PIC10
  • *
  • Mensajes: 39
RE: Programación de un intercomunicador unidireccional
« Respuesta #1 en: 11 de Agosto de 2004, 17:39:00 »
A ver si entendî bien ... Te estân pidiendo que hagas un intercomunicador con un micro?
Que feo proyecto!

Encima tenês que almacenar un mensaje de 4 segundos.

Tenê en cuenta que 4 seg, sampleados a 4Khz son 16k palabras, vas a nacesitar memoria externa.
Para mandar datos, ya sea a una o todas las habitaciones necesitâs samplear y transmitir 4000 x 8 (ideal 10) bits por segundo.
Estudiâ muy bien el uso del conversor AD, si bien es fâcil usarlo, hacer que funcione con un timing preciso no es TAN fâcil.
Controla el timing de las rutinas que hagas para traer los datos de la memoria externa, no creo que tengas problemas, pero puede que necesites un buffer para equilibrar velocidades.
Usâ el XTAL mâs râpido que te permita el micro (20 Megas, no?)

Si te animâs, en los terminales podês hacer un rudimentario conversor DA con PWM, pero tenês que diseñar un buen filtro, si no vas, a escuchar el mensaje como si fueran la heladera y el microondas charlando en idioma Samsung.

Mi consejo, esto tiene que ser un programa que se mantenga en estado IDLE todo el tiempo y corra netamente movido por las interrupciones de tus timers y del ADC.

Este es tu primer proyecto con micros? Quê te tiraron, un salvavidas de plomo?
Yo que vos le rayarîa el auto al profesor.

Suerte.

Desconectado sabina77

  • PIC10
  • *
  • Mensajes: 4
RE: Programación de un intercomunicador unidireccional
« Respuesta #2 en: 12 de Agosto de 2004, 00:16:00 »
Hola!

Juanse_  ante todo muchas gracias por tu comentario. Efectivamente voy a utilizar memoria externa (concretamente 32kbytes) y un convertidor A/D a la entrada. Me imagino que lo primero que debo hacer es inicializar variables, y luego rastrear el teclado para ver que tecla se ha apretado.
A partir de la tecla si es grabar el mensaje encender led rojo y poner a grabar. Si es hablar con una habitación escuchar el mensaje y después poder hablar. Y si es a todas a la vez pues escuchar el mensaje en todas y hablar con todas.
Tambien estoy usando 4 contadores de 4 bits.
El problema es que no se bien como se debe indicar desde el PIC que comience a hacer la conversión A/D, a que velocidad, como ir guardando los datos en la memoria, como recuperarla después.

Saludos,

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: Programación de un intercomunicador unidireccional
« Respuesta #3 en: 12 de Agosto de 2004, 13:55:00 »
No tengo muchos conocimientos del tema, pero te intentare ayudar en lo que pueda... asi me preparo para cuando me llegue la universidad a mi, y me pongan semejantes proyectos... no olvides rayarle el coche a tu profe, se lo merece "de todo corazon"...

Al grano. El teclado supongo que será un 4x4 verdad? Por lo tanto, usariamos un puerto entero para el manejo de este teclado (4 filas + 4 columnas = 8 salidas ).

Veamos, para la entrada de la voz, usariamos un ADC, en este caso el del PIC. Si 10 bits no son suficientes, tal vez deberias usar un ADC externo con mas resolucion, pero talvez sea complicar todo demasiado. Por lo tanto, para la entrada usamos el ADC enclavado en PORTA.

Para sacar los datos a los altavoces, debes de usar un DAC externo, que tenga bastante resolucion, y que sea rapido. No conozco mucho sobre DACs pero seria cuestion de documentarse.

La velocidad debe de ser la maxima, 20mhz en este caso. Si pudieras usar un 18F452, mejor, pues este soporta 40mhz. No obstante no creo que debas de hacer uso de las interrupciones para nada.

Los algoritmos, espero que te gusten:

-Placa madre
  >Arranque (variables,declaraciones etc)
2>Esperar respuesta del teclado (pulsacion)        
  >Leer datos de la memoria, y enviarlos al DAC externo. (4seg,altavoz)
  >Activar lectura de ADC 10 bits, enviar datos serialmente a los modulos esclavo, primero el numero clave(*).  (microfono conectado a ADC)
  >Acaba transmision, borrar datos temporales, ir a [2]

-Placas esclavo
1 >Chequear numero clave(*) en bucle infinito, si corresponde, seguir adelante.
   >Recibir datos serialmente , y redirigirlos al DAC externo.
   >Si hay mas de medio segundo de inactividad, ir a [1]
   
--------------

Te habras dado cuenta de que he puesto (*) en "numero clave". La cuestion es la siguiente:
Todos los dispositivos esclavo compartiran el "bus de datos" que enviara los datos referentes al ADC (cuando hablamos). Necesitamos regular la recepcion de datos segun el esclavo que seleccionemos, pues de lo contrario siempre estaremos hablando a TODOS los esclavos. Yo propongo el siguiente protocolo:
Usamos un puerto cualquiera, pero lo usamos enteramente:

BIT 7 : todos los esclavos obedecen a este BIT.
BIT 6...0 : Bits 6...0 del codigo

Cada "esclavo" tendria grabado un codigo en él, que difiera de todos los demas. Asi , antes de empezar a enviar datos de voz serialmente, activariamos los bits correspondientes a este bus. Si te has dado cuenta, asi podemos activar hasta 128 esclavos (por si piensas patentarlo a alguna mansion marbellí.

Asi, para activar el esclavo 4:   00000100
                                         42:   00101010
Para activar TODOS los esclavos:  10000000

Osea, el BIT 7 seria el bit global, osea el que activa todos los esclavos. Los demas son los que seleccionan el esclavo.



Espero haberte ayudado lo más posible.

salu2

Desconectado sabina77

  • PIC10
  • *
  • Mensajes: 4
RE: Programación de un intercomunicador unidireccional
« Respuesta #4 en: 12 de Agosto de 2004, 16:52:00 »
Hola!

Estoy realmente emocionado (lo digo en serio), de verdad que muchas gracias por vuestro interés!!!

A ver, no me dejan utilizar el ADC del PIC y debo utilizar un ADC externo con 32kb. Tambien utilizo 4 contadores de 4 bits para incrementar la memoria (externa tambien). Y aki está el problema. Cuando se pulsa la tecla de grabación del mensaje de 4 segundos, el pic tiene que controlar el ADC, los contadores y la memoria externa y de verdad que no se por donde pillarlo.
Me imagino que cuando se pulse la tecla para grabar, hay que encender un led rojo, para indicar al usuario que está grabando, y luego también decir al ADC que empieze a convertir y resetear los contadores. La verdad es que estoy hecho un lío.

No entiendo como lo voy a hacer. Se inicia la conversion, a la salida del conversor estarán los 8 bits, pero como llevo esos bits a la memoria y le indico que tienen que ir a la posición que indican los contadores?.

Toda ayuda sera eternamente agradecida.
Saludos!

Desconectado Juanse_

  • PIC10
  • *
  • Mensajes: 39
RE: Programación de un intercomunicador unidireccional
« Respuesta #5 en: 12 de Agosto de 2004, 16:56:00 »
Lamentablemente Manex, estoy prâcticamente en desacuerdo con tddo lo que has recomendado. Pero buen, de eso se trata no? De opinar y de muchas ideas sacer un buen diseño.

Sabina, todas las respuestas estân en las hojas de datos, de ahî en mâs tenês que usar tu criterio y programar bien.
No creo que necesites mayor resoluciôn que los 10 bits que te va a proveer el ADC que trae el micro. Es mâs, podês shiftear esos datos de forma de eliminar los 2 LSBs y trabajar con 8 bits. El por quê de esta recomendacion es la siguiente, la limitaciôn de calidad te la va a dar el amplificador y el parlantito que uses en los terminales, trabajar con mâs de 8 bits de resoluciôn es como comprar un equipo HI FI de la puta madre y escucharlo con auriculares. Por otro lado, probablemente tu memoria tenga un ancho de palabra de 8 bits, otra razôn para trabajar con 8 bits de resoluciôn.
Una cosa importante, tenês que saber bien que mic estâs usando, vas a necesitar amplificarlo e idealmente filtrar la señal antes de samplear.

Los 20 Mhz del F876 son suficientes si lo manejâs bien, es verdad que una mayor velocidad te va a dar mâs flexibilidad, pero vas a estar gastando mâs plata. Claro que serîa mâs fâcil comprar 5 PCs e instalarlas en cada pieza, pero pensâ que en el futuro tal vez estês trabajando para una empresa en la que si tu competidor metiô el mismo producto en un micro que cuesta 5 centavos mas barato, te ganô el mercado.

Lei que no sabês muy bien como usar el ADC, por lo que infiero que no tenês mucha experiencia programando hard, olvidâ mi idea de usar PWM como DAC, te va a complicar la vida, usâ uno externo, hasta el mas barato va a ser suficientemente râpido para tu aplicaciôn. A diferencia con los ADC en el que el precio varîa mucho con la velocidad (sample and hold shit), los conversores DAC son en general râpidos.  

INSISTO que este systema tendrîa que estar basado en interrupciones, por lo menos el master. Pensâ que tenês que manejar varios procesos que son dependientes del tiempo. Pero bueno, eso depende de vos.

Con respecto a la comunicacion con los esclavos, mm, yo no harîa un bucle infinito que escuche y reconozca direcciones, hacer eso significa que vas a tener que armar un pequeño protocolo en el que al menos haya un ack por parte del exclavo e idealmente un control de errores de "fail to connect". Para quê complicarse si eso ya estâ resuelto por hard ! Yo usarîa el bus IIC para la comunicacion con los esclavos.

ADC - DAC externo - Memoria externa - IIC - Interrupciones para timers, para IIC, para ADC.

Te deseo suerte !!
Vas a programarlo en asm?

Por quê no le decîs a tu profesor si podês hacer titilar un led en vez de hacer el intercomunicador?

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: Programación de un intercomunicador unidireccional
« Respuesta #6 en: 13 de Agosto de 2004, 05:17:00 »
Me suponia claramente que estariais en desacuerdo, porque los que tienen algo de idea aqui sois vosotros, que seguro sois universitarios,o ya licenciados... yo solo se lo que he aprendido mediante algun libro que otro e internet...

PD: Si para seleccionar esclavos no he recomendado I²C es porque no conozco sus posibilidades en ese sentido, solo he manejado una eeprom en este sentido hasta ahora...


Desconectado Juanse_

  • PIC10
  • *
  • Mensajes: 39
RE: Programación de un intercomunicador unidireccional
« Respuesta #7 en: 13 de Agosto de 2004, 15:03:00 »
Mirâ, si ponês debajo de la almohada las hojas de datos, nada vas a tener que envidiarle a un universitario o licensiado !

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: Programación de un intercomunicador unidireccional
« Respuesta #8 en: 14 de Agosto de 2004, 06:12:00 »
Pero qué hojas de datos??? Podrias tener el minimo detalle de enumerar las incongruencias que encuentras en el protocolo que he descrito??? Y que no sean en modo de critica.

salu2

Desconectado Juanse_

  • PIC10
  • *
  • Mensajes: 39
RE: Programación de un intercomunicador unidireccional
« Respuesta #9 en: 14 de Agosto de 2004, 06:36:00 »
Epa! No lo tomes mal!
El comentario lo hice por lo que decîs que no conocês bien el funcionamiento del bus IIC, y si lees detenidamente las hojas de datos y pracitâs, vas a saber lo mismo o mâs que un universitario. La ûnica diferencia entre vos y muchos de ellos va a ser que a ellos los obligaron a leerlas y vos lo hiciste por gusto.

Con respecto al protocolo, solo podrîa recomendar que en vez de usar el bit 7 para broadcast, deberîas usar la palabra 00h asî podês tener 254 esclavos en vez de 128.
Otra cosa que no mensionâs, pero seguro la pensaste es que debe haber alguna clase de charla entre el esclavo y el master antes de empezar la comunicaciôn, si no, corres el riesgo de perder la comunicaciôn.

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: Programación de un intercomunicador unidireccional
« Respuesta #10 en: 14 de Agosto de 2004, 06:39:00 »
Tranqui, no lo tomo a malas. Simplemente no interpreté bien la pregunta. Y tienes razon... porque yo ahora mismo el bus IIC solo se usarlo en cuanto a EEPROMs... voy a empollarme el protocolo enteramente si puedo.

salu2 y buen rollito!

Desconectado leoregroso

  • PIC10
  • *
  • Mensajes: 1
Re: Programación de un intercomunicador unidireccional
« Respuesta #11 en: 22 de Mayo de 2014, 15:26:15 »
hola disculpa q me meta pero te aseguro q si buscas en google encontraras mucha info sobre el uso del i2c y es lo mismo q usarlo con una eeprom solo q debes darle una direccion a cada esclavo asi poder llamarlo sin tener que hacer tanto lio con protocolos nuevos o inventar tanto! y para salir con el audio en el esclavo podrias usar el pwm y solo cargar el dato q llega desde el master y filtrarlo con una resistencia y un capacitor luego lo amplificas y listo tendras una vos clara no con la mas alta calidad pero si entendible!! espero que te funcione!!!! saludos


 

anything