# Problemas con PIC16F877A



## leydi25 (Abr 2, 2007)

Hola a todos!!!

Tengo problemas con unos pic 16f877a que he comprado...uno de ellos es que tengo que realizar el grabado del pic varias veces ya que siempre presenta problemas en alguna posición de la memoria...se que no es el programador porque otro pic que si funciona bien se graba sin ningún problema...y finalmente cuando logro grabarlo correctamente no funciona!!!! lo monto en el circuito y no hace NADA!!!!! como puedo saber que daño tiene el PIC???

Otro de los pic no se quiere grabar....siempre me aparece en blanco...

Agradeceria cualquier ayuda....


----------



## MaMu (Abr 2, 2007)

leydi25, es dificil determinar el error con la poca información que nos brindas. Seria prudente que muestres el diagrama de tu circuito y el programa del pic, para ir descartando las fallas. Por los datos que dejas, a simple intuicion, la unica solucion es reemplazar el PIC. Habria que ver que programador estas usando y las condiciones del mismo, quizas estes sobrepasando el limite de tolerancia de VPP.

Saludos


----------



## maunix (Abr 2, 2007)

leydi25, a mi modo de verlo, la única forma que podrás averiguar la cual es tu problema es usando otro programador.

De esa forma, sabrás si se realmente el programador o el pic. 

Saludos

PD: de todas formas, por los síntomas que mencionas, pareciera ser que el problema es el programador.


----------



## leydi25 (Abr 3, 2007)

El circuito programador que estoy usando es el PIPO2 y lo descargue de la pagina http://docs.ajo.es/acuarios/213.97....F/rev_pipo2.pdf, use el programador JDM pero nunca me funciono...siempre me salio el famoso error 000h...igual no creo que sea el circuito programador... volvi a montar el programador en un protoboard y me dejaron de salir los errores, pude solucionar el problema de la grabación usando el mismo circuito que tenia y el IC-PROG...
    Sin embargo tengo 4 pics para probarlos les grabe un programa que funciona correctamente...tres de mis pics ejecutan el programa sin problema y el otro no hace nada aunque se grabo correctamente...  
    Si tienen alguna observacion les agradeceria...


----------



## El nombre (Abr 5, 2007)

Si el programa funciona correctemente compraría otro pic.

Esto... repasa los flag del oscilador y esas cositas que hay veces que no se configuran correctamente y hacen que no funcione ( confundir el oscil de resistencia con el de cristal por ejemplo) Es curiosa esta equivocación ya que funciona al acercar el dedo al cristal.
Saludos y paciencia


----------



## RAM_G_JES (Abr 12, 2007)

puedes bajar la version más actual del software que empleaste para programar el PIC; porque yo tuve un problema similar y lo solucione de esta forma.

Despues; cuando por fin pude grabarlo; no hacia nada; y esto era por el oscilador;(el PIC16F877A, solo me funciono cuando conecte los 2 capacitores del oscilador a tierra)(el PIC16F877 solo me funciono cuando retire los 2 capacitores del oscilador). Para reducir todo tipo de problemas te recomiendo cambiar al PIC16F877-20 o PIC16F877-4.

Otra cosa; debes tener cuidado con el tipo de oscilador que configuras; yo siempre programo el tipo XT, y tampoco he tenido problema; cuida que LVP este deshabillitado; porque podría ocasionarte fallas en el programa grabado en el PIC.


----------



## ZOH (Feb 24, 2008)

Gracias RAM G JES, tenía un problema similar al de leydi, y lo solucione desahabilitando el LVP que dijiste, lo que no me queda claro es porque en proteus funcionaba perfectamente y como puedo modificar directamente en el codigo fuente esta bandera. De nuevo gracias


----------



## sergiogib (Abr 28, 2009)

mmm soy nuevo en esto, como podria deshabiilitar el LVP que menciona,


----------



## felixls (Abr 28, 2009)

Puedes deshabilitar el LVP con los fuses del micro, para ello puedes:

1. Importar el hex con MPLAB y modificar el fuse y luego exportar.

