¿Cómo escribo y subo un programa de parpadeo de LED en un PIC (pic16f59)?

1

Tengo un PIC16F59 y quiero comenzar a escribir un programa de LED parpadeante. Estoy usando HI-TECH C para la familia MCU PIC10 / 12/16 y PICkit3 y MPLAB X como mi IDE. Aquí está mi código de intento que se supone que enciende todos los LED en el puerto B.

#include <stdio.h>
#include <stdlib.h>
#include <htc.h>

int main(int argc, char** argv)
{
    while (1)
    {
        // Put delay code here
        PORTB=1;
        // Put delay code here
    }
    return (EXIT_SUCCESS);
}

El programa compila bien. Sin embargo, al cargar el archivo hexadecimal con PICkit3, aparece este mensaje de error:

Program operation of Program Memory failed
Address 0x0, read expected 0x25

¿Qué estoy haciendo mal? ¿Hay alguna configuración que no conozca?

    
pregunta Dillion Ecmark

3 respuestas

5

El mensaje de error que aparece indica un error de comunicación entre el PicKit y el chip. No tiene nada que ver con los contenidos de su programa. Te ayudaría si mostraras el esquema de exactamente lo que está alrededor del PIC y cómo se conecta el PicKit. Los posibles problemas son:

  1. Algo está cargando el pin PGC o PGD, lo que impide que el programador se comunique.

  2. Algo no está permitiendo que el MCRL sea elevado a la tensión de programación. No busqué la especificación de programación para este chip, pero Vpp puede ser tan alto como 13 V para algunos PIC.

  3. No hay límite de bypass entre Vdd y Vss.

  4. No todas las clavijas de alimentación y tierra conectadas si este chip tiene varios. Una vez más, no busqué su PIC específico.

  5. Un cable demasiado largo entre el PicKit y el chip, que permite la interferencia entre PGC y PGD.

Consulte mi Programación en serie en circuito para obtener más detalles y la desmitificación general del proceso de programación.

En un tema separado, hay dos fallas en su programa. Primero debe configurar RB1 como salida, ya que se activa como entrada. En segundo lugar, también debe apagarlo en el bucle si desea que el LED parpadee. En este momento su programa establece RB1 alto y lo deja así. Si su chip tiene entradas analógicas, también debe asegurarse de que RB1 no sea una de ellas o de cambiarlo explícitamente a un pin digital.

    
respondido por el Olin Lathrop
1

Es cosas incrustadas, ¿así que normalmente no usarías void main (void)?

Aparte de eso ... TRISB debe configurarse para los pines que se emiten en PORTB. Mejor hábito también es escribir en LATB no PORTB ... leer desde el puerto escribir en el pestillo.

PORTBbits.RB0 = 0x01 igual que LATBbits.LATB0 = 0x01, pero un método mejor es a través del pestillo.

Cuando creó su proyecto con Project Wizard, ¿eligió el número de chip correcto? Eso pasa a la parte del ensamblador / vinculador cuando construyes y si tienes el número de PIC incorrecto en la lista, se complicará cuando intentes y programes porque intenta escribir datos en un mapa de memoria para ese chip en particular.

Comprueba eso y ve lo que encuentras.

    
respondido por el Chef Flambe
-2

La página 31 de la Hoja de datos del PIC 16f59 habla sobre sus puertos de E / S y cómo configurarlos.

Básicamente, cada puerto se puede configurar como un puerto de entrada o de salida. Esto se hace a través del registro TRIS (registro de estado) para cada uno de los diferentes puertos. PORTA = TRISA / PORTB = TRISB y así sucesivamente.

Si establece el bit 0 en TRISA en 1, el bit PORTA 0 (RA0) se convierte en entrada (1 = entrada 0 = salida).

Por lo tanto, al proporcionar el archivo de encabezado correcto cargado para nuestras definiciones de nombre, puede hacer que PORTB Bit 0 sea una salida al hacer esto ...

void main(void)
{
    TRISBbits.TRISB0 = 0x00;  // PORTB Bit 0 is now Output.
    // To set ALL pins to output all at once TRISA = 0x00;
    PORTBbits.RB0 = 0x01;     // You've just energized the pin which corresponds to RB0

    while(1)                      // Loop forever
    {

        LATBbits.LATB0 = 0x01;    // is an alternative way of doing the same thing except you are 
                                  // writing to the Port buffer instead of directly to the Port
                                  // which is a safer method of coding (so I'm told).

        Delay(of time);           // Delay method of your choice

        LATBbits.LATB0 = 0x00;  // De-energizes Bit 0

        // or PORTBbits.RB0 = 0x00;

        Delay(of time);

    }
}

Y ahí lo tienen ... un pequeño fragmento de código que destellará un LED, correctamente conectado, al pin de salida del bit 0 de PORTB. Realiza los bucles de retardo y lanza los #includes correctos y debería funcionar para ti.

Sin embargo, leer a través de la hoja de datos ayudará más. Le proporciona ejemplos de código para inicializar puertos y demás.

    
respondido por el Chef Flambe

Lea otras preguntas en las etiquetas