Problemas con PIC16F877A

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

  • 16F877A LCD y Teclado 3x4.rar
    52.5 KB · Visitas: 5
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:
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. ...
 
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);
}
 }
 
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?
 
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".
 
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.
 
Hola, tengo un 16f877a y lo grabo o lo leo y parece que lo hace bien, el problema esta cuando lo pongo en funcionamiento y no hace nada.
Tengo que decir que estaba grabado para hacer otras funciones y funcionaba al principio ya que en el lcd de 4x20 salia bien la informacion, pero hecho una tarjeta para hacer otro trabajo y desde entonces no hay manera, he revisado una y otra vez la placa y no le veo ningun fallo.
La lcd, alguna vez, solo salen simbolos y algun que otro caracter, otras veces ni eso.
He podido ver que donde conecto una tarjeta de 4 reles, al encender, estan activados como si diese a entender que el puerto esta todo en 1.
Puede un micro grabar bien pero no funcionar? es que no me habia pasado nunca, gracias.
 
Hola, tengo un 16f877a y lo grabo o lo leo y parece que lo hace bien, el problema esta cuando lo pongo en funcionamiento y no hace nada.
Tengo que decir que estaba grabado para hacer otras funciones y funcionaba al principio ya que en el lcd de 4x20 salia bien la informacion, pero hecho una tarjeta para hacer otro trabajo y desde entonces no hay manera, he revisado una y otra vez la placa y no le veo ningun fallo.
La lcd, alguna vez, solo salen simbolos y algun que otro caracter, otras veces ni eso.
He podido ver que donde conecto una tarjeta de 4 reles, al encender, estan activados como si diese a entender que el puerto esta todo en 1.
Puede un micro grabar bien pero no funcionar? es que no me habia pasado nunca, gracias.
No vemos que le estas grabando, incluyendo los bites de configuracion y un esquemático o foto clara de como lo estás conectando.
 
Tienes razon, se me ha pasado por alto, voy hacerlo y lo subo.

Uff creo que termino de ver mi error ahora cuando hiba a mandar la informacion, voy a comprobarlo y comento si puede ser ese mi error.
 
Última edición:
Bueno, pues pense que habia visto el problema pero no ha sido asi y me explico, crei que el problema era un contacto entre patillas del pic pero no, seguramente tengas algo de razon juanma2468, en el tema de configuracion del pic, la verdad es que no soy ningun manitas en programacion pero me arreglo para mis cosas, por cierto, disculpas por no haber respondido antes.

Creo que todo esta en el tema del DS18B20 en como debo configurarlo, pero por mas vueltas que le doy no doy con la tecla.
Si cuando programo no pongo nada refernte al DS18B20 entonces todo perfecto, aunque este conectado el sensor, pero en el momento que lo cargo con los datos para que lea el sensor entonces se bloquea y no va nada ni la lcd.

El sensor quiero que este conectado en el pin RA1 del 16F877A por que en el RA0 quiero conectar un potenciometro para, en el futuro, y si me aclaro, manejar la velocidad de un motor universal.
Adjunto un zip donde va toda la informacion.
 

Adjuntos

  • PRACTICAS.rar
    48.8 KB · Visitas: 6
En la funcion del DS18B20.c nunca sale del WHILE porque BUSY siempre es 0, y luego del WHILE modificas/o no el valor de la variable BUSY con la informacion de onewire_read();.

Mete el onewire_read(); dentro del WHILE, para que cuando cambie a otro valor diferente de 0, pueda salir y continuar
 
DJ T3 gracias por tu respuesta pero si no te es mucha molestia me puedes decir como por que yo veo que esta dentro del while o eso creo, pongo como esta y dime como lo modifico por que no lo entiendo bien.

Código:
float ds18b20_read()
{
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;

   onewire_reset();
   onewire_write(0xCC);
   onewire_write(0x44);

   while (busy == 0)
   busy = onewire_read();

   onewire_reset();
   onewire_write(0xCC);
   onewire_write(0xBE);
 
   temp1 = onewire_read();
   temp2 = onewire_read();
   temp3 = make16(temp2, temp1);

   // result = (float) temp3 / 2.0; //Calculation for DS18S20 with 0.5 deg C resolution
   result = (float) temp3 / 16.0; //Calculation for DS18B20 with 0.1 deg C resolution
 
   delay_ms(500);
   return(result);
}

Lo que dices que haga es esto?
Código:
while (busy == 0)
   {busy = onewire_read();}
 
Solo tienes que cambiar de lugar la instrucción para tomar la lectura del DS18B20
Lo que sucede es que aunque está dentro del bucle principal, está condicionada por un if.

