• Terminal
    Terminal
    An electrical connector acting as reusable interface to a conductor and creating a point where external circuits can be connected.
  • Ground
    A common return path for electric current. Commonly known as ground.
  • Net Portal
    A net identifier used to create connectivity to other Net Portal with the same designator. #portal
  • Power Net Portal
    Power net portal is a special schematic object used to define a power or ground net. Power ports allow you to conveniently indicate a power net at any location in the design. Power nets of the same designator automatically connect throughout your design #portal #power
  • Generic Resistor
    A generic fixed resistor for rapid developing circuit topology. Save precious design time by seamlessly add more information to this part (value, footprint, etc.) as it becomes available. Standard resistor values: 1.0Ω 10Ω 100Ω 1.0kΩ 10kΩ 100kΩ 1.0MΩ 1.1Ω 11Ω 110Ω 1.1kΩ 11kΩ 110kΩ 1.1MΩ 1.2Ω 12Ω 120Ω 1.2kΩ 12kΩ 120kΩ 1.2MΩ 1.3Ω 13Ω 130Ω 1.3kΩ 13kΩ 130kΩ 1.3MΩ 1.5Ω 15Ω 150Ω 1.5kΩ 15kΩ 150kΩ 1.5MΩ 1.6Ω 16Ω 160Ω 1.6kΩ 16kΩ 160kΩ 1.6MΩ 1.8Ω 18Ω 180Ω 1.8KΩ 18kΩ 180kΩ 1.8MΩ 2.0Ω 20Ω 200Ω 2.0kΩ 20kΩ 200kΩ 2.0MΩ 2.2Ω 22Ω 220Ω 2.2kΩ 22kΩ 220kΩ 2.2MΩ 2.4Ω 24Ω 240Ω 2.4kΩ 24kΩ 240kΩ 2.4MΩ 2.7Ω 27Ω 270Ω 2.7kΩ 27kΩ 270kΩ 2.7MΩ 3.0Ω 30Ω 300Ω 3.0KΩ 30KΩ 300KΩ 3.0MΩ 3.3Ω 33Ω 330Ω 3.3kΩ 33kΩ 330kΩ 3.3MΩ 3.6Ω 36Ω 360Ω 3.6kΩ 36kΩ 360kΩ 3.6MΩ 3.9Ω 39Ω 390Ω 3.9kΩ 39kΩ 390kΩ 3.9MΩ 4.3Ω 43Ω 430Ω 4.3kΩ 43KΩ 430KΩ 4.3MΩ 4.7Ω 47Ω 470Ω 4.7kΩ 47kΩ 470kΩ 4.7MΩ 5.1Ω 51Ω 510Ω 5.1kΩ 51kΩ 510kΩ 5.1MΩ 5.6Ω 56Ω 560Ω 5.6kΩ 56kΩ 560kΩ 5.6MΩ 6.2Ω 62Ω 620Ω 6.2kΩ 62KΩ 620KΩ 6.2MΩ 6.8Ω 68Ω 680Ω 6.8kΩ 68kΩ 680kΩ 6.8MΩ 7.5Ω 75Ω 750Ω 7.5kΩ 75kΩ 750kΩ 7.5MΩ 8.2Ω 82Ω 820Ω 8.2kΩ 82kΩ 820kΩ 8.2MΩ 9.1Ω 91Ω 910Ω 9.1kΩ 91kΩ 910kΩ 9.1MΩ #generics #CommonPartsLibrary
  • Generic Capacitor
    A generic fixed capacitor for rapid developing circuit topology. Save precious design time by seamlessly add more information to this part (value, footprint, etc.) as it becomes available. Standard capacitor values: 1.0pF 10pF 100pF 1000pF 0.01uF 0.1uF 1.0uF 10uF 100uF 1000uF 10,000uF 1.1pF 11pF 110pF 1100pF 1.2pF 12pF 120pF 1200pF 1.3pF 13pF 130pF 1300pF 1.5pF 15pF 150pF 1500pF 0.015uF 0.15uF 1.5uF 15uF 150uF 1500uF 1.6pF 16pF 160pF 1600pF 1.8pF 18pF 180pF 1800pF 2.0pF 20pF 200pF 2000pF 2.2pF 22pF 20pF 2200pF 0.022uF 0.22uF 2.2uF 22uF 220uF 2200uF 2.4pF 24pF 240pF 2400pF 2.7pF 27pF 270pF 2700pF 3.0pF 30pF 300pF 3000pF 3.3pF 33pF 330pF 3300pF 0.033uF 0.33uF 3.3uF 33uF 330uF 3300uF 3.6pF 36pF 360pF 3600pF 3.9pF 39pF 390pF 3900pF 4.3pF 43pF 430pF 4300pF 4.7pF 47pF 470pF 4700pF 0.047uF 0.47uF 4.7uF 47uF 470uF 4700uF 5.1pF 51pF 510pF 5100pF 5.6pF 56pF 560pF 5600pF 6.2pF 62pF 620pF 6200pF 6.8pF 68pF 680pF 6800pF 0.068uF 0.68uF 6.8uF 68uF 680uF 6800uF 7.5pF 75pF 750pF 7500pF 8.2pF 82pF 820pF 8200pF 9.1pF 91pF 910pF 9100pF #generics #CommonPartsLibrary
  • Generic Inductor
    A generic fixed inductor for rapid developing circuit topology. *You can now change the footprint and 3D model at the top level anytime you want. This is the power of #generics
  • 875105359001
    10uF Capacitor Aluminum Polymer 20% 16V SMD 5x5.3mm #forLedBlink #commonpartslibrary #capacitor #aluminumpolymer #radialcan
  • CTL1206FYW1T
    Yellow 595nm LED Indication - Discrete 1.7V 1206 (3216 Metric) #forLedBlink
  • 1070TR
    Battery Holder (Open) Coin, 20.0mm 1 Cell SMD (SMT) Tab bate or batt #forLedBlink

PIC16F877-04I/P

PIC16F877-04I/P
Description

Created
March 25th 2022
Last updated by vasyl
2 years ago
1 Contributor(s)
vasyl

Controls

Properties

Part Type
Microcontroller
Manufacturer Name
Manufacturer Part Number
PIC16F877-04I/P
Designator Prefix
U

