SDCC genera programas no válidos para PIC 16f628a

He estado aprendiendo a codificar para PIC 16f628A y escribí un código muy simple para encender un LED, que está conectado a RB0, y mantenerlo encendido. Mi intención original era usar SDCC y GPUTILS para compilar los proyectos. Sin embargo, parece que SDCC o GPUTILS están generando archivos hexadecimales no válidos, ya que el programa no actúa como se esperaba cada vez que lo subo al chip, el LED se mantiene apagado durante toda la ejecución del programa. Un código similar compilado con el compilador de CSC se ejecuta sin ningún problema. Además, no tuve éxito al ejecutar un programa simple compilado con GPASM. Cabe destacar que GPSIM ejecuta todos esos programas a la perfección y muestra que los pines funcionan como se esperaba. Estoy usando K150 como programador. No sé qué está pasando con SDCC y GPUTILS.

#include "pic16f628a.h"
//#include "tsmtypes.h"
//#include "tsmpic.h"

#include <stdint.h>

//CONFIG:__config (_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT)

uint16_t __at 0x2007  __CONFIG = _CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT;

#define CLOCK_8MHZ 0
#define CLOCK_4MHZ 1

void main(void)
{
    //SCS = 1;

    TRISA = 0x00;
    TRISB = 0x00;

#ifdef __16f628a    // Only compile this section for PIC16f628a
    CMCON = 0x07;   /** Disable comparators.  NEEDED FOR NORMAL PORTA
         *  BEHAVIOR ON PIC16f628a!          */
#endif

    // Loop forever.  
    while(1) {
        RB0 = 1;
    }
}
estoy usando reloj interno
¿Qué versión de SDCC? Creo que el soporte de PIC estuvo "en beta" por un tiempo, ¿alguna vez finalizaron el objetivo de PIC para su lanzamiento?
La versión que estoy usando es la 3.3. Estaba pensando que el soporte de SDCC para PIC era mejor que eso.

Respuestas (2)

¿Cuál es la configuración física de su pin MCLR? Su configuración tiene MCLR habilitado, por lo que si no está suministrando VCC al pin MCLR (pin4/RA5), básicamente está manteniendo presionado el botón de reinicio.

Cambie su declaración de configuración a:

uint16_t __at 0x2007  __CONFIG = _CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT;

En un consejo más general, me ha resultado útil deshabilitar explícitamente todas las opciones de configuración que no estoy usando. Evita cosas como ser mordido por MCLR, pero también me obliga a leer más de la hoja de datos y aprender más sobre las características del microcontrolador.

También veo en tu comentario que estás usando SDCC 3.3. A partir de esta publicación, SDCC 3.5.5 está disponible. El manual SDCC actual recomienda usar #pragma config para establecer los bits de configuración, ya que el método utilizado en su ejemplo está en desuso. He aquí un extracto del manual:

4.6.17 Configuration Bits
Configuration bits (also known as fuses) can be configured using one of two methods:

• using #pragma config (see section 4.6.6), which is a preferred method for the new code. Example:

#pragma config CP0=OFF,OSCS=ON,OSC=LP,BOR=ON,BORV=25,WDT=ON,WDTPS=128,CCP2MUX=ON
#pragma config STVR=ON

• using ‘__code’ and ‘__at’ modifiers. This method is deprecated. Possible options should be ANDed and
can be found in your processor header file. Example for PIC18F2550:

#include <pic18fregs.h> //Contains config addresses and options
static __code char __at(__CONFIG1L) configword1l =
_USBPLL_CLOCK_SRC_FROM_96MHZ_PLL_2_1L &
_PLLDIV_NO_DIVIDE__4MHZ_INPUT__1L & [...];
static __code char __at(__CONFIG1H) configword1h = [...];
static __code char __at(__CONFIG2L) configword2l = [...];
//More configuration words

Mixing both methods is not allowed and throws an error message ”mixing __CONFIG and CONFIG directives”.

Entonces, usando el método recomendado en el manual de SDCC, su bloque de configuración sería:

/* CONFIGURATION Bits */
#pragma config CP=OFF,CPD=OFF,LVP=OFF,BOREN=OFF
#pragma config MCLRE=OFF,PWRTE=OFF,WDTE=OFF
#pragma config FOSC=INTOSCIO    

Descubrí que con pic16f628 y pic16f628A WatchDog Timer no está deshabilitado si elige OSC y ClockOut. No sé si es culpa de SDCC o gpasm.

EDITAR

El error está en el archivo de encabezado /usr/share/gputils/header/p16f628a.inc, el valor de WDTE_OFF 0x3ff7 es incorrecto y no deshabilita el WDT para todas las configuraciones pero afecta la configuración del reloj. El valor correcto es 0x3ffb. Y el archivo p16f628.inc tiene un valor incorrecto.

La respuesta anterior con pragma es para la familia 18f, no para el antiguo 16f628.