PIC16F877A PORTA RA4 no funciona como salida

1

He utilizado la interrupción de cambio de estado RB para encender dos LED conectados al puerto A (pin4 y 5). El problema es cuando se produce una interrupción. El LED en pin5 se enciende, pero no el LED en pin4. Cuando cambio pin4 a pin3, funciona normalmente, pero no puedo usar este pin porque mi circuito ya está impreso.

He leído la hoja de datos y entiendo que PORTA pin4 se multiplexa con Timer0, ¿eso es lo que causa el problema? ¿Cómo desactivo eso?

Código del compilador XC8:

#define _XTAL_FREQ 20000000

#include <xc.h>

// BEGIN CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = ON // 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)
//END CONFIG

int main()
{
   TRISA = 0x00;    //set portA as output
   TRISB = 0xFF;    //set portB as input    
   TRISD = 0xFF;    //set portD as input    
   TRISC = 0xFF;    //set portC as input
   ADCON0 = 0x00;   //disable AD converter
   ADCON1 = 0b10000110; //disable AD converter
   OPTION_REG = 0b00000000; //disable AD converter
   INTCON = 0b11001000;     //enable port b pullups
   PORTA = 0x00;        //turn off LEDs

  while(1)
  {
  }
  return 0;
}

void interrupt isr(void)
{
   if (INTCONbits.RBIF) {
   if (PORTB) {
      asm("nop");
   }
   INTCONbits.RBIF = 0; //clear interrupt flag
   PORTAbits.RA4 = 1;   // turn on bottom LED
   PORTAbits.RA5 = 1;   // turn on top LED
   }
}

    
pregunta hiddeneyes02

1 respuesta

3

RA4 en ese microcontrolador es una salida de drenaje abierto. Esto significa que cuando lo establezca como bajo, la salida será baja; pero cuando se configura en alto, la salida se desactiva (alta impedancia).

Deberá cambiar la configuración de su LED para encenderlo con un drenaje abierto.

    
respondido por el Adam Z

Lea otras preguntas en las etiquetas