Availability & Pricing

DPNStockQty 1
20–60$7.836–$7.888
1877$8.16
160$7.888
1144$8.16
10$9.7687

Assets

    Footprint
  • DIP-40_W15.24mm.kicad_mod

    id=Footprint_V5

  • Thumbnail
  • thumbnail
    DIP-40_W15.24mm.png

    id=DIP-40_W15.24mm

  • 3d Model
  • DIP-40_W15.24mm.step

    id=3D

  • Default
  • thumbnail
    PIC16F874-XXIP

    id=default

Simulation

µs

Simulation Speed

quiero al pic como un contador de segundos dependiendo de la asignacion del usua...
quiero al pic como un contador de segundos dependiendo de la asignacion del usuario en minitos
4mo
CREA UN CIRCUITO CONTADOR DE 0A 16 UTILIZANDO EL PIC16F877A
CREA UN CIRCUITO CONTADOR DE 0A 16 UTILIZANDO EL PIC16F877A
4mo
@copilot //User \#include <16f877a.h> \#fuses HS,NOWDT,NOPUT,NOLVP,NOPROTECT,BRO...
//User #include <16f877a.h> #fuses HS,NOWDT,NOPUT,NOLVP,NOPROTECT,BROWNOUT #use delay(clock=20000000) #use fast_io(B)
//DEFINE THE PINES TO USE #define PIN_PIR PIN_B0 #define PIN_FAN PIN_B3 //#define PIN_LM35 PIN_B2 ERROR (ES UN PIN ANALOGICO AN0/RC0))
float leerTemperaturaLM35(void); void controlarVentilador(int encendido);
void main() {
set_tris_b(0b00000001); // output_b(0b00000001); //ESTE ME FUNCIONA PARA QUE NO SE ACTIVEN LOS DEMAS PINES DE ESTE PUERTO (B)
while (true) {
    
    if (input(PIN_PIR) == 1) { //IF IS TRUE ACTIVE THE SENSOR LM35
      
        float temperatura = leerTemperaturaLM35();
        
      
        if (temperatura > 25.0) {
            controlarVentilador(1); 
             delay_ms(5000);
            
        } else {
            controlarVentilador(0);//IF THE CONDITION IS FALSE NO ACTIVE THE SENSOR LM35
        }
    }

    delay_ms(100); 
}
}
float leerTemperaturaLM35() { float temperatura; int16 adc_value; //UTILIZO EN PIN RC0/AN0 set_adc_channel(0); delay_us(20); adc_value = read_adc();
temperatura = (adc_value * 5.0) / 1023.0; 
temperatura = temperatura * 100.0;

return temperatura;
} void controlarVentilador(int encendido) { if (encendido ==1) { output_high(PIN_FAN); } else { output_low(PIN_FAN); } }
8mo
Your code looks well-structured for controlling a fan based on the temperature reading from an LM35 temperature sensor, with the help of a PIR sensor for activation. However, there's a minor correction and some enhancements you might consider.

  1. Correction in the Comment:

    • You've mentioned #define PIN_LM35 PIN_B2 ERROR (ES UN PIN ANALOGICO AN0/RC0)). Indeed, PIN_B2 cannot be used for LM35 because it's a digital I/O pin, and for LM35 temperature sensor, an analog input pin is required. Given you're using set_adc_channel(0);, you are correctly planning to use AN0 which is associated with RC0 on the PIC16F877A, not RA0. So ensure your hardware connection matches this pin for the LM35 sensor.
  2. Improvements:

    • Given you are using #fuses HS, ensure you have a High-Speed crystal oscillator attached to your OSC1/CLKI and OSC2/CLKO pins for the system clock. Assuming your comment #use delay(clock=20000000) means you intend to use a 20MHz crystal.
  3. Enhancements for Readability and Functionality:

    • You might benefit from adding simple comments to your code for maintenance or further development. Describing briefly what each function does could be beneficial.
    • Enabling interrupts, if you expect this system to scale or include more real-time tasks, might improve performance and responsiveness. However, for the simplicity and specific use case of your project, it's not a necessity.
Suggested Electrical Connections:
Given the components in the project description, ensure these connections for your application to work:

  • LM35 Sensor to PIC16F877A:

    • Assuming the analog output of the LM35 is connected to AN0, which corresponds to RA0 on the PIC16F877A. Please note that in your description, AN0/RA0 was listed for pin number 2 (this may require connection adjustment based on actual hardware layout).
  • PIR Sensor to PIC16F877A:

    • Connect the output of the PIR sensor to RB0 (INT/RB0) on the PIC16F877A for the digital reading.
  • Fan Control:

    • You are controlling the fan via PIN_FAN, which corresponds to RB3 (PGM/RB3). Ensure your fan control circuitry or relay is compatible with the output current and voltage levels of the PIC16F877A.

Plaintext