o bien
2. Modificar el código fuente y luego recompilar.

En ambos casos se debe reprogramar el pic.


----------



## viejobarco (Jul 1, 2009)

diculpen, tengo un problema similar porque el pic no hace nada despues de quemarlo, le configure el cristal hs y uso un cristal de dos pines con 2 capacitores a tierra, pero en el quemador uso un cristal cuadrado, ambos cristales son de 20Mhz, lo raro es que uno me funcionaba en una targeta de mikroelektronika pero al probarlo solo con unos leds no me funciono, 

todaslas patitas tienen un voltaje de mas o menos .40 voltios, tengo la resistencio de pull up en el master clear y conectada Vdd y Vss a la fuente de 5 voltios, si me podrian alludar les agradezco, tengo que entregar proyecto y el pic no da señales de estar trabajando.


----------



## aloris (Nov 18, 2009)

una pegunta... yo estoy haciendo un cto que controla una alarma atravez de una clave, con un teclado y un lcd. Mi principal problema es que todo lo que simulo en proteus me sale al reves en el protoboard.  por ejemplo si yo he dicho por programa que al concetar uno logico al pic ra6 la alarma se debe prender, esta se prende conectandole un cero logico. Cualquier ayuda bien recibida gracias.


----------



## andyt (Mar 31, 2012)

compadres tengo un problema con el pic 16f877a... al montarlo en el programador me aparece todo ok..
pero cuando voy ala cto no me funciona nada... he revisado el cto varias vexes,  con  varios micros lo vuelvo a programar y nada.. pero cuando programao el 16f628 funciona ala perfeccion.. 
lo probe con 2 programadores y nada.. no funciona
el programa es pickit 2.6 
agradesco su colaboracio
gracias


----------



## josexremix65 (May 13, 2013)

Buenas, Soy un estudiante de electronica y es primera ves que utilizo los pics, ya vi la teoria y una ves compiladas las instrucciones en MPLAB en lenguaje Asm, y probado el codigo ( Todo funciona perfecto en el simulador ) me dirijo a grabarlo, con unos tutoriales aprendi a grabarlo, pero a pesar de que me dice que fue programado exitosamente, y que al verificarlo me dice que todo esta bien ( por puerto serial ) al colocarlo en la protoboard no hace nada, ni enciende, tengo el MCLR en alto, ambas alimentaciones bien, y mis leds conectados a los puertos que son, los puertos A y E estan como analogicos, no los utilicé, muchas gracias de antemano. aprecio cualquier ayuda. Solo quiero que funcione, ya lo revise por el programador y no esta quemado ni dañado segun el mplab.


----------



## D@rkbytes (May 13, 2013)

¿Agregaste la palabra de configuración en el código?
Algo así como esto...

```
include    <p16f877a.inc>
    __Config    _XT_OSC & _PWRTE_ON & _WDTE_OFF & _LVP_OFF
```
Es importante que lo hagas, ya que el PIC puede ser grabado con una configuración no adecuada.


----------



## josexremix65 (May 13, 2013)

Para ser sincero no, lo configuro por la pestaña de configuraciones del MPLAB, pero lo probare y comentare cualquier resultado, muchas gracias.


----------



## marvin villalobos (Feb 3, 2014)

Hola amigos del Foros de electrónica, tengo un inconveniente con la configuración de un código para grabar mi pic.
 La vez pasada hicimos con un amigo un contador de 4 dígitos en displays de 7 segmentos y a la hora que grabamos el pic y encendíamos el contador (en físico osea en plaquita) nos salia la cuenta en 255, y recuerdo que grabamos el pic cambiando el estado de estos dígitos FFF en winpic x 00 00 (código) para que cuando encendamos el contador nos salga en 00, pero ahora tengo el mismo problema con una programación con pic 16f877a, mis variables son:

fase_1 var byte
fase_2 var byte

fase_1=0
fase_2=0

