Página principal Castellano  Deutsch  English 

Cuando el PIC no está "co-operando" ...

Usar un PIC es simple: escribir algo de código, quemarlo en el Flash-ROM, poner el PIC en el circuito de aplicación, suministrar voltaje, y trabaja — bueno, en general...

Para todos los amantes de la Ley de Murphy, acá siguen algunas ideas de todo lo que puede andar mal.

El PIC no funciona en absoluto

Causas posibles:

  1. El PIC no está bien insertado en el zócalo.
    Suena ridículo, pero no es imposible poner un PIC al revés en un zócalo, torcer un pin o pescar un zócalo que no da buen contacto.
  2. Falta el voltaje operativo.
  3. Falla del oscilador.
    Mi favorito. Si la velocidad y la exactitud no importan, recomendaría el uso del oscilador interno. Esto simplifica el diseño de la placa y da dos pines extra.
  4. El PIC permanece en estado RESET.
    Además de la causa simple – que el pin /MCLR permanece "accidentalmente" en "low" – hay otras situaciones, no tan fácilmente visibles, que pueden detener a un PIC:
  5. El circuito del depurador está activado.
    Si el depurador está activado, el PIC ejecuta la primera instrucción y luego para. Por eso, después de depurar el software se debe re-programar el PIC en el modo normal, antes de usarlo en el circuito de aplicación.
  6. El PIC parece muerto.
    En mi experiencia los PIC no se rompen tan fácilmente. Incluso después de aplicar el voltaje operativo al revés hay esperanza. Antes de transformar al PIC en una linda escultura, se puede intentar recuperarlo borrándolo varias veces.

El PIC no funciona como esperado

Causas posibles:

  1. Está seleccionado el banco de registros equivocado.
    El código operativo de los PIC 12Fxxx/16Fxxx sólo puede contener los 7 bits inferiores de la dirección de un registro. Para permitir más de 128 registros, éstos están organizados en dos o cuatro bancos. Al escribir código ensamblador, antes de acceder a un registro se debe asegurar que en el registro STATUS esté seleccionado el banco correspondiente.
    Cuando MASM genera un archivo "List file", el editor de 'PicProm' puede mostrar ambos: el archivo HEX y las líneas de fuente correspondientes, lo cual permite la verificación visual del código generado.
    [Editor]
    (Si bien con MASM se puede usar la pseudo-instrucción "banksel" antes de cada acesso a un registro, la cual genera las instrucciones necesarias para configurar correctamente los bits de banco, no puedo recomendar este método por dos razones: primero, aparentemente no es posible poner un símbolo en la misma línea, y segundo, esta pseudo-instrucción siempre genera código — también cuando los bits de banco ya están configurados correctamente — inflando de este manera el tamaño del código y aumentando el tiempo de ejecución.)
  2. Está seleccionada la página de memoria equivocada.
    El código operativo de los PIC 12Fxxx/16Fxxx sólo puede contener los 11 bits inferiores de la dirección de un blanco de transferencia, lo cual da un rango de direcciones directas de 2 KWords. Si el código supera estos 2 KWords, debe asegurar que la página correspondiente está seleccionada en el registro PCLATH antes de ejecutar un "goto" o "call".
  3. El temporizador Watchdog ("perro guardián") resetea al PIC una y otra vez.
    Con el temporizador Watchdog activado — que es el estado por defecto — se deben incluir instrucciones "clrwdt" en el código fuente, de tal manera que en caso de ejecución normal del programa una de estas sea ejecutada por lo menos cada 10 ms.
    Antes de desactivar el temporizador Watchdog en la palabra de configuración, hay que tener en cuenta que este temporizador es la única manera en que un PIC puede "recuperarse" a sí mismo cuando el software queda atrapado en un bucle sin fin por algún desperfecto.
  4. Los puertos no están inicializados correctamente.
    Después del "Power-on-Reset", algunos pines pueden estar configurados como entradas analógicas, y al leerlos siempre da '0'. Esto depende del controlador. Acá ayuda acudir a las especificaciones para saber cómo inicializar los puertos.
  5. Instrucción con puerto I/O como destino.
    Al modificar datos de un puerto, hay que tener en cuenta que la instrucción lee el estado actual – externo – de todos los pines y escribe el resultado a todos los búferes de salida del puerto. Esto puede dar resultados inesperados. Algunos ejemplos:
  6. Falta el bucle principal.
    En principio, una vez que el PIC se ha puesto en marcha, va a ejecutar instrucciones de la memoria del programa hasta que se lo apague. No hay una instrucción "halt", y la declaración "END" del bloque del código de ensamblador no tiene significado con respecto a la ejecución del código.
    Por eso, el programa debe contener un bucle principal (sin fin) o — si el programa se ejecuta sólo una vez después del arranque — por lo menos terminar con una instrucción "goto $" para evitar la ejecución de memoria de programa vacío.
  7. Desbordamiento de pila.
    Los PIC 12Fxxx/16Fxxx sólo tienen 8 niveles de pila para instrucciones "call" y para la rutina de interrupción. Si el programa usa subrutinas anidadas en exceso puede ocurrir un desbordamiento de pila — y para esto no hay previsto ningún tratamiento especial. El programa simplemente se cuelga.
    Por lo tanto, al cargar un archivo HEX, 'PicProm' lo analiza y da una advertencia en caso de que se pudiera producir un desbordamiento de pila durante la ejecución del programa.
  8. Falta el capacitor de desacoplo.
    Un capacitor de desacoplo de 100nF debería estar ubicado lo más cerca posible de los pines Vdd y Vss del PIC. Mi método preferido con los dispositivos PDIP es soldar un capacitor SMD pequeño directamente entre los pines.

volver a la página principal