- Connect LM35 output to AN0/RA0 (Ensure this is correct based on your hardware setup, as your code suggests using AN0)
- Connect PIR sensor output to RB0 (INT/RB0)
- Connect fan control mechanism to RB3 (PGM/RB3)
Always make sure to check the pin configurations and power requirements of your sensors and actuators to avoid damage to the PIC16F877A or the peripherals.
8mo
dime domo debo conectar todo esto, basado en el código que te daré, //User \#inc...
dime domo debo conectar todo esto, basado en el código que te daré, //User #include <16f877a.h> #fuses HS,NOWDT,NOPUT,NOLVP,NOPROTECT,BROWNOUT #use delay(clock=20000000) #use fast_io(B)
//DEFINE THE PINES TO USE #define PIN_PIR PIN_B0 #define PIN_FAN PIN_B3 //#define PIN_LM35 PIN_B2 ERROR (ES UN PIN ANALOGICO AN0/RC0))
float leerTemperaturaLM35(void); void controlarVentilador(int encendido);
void main() {
set_tris_b(0b00000001); // output_b(0b00000001); //ESTE ME FUNCIONA PARA QUE NO SE ACTIVEN LOS DEMAS PINES DE ESTE PUERTO (B)
while (true) {
    
    if (input(PIN_PIR) == 1) { //IF IS TRUE ACTIVE THE SENSOR LM35
      
        float temperatura = leerTemperaturaLM35();
        
      
        if (temperatura > 25.0) {
            controlarVentilador(1); 
             delay_ms(5000);
            
        } else {
            controlarVentilador(0);//IF THE CONDITION IS FALSE NO ACTIVE THE SENSOR LM35
        }
    }

    delay_ms(100); 
}
}
float leerTemperaturaLM35() { float temperatura; int16 adc_value; //UTILIZO EN PIN RC0/AN0 set_adc_channel(0); delay_us(20); adc_value = read_adc();
temperatura = (adc_value * 5.0) / 1023.0; 
temperatura = temperatura * 100.0;

return temperatura;
} void controlarVentilador(int encendido) { if (encendido ==1) { output_high(PIN_FAN); } else { output_low(PIN_FAN); } }, dime el número de pines, por favor.
8mo
conecta todo para hacer un seguidor de linea con pic 16f877a
@copilot conecta todo para hacer un seguidor de linea con pic 16f877a
1y
Para hacer un seguidor de línea con PIC16F877A, necesitarás algunos componentes adicionales como sensores de línea (Sensores de infrarrojos IR), motores DC y un driver de motor (como L293D). Aunque no has proporcionado las especificaciones de estos componentes, haré algunas suposiciones y te proporcionaré una guía general.
A continuación, se detalla una posible forma de conectar los componentes. Asegúrate de verificar las especificaciones de tus componentes antes de continuar.

  1. Sensor IR:

    • Conecta las salidas de los sensores IR a los pines de entrada analogicos del PIC. Por ejemplo, podrías utilizar AN0/RA0 (pin 2) y AN1/RA1 (pin 3) para los sensores de línea izquierda y derecha respectivamente.
  2. Motores DC:

    • Conecta las salidas del controlador de motor a los motores. Normalmente, un controlador L293D tiene 4 entradas (2 para cada motor) y 4 salidas (2 para cada motor).
    • Las entradas del controlador de motor se pueden conectar a los pines CCP (Capture/Compare/PWM) del PIC para permitir el control de PWM. Los pines CCP1/RC2 (pin 17) y CCP2/RC1 (pin 16) son buenos candidatos.
  3. Driver de motor L293D:

    • Conecta las entradas del controlador de motor (IN1, IN2, IN3, IN4) a los pines de salida del PIC (con capacidad PWM si se necesita control de velocidad). Podrías usar los pines RD0/PSP0 (pin 19), RD1/PSP1 (pin 20), RD2/PSP2 (pin 21), RD3/PSP3 (pin 22) para ello.
    • Conecta VCC1 (alimentación lógica) del L293D a un pin de VDD del PIC.
    • Conecta VCC2 (alimentación del motor) del L293D a tu fuente de alimentación del motor (asegúrate de que cumple con las necesidades de tus motores).
    • Conecta todos los pines GND del L293D a un pin VSS del PIC.
  4. Alimentación del PIC:

    • Conecta los pines de alimentación (VDD - pin 32 y VSS - pin 31).
  5. Programación del PIC:

    • Conecta el pin PGD/RB7 (pin 40) (Data) y el pin PGC/RB6 (pin 39) (Clock) a tu programador de PIC.
Ten en cuenta que los pin designators especificados son puramente de referencia y debes comprobar las conexiones de acuerdo a tus necesidades y verificar con las hojas de datos de los componentes. Además, no olvides conectar un oscilador a los pines OSC1/CLKI (pin 13) y OSC2/CLKO (pin 14) de acuerdo con las necesidades de frecuencia de tu aplicación.
1y
Para un proyecto que usa 2 microcontroladores PIC16F877A, necesitarías interconectarlos para que puedan comunicarse entre sí. Aquí te explico cómo puedes hacerlo a través de la Comunicación Serial (UART). He designado el primer microcontrolador como PIC1 y el segundo microcontrolador como PIC2.

  1. Interconexión UART: El PIC16F877A tiene un módulo UART incorporado, por lo que puedes establecer una comunicación serial entre los dos PIC.

    • Conecta el pin TX (transmisión) del PIC1 (CK/TX/RC6 - Pin 25) al pin RX (recepción) del PIC2 (DT/RX/RC7 - Pin 26).
    • Conecta el pin RX (recepción) del PIC1 (DT/RX/RC7 - Pin 26) al pin TX (transmisión) del PIC2 (CK/TX/RC6 - Pin 25).
  2. Líneas de alimentación (VDD, VSS): Cada PIC debe tener sus propias conexiones de alimentación. Por lo tanto, conecta los respectivos pines VDD y VSS de cada PIC a tu fuente de alimentación.
  3. Líneas de programación (PGD, PGC): Cada PIC se programaría por separado. Por lo tanto, deja los pines de programación (PGD - Pin 40 y PGC - Pin 39) de cada PIC accesibles para tu programador.
  4. Oscilador: Cada PIC debe tener su propio oscilador. Por lo tanto, debes conectar un circuito de oscilador a los pines OSC1/CLKI (Pin 13) y OSC2/CLKO (Pin 14) de cada PIC.
Ten en cuenta que esta es una configuración de comunicación de muy alto nivel. El diseño exacto de tu circuito dependerá de tus necesidades específicas, incluyendo la forma de controlar los motores, cómo planeas alimentar tus microscontroladores, y otros detalles relevantes que tu proyecto pueda requerir. Te sugiero que revises la hoja de datos del PIC16F877A para obtener una comprensión completa de cómo se puede configurar cada uno de estos pines y módulos.
1y
If you want to use two PIC16F877A microcontrollers to develop a line-following robot, you can split the responsibilities between the two PICs. For instance, one PIC can handle the line detection part, processing inputs from the IR sensors, while the second PIC can handle the motor control, driving the motors based on the inputs given by the first PIC.
Here's a way to connect everything:
Sensor to PIC connection:
Connect the IR sensor outputs to the Analog Input pins (AN) of the first PIC. For instance, we can use:

  • Sensor 1 -> AN0/RA0 (pin 2)
  • Sensor 2 -> AN1/RA1 (pin 3)
  • (Continue according to the number of sensors)