y cuando grabo mi pic a la hora de probarlo en la pantalla de lcd me sale 255, la verdad es que no se porque mi amigo que ya no lo veo dicho sea de paso, cambiaba las FF FF x 00 00, 

amigos del Foro la verdad deseo que me orientaran un poco y si es posible enviarme a una pagina o dame infomacion para poder amparme un poco mas de este secreto, le agradezco de antemano.

Ah si  pudieran enviarme un material sobre interrpciones; Incont, adcon, tmo, option_reg, en pic basic pro, poruqe eh buscado mucho en este foro pero no eh encontrado mucho.

Muchas Gracias


----------



## D@rkbytes (Feb 3, 2014)

marvin villalobos dijo:


> La vez pasada hicimos con un amigo un  contador de 4 dígitos en displays de 7 segmentos y a la hora que  grabamos el pic y encendíamos el contador (en físico osea en plaquita)  nos salia la cuenta en 255, y recuerdo que grabamos el pic cambiando el  estado de estos dígitos FFF en winpic x 00 00 (código) para que cuando  encendamos el contador nos salga en 00, pero ahora tengo el mismo  problema con una programación con pic 16f877a


Lo mejor es que adjuntes el programa, ya que no es necesario que tengas que modificar el código hexadecimal.


marvin villalobos dijo:


> Ah, si  pudieran enviarme un material sobre interrupciones; Intcon, adcon,  tmr0, option_reg, en pic basic pro, porque he buscado mucho en este foro  pero no he encontrado mucho.


Es complicado sugerirte algo, porque su uso no es genérico.

Saludos.


----------



## nelsonr (Feb 5, 2014)

Hola a todo acudo a ustedes ya que e leído unos manuales de manejo de los pines por separados en un pic, por ejemplo el 16f877a y al pareces no comprendo su funcionamiento
 Ejemplo yo estoy usando el puerto B para el manejo de un LCD 16x2 que hasta ahora funciona todo bien pero el pin B0(cero) esta sin usar ,entonses quiero usar ese pin B0 para encender un led  cuando se cumple un candicion dentro del programa. Pero el pinB0  hace lo que le da la gana yo le digo output_high(PINB0) y no responde a esta intención,le e manejado la dirección según los manuales con el TRISB y no e podido.
Yo estoy editando en  C CCS y les agradesco que me aclaren como manejar este aunto de pines por separado


----------



## D@rkbytes (Feb 5, 2014)

nelsonr dijo:


> el pinB0  hace lo que le da la gana, yo le digo output_high(PINB0) y no responde a esta intención, le he manejado la dirección según los manuales con el TRISB y no he podido.
> Yo estoy editando en  C CCS y les agradezco que me aclaren como manejar este asunto de pines por separado


Pues no debes tener problema, el pin RB0 no es un pin con ADC y que esa pudiera ser la causa de que no responda, ese pin es el de interrupción, y por defecto se encuentra deshabilitada la interrupción por RB0.
Al usar la instrucción output_high(PIN_B0); no se necesita configurar ese pin como salida, esa instrucción lo hace automáticamente aunque por defecto los pines estén configurados como entradas y convierte al pin como salida estableciendo un 1 lógico.

Debes tener algún  problema de montaje o configuración y es mejor que muestres tu programa para poder determinar la causa del problema.

Saludos.


----------



## nelsonr (Feb 6, 2014)

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.

configuración en el programa
void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   set_tris_a(0x1F);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   port_b_pullups(true);
   lcd_init();
   kbd_init();
//////////////////////////////////
librerías

#include <LCD.C>
#include <KBD.C>
#include <string.h> 
#use fast_io(a)


----------



## D@rkbytes (Feb 6, 2014)

nelsonr dijo:


> 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.


----------



## marvin villalobos (Feb 14, 2014)

D@rkbytes https://www.forosdeelectronica.com/f24/problemas-pic16f877a-6851/#post881506 ya lo solucione mi primer problema era una declaracion previa:
eeprom. Muchas GRacias



D@rkbytes y el otro problemita que tengo como lo solucionaria no? eso de la sentencia para activar mi alarma en pbp.


