Pines de E / S diferentes del mismo PUERTO de ATMEGA8 que no proporcionan una salida exacta [cerrado]

0

He escrito un código para encender / apagar alguna luz LED conectada a diferentes pines de E / S del mismo PUERTO (es decir, PORTD) del microcontrolador atmega8. Este proceso se realiza mediante la aplicación de Android enviando un byte diferente a través de USART. Cuando se envía un byte de datos, el LED correspondiente está ENCENDIDO. Cuando dos o más LED están ENCENDIDOS enviando sus datos correspondientes a continuación, si para apagar un LED específico, se envía un byte específico, todo el LED está apagado. Si uso dos puertos separados (es decir, PORTC y PORTD), obtengo la salida exacta, pero en este caso solo puedo usar un pin de PORTD y un pin de PORTC para dos LED ON / OFF. Si uso más de dos pines, se produce el fallo anterior. Mi código está abajo.

ISR(USART_RXC_vect)
{
while(!(UCSRA & (1<<RXC)));
rec=UDR;

        switch(rec)           
{

              case 65:{
              PORTD |=1<<4;

             }break;



              case 66:{
               PORTD |=1<<5;       
             }break;

              case 67:{
                PORTD |=1<<6;       
             }break;
              case 68:{
              PORTD |=1<<7;

             }break;


             case 69:{
               PORTD&=~1<<4;

             }break;



              case 70:{
               PORTD&=~1<<5;       
             }break;

              case 71:{
                PORTC&=~1<<6;      
             }break;
              case 72:{
              PORTB&=~1<<7;

             }break;


             }

}

por favor, que alguien me ayude a resolver este problema.

    
pregunta Muzahid Karim

1 respuesta

1

La expresión

PORTD &= ~ 1 << 4;

en realidad se interpreta como

PORTD &= ((~1) << 4);

debido a la precedencia del operador. En C ++, el operador unario ~ tiene mayor prioridad que el operador binario << . Consulte enlace

Corrija esto utilizando paréntesis para encerrar el 1 < < 4 expresión:

PORTD &= ~(1 << 4);
    
respondido por el MarkU

Lea otras preguntas en las etiquetas