The first PIC will read the sensor data and convert it into digital signals that indicate the line position.
Inter-PIC communication:
Then, you need to set up communication between the two PICs. This can be done using I2C, SPI or UART.

  • If choosing SPI:

    • Connect SDO/RC5 (pin 24) of the first PIC to SDI/SDA/RC4 (pin 23) of the second PIC and vice versa.
    • Connect SCK/SCL/RC3 (pin 18) of the first PIC to the corresponding pin of the second PIC.
Motor to PIC connection:
Next, we'll connect the second PIC to the motor driver (e.g., L293D). Assume we are using the PWM pins of the PIC to give speed and direction control to the motors:

  • Connect CCP1/RC2 (pin 17) and CCP2/RC1 (pin 16) to the input control pins of the motor driver.
The second PIC will then receive digital signals from the first PIC, process them, and control the motors accordingly.
Remember:

  1. Both PICs should share the same power and ground reference. Connect all VDD and VSS pins to the power and ground respectively.
  2. MCLR (pin 1) should be tied to VDD through a pull-up resistor to avoid any unintentional resets.
  3. Always remember to connect filtering capacitors near the VDD and VSS pins to maintain stable operation.
  4. Check and connect the necessary pins for programming the PICs like PGD/RB7 (pin 40) and PGC/RB6 (pin 39).
Remember to verify the connections with your component's datasheets and to follow good practices of PCB layout design.
1y
Tu solicitud de usar 2 microcontroladores PIC16F877A en un seguidor de líneas introduce un nivel adicional de complejidad en tu diseño. Podrías decidir dividir la funcionalidad entre los dos PICs, por ejemplo, un PIC podría manejar el procesamiento del sensor y el otro el control del motor. Aquí está una configuración posible:
Microcontrolador 1 (Manejo de datos del sensor):
Conecta los sensores IR en los pines de entrada analógicos del primer PIC. Podrías usar:

  • Sensor izquierdo en AN0/RA0 (Pin 2)
  • Sensor derecho en AN1/RA1 (Pin 3)
Microcontrolador 2 (Control del motor):
Conecta las entradas del controlador de motor a los pines de salida del segundo PIC que soporten PWM. Por ejemplo, CCP1/RC2 (Pin 17) y CCP2/RC1 (Pin 16) se pueden conectar a las entradas del conductor del motor.
Interconexión de los dos microcontroladores:
Para la comunicación entre los dos PICs, puedes utilizar el protocolo I2C o SPI (se recomienda I2C para la simplicidad).
Con I2C, tienes SDA y SCL que puedes conectarte a SDI/SDA/RC4 (Pin 23) y SCK/SCL/RC3 (Pin 18) respectivamente en ambos PICs.
Conexiones de alimentación y programación:
Realiza las mismas conexiones de alimentación y programación que recomendamos anteriormente para ambos PICs.
Por supuesto, todo esto necesita ser respaldado con código de software adecuado para leer los sensores y controlar los motores basados en los datos del sensor. Si planeas usar interrupciones en tu código, ten cuidado con el manejo de la latencia y asegúrate de que tu sistema puede responder rápidamente a los cambios en los datos del sensor.
1y
Lo siento, pero parece haber un error tipográfico en tu solicitud, como no existe un microcontrolador con la denominación "PIC F16877A". ¿Podría ser que quisieras referirte al microcontrolador "PIC16F877A" de Microchip Technology?
Si es así, estoy listo para ayudarte con cualquier pregunta o duda que puedas tener al respecto. Esta es una MCU muy popular en las series PIC debido a sus características como memoria FLASH de 8K x 14, oscilador interno, módulos de temporizador, módulos de comunicación (USART, SPI, I2C) y módulos de control PWM. Proporciona una gran flexibilidad para una amplia gama de aplicaciones de diseño e ingeniería.
Si tu esquema involucra dos PIC16F877A, proporciona más detalles sobre cómo deseas que interactúen estos dos microcontroladores y cómo deben estar configurados. ¿Deben comunicarse entre sí? De ser así, ¿qué protocolo deberían usar? ¿O tienen roles específicos en tu circuito global? Estas especificaciones me ayudarán a proporcionarte asesoramiento más precisivo.
1y
Comunicacion entre 2 PIC16F877A
1y
Existen varias formas de establecer comunicación entre dos microcontroladores PIC16F877A, y la elección del método de comunicación depende en gran medida de las necesidades de tu aplicación específica. A continuación, se presentan algunos de los protocolos de comunicación más comunes que podrías considerar:

  1. UART: Esta es probablemente la forma más sencilla de establecer comunicación entre dos microcontroladores. Necesitarías conectar el pin TX (CK/TX/RC6) de un microcontrolador al pin RX (DT/RX/RC7) del otro, y viceversa.
  2. SPI: Esta es una opción buena y rápida si uno de tus microcontroladores puede actuar como maestro y el otro como esclavo. Necesitarías conectar los pines SDO (SDO/RC5), SDI (SDI/SDA/RC4) y SCK (SCK/SCL/RC3) correspondientes en ambos microcontroladores.
  3. I2C: Este protocolo permite la comunicación entre varios dispositivos utilizando solo dos cables, y podría ser una opción si planeas expandir tu sistema en el futuro para incluir más microcontroladores u otros dispositivos I2C. Necesitarías conectar los pines SDA (SDI/SDA/RC4) y SCL (SCK/SCL/RC3) en ambos microcontroladores.
En todos los casos, asegúrate de que ambos microcontroladores compartan una conexión a tierra común. Además, cada protocolo requiere su propia configuración y manejo específico en el código, asegúrate de configurar correctamente los registros correspondientes y de implementar el manejo adecuado de los datos en tu código.
1y
un codigo que haga comunicacion en 2 pics un emisor y otro receptor
1y
Para una comunicación serial entre dos microcontroladores PIC16F877A a través de UART, un código de ejemplo básico se proporciona a continuación:
Para el PIC emisor:

C


#include <xc.h>
#define _XTAL_FREQ 20000000 //20MHz Crystal Oscillator

void UART_init(void){
   SPBRG = 129; // Set baud rate as 9600 for Fosc = 20MHz
   TXSTA = 0x20; // Enable transmitter
   RCSTA = 0x90; // Enable receiver
}

void UART_send_char(char ch){
   while(!TRMT); // Wait until transmitter is empty
   TXREG = ch;
}