----------



## D@rkbytes (Feb 15, 2014)

marvin villalobos dijo:


> 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.


----------



## Oscar Jaen (May 21, 2016)

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. ...


----------



## ruben90 (May 21, 2016)

Alguien dijo mikroC? Si subes tu código tal vez pueda ayudarte.


----------



## Oscar Jaen (May 21, 2016)

```
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);
}
 }
```


----------



## ruben90 (May 21, 2016)

*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?


----------



## Oscar Jaen (May 21, 2016)

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".


----------



## ruben90 (May 21, 2016)

Prueba el siguiente código para encender y apagar todo el puerto A:

```
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.


----------



## miglo (Oct 2, 2019)

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.


----------



## juanma2468 (Oct 2, 2019)

miglo dijo:


> 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.


----------



## miglo (Oct 2, 2019)

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.


----------



## miglo (Oct 8, 2019)

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.


----------



## DJ T3 (Oct 8, 2019)

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


----------



## miglo (Oct 9, 2019)

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.


```
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?

```
while (busy == 0)
   {busy = onewire_read();}
```


----------



## D@rkbytes (Oct 9, 2019)

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í:

Y colócala acá:

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.


----------



## miglo (Oct 9, 2019)

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?

```
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.


----------



## D@rkbytes (Oct 9, 2019)

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.


----------



## miglo (Oct 9, 2019)

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.


----------



## D@rkbytes (Oct 9, 2019)

miglo dijo:


> 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.


miglo dijo:


> 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.


miglo dijo:


> 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.


----------



## miglo (Oct 12, 2019)

Bueno pues visto que de momento no encuentro como hacer funcionar el programa con la sonda ds18b20 pues tomo la decisión de quitarla y armar toda la tarjeta con lo demas.

Mirare por que recuerdo haber hecho una tarjeta con el ds18b20, para una nevera vieja que tengo y funciona perfecto, pero el codigo lo tengo en otro disco, haber donde cometo el error por que creo que, o bien el problema es el codigo o son las sondas que me enviaron desde una web que todos conocemos, digo esto por que he comprobado los 3 pics 16f877a, que creia estropeados, y sin las funciones de la sonda funcionan bien.   
Por cierto, gracias D@rkbytes y DJ T3 por haber estado hay, lo gracioso es que, en proteus, la simulacion va de lujo, supongo que seran bugs del proteus, pero es conectar y se queda esperando como diciendo que no le entran los datos de la sonda y de hay no pasa.

Posdata: si me gustaria, si es posible, saber como comprobar estas sondas, si se puede, ya que tengo entendido que se puede leer su numero de serie con algun programa, por si se quieren conectar varias al mismo pin en serie, y no encontrado nada por la web.


----------



## miglo (Oct 12, 2019)

Hola gente, otro, bueno pues, jeje, al final resulta que el culpable era yo, despues de hacer pruebas y mas pruebas resulta que el problema era una mala soldadura, cosas que pasan, en la patilla de DQ, en este caso que hiba al pin_A1 aunque estaba soldada no habia hecho buena la soldadura con el zocalo y cuando media con el tester me marcaba bien hasta que he medido en las mismas patillas del pic y eboala.

Posdata: para los que tengan los ds18b20 con los colores, amarillo, rojo y gris decir que el rojo es +5, el amarillo es datos y el gris es GND, venga un saludo.


----------



## D@rkbytes (Oct 12, 2019)

Adjunto la librería modificada para los sensores DS18B20 y DS18S20
Incluye ejemplo de uso.


----------



## Gino98Electronica (Oct 29, 2019)

Buenas, mi duda es porque la salida no se pone a 5V con un output_high(x) y a 0V con output_low(x), Lo que quiero hacer es mandar un uno logico o un cero logico para que otro pic realice otro proceso, pero la salida de este pin siempre se encuentra a 1V y nose que puede ser


----------



## DownBabylon (Oct 29, 2019)

Revisa el datasheet y la configuracion que asignaste a los puertos


----------

