_main
MOVLW 0x01
BANKSEL r0x1000
MOVWF r0x1000
BANKSEL _TRISB
CLRF _TRISB
_00109_DS_
BANKSEL r0x1000
MOVF r0x1000,W
BANKSEL _PORTB
MOVWF _PORTB
MOVLW 0x80
BANKSEL r0x1000
SUBWF r0x1000,W
BTFSC STATUS,0
GOTO _00106_DS_
BCF STATUS,0
RLF r0x1000,F
GOTO _00109_DS_
_00106_DS_
MOVLW 0x01
BANKSEL r0x1000
MOVWF r0x1000
GOTO _00109_DS_
RETURN
#include <pic/pic16f628a.h>
typedef unsigned int word;
word at 0x2007 CONFIG = _XT_OSC & _WDT_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _CP_OFF & _DATA_CP_OFF & _MCLRE_ON;
void main()
{
unsigned char dato = 1;
TRISB = 0;
while (1)
{
PORTB = dato;
if (dato < 128) dato = dato<<1;
else
dato = 1;
}
}
PROG_NAME = test.hex
OBJS = test.o
sdcc_PIC_TYPE = 16f628a
lkr_PIC_TYPE = 16f628a
TOOLSDIR = /usr
DEBUG = -DUSB_USE_UART #-DDEBUG_UART -DDEBUG # -DDEBUG_PRINT
CFLAGS = -mpic14 -p$(sdcc_PIC_TYPE) $(DEBUG) --opt-code-size
INC = -I.
CRT = crt0.o
all: clean $(PROG_NAME)
.c.o:
sdcc $(CFLAGS) $(INC) -c $<
$(PROG_NAME): $(OBJS)
sdcc $(DEBUG) -Wl-s/usr/share/gputils/lkr/$(lkr_PIC_TYPE).lkr,-m -mpic14 -p$(sdcc_PIC_TYPE) $+ -o $(@)
clean:
rm -f *.o *.lst *.cod *.hex *.map *.asm
Compilé ese código con SDCC y me dio este ASM:Código: [Seleccionar]_main
MOVLW 0x01
BANKSEL r0x1000
MOVWF r0x1000
BANKSEL _TRISB
CLRF _TRISB
_00109_DS_
BANKSEL r0x1000
MOVF r0x1000,W
BANKSEL _PORTB
MOVWF _PORTB
MOVLW 0x80
BANKSEL r0x1000
SUBWF r0x1000,W
BTFSC STATUS,0
GOTO _00106_DS_
BCF STATUS,0
RLF r0x1000,F
GOTO _00109_DS_
_00106_DS_
MOVLW 0x01
BANKSEL r0x1000
MOVWF r0x1000
GOTO _00109_DS_
RETURN
El c completo para un 16f628a sería:Código: [Seleccionar]#include <pic/pic16f628a.h>
typedef unsigned int word;
word at 0x2007 CONFIG = _XT_OSC & _WDT_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _CP_OFF & _DATA_CP_OFF & _MCLRE_ON;
void main()
{
unsigned char dato = 1;
TRISB = 0;
while (1)
{
PORTB = dato;
if (dato < 128) dato = dato<<1;
else
dato = 1;
}
}
Utilicé este MakefileCódigo: [Seleccionar]PROG_NAME = test.hex
OBJS = test.o
sdcc_PIC_TYPE = 16f628a
lkr_PIC_TYPE = 16f628a
TOOLSDIR = /usr
DEBUG = -DUSB_USE_UART #-DDEBUG_UART -DDEBUG # -DDEBUG_PRINT
CFLAGS = -mpic14 -p$(sdcc_PIC_TYPE) $(DEBUG) --opt-code-size
INC = -I.
CRT = crt0.o
all: clean $(PROG_NAME)
.c.o:
sdcc $(CFLAGS) $(INC) -c $<
$(PROG_NAME): $(OBJS)
sdcc $(DEBUG) -Wl-s/usr/share/gputils/lkr/$(lkr_PIC_TYPE).lkr,-m -mpic14 -p$(sdcc_PIC_TYPE) $+ -o $(@)
clean:
rm -f *.o *.lst *.cod *.hex *.map *.asm
El code size estimation tiró:
; code size estimation:
; 16+ 6 = 22 instructions ( 56 byte)
No lo veo tan mal :?