Problemas con PIC16F877A

#21
Hola D@rkbytes tengo que comentarte que me confundí y dije que el puerto en este caso B era usado por un LDC mas no es así, esta siendo usada por un teclado, como lo muestra la imagen.
Este puerto (B) está configurado como lo dice la librería de C CCS para manejar un teclado.
Como bien me indicas el puerto queda deshabilitado pero cuando trato de ponerlo en High el pin (B0) no lo mantiene. Me di cuenta que por ejemplo si yo pongo la intrusión Output_high(Pin_B0); y después le pongo un delay_ms(5000); se mantiene por ese tiempo y luego se deshabilita
Lo que yo quiero hacer con el pin (B0) que puse como ejemplo, es poderlo manejar en alto o bajo a mi parecer y por eso busque manuales que me ayuden con la direcciones TRISX que es donde pienso que estoy fallando. Y es por eso que acudo a ustedes para que me aclaren este punto o de no ser este el punto que afecta me ayuden a aclara el misterio.
Posiblemente tengas algún conflicto dentro del programa, ya que no deberías tener problemas para controlar RB0.
Otra causa que podría estar interfiriendo con el pin RB0 son las instrucciones de la librería para el teclado.

También puedes usar la pantalla y el teclado por el mismo puerto, por ejemplo en el puerto C y así ahorras pines y aparte ya tienes libre todo el puerto B, aunque es más recomendable usar la pantalla y el teclado por el puerto B, ya que éste tiene resistencias pull-up internas.

Para que veas que no existe problema para controlar el pin RB0, adjunto un ejemplo que modifiqué para usar una pantalla LCD 16x2 y teclado matricial 3x4 por puertos separados.

Notarás que cuando se actúa sobre el pulsador en RA0 se detiene el proceso durante 5 segundos debido al retardo de encendido del LED en RB0.

Suerte.
 

Adjuntos

#23
D@rkbytes ¿Y el otro problemita que tengo cómo lo solucionaría?
Eso de la sentencia para activar mi alarma en pbp.
Para no salirse del tema, realiza tu consulta dentro de algún tema similar sobre RTC DS1307.
Y por favor agrega una clara descripción de cual es el problema.
Si tu proyecto cuenta con simulación o algún esquema, es preferible que los incluyas.

Saludos.
 
Última edición:
#24
Tengo problemas con mi PIC16F877A, puesto que al quemar programas y armarlos físicamente me presenta dificultades, intente solucionarlo poniendo capacitores de 22, 15, 30, pf y nada, aumente y disminuí la resistencia en el Masterclear, tampoco funciono, puse capacifores de 0.1 nf entre el pin 11 y 12 y el 31 y 32, cambiando el cristal, mi código esta bien, e incluso con códigos tan sencillos como prender un led, no hace su función correcta, mi teoría es que los fuses que he puesto en Mikro C, estén incorrectos(solo esta activado la opción de brown-out reset y el oscilador es un HS), ayuda, urge. ...
 
#26
PHP:
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;

char  keypadPort at PORTB;
int i;
char password[4];
char get_password()
{
INICIO:
{
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1, 2, "INSERTE CODIGO");
for(i=0;i<3;i++)
{
while (password[i] == 0)
{
password[i] = Keypad_Key_Click();
}

if(password[i]==1)     password[i]  = '1';
if(password[i]==2)     password[i]  = '2';
if(password[i]==3)     password[i]  = '3';
if(password[i]==5)     password[i]  = '4';
if(password[i]==6)     password[i]  = '5';
if(password[i]==7)     password[i]  = '6';
if(password[i]==9)     password[i]  = '7';
if(password[i]==10)    password[i]  = '8';
if(password[i]==11)    password[i]  = '9';
Lcd_Chr(2, i+1, password[i]);
}
if(strcmp(password,"123") == 0) {return 1;}
else
{
password[0]  = 0;
password[1]  = 0;
password[2]  = 0;
password[3]  = 0;
goto INCORRECTO;}
}
INCORRECTO:
{
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1, 6, "CODIGO");
Lcd_Out(2, 4, "INCORRECTO");
Delay_ms(3000);
goto INICIO;

}
}

void main(){

PORTC=0X00;
PORTD=0X00;
PORTB=0X00;
TRISB=0XFF;
TRISD=0X00;

Lcd_Init();    keypad_Init();
Lcd_Cmd(_LCD_CURSOR_OFF)
;
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,5 , "SISTEMA");
Lcd_Out(2,3 , "INICIALIZADO");
delay_ms(2000);
get_password();

while(1){

Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,6 , "CODIGO");
Lcd_Out(2,5 , "CORRECT0");
portc.b4 = ~ portc.b4;
delay_ms(3000);
goto SUSPENDIDO;
}
SUSPENDIDO:
{
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1, 5, "SISTEMA");
Lcd_Out(2, 4, "SUSPENDIDO");
delay_ms(10000);
Lcd_Cmd(_LCD_CLEAR);
}
 }
 
#27
char keypadPort at PORTB; //Esto es una librería? Porque las variables no pueden tener espacios.
char get_password() //creo que el problema radica en tu sub rutina.

Tengo 2 preguntas:
El compilador te tira error o advertencia?
Corriste el código en algún simulador?
 
#28
Si, es una libreria, y lo simule en Proteus 8, y funciona a la perfección, incluso llego a "funcionar" en fisico, pero el problema es que no se que fuses necesito tener para que este funcione, solo tengo activado el "Brown-out reset".
 
#29
Prueba el siguiente código para encender y apagar todo el puerto A:
Código:
void main() {
TRISA = 0;
PORTA = 0;
ADCON1 = 7;
while(1) {
PORTA = 0x00;
delay_ms(1000);
PORTA = 0xFF;
delay_ms(1000);
}
}
Al crear el proyecto NO configures nada en los fuses.
 
Arriba