Problema al grabar en el PIC16F877A: error en la memoria Flash.

Hola amigos de foros de electrónica. Esta es mi segunda pregunta en este foro :rolleyes:

El problema que ahora tengo, es que no puedo grabar mi PIC16F877A. Para grabar tengo el software del Master-Prog y de hecho ayer lo grabé y me andaba bien pero justo hoy en la mañana no graba ningún programa, ni el más sencillo.

El error que me muestra generalmente dice:
Error en la memoria FLASH en: 0x000000

A veces cuando cambio de *.hex, me puede mostrar otra dirección como 0x000001 o algo por el estilo :unsure:

A pesar de ello, ya no me graba los primeros programas que hice :confused: y tengo que entregar esto para mañana :cry:

Aquí les paso mi código:

Código:
#include <16F877A.h>
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       // Admite HS y XT
#FUSES PUT                      //Power Up Timer
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage programing, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOPROTECT

#use delay(clock=20000000)

#define Cero 0b01111110
#define Uno 0b00001100
#define Dos 0b10110110
#define Tres 0b10011110
#define Cuatro 0b11001100
#define Cinco 0b11011010
#define Seis 0b11111010
#define Siete 0b00001110
#define Ocho 0b11111110
#define Nueve 0b11001110

#define display1(d) output_b(d)
#define display2(d) output_c(d)

void show(int entero, int decimal){

  switch (entero)
  {
      case 0:
      {
         display1(Cero);
      } break;

      case 1:
      {
         display1(Uno);
      } break;

      case 2:
      {
         display1(Dos);
      } break;

      case 3:
      {
         display1(Tres);
      } break;

      case 4:
      {
         display1(Cuatro);
      } break;
      
      case 5:
      {
         display1(Cinco);
      } break;

      case 6:
      {
         display1(Seis);
      } break;

      case 7:
      {
         display1(Siete);
      } break;

      case 8:
      {
         display1(Ocho);
      } break;

      case 9:
      {
         display1(Nueve);
      } break;
  }

  switch (decimal)
  {
      case 0:
      {
         display2(Cero);
      } break;

      case 1:
      {
         display2(Uno);
      } break;

      case 2:
      {
         display2(Dos);
      } break;

      case 3:
      {
         display2(Tres);
      } break;

      case 4:
      {
         display2(Cuatro);
      } break;
      
      case 5:
      {
         display2(Cinco);
      } break;

      case 6:
      {
         display2(Seis);
      } break;

      case 7:
      {
         display2(Siete);
      } break;

      case 8:
      {
         display2(Ocho);
      } break;

      case 9:
      {
         display2(Nueve);
      } break;
  }
}

void convert(float voltaje){
  unsigned int entero, decimal;
  float masa;

  /* Método numérico aplicado:
    función = 5.84089 - (94.7218/V^3) + (99.9228/V^2) - (36.3907/V);
  */

  masa = 5.84089 - (94.7218/(voltaje*voltaje*voltaje)) + (99.9228/(voltaje*voltaje)) - (36.3907/voltaje);

  entero = masa;
  decimal = 10*(masa-entero);
  show(entero, decimal);
}

void main(void)
{
  float medicion, voltaje;

  setup_adc(adc_clock_internal);
  setup_adc_ports(ALL_ANALOG);
  set_adc_channel(0);// Patilla 2 (A0)

  output_b(0x00);
  output_c(0x00);

  delay_ms(300);

  while(TRUE){
     medicion = read_adc();
     voltaje = medicion*(0.00489);  // (5/1023) = 0.0048876

     convert(voltaje);
  }

}

Espero que me puedan ayudar. Saludos ;)
 

Adjuntos

  • error.png
    error.png
    27.9 KB · Visitas: 24
La memoria Flash es donde se guarda el programa en si, la direccion 0x00000 es el primer byte, si intentas grabar o cambias la direccion 1 entonces te va a poner error en la grabacion en 0x00001 etc...

cuando no se puede grabar en la memoria flash entonces el micro esta mas frito que unas papas fritas y entonces es momento de pensar en hacerle un funeral.... ahhh y quizas siga funcionando con el ultimo programa escrito...
 
La memoria Flash es donde se guarda el programa en si, la direccion 0x00000 es el primer byte, si intentas grabar o cambias la direccion 1 entonces te va a poner error en la grabacion en 0x00001 etc...

cuando no se puede grabar en la memoria flash entonces el micro esta mas frito que unas papas fritas y entonces es momento de pensar en hacerle un funeral.... ahhh y quizas siga funcionando con el ultimo programa escrito...

NOO!! :cry:
Ahora dónde conseguiré uno nuevo u_u
Y lo peor es que era prestado :cabezon:

Por cierto, mi laptop aún detecta el microcontrolador...
 
Sip... yo tengo varios en esa condicion y podria decir que no estan muertos, sino que estan en estado catatonico, paralisis cerebral, o en coma...

Pensé que era el único, ¿porqué sucede esto?, sucede que yo tenía un PIC16F876 en un circuito que controla unas electroválvulas a 120 Volts, funcionó bien por unos 3 meses (uso diario de aproximadamente 5 horas), y de un día para otro dejó de reconocer un teclado que tenía incorporado en la placa del circuito.
Lo puse en el programador para intentar recuperarlo pero nada, el programador no lo reconoce (utilizo el pickit 2 clone). Lo raro es que sigue funcionando a excepción de una fila del teclado (es un teclado de matriz). ¿Esto sucede por los picos de la línea de alimentación?, ¿fué al azar?.
 
¿Esto sucede por los picos de la línea de alimentación?, ¿fué al azar?.

en mi caso, algunos fueron por error en configuracion de puertos, es decir, los puse como salidas e hize corto al ponerlos a tierra... en otro estaba practicando con fuente sin transformador, en otro le estaba metiendo voltaje de 110 con resistencia limitadora por un puerto... y otros casos similares, en pocas palabras, en mi caso fueron errores de diseño o accidentes...
 
Atrás
Arriba