TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Algec en 02 de Noviembre de 2011, 09:42:54
-
NEcesito hacer un pequeño mando a distancia con un pic y un emisor tipo aural RS232, y quiero solo mandar un caracter al pulsar un pulsador.
Con un 16F84 va perfectamente pero me gustaria usar algo mas pequeño y barato, y probe programarlo igual con un 12C629 y no funciona en lo absoluto elija cualquiera de las salidas para tx datos.
Podeis decidme porque?
no se puede con los 12C? porque motivo? y ...cual seria lo mas apropiado para eso, solo neceito un pulsador y una salida TX de protocolo RS232
-
¿En qué lenguaje? ¿A qué frecuencia de RS232 pretendés trabajar?
-
simple en CCS y 2400 bausd es suficiente.
-
¿Estás teniendo en cuenta que dicho PIC tiene entradas para comparadores?
Por defecto dichas entradas quedan configuradas como analógicas y tal vez el problema sea que no estás leyendo el pulsador y no que no funcione la transmisión RS232
-
Pues no se pero te pego el programa que es muy simple y me dices.
EL mismo en un 16F84 va bien solo cambie el fichero .h y creo que nada mas
#include<12F629.h>
#use delay(clock=1000000)
#fuses XT,NOWDT
#use rs232(baud=2400,xmit=PIN_A0,rcv=PIN_A1,parity=N,bits=8)
// define el puerto serie como 2400 Baudios 8 bits sin paridad y
// la entrada de datos no se usa
// la salida es la salida de datos al equipo RF
//*********************
// PROGRAMA PRINCIPAL *
//*********************
void main()
{
While(1){
// el retardo se usa para no estar enviando permanentemente en mensaje y conservar la bateria del emisor
// si esta activa RB3 envia por el puerto E
// si RB3 esta a cero envia por el puerto A
putc(0b01110000); // envia cabecera
putc(0b01110000); // envia cabecera
putc('E');
delay_ms(2000);
}
}
La verdad es que me da igual el pic usar, es mas por tamaño (para que entre en un mando a distancia con un modulo aureal de RF que ya tengo) y precio. Me vale cualquiera de 8 pines que sea barato y sobre todo facil de encontrar en Madrid
-
Si no recuerdo mal, para un cristal de 10MHz no puedes poner el fuse XT, sino el HS.
Si tienes dudas, ponle OSCIO y #use delay(clock=4MHz) y verás cómo sale andando.
-
perdona el error se colo el 10 Mhz, con eso no funcionaria claro, pero tampoco funciona con menos.
Lo del OSCIO que es?
-
Es para usar el oscilador interno
-
Es decir, con eso no necesito cristal? a que frecuencia funcionaria? seria suficiente con eso para el RS232 a 2400 BAuds?
Estoy acostumbrado a usar siempre crstales de 4 Mhz a 20 Mhz jamas use pic pequeños con oscilador interno.
-
Asi funciona con proteus, Mil gracias.
La pregunta ahora es..... 4 Mhz con el reloj interno?
Cuanto se puede poner de maximo?
Nunca lo habia usado
Mil gracias de nuevo
#include<12F629.h>
#OCS 4 MHz
#fuses NOWDT
#use rs232(baud=2400,xmit=PIN_A0,rcv=PIN_A1,parity=N,bits=8)
// define el puerto serie como 2400 Baudios 8 bits sin paridad y
// la entrada de datos no se usa
// la salida es la salida de datos al equipo RF
//*********************
// PROGRAMA PRINCIPAL *
//*********************
void main()
{
While(1){
// el retardo se usa para no estar enviando permanentemente en mensaje y conservar la bateria del emisor
// si esta activa RB3 envia por el puerto E
// si RB3 esta a cero envia por el puerto A
putc(0b01110000); // envia cabecera
putc(0b01110000); // envia cabecera
putc('E');
delay_ms(2000);
}
}
-
Depende del micro, lo puedes ver en la datasheet; para este micro el máximo (y el único) valor es 4MHz. Para hermanos mayores como el 12F683 se puede correr hasta 8MHz, por ejemplo.
Si el temporizado del micro no es crítico, el oscilador interno va muy bien.
Por cierto, si lo que quieres es ahorrar batería te recomiendo que en lugar de un delay_ms duermas al micro (sleep) y lo despiertes mediante una interrupción del timer. Parece muy complicado pero no lo es y realmente así sí que ahorrarás energía.
-
Solo se pondra en marcha al darle alimentacion. genera el caracter cada 2 seg o menos , lo justo para activar o desactivar la alarma y suelto el pulsador cuando escucho que esta activa por un zumbador. Asi queda sin alimentacion el PIC y todo el circuito emisor. El retardo es para que no lleguen dos caracteres seguidos a la alarma y me la este activando y desactivando.
Mil gracias de nuevo voy a probar todo eso.
-
Por cierto es una pequeña alarma para moto, con un sensor de vibracion y una sirena de 4 Euros. Emisor de radio para puesta en marcha y paro , un led en el cuadro para señalizar y poco mas.
Si cuando este lista alguien la quiere os la paso. Menos coste casi imposible creo.
-
¡La quiero!. Siempre he pensado en hacer algo para mi moto y nunca le meto mano
-
Por supuesto cuenta con ello, ya esta casi en proteus y si va diseño rapido los CI y te lo paso todo.El sensor que usare es un viejo interruptor de mercurio, de los que no se si se encuentran ya pero que aun tengo ahi de otra vieja alarma de Moto Cmos que me monte hace años.
Mil gracias de nuevo
-
Bueno la primera parte ya casi esta, pero tengo algunos problemas.
He hecho de momento dos versiones provisionales. Una que no me gusta va con delays a base de contadores y asi es mas dificil y poco preciso ajustar tiempos etc. La segunda va con interrupcion, dentro de lo que me permite el 16F84, pero algo no va porque la interrupcion RB solo funciona al principio y luego a la hora de desactivar la alarma no funciona.
LA filosofia es la siguiente, un pequeño mando con un pic 12C y un modulo RF que simulo en Proteus dandole a un pulsador y eso seria el envio de datos al receptor. En esta parte no se que mas componentes tengo que añadir para poner el oscilador interno. ¿me podeis indicar si necesito algo mas?
En la parte de receptor de momento solo lleva un led del cuadro de la moto que parpadea lento cuando esta activada la alarma, y rapido si esta activada y ha sido disparada asi cuando volvemos vemos si alguien trasteo la moto y se disparo por cualquier causa. Quedaria resolver el problema de la recepcion para apagar, en la version con INT, y poner alguna entrada mas de disparo o salida a rele o trasoistor para encender luces, quizas tambien que la sirena fuese intermitente.
De momento resolver los problemas que me han surgido.
Os subo las dos versiones para ver si me podeis ayudar en eso.
Por cierto el 16F84 tambien podria ir con el oscilador interno, ¿que debo añadir de hardware que me falte?
-
Alguien miro a ver, he estado leyendo y parace que es un problema de la interrupcion RB con los delays, si cuando se ejecuta un delay se bloquea la interrupcion RB como el sistema lleva muchos delay voy apañado.
Alguna solucion que conozcais?
-
Tienes que evitar meter delays dentro de la rutina de interrupción. En su lugar, lo que te recomiendo es que dentro de la misma marques un flag (p.e. InterrupcionActiva=1) y en el bucle principal del main hagas la pregunta:
if (InterrupcionActiva) {
// Aquí tu proceso completo, incluyendo los delays que necesites
Interrrupcion=0;
}
De esta manera, conseguirás el mismo resultado, pero no estarás bloqueando al micro dentro de la INT.
Por cierto, el F84 no tiene oscilador interno.
-
VAle lo cambiare a ver si asi me va mejor. YA te cuento
-
Puedes ahorrar mas espacio aun con un PIC 10F222 que tiene oscilador interno de 8Mhz, y en formato SOT23 ocupa menos que la cabeza de una cerilla/fosforo.
Noc hizo un mando a distancia (infrarojo) para su aspirador con uno de esos... Tienes el codigo por el foro para tener una idea.
Por otro lado, los PICs con letra "C" intercalada no tienen una memoria de una sola escritura?
Salu2
-
Aquí está lo que hice, aunque no sé si servirá:
http://micropic.es/index.php?option=com_content&view=article&id=78:sencillo-mando-ir-para-roomba-serie-500&catid=3:proyectos&Itemid=62
-
Nocturno, a ese proyecto no le falta su 104 entre vcc y gnd? Y su R para el LED IR?
-
Hola Jeremy, le falta casi todo, sí :D
El 104 no lo puse porque la alimentación es a pilas y ahí no hay ruido. Y la R no la puse porque el led IR es de 3V, así que en directo sin R es como más lejos podía usar el mando.
-
Y nunca te ha dado ningún tipo de problema/fallo ?
-
No, siempre ha funcionado bien. Aunque la que no funciona ahora es la Roomba, porque se estropearon sus baterías y tengo que ver cómo las sustituyo.
-
Bueno, por ser baterias, como bien decis, lo del condensador de desacoplo puedo entenderlo; pero, nunca esta demás. Talves en otros ambientes si se requiere no?
Por otro lado, lo de alimentar el LED IR directamente... Una vez lo pregunte y se discutio mucho en este apartado: http://www.todopic.com.ar/foros/index.php?topic=32995.0 Alfinal, nunca supe a ciencia cierta si se podia hacer lo que haces. Se que depende mucho del fabricante y su hoja de datos del LED. Aun que en este caso es un LED IR.
Pero bueno, si te funciona bien siempre entonces bien!
-
Perfecto lo del 10, pero se encuentra en españa?
Ese es uno de los problemas, la verdad es que casi te ahorras una placa y por tamaño ya ves.
Si los 12C solo se programan una vez y tengo alguno por ahi de hacer unos interfaces de CNC.
Aun no me han dejado probar lo de las interrupciones, si alguien tiene alguna sugerencia en cuanto a entradas o salidas para la alarma,......yo habia pensado dejar algunas entradas libres para disparo que se puedan dejar en placa puenteadas si no se usan, y alguna salida para el faro o los intermitentes, pero no quiero complicarme cableando en la moto que hay que quitar carenado y demas. Simplemente con dispararla por el movimiento ya deberia vales y no hay que cablear mas que la alimentacion a bateria.
Aun me falta un detalle, el esquem que fije para el 12C esta bien para el oscilador interno? o aun faltan cosas?
-
Bueno ya parece que funciona, hacer la placa para probarlo en hard porque en proteus va bien.
En cuanto este asegurado que funciona os subo todo.
Deberia cerrar ya este post cuando suba todo lo hare en uno nuevo, como alarma moto.
Mil gracias y un saludo de nuevo
-
Pues a esperar esos resultados. Suerte
-
Vuelvo de nuevo con esto. YA hice las placas y estoy probando en Real y me encontre para empezar un problema con el emisor
El 12C508 no funcionaba y encontre que es que no estaba bien programado el escilador interno y estaba con RC externa.
Habia incluido la directiva
#OCS 4 MHz
#fuses NOWDT
en el porgrama pero cuando se programo estaba como oscilador RC externo
Que debo poner en fuses en el CCS para que me trabaje con el OSC interno a 4 Mhz? No es cuestion de publicar algo que no va bien.
Lo cambie en Winpic y reprograme y lo que es el emisor ya va bien.
En cuanto arregle eso y pruebe con el receptor etc lo publico
Mil gracias
-
los PICs que yo suelo utilizar siempre tienen oscilador interno, y el fuse que uso es INTRC_IO
y luego en el main, antes del bucle principal configuro el oscilador con "setup_oscillator".
Si usas CCS tiene una opcion donde puedes mirar los "valid fuses" para tu PIC
y sino, en la carpeta de CCS (que suele ser ARCHIVOS DE PROGRAMA>PICC) hay una carpeta llamada DEVICES y dentro tendras todas las cabeceras de los PICs, busca el 12C629 y podras ver los fuses validos arriba de todo, y mas abajo podras ver las opciones de configuracion del oscilador.
Salu2
-
Gracias me pongo a mirarlo
-
OK prefecto, ya se algo mas que no sabia, siempre trabaje con cristal.
Como siempre venis en mi rescate.
Muchas gracias