void main(void){
   UART_init();
   while(1){
      UART_send_char('A');
      __delay_ms(1000);
   }
}
El código anterior inicializa el UART con una velocidad de baudios de 9600, luego en el bucle principal envía el caracter 'A' cada segundo.
Para el PIC receptor:

C


#include <xc.h>
#define _XTAL_FREQ 20000000 //20MHz Crystal Oscillator

void UART_init(void){
   SPBRG = 129; // Baud rate=9600 for 20MHz
   TXSTA = 0x20; // Enable Transmitter
   RCSTA = 0x90; // Enable Receiver
}

char UART_get_char(void){
   if(OERR){ // check for an overrun error
      CREN = 0; // Reset CREN (receiver)
      CREN = 1; // enable receiver again
   }
   while(!RCIF); // Wait until the data is ready to be read
   return RCREG; // return the received data
}

void main(void){
   UART_init();
   
   TRISB = 0; // Set PORTB as output
   PORTB = 0; // Initialize PORTB as 0
   
   char received_data;
   while(1){
      received_data = UART_get_char();
      
      if(received_data == 'A'){ // if received data is 'A'
         PORTB = 0xFF; // Switch ON all LEDs connected to PORTB
         __delay_ms(1000); // Delay of 1 second
         PORTB = 0x00; // Switch OFF all LEDs connected to PORTB
      }
   }
}
El código receptor inicializa el UART igualmente y configura PORTB como salida. En el bucle principal, recibe el dato desde el UART. Si recibe un 'A', enciende todos los LEDs conectados a PORTB por un segundo y luego los apaga.
Por favor nota las siguientes cosas:

  • Estas son configuraciones simples del UART, sin interrupciones. Deberías delimitar los datos si envías más de un byte.
  • Asegúrate de conectar el TX del PIC emisor al RX del PIC receptor y viceversa.
  • Ambos PIC deben compartir la misma masa.
  • El cristal de oscilador que se utilizó aquí es de 20 MHz. Si estás usando un oscilador de diferentes MHz, debes cambiar la definición de _XTAL_FREQ y la configuración del SPBRG para establecer las tasas de baudios.
1y
ayudame con un contador de 0 a 16 en pic
1y
Something went wrong, sorry. Please try again.
1y
Claro, estaré encantado de ayudarte a desarrollar un contador de 0 a 16 usando un PIC, específicamente el PIC16F877A, que es el que hemos estado discutiendo. La idea básica detrás de este contador es incrementar un valor en un registro y luego mostrar o utilizar este valor de alguna manera, como a través de LEDs conectados a un puerto, por ejemplo.
Para este propósito simple, asumiremos que quieres mostrar el valor del contador en un puerto (digamos PORTB) para que puedas ver el conteo en una serie de LEDs.
Aquí hay un ejemplo básico de cómo lo harías en C, utilizando el compilador XC8:

C


#include <xc.h>
#define _XTAL_FREQ 4000000 // Asumiendo que usas un cristal de 4MHz

// Configuración de bits de configuración
#pragma config FOSC = HS // Oscilador de alta velocidad
#pragma config WDTE = OFF // Watchdog Timer desactivado
#pragma config PWRTE = OFF // Power-up Timer desactivado
#pragma config BOREN = ON // Brown-out Reset habilitado
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming desactivado
#pragma config CPD = OFF // Data code protection desactivado
#pragma config WRT = OFF // Flash Program Memory write protection desactivado
#pragma config CP = OFF // Code protection desactivado

void main(void) {
    TRISB = 0x00; // Configura el puerto B como salida
    int contador = 0; // Inicializa el contador

    while(1) {
        PORTB = contador; // Muestra el valor del contador en PORTB
        __delay_ms(1000); // Espera un segundo
        contador++; // Incrementa el contador

        // Si el contador llega a 17, reinícialo a 0
        if(contador == 17) {
            contador = 0;
        }
    }
}
Para este ejemplo, asegúrate de conectar LEDs con resistencias adecuadas a cada pin del PORTB para ver visualmente el conteo. Este programa incrementará un contador cada segundo y mostrará su valor en los LEDs conectados al PORTB.
También he asumido que utilizas un cristal de 4MHz (común para proyectos de hobby), pero si estás utilizando una frecuencia de oscilador diferente, asegúrate de cambiar el valor de _XTAL_FREQ en consecuencia. La configuración de bits de configuración también puede necesitar ajustes según tus necesidades específicas (por ejemplo, si estás utilizando otro método de reloj).
Este es un punto de partida básico, y seguramente querrás expandirlo o adaptarlo a las necesidades específicas de tu proyecto.
9mo
9mo
PUEDES GENERAR DIAGRAMAS CON CÓDIGO?
8mo
Lamento la confusión, pero directamente no puedo generar imágenes o diagramas visuales. Sin embargo, puedo describir cómo organizar los componentes en un esquema electrónico o en un diagrama de bloques utilizando descripciones textuales o pseudo-código. También puedo ayudarte a entender cómo se vería dicho diagrama como código para herramientas específicas, como descripciones de circuitos digitales con Verilog o VHDL, o incluso cómo organizar un diagrama en software de diseño de PCBs, indicando las conexiones entre componentes.
Si necesitas ayuda con algún aspecto específico de tu proyecto, como la creación de un diagrama de bloques conceptual o la organización lógica de tu circuito, dime exactamente qué es lo que estás tratando de realizar, y haré mi mejor esfuerzo para ayudarte.
8mo
Me lo puedes explicar que numero de pin debo de utilizar?? //User #include <16f877a.h> #fuses HS,NOWDT,NOPUT,NOLVP,NOPROTECT,BROWNOUT #use delay(clock=20000000) #use fast_io(B)
//define the pines to use #define PIN_PIR PIN_B0 #define PIN_FAN PIN_B3 #define PIN_LM35 PIN_B2
float leerTemperaturaLM35(void); void controlarVentilador(int encendido);
void main() {
set_tris_b(0b00000111); output_b(0x00);
while (true) {
    
    if (input(PIN_PIR) == 1) {
      
        float temperatura = leerTemperaturaLM35();
        
      
        if (temperatura > 25.0) {
            controlarVentilador(1); 
             delay_ms(5000);
            
        } else {
            controlarVentilador(0);
        }
    }

    delay_ms(100); 
}
}
float leerTemperaturaLM35() { float temperatura; int16 adc_value; //UTILIZO EN PIN RC0/AN0 set_adc_channel(0); delay_us(20); adc_value = read_adc();
temperatura = (adc_value * 5.0) / 1023.0; 
temperatura = temperatura * 100.0;

return temperatura;
} void controlarVentilador(int encendido) { if (encendido >1) { output_high(PIN_FAN); } else { output_low(PIN_FAN); } }
8mo
Para tu proyecto en un microcontrolador PIC16F877A, utilizando un sensor de movimiento PIR, un ventilador y un sensor LM35 para medir temperatura, has elegido una configuración interesante con el uso de pines de la serie B para los dispositivos de entrada y salida, y un pin de la serie A para la entrada analógica del sensor LM35. A continuación te explicaré el uso de los pines según tu código:

  1. PIN_PIR (PIN_B0): Es el pin 33 en el microcontrolador PIC16F877A. Este pin se configura como entrada digital para leer el estado del sensor PIR (Presencia o Ausencia de movimiento).
  2. PIN_FAN (PIN_B3): Corresponde al pin 36 en el PIC16F877A. Este pin se usa como salida digital para controlar el ventilador. Cuando se activa, se espera que el ventilador se encienda.
  3. PIN_LM35 (PIN_B2): A pesar de que aquí defines PIN_LM35 en el PIN_B2, en realidad para leer el sensor LM35 se utiliza el canal analógico, especificado en set_adc_channel(0);. El canal 0 analógico es AN0, que corresponde a RC0 o pin 15 en el PIC16F877A, no PIN_B2. Es importante aclarar este detalle para evitar confusión. En tu código, el nombre PIN_LM35 no se utiliza realmente en la función leerTemperaturaLM35(). En su lugar, especificas directamente el canal analógico 0 con set_adc_channel(0);, que es el correcto enfoque para leer el sensor LM35 conectado a RC0/AN0.
