necesito una salida de atmega 16 para alternar usando el interruptor

0

construí un interruptor de control remoto y conecté su salida a PB0 en el microcontrolador atmega16

luego conectó el sensor pir con una configuración de disparo único durante 30 segundos y se conectó a PB1 en atmega16

aquí está el circuito mi objetivo es poner el sensor pir para detectar que entré en mi habitación para que se encienda en la luz (este punto se hace en el código)

mi problema en el interruptor RC quiero cambiar el estado de PB1 para que pueda controlar su encendido y apagado

utilicé este código

/*
 * AVRGCC4.c
 *
 * Created: 7/9/2017 20:05:11
 *  Author: shadylap
 */ 

#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
    DDRA= 0b11111111;
    DDRB= 0b00000000;
    DDRC= 0b00000000;
    while(1)
    {

       if (PINB == 0b00000010)
       {
           _delay_ms(500);
           PORTA = 0b00000001;

       }

       if (PINB == 0b00000001)
       {
           _delay_ms(1000);
           PORTA &= ~ (1<<PA0);
       }

          }
    return 0 ;
}

cuando enciendo el interruptor IR, el led sigue encendiéndose y apagándose, pero quiero cuando enciendo el interruptor IR el led alterna su estado una sola vez

nueva actualización ............................................. ........................ utilicé este código pero no funciona en la simulación de Proteus, aunque estaba funcionando antes, ¿por qué?

    #define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

int main(void)
{
    DDRA=0b11111111;
    DDRB=0b00000000;
    DDRD=0b00000000;


    MCUCR |= (1<<ISC00);
    GICR |= (1<<INT0);
    sei();

    while(1)
    {
    if (PINB == 0b00000010)
    {
        PORTA = 0b00000001;
        _delay_ms(500);
    }
        return 0;
    }

}

ISR(INT0_vect){

        PORTA ^=(1<<PA0);

    }  
    
pregunta Shady Mohamed

2 respuestas

0

Su descripción de la funcionalidad deseada es un poco ambigua.

Asumiré lo siguiente. Si esto no es correcto, indíquelo en los comentarios a esta respuesta y lo ajustaré en consecuencia.

El funcionamiento normal es que el sensor PIR determina si el LED está encendido o apagado. Sin embargo, a través de un control remoto infrarrojo, le gustaría cambiar el estado del LED. Le gustaría que el LED permanezca en ese estado hasta el próximo evento de control PIR o IR.

Su código actual está examinando constantemente el nivel de las entradas y cambiando la salida en base a esta información, esto se denomina detección de nivel. En su lugar, su código debe realizar el disparo de borde. Aquí es donde el código realiza alguna acción solo cuando el estado de la entrada cambia de bajo a alto o alto a bajo, según corresponda.

La técnica básica para realizar la detección de bordes es guardar el valor del bit de entrada cada vez y la próxima vez que se lea el bit de entrada, compárelo con su valor anterior. Si no es lo mismo, acaba de cambiar de estado (detectó el borde del pulso). Ahora puede tomar las medidas apropiadas en función de la dirección del cambio. Todo este mecanismo agregará solo media docena de líneas de código a su programa.

Aquí hay un pseudo código que se captura como flanco ascendente de una entrada de bit de puerto:

IR_MASK = 0b00000001;
IR_INPUT = (PINB & IR_MASK);       /* mask off the other bits
if (IR_INPUT ^ IR_LAST)            /* if true, we caught an edge (change)
{
     IR_LAST = IR_INPUT;           /* save the new IR input bit value
     if (IR_INPUT);
     {
          /* put any rising edge code here
     else {
          /* put any falling edge code here
     }
}
    
respondido por el Glenn W9IQ
0

PORTA &= ~ (1<<PA0); es un conmutador. Y su código sondea la entrada en lugar de usar una interrupción. Así que cada vez que PinB = 1, cambiará PA0.

Solución. Utilice una interrupción en lugar de sondeo. O una versión más simple, use una if else or two ifs or algo.

Pseudocódigo: si pb0 = 1, encienda el led. Si pb0 = 0, apaga.

    
respondido por el Passerby

Lea otras preguntas en las etiquetas