Quítala de aquí:
Bad.jpg
Y colócala acá:
Good.jpg
O sea, dentro del bucle pero fuera de los condicionantes.
Ese break; no es necesario, así como tampoco estar escribiendo constantemente lo mismo en la pantalla al principio del bucle.
 
D@rkbytes eso que me dices lo tengo claro y ya se que deve estar fuera del if, yo lo he puesto asi solo para hacer pruebas ya que como me bloquea el pic queria saber por donde podia tener el problema y lo del break tambien lo se, es por lo mismo que lo anteriror, todo es por que no veia o veo la solucion, lo hacia por que ya de entrada no me hacia nada y quitando todo lo referente al ds18b20 funciona y yo creo que es por que lo he conectado en el pin RA1 de hay lo del "while(busy==0)" de la funcion del ds18b20. No se si me explico.
Mi pregunta es, tal como he puesto anteriormente el codigo, segun me indicó DJ T3, si es asi como debo hacer la modificacion en la funcion del ds18b20?
Código:
while (busy == 0)
   {busy = onewire_read();}
es que voy medio perdido, he probado 3 sondas, encima los colores son rojo, amarillo y gris, no negro, supuestamete el amarillo son datos y el gris gnd, pero he leido en algun sitio que el amarillo es el gnd y el gri los datos, he cambiado 3 pics con lo que tengo claro que todos no pueden estar estropeados y por si faltaba poco hoy el pickit-3 cuando intentaba cargarle el hex, me reconocia el 16f877a y al cargar me decia que tenia un 16f87, una locura, lo he quitado y lo he vuelto a instalar y parece que va bien ahora.
 
El programa se bloquea precisamente por ese bucle de espera (while (busy == 0)
Pero únicamente sucede cuando el sensor se desconecta.
Eso me pasó a mi también en un sistema y lo solucioné modificando la rutina para que saliera si el sensor no estaba conectado.
Si se cumplía cierto tiempo y no se detectaba el sensor se mostraba un mensaje.
 
Hola D@rkbytes, mira lo que te explico, a mi, en otra tarjeta, me paso lo que tu dices, pero el sensor lo tenia conectado en el pin RA0, si no estaba conectado el sensor el programa se quedaba parado como diciendo, si no detecto el sensor no continuo, eso me paraece correcto, de hecho conectaba la sonda y todo perfecto, pero en esta tarjeta quiero que sea en el pin RA1 y hay es donde creo que esta todo el lio ya que por algun motibo que no se creo que alguna funcion, ya sea en el ds18b20 o en el 1wire, no esta bien para el pin RA1, es mas, lo gracioso es que, tal como yo quiero que vaya, en proteus simula de lujo pero en lo fisico se queda parado, como si estubiese esperando a detectar el sensor, de hay mi pregunta si tal como he indicado en la parte de la funcion del ds18b20 era correcto como lo habia puesto y si no lo es, si no te importa, dime como debo poner esa parte, o la parte que sea de la funcion que toque, todo esto es por no tener que cambiar toda la tarjeta.

Una pregunta, " while(busy==0) " no esta hablando del pin RA0 verdad?, solo es una variable que mientras este en 0 no deja salir del bucle while.
 
Hola D@rkbytes. Mira lo que te explico, a mi, en otra tarjeta, me pasó lo que tú dices, pero el sensor lo tenía conectado en el pin RA0, si no estaba conectado el sensor el programa se quedaba parado como diciendo, si no detecto el sensor no continúo, eso me paraece correcto, de hecho conectaba la sonda y todo perfecto, pero en esta tarjeta quiero que sea en el pin RA1 y ahí es donde creo que está todo el lio ya que por algún motivo que no sé, creo que alguna funcion, ya sea en el ds18b20 o en el 1wire, no está bien para el pin RA1
El pin DQ del DS18B20 puede ser conectado en cualquier pin que funcione como E/S digital.
Si el pin del microcontrolador está configurado como análogo el sensor no funcionará correctamente.
Eso se puede comprobar leyendo el registro ADCON1 (Bits PCFG3, PCFG2, PCFG1, PCFG0)
Los valores para que RA1 sea digital son 1110 o 1111 y para que todos los pines sean digitales el valor puede ser 0111 o 0110 ya que en esta configuración el bit menos significativo no es relevante.
en la parte de la función del ds18b20, ¿era correcto como lo había puesto? y si no lo es, si no te importa, dime cómo debo poner esa parte, o la parte que sea de la función que toqué, todo esto es por no tener que cambiar toda la tarjeta.
Esa parte no la debes mover a menos que se modifiquen algunas partes de la librería, que fue lo que yo hice.
Una pregunta. ¿" while(busy==0) " no está hablando del pin RA0, verdad?
El error de esa librería es precisamente en esa sentencia, ya que abajo se define el valor de busy. (busy = onewire_read())
Por eso es conveniente modificarla.
 
Atrás
Arriba