Sensores con PIC16F877A-I/P

Hola a todos, estoy empezando en el mundo de la electrónica y microcontroladores, así que si ven errores fatales no me golpeen jeje.

Básicamente lo que pretendo es controlar 3 sensores infra rojos. Si se activa el infrarojo de enmedio activa una torreta (representado por el led de la izquierda), si se activa el de enmedio y cualquiera de los otros dos o los tres se activan la torreta y la alarma (ambos leds). Si sólo se activan los sensores de los lados no pasa nada. Acá la imagen.

Nota: tanto la torreta como la alarma funcionan a 12 V, para simplificar en proteus usé leds, sólo tendría que cambiar la alimentación de los relés.


1574269308771.png

Ahora, este es el código que está cargado en el PIC
*
* File: S.A.C..C
* Author: Asus
*
* Created on 13 de noviembre de 2019, 04:48 PM
*/
#include <pic16f877a.h>
#include<htc.h>
// PIC16F877A Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h> //LIBRERIA XC8

#define _XTAL_FREQ 4000000
#define SENSORIZQ RB0
#define SENSORMED RB1
#define SENSORDER RB2
#define RELELUZ RC0
#define RELESONIDO RC1

void main()
{
TRISB=0xFF;
TRISC=0X00;
PORTB=0X00;


while(1) //loop infinito

if(SENSORMED == 1)
{
RELELUZ = 1;

if(SENSORIZQ == 1 || SENSORDER == 1)
{
RELESONIDO = 1;
}
else
{
RELESONIDO = 0;
}
}
else
{
RELELUZ = 0;
RELESONIDO = 0;
}
}

En el proteus funciona de maravilla, sin embargo en la práctica no funciona. Cargué el código mediante un programador pic k150 y el código lo escribí en MPLAB X IDE.
Físicamente no pasa nada, y me pregunto en dónde está el error.... Como comentaba al principio, estoy comenzando en el tema, no sean rudos conmigo...

Gracias a todos!
 
Hola, en la práctica no podemos saber cómo has hecho las conexiones.
Puede que falte conectar la señal de RESET, el Xtal podría no estar haciendo contacto, pines de alimentación sin tensión, etc.
 
El arreglo lo hice tal cual, conecté el MCLR a tierra por medio de un pulsador, y a 5 V con una resistencia de 10 K, usé un oscilador de 4 MHz y dos capacitores de 15 pF. Las lineas de alimentacion que se muestran son de 12 v y 5 v, las de 12 se conectan a las terminales de la alarma y torreta de los relevadores. Estoy alimentando VSS Y VDD con la salida de un 7805A, y los sensores con otro igual (dos lineas separadas). Los sensores envían tierra al detectar, ya medí con multímetro, entonces sí está recibiendo la señal que le pido. pero parece que el micro no está haciendo su jale, no sé si sea por la línea de programación o si no se grabó bien la información en el micro. Sabes cómo puedo comprobar esto? Revisé las salidas de los relés y a uno le llegan 2V y al otro 0.2 - 0.3 V, no entiendo qué está pasando...


1574274088580.png
 
Yo le pondría tres resistencias de Pull-UP(10K) a las entradas de los pines del micro que van a los sensores como para estar seguro del nivel lógico de partida(High).

No programado en C pero no me gusta(no se como trabaja) PortB=0(el alcance del intérprete del compilador) ya que puede interpretarse como pasar a estado bajo el puerto B y eso implicaría cambiarlo de entrada a salida previamente.

En otros lenguajes solo se pasa a estado bajo/alto las salidas ya que las entradas esperan niveles lógicos externos y solo se pueden limpiar/vaciar las variables que los involucran.
 
Ya coloqué las resistencias, sigue sin pasar nada... En el código quité el comando y tampoco... No sé, creo que el código es muy simple, y debería funcionar, estoy leyendo el voltaje de los pines A0,A1,A2 y sí les llega el 0 cuando detectan los sensores, Pero a la salida de los pines C0 y C1 no cambia el voltaje, es decir permanecen en 0.2 V y 2.2 V respectivamente, sin importar si el sensor detecta o no... No sé dónde está el error.
 
No se de donde sacaste que con el pin a secas del micro podes activar directamente la bobina de un relay de 12V o de 5V pero eso es erróneo.

No los veo en el esquema y lo poco que se ve en la foto, ningún transistor, etc que separe los 5Vdc(5.5) máximos que soporta el pin de ese tipo de PIC a unos 25mA o poco más según me parece recordar.

Algo así donde la conexión que dice Relay va al pin del PIC.
re.JPG


Si hiciste eso y no se quemó el pin/protección que tiene el PIC internamente podes llamarte afortunado, si no es el precio a pagar para aprender.

a.JPG

Si los relay son de 5Vdc la bobina, consumen cerca de 60mA a 100mA
 
Última edición:
Muchas gracias @ricbevi... Soy diseñador mecánico (CAD) y apenas estoy empezando a capacitarme en electrónica - electrónica digital... Por eso empecé en el foro. Ahora mismo estaba llegando a esa solución, porque me puse a leer los datasheets de todos los componentes que estaba manejando... Agradezco tu aporte... PD: Sí quemé el PIC jajaja, gajes del oficio.
 
Si no lees la hojas de datos antes, generalmente te cuesta plata y tiempo con problemas como esos.

Siempre al menos ojea los datos relevantes de las hojas de datos porque te evitará dolores de cabeza importantes.

Cada rama de la electrónica tiene sus "tip" que los irás descubriendo/capacitandote si la transitas y haces algo en ella.

Yo ni te cuento las cosas que he quemado por cosas como esas y más pero después de 40 y tantos años ,"los muertos" ya son muchos menos :)

Saludos y suerte.
 
Los relés que manejo se activan con 5 V, debería usar el mismo transistor? Cómo sé qué diodos y transistores elegir? Hay algún libro que me recomiendes para darle una hojeada, en relación a la pregunta.
 
Siempre la hoja de datos de los componentes te marca el límite de donde se puede usar.

El BC337 perfectamente soportara el trabajo ese ya que está lejos de los 800mA de Colector máximo y los 45V entre CE que puede tolerar.

Si te referis a los diodos como D7 del esquema se puede usar cualquier diodo rectificador y es común usar un 1N4001....7 o aun diodos de conmutación tipo 1N4148...914, etc

Cuando son varios relay te conviene que la tensión de la bobina sea la mayor disponible ya que cae la corriente que consumen y al ser varios todos se suman, si están activados a la vez.

Para el caso de varios relay hay IC que son comunes de usar en esos caso que tiene resuelto el tema de corriente/tensión, etc tipo los ULN2001...4

No trates de aprender "todo de una" si no anda asimilando a medida que vas resolviendo/teniendo temas para estudiar/aprender.
 
Listo! Todo solucionado!! Muchas gracias a todos. Esta vez aprendí a los golpes, pero ha quedado muy claro muchos conceptos! Les agradezco a toda la comunidad! Ya quedó montado y funcionando!
 

Arriba