Programación y uso de un PIC de memoria flash

2

Estoy aprendiendo a programar un PIC12F609 y tengo lo que (creo) Es una pregunta tonta n00b. Como prueba, estoy intentando grabar un programa que simplemente gira los 5 pines IO para generarlos y los enciende todos, de modo que si conecto un LED en serie con una resistencia a cualquier pin, se encenderá. Mi programa es muy simple y funciona bien y MPLAB dice que el PicKit3 ha programado el dispositivo con éxito. Pero cuando intento usar el chip programado no funciona.

Mi temor es que el programa caduque de la memoria en cuanto desconecto el PicKit. Mi plan era programar el PIC, extraerlo, colocarlo en el circuito de LED y conectar la fuente de alimentación (batería de 9V a través del regulador de 5V). En toda mi experiencia anterior con el microcontrolador, el programa desapareció de la RAM tan pronto como se detuvo la alimentación y solo los programas almacenados en EEPROM, que este pequeño pin de 8 pines no tiene, arrancarían cuando se volviera a conectar la alimentación.

Si este es el caso, ¿cómo puedo hacer que un programa se "pegue" en mi chip? y si no, ¿qué más de mi proceso parece mal?

editar: estoy publicando mi código con la esperanza de que esto sea útil. Realmente aprecio las respuestas pensadas que ya se han dado, espero que de esta manera alguien pueda ayudarme a configurar mis interruptores de configuración.

#include <12F609.h>
#include <stdlib.h>

void main (){
    // All five IO pins are on port A. 
    SET_TRIS_a(11111);
    OUTPUT_a(11111);
    while(1){
        // endless loop, my attempt to make sure it didn't stop running
        // I've also tried putting the OUTPUT and TRIS in here but no luck
    }
}

mis bits de configuración son

FOSC - Bits de selección de oscilador - Oscilador RC
WDTE - bit de activación del temporizador de vigilancia - WDT desactivado
PWRTE - Bit de activación del temporizador de encendido - PWRT habilitado
MCLRE - Bit de selección de función de pin MCLR - La función de pin MCLR es MCLR
CP - Bit de protección de código - CP está deshabilitado
IOSCFS - Selección de frecuencia de oscilador interno - 8 MHz
BOREN - Bits de selección de restablecimiento de salida - BOR habilitado.

Creo que entiendo lo que la mayoría de ellos hace, pero realmente no sé lo suficiente como para seleccionar los correctos.

    
pregunta NealJMD

4 respuestas

4

Su plan está bien tal como está: cuando programa el PIC, programa la memoria flash. Este programa debería poder conservarse durante muchas decenas, incluso cientos de años.

El problema que tiene la mayoría de las personas (incluido yo mismo) al comenzar con los PIC es con los fusibles de configuración . Estas son configuraciones que definen cómo se ejecuta el PIC, incluido qué oscilador usar para conducirlo.

Es muy probable que no haya configurado estos fusibles correctamente (pueden ser un verdadero dolor), por lo que su programa simplemente no se está ejecutando.

Si pudiera publicar su programa completo en su pregunta, podemos ayudarlo a diagnosticarlo mejor.

    
respondido por el Majenko
1

No estoy familiarizado con la serie PIC12, pero he usado los chips PIC16, PIC18, PIC24 y PIC32 con MPLAB.

Para cada uno de estos, un programa puede compilarse en el modo debug o release. (Hay un menú desplegable para la configuración de compilación en la barra de herramientas, con opciones para Depurar o Liberar).

Creo que la configuración predeterminada es Depurar. Sin embargo, si programa un dispositivo en modo de depuración y luego desconecta el programador, el programa no se ejecutará de forma independiente. Debe cambiar la configuración a Release y también seleccionar PICkit3 como su Programador en lugar de Debugger.

Luego, vuelva a compilar (o reensamblar) su programa y programe el dispositivo. El programa debería ejecutarse sin el programador adjunto.

    
respondido por el tcrosley
1

Si echa un vistazo a su número de referencia, notará la 'F'. Eso significa que el programa se almacenará en la memoria flash (la memoria RAM de este dispositivo es de solo 64 bytes (!), Por lo que no funcionará el almacenamiento del código del programa). Puede publicar su código aquí ...

    
respondido por el 0x6d64
1

Tu código se ve bien, excepto por una línea:

SET_TRIS_a(11111) ; set all 5 pins to 1=Input, using deprecated instruction.

Creo que quieres algo más como el Ejemplo 5-1 en la pág. 43 de la hoja de datos:

banksel GPIO
movlw   b'00010101' ; 0=low, 1=high
movwf   GPIO
banksel ANSEL
clrf    ANSEL ; digital I/O, rather than ADC
banksel TRISIO
movlw   b'00000000' ; 0=output, 1=input
movwf   TRISIO

Es posible que desee consultar la hoja de datos para el PIC12F609 . Una pequeña nota a pie de página en la p. 16 (de 212) de la ficha técnica. dice "TRISIO3 siempre se lee como '1' ya que GP3 es un pin de entrada solamente". En P. 43, las menciones de la ficha técnica. "La configuración de un bit TRISIO (= 1) hará que el pin GPIO correspondiente sea una entrada (es decir, deshabilite el controlador de salida). Al borrar un bit TRISIO (= 0), el pin GPIO correspondiente se convertirá en una salida (es decir, habilita el driver de salida y pone el contenido del pestillo de salida en el pin seleccionado). "

(Sí, 1 = entrada, 0 = la salida es exactamente lo opuesto a otros chips populares).

(Más detalles: Massmind: TRIS ; Massmind: código de ejemplo PIC12F )

EDITAR: Aunque creemos que el 12f609 no "necesita" tener ANSEL autorizado, Lo borraría de todos modos. He escuchado que corrige al menos un Problema con 12f609 .

#include <12F609.h>
// ...
main(){
    OUTPUT_A(0xFF); // all high: 0=low, 1=high
    //  #BYTE ANSEL = 0x9F // defined in 12F609.h ?
    ANSEL = 0;
    SET_TRIS_A(0X00); // 0=output, 1=input
    // ...
}
    
respondido por el davidcary

Lea otras preguntas en las etiquetas