SDCC genera programas no válidos para PIC 16f628a

2

He estado aprendiendo cómo codificar para el 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 cuando lo subo al chip, el LED permanece 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 en la ejecución de un programa simple compilado con GPASM. Cabe destacar que GPSIM ejecuta todos esos programas perfectamente 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;
    }
}
    
pregunta user12707

1 respuesta

1

¿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á presionando 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, he encontrado útil deshabilitar explícitamente todas las opciones de configuración que no estoy usando. Previene 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 por tu comentario que estás usando SDCC 3.3. A partir de este post, SDCC 3.5.5 está disponible. El manual actual de SDCC recomienda usar #pragma config para establecer los bits de configuración, ya que el método utilizado en su ejemplo está en desuso. Aquí hay 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, utilizando 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    
    
respondido por el Daelon Suzuka

Lea otras preguntas en las etiquetas