En tu función leerTemperaturaLM35(), haces correctamente la llamada a set_adc_channel(0); para leer valores analógicos del sensor LM35 conectado al RC0/AN0, no PIN_B2. Recuerda, RC0/AN0 es el canal analógico 0 y corresponde al pin 15 en el PIC16F877A.
En cuanto a la función controlarVentilador(int encendido), hay un pequeño error lógico en la comparación: $if (encendido >1) {$, debería ser $if (encendido ==1) {$, para encender el ventilador si la variable $encendido$ es 1, y apagarlo si es 0.
Corrigiendo este pequeño detalle y aclarando el uso de PIN_LM35, tu proyecto debería funcionar según lo esperado.
8mo
debo usar un transistor 2n222 para el funcionamiento en el ventilador??
8mo
Sí, utilizar un transistor 2N2222 para controlar un ventilador es una excelente idea, especialmente si el ventilador requiere más corriente de la que el microcontrolador PIC16F877A puede suministrar directamente a través de sus pines de salida. El PIC puede suministrar una corriente máxima por pin del orden de 20-25 mA, lo cual es insuficiente para la mayoría de los ventiladores DC.
Aquí te muestro cómo puedes conectar el transistor 2N2222 para controlar el ventilador:

  1. Colector al Ventilador: Conecta el colector del transistor 2N2222 al terminal negativo del ventilador. El terminal positivo del ventilador se conecta a la fuente de alimentación positiva que corresponde a la tensión nominal del ventilador.
  2. Emisor a Tierra: Conecta el emisor del 2N2222 a tierra (GND).
  3. Base al PIC16F877A: Conecta la base del transistor a PIN_B3 (PIN del ventilador) del PIC16F877A a través de una resistencia limitadora de corriente. La resistencia puede ser de alrededor de 1kΩ. Esta resistencia es importante ya que limita la corriente de base del transistor, protegiendo así el pin de salida del PIC de sobrecorriente.
  4. Diodo de rueda libre: Es muy recomendable colocar un diodo de rueda libre en paralelo al ventilador, conectando el ánodo al terminal negativo del ventilador (o colector del transistor) y el cátodo al lado positivo de la fuente de alimentación del ventilador. Este diodo protege al transistor de los posibles voltajes de polarización inversa generados por el inductor (ventilador) cuando se apaga. Un diodo 1N4007 puede funcionar bien para esta aplicación.
La conexión sería algo así:
Fuente de alimentación (V+) --- Ventilador+ 
Ventilador- --- Colector (2N2222)
Emisor (2N2222) --- GND
Base (2N2222) --- Resistor (1kΩ) --- PIN_B3 del PIC16F877A
Diodo de rueda libre (1N4007) entre V+ y colector del 2N2222 (cátodo en V+, ánodo en colector)
Al enviar un "HIGH" (1 lógico) desde el PIC al PIN_B3, la base del transistor se polariza, permitiendo el flujo de corriente desde el colector hacia el emisor, activando así el ventilador. Al enviar un "LOW" (0 lógico), el transistor se apaga, cortando el flujo de corriente y deteniendo el ventilador.
Es importante verificar la hoja de datos del ventilador para asegurarse de que el transistor 2N2222 puede manejar la corriente requerida, ya que este transistor tiene un límite de corriente de colector que no debe ser excedido.
8mo
Podría, emular esto en proteus?? o tu puedes??
8mo
Como asistente, no puedo interactuar directamente con software o ejecutar simulaciones por mí mismo, pero puedo guiarte sobre cómo podrías hacerlo en Proteus.
Proteus es una herramienta poderosa para la simulación de circuitos electrónicos y microcontroladores. Puedes emular el circuito que hemos discutido $con el microcontrolador PIC16F877A, el transistor 2N2222 para el control del ventilador, un sensor PIR, y el sensor de temperatura LM35$ en Proteus siguiendo estos pasos:

  1. Inicio del Proyecto: Inicia un nuevo proyecto en Proteus e ingresa el nombre y la ubicación que prefieras para tu proyecto.
  2. Agrega los Componentes:

    • Usa la barra de búsqueda en la biblioteca de componentes de Proteus para encontrar y colocar en el área de trabajo el PIC16F877A, un transistor 2N2222, un diodo $como el 1N4007$, un sensor PIR, un sensor LM35, y un modelo de ventilador DC. No olvides buscar resistencias y fuentes de alimentación para tus componentes.
    • También tendrás que agregar un oscilador de cristal y capacitores si tu diseño lo requiere en el PIC16F877A, dependiendo de cómo programas configurar el oscilador en tu código fuente.
  3. Conecta los Componentes:

    • Conecta el PIC al resto de los componentes según las conexiones que hemos discutido. Por ejemplo, conectar el sensor PIR al PIN_B0, la base del transistor 2N2222 $a través de una resistencia$ al PIN_B3, y el sensor LM35 al canal analógico correcto $RC0/AN0 para la función de lectura ADC$.
    • No olvides conectar el diodo de rueda libre paralelo al ventilador y dirigido hacia la alimentación positiva.
  4. Carga tu Código:

    • Una vez finalizado el esquema, debes cargar el código a tu microcontrolador en Proteus. Para hacer esto, haz doble clic en el microcontrolador que has colocado en tu esquema de Proteus. En las propiedades del componente, busca una opción para cargar un archivo de firmware. Aquí deberías buscar y seleccionar el archivo .HEX que genera tu compilador C $como MPLAB X IDE o XC8$ cuando compilas tu código.
  5. Simula:

    • Ahora que tienes todo listo, haz clic en el botón de inicio para correr la simulación. Proteus emulará el comportamiento de tu circuito según el código que hayas cargado en el PIC. Podrás ver cómo se activa el ventilador a través del transistor 2N2222 cuando se detecta movimiento y la temperatura excede el umbral que has definido.
De esta forma, puedes utilizar Proteus para simular y validar el diseño de tu circuito y el funcionamiento de tu código antes de la construcción física del proyecto.
8mo
conecta todo para hacer un seguidor de linea con pic 16f877a
conecta todo para hacer un seguidor de linea con pic 16f877a
1y
dame un circuito electronico donde Utilizando el PIC16F877A, se requiere que con...
@copilot dame un circuito electronico donde Utilizando el PIC16F877A, se requiere que conecten dos Leds en los pines RB0 y RB1, el programa que uds diseñen debe hacer que los los LEDs enciendan de manera alternada con una frecuencia de 1Hz.
1y
Para el requerimiento que planteas, aquí te proporciono un diagrama básico de cómo podrías conectar tus LEDs al PIC16F877A y el código que haría que los LEDs parpadeen de manera alternativa a una frecuencia de 1Hz.
Diagrama de conexión:

Plaintext


        PIC16F877A           LED
           Pin RB0  ----->  Anodo ------ +
           Pin RB1  ----->  Anodo ------ +
           Vss      ----->  Cátodo (a través de resistencia de 330 ohm)
Nota: No olvides que los LEDs deben estar conectados a tierra (Vss) a través de una resistencia (alrededor de 330 ohms debería estar bien para la mayoría de los LEDs), para limitar la corriente que pasa a través del LED.
Para el código, puedes utilizar el lenguaje de programación C y el compilador MPLAB XC8 de Microchip. Aquí está el código que hará que los LEDs parpadeen de forma alternativa a una frecuencia de 1Hz:

C


#include <xc.h>

#define _XTAL_FREQ 4000000 // Esto se utiliza por la macro __delay_ms

void main() {
    TRISB0 = 0; // Configura el pin RB0 como salida
    TRISB1 = 0; // Configura el pin RB1 como salida

    while(1) {
        RB0 = 1;  // Enciende el LED en el pin RB0
        RB1 = 0;  // Apaga el LED en el pin RB1
        __delay_ms(500); // Espera medio segundo

        RB0 = 0;  // Apaga el LED en el pin RB0
        RB1 = 1;  // Enciende el LED en el pin RB1
        __delay_ms(500); // Espera medio segundo
    } 
} 
Nota: Este código asume que estás utilizando un cristal de 4MHz para tu PIC16F877A. Si estás utilizando un cristal de diferente frecuencia, debes cambiar el valor de _XTAL_FREQ al valor de tu cristal para que la función __delay_ms() funcione correctamente.
Recuerda que esta es una solución básica, pueden existir otras más avanzadas y eficientes en función de las necesidades de tu proyecto.
Source(s):
1y
QUIERO PRENDER UN LED CON ESTE PIC
1y
Para encender un LED utilizando el microcontrolador PIC16F877-04I/P, primero necesitas configurar el pin al que conectarás el LED como salida. Luego, proporciona un nivel alto ('1') a ese pin para encender el LED.
Aquí te proporciono un esquema básico de cómo podrías hacer la conexión, y un ejemplo de código.
Esquema de Conexión:
      PIC16F877-04I/P Pin RB0 ----------(A) LED (K)------- Resistor 220 Ω  ------- GND
Nota: (A) hace referencia al ánodo del LED. (K) hace referencia al cátodo del LED. Conectar el cátodo del LED a tierra (GND) a través de la resistencia limita la corriente que pasa a través del LED.
Ejemplo de código (en lenguaje C para el compilador XC8 de Microchip):

C


#include <xc.h>

// CONFIG
#pragma config FOSC = HS 
#pragma config WDTE = OFF 
#pragma config PWRTE = OFF 
#pragma config BOREN = ON 
#pragma config LVP = OFF 
#pragma config CPD = OFF 
#pragma config WRT = OFF 
#pragma config CP = OFF

#define _XTAL_FREQ 4000000

int main() {
    TRISB0 = 0; // Configura el pin RB0 como salida
    RB0 = 1; // Enciende el LED en RB0
    while(1);
} 
Este es sólo un ejemplo básico. Si quieres implementar un control más sofisticado del LED (por ejemplo, hacer que parpadee o que su brillo varíe), necesitarás un código más complejo.
Recuerda, verificar que la corriente que va a pasar por el LED no exceda su límite. Puedes calcularla usando la ley de Ohm: I = V/R, donde V es la diferencia de voltaje entre el pin RB0 y tierra, y R es la resistencia utilizada (220 Ω en este ejemplo).
Source(s):
1y
pic16f877 con sensor de proximidada
1y
Para conectar un sensor de proximidad al microcontrolador PIC16F877A, necesitarás asignar un pin en el microcontrolador para recibir los datos del sensor. Considera la posibilidad de usar un sensor de proximidad digital simple como el GP2Y0A21YK0F de Sharp que puede enviar una señal HIGH o LOW si detecta un objeto dentro de un cierto rango.
Aquí está cómo podrías hacer la conexión:
Diagrama de conexión:
      PIC16F877A Pin RB0 <---------- GP2Y0A21YK0F Sensor Output
      PIC16F877A Vcc     ----------> GP2Y0A21YK0F Vcc
      PIC16F877A GND     ----------> GP2Y0A21YK0F GND
Ejemplo de código (en lenguaje C para el compilador XC8 de Microchip):
Este código muestra un ejemplo de cómo puedes leer una entrada digital en el pin RB0 de PIC16F877A. En este caso, si el sensor detecta un objeto cercano, enviará una señal HIGH ('1') al pin RB0, de lo contrario, enviará una señal LOW ('0').

C


#include <xc.h>

#define _XTAL_FREQ 4000000 // Asegúrate de ajustar esto a la frecuencia de tu oscilador

int main() {
    TRISB0 = 1; // Configura el pin RB0 como entrada

    while(1) {
        if (RB0 == 1) {
            // El sensor detectó un objeto, aquí puedes poner el código a realizar en este caso
        }
        else {
            // El sensor no detectó un objeto, aquí puedes poner el código a realizar en este caso
        }
    }
}
Recuerda que este es un ejemplo básico y que dependiendo del sensor de proximidad específico que estés utilizando, podrías necesitar ajustar el código y/o el diagrama de conexión para que se ajuste a las especificaciones y características de tu sensor.
Source(s):

  1. /p/blog/introduction-to-the-attiny85-microcontroller
  2. https://docs.flux.ai/faq
1y
programming language for pic16f874
@copilot programming language for pic16f874
1y
I'm sorry, but as an AI developed by Flux.ai, I don't have the ability to provide information on programming languages for specific microcontrollers like the PIC16F874. My primary function is to assist users in designing electronic circuit schematics and PCB layouts using Flux.ai.
However, typically, PIC microcontrollers like the PIC16F874 are programmed using assembly language or C. There are various compilers available for these languages, such as the MPLAB X IDE from Microchip for assembly language and the XC8 compiler for C.
For more specific information, I recommend referring to the relevant Microchip documentation or resources.
Source(s):
1y
@copilot what programming language for pic16f874 use in flux.ai
1y
Flux.ai does not directly deal with programming languages for microcontrollers like the PIC16F874. It is primarily a tool for designing and simulating electronic circuits and PCB layouts.
However, for programming a PIC16F874 microcontroller, you would typically use a language like C or assembly. You would then use a tool like MPLAB X IDE and a compiler like XC8 for PIC microcontrollers to write and compile your code.
Remember, after programming your microcontroller, you can simulate its interaction with other components in your circuit using Flux.ai.
Source(s):
1y
lenguaje de programación para los pic16f874
@copilot lenguaje de programación para los pic16f874
1y
Lo siento, pero actualmente Flux Copilot solo puede responder preguntas en inglés. Sin embargo, puedo decirte que los microcontroladores PIC16F874 generalmente se programan utilizando el lenguaje de programación C o el lenguaje de ensamblaje. Te recomendaría utilizar un compilador como MPLAB X IDE de Microchip para programar estos microcontroladores.
Source(s):
1y
Programacion
Programacion
1y
fuente de alimentacion para el pic
@copilot fuente de alimentacion para el pic
1y
El PIC16F877-04I/P de Microchip Technology es un microcontrolador que opera con una fuente de alimentación de +2.0V a +5.5V. La fuente de alimentación se conecta a los pines de VDD (fuente de alimentación positiva) y VSS (tierra).
Aquí están los pines de alimentación del PIC16F877-04I/P en este proyecto:

  • VSS en las posiciones de esquema (0, -856) y (21, -856)
  • VDD en las posiciones de esquema (0, 800) y (21, 800)
Estos pines deben conectarse a la fuente de alimentación de su circuito. Recuerde que siempre es recomendable tener condensadores de desacoplo cerca de los pines de alimentación para estabilizar la fuente de alimentación.
Referencia: Datasheet del PIC16F877-04I/P.
1y
puedes crear una en el esquematico?
1y
Lamentablemente, como una inteligencia artificial de texto, no tengo la capacidad de dibujar esquemas o modificar esquemas de PCB en tiempo real. Sin embargo, puedo ofrecerte una guía paso a paso sobre cómo puedes hacerlo en Flux:

  1. Asegúrate de que tienes el componente de condensador en tu biblioteca. Si no lo tienes, añádelo. Para este caso, un condensador cerámico de 100nF (0.1uF) debería ser suficiente.
  2. Añade el condensador al esquemático. Para hacerlo, simplemente arrastra y suelta el componente de la biblioteca al esquemático.
  3. Conecta un extremo del condensador al pin VDD del microcontrolador y el otro extremo al pin VSS. Puedes hacer esto utilizando la herramienta de cableado en Flux.
  4. Repite el paso 3 para todos los pines de alimentación (VDD y VSS) del microcontrolador.
  5. Revisa y guarda tu esquema.
Ten en cuenta que estos son pasos generales y pueden variar dependiendo de tu diseño y requisitos específicos.
1y
fuente de alimentacion
fuente de alimentacion
1y
Hey, I'm copilot! I can help you with all kinds of stuff in your project. Reac...
Hey, I'm copilot! I can help you with all kinds of stuff in your project. Reach me at any time by tagging me on comments or in the chat with my handle, @copilot.
1y
Someone is typing...
Checks that the power traveling across a given resistor is under its rating with 50% headroom.
Learn more
Checks that IC pins that require pull up or pull down resistors have them.
Learn more
Checks that capacitors have appropriate voltage ratings to prevent overheating and ensure reliable circuit operation.
Checks that all parts have a part number and are available from distributors.
Reports copper elements that are shorting.
Reports parts that have no footprint.
Reports nodes that are assigned to a layer that doesn't exist in the layout stackup.
Reports components that have been modified using the "!important" flag.
Reports terminals that are not connected properly. NOTE: Only connections to the center of pads are considered valid.
Reports nodes that are using rules that are not supported anymore.
Reports layers that have multiple copper fills of different nets. Make sure the Connected Layers rule value of nets with fills is valid.
Detect any via, trace or copper fill island that is not connected to any net.