Autor: Fernando Rafael Filipuzzi
E-mail: fernando_6867@yahoo.com.ar
La idea es crear un ejemplo en c para compilarlo con sdcc, en este ejemplo se genera una secuencia para mover un motor paso a paso bipolar. Para esto elegí el microcontrolador HC908AP16.
La versión de sdcc que usé fue la 3.1.0 construida a partir de los fuentes. Más detalles [aquí].
hp:/usr/src/sdcc_examples/example# sdcc -v SDCC : mcs51/gbz80/z80/z180/r2k/ds390/pic16/pic14/TININative/ds400/hc08 3.1.0 #7066 (Nov 22 2011) (Linux)
Los archivos fuentes son:
He hecho un makefile sencillo.
# # Ejemplo sdcc MC68HC08 # PTD: secuencia para un motor paso a paso bipolar # PTC: led de actividad # # microcontrolador: hc908ap16 # archivo: Makefile # fecha: 15/12/2012 # url: http://hdcm.sytes.net # http://hdcm.com.ar # # Autor: Filipuzzi, Fernando Rafael # E-Mail: fernando6867@gmail.com # all: sdcc -V --verbose --fverbose-asm --std-c99 --model-small \ --main-return -mhc08 \ --code-loc 0x0860 --code-size 0x4000 \ --data-loc 0x0060 --iram-size 0x0400 --stack-loc 0x045f \ main.c clean: ls | grep -v "\.*.[c|h]$$" | grep -v "Makefile" | xargs rm -f
Declaro los registros de los dispositivos de este microcontrolador. No estan todos los registros, los iré definiendo a medida que los use.
/** * * microcontrolador: hc908ap16 * archivo: mc68hc908ap16.h * * Autor: Filipuzzi, Fernando Rafael * E-Mail: fernando6867@gmail.com * **/ #ifndef __MC68HC908AP16_H__ #define __MC68HC908AP16_H__ /*PTC Port C Data Register*/ typedef union{ unsigned char byte; struct{ unsigned char PTC7:1; unsigned char PTC6:1; unsigned char PTC5:1; unsigned char PTC4:1; unsigned char PTC3:1; unsigned char PTC2:1; unsigned char PTC1:1; unsigned char PTC0:1; } bits; } ptc; #define PTC_PTC7_MASK 0x80 #define PTC_PTC6_MASK 0x40 #define PTC_PTC5_MASK 0x20 #define PTC_PTC4_MASK 0x10 #define PTC_PTC3_MASK 0x08 #define PTC_PTC2_MASK 0x04 #define PTC_PTC1_MASK 0x02 #define PTC_PTC0_MASK 0x01 #define _PTC (*((volatile ptc*)(0x0002))) #define PTC _PTC.byte #define PTC_PTC7 _PTC.bits.PTC7 #define PTC_PTC6 _PTC.bits.PTC6 #define PTC_PTC5 _PTC.bits.PTC5 #define PTC_PTC4 _PTC.bits.PTC4 #define PTC_PTC3 _PTC.bits.PTC3 #define PTC_PTC2 _PTC.bits.PTC2 #define PTC_PTC1 _PTC.bits.PTC1 #define PTC_PTC0 _PTC.bits.PTC0 /*PTD Port D Data Register*/ typedef union{ unsigned char byte; struct{ unsigned char PTD7:1; unsigned char PTD6:1; unsigned char PTD5:1; unsigned char PTD4:1; unsigned char PTD3:1; unsigned char PTD2:1; unsigned char PTD1:1; unsigned char PTD0:1; } bits; } ptd; #define PTD_PTD7_MASK 0x80 #define PTD_PTD6_MASK 0x40 #define PTD_PTD5_MASK 0x20 #define PTD_PTD4_MASK 0x10 #define PTD_PTD3_MASK 0x08 #define PTD_PTD2_MASK 0x04 #define PTD_PTD1_MASK 0x02 #define PTD_PTD0_MASK 0x01 #define _PTD (*((volatile ptd*)(0x0003))) #define PTD _PTD.byte #define PTD_PTD7 _PTD.bits.PTD7 #define PTD_PTD6 _PTD.bits.PTD6 #define PTD_PTD5 _PTD.bits.PTD5 #define PTD_PTD4 _PTD.bits.PTD4 #define PTD_PTD3 _PTD.bits.PTD3 #define PTD_PTD2 _PTD.bits.PTD2 #define PTD_PTD1 _PTD.bits.PTD1 #define PTD_PTD0 _PTD.bits.PTD0 /*DDRC Direction Register C*/ typedef union{ unsigned char byte; struct{ unsigned char DDRC7:1; unsigned char DDRC6:1; unsigned char DDRC5:1; unsigned char DDRC4:1; unsigned char DDRC3:1; unsigned char DDRC2:1; unsigned char DDRC1:1; unsigned char DDRC0:1; } bits; } ddrc; #define DDRC_DDRC7_MASK 0x80 #define DDRC_DDRC6_MASK 0x40 #define DDRC_DDRC5_MASK 0x20 #define DDRC_DDRC4_MASK 0x10 #define DDRC_DDRC3_MASK 0x08 #define DDRC_DDRC2_MASK 0x04 #define DDRC_DDRC1_MASK 0x02 #define DDRC_DDRC0_MASK 0x01 #define _DDRC (*((volatile ddrc*)(0x0006))) #define DDRC _DDRC.byte #define DDRC_DDRC7 _DDRC.bits.DDRC7 #define DDRC_DDRC6 _DDRC.bits.DDRC6 #define DDRC_DDRC5 _DDRC.bits.DDRC5 #define DDRC_DDRC4 _DDRC.bits.DDRC4 #define DDRC_DDRC3 _DDRC.bits.DDRC3 #define DDRC_DDRC2 _DDRC.bits.DDRC2 #define DDRC_DDRC1 _DDRC.bits.DDRC1 #define DDRC_DDRC0 _DDRC.bits.DDRC0 /*DDRD Direction Register D*/ typedef union{ unsigned char byte; struct{ unsigned char DDRD7:1; unsigned char DDRD6:1; unsigned char DDRD5:1; unsigned char DDRD4:1; unsigned char DDRD3:1; unsigned char DDRD2:1; unsigned char DDRD1:1; unsigned char DDRD0:1; } bits; } ddrd; #define DDRD_DDRD7_MASK 0x80 #define DDRD_DDRD6_MASK 0x40 #define DDRD_DDRD5_MASK 0x20 #define DDRD_DDRD4_MASK 0x10 #define DDRD_DDRD3_MASK 0x08 #define DDRD_DDRD2_MASK 0x04 #define DDRD_DDRD1_MASK 0x02 #define DDRD_DDRD0_MASK 0x01 #define _DDRD (*((volatile ddrd*)(0x0007))) #define DDRD _DDRD.byte #define DDRD_DDRD7 _DDRD.bits.DDRD7 #define DDRD_DDRD6 _DDRD.bits.DDRD6 #define DDRD_DDRD5 _DDRD.bits.DDRD5 #define DDRD_DDRD4 _DDRD.bits.DDRD4 #define DDRD_DDRD3 _DDRD.bits.DDRD3 #define DDRD_DDRD2 _DDRD.bits.DDRD2 #define DDRD_DDRD1 _DDRD.bits.DDRD1 #define DDRD_DDRD0 _DDRD.bit.DDRD0 /*SCI Control Register 1*/ typedef union{ unsigned char byte; struct{ unsigned char LOOPS:1; unsigned char ENSCI:1; unsigned char TXINV:1; unsigned char M:1; unsigned char WAKE:1; unsigned char ILTY:1; unsigned char PEN:1; unsigned char PTY:1; } bits; } scc1; #define SCC1_LOOPS_MASK 0x80 #define SCC1_ENSCI_MASK 0x40 #define SCC1_TXINV_MASK 0x20 #define SCC1_M_MASK 0x10 #define SCC1_WAKE_MASK 0x08 #define SCC1_ILTY_MASK 0x04 #define SCC1_PEN_MASK 0x02 #define SCC1_PTY_MASK 0x01 #define _SCC1 (*((volatile scc1 *)(0x0013))) #define SCC1 _SCC1.byte #define SCC1_LOOPS _SCC1.bits.LOOPS #define SCC1_ENSCI _SCC1.bits.ENSCI #define SCC1_TXINV _SCC1.bits.TXINV #define SCC1_M _SCC1.bits.M #define SCC1_WAKE _SCC1.bits.WAKE #define SCC1_ILTY _SCC1.bits.ILTY #define SCC1_PEN _SCC1.bits.PEN #define SCC1_PTY _SCC1.bits.PTY /*SCI Control Register 2*/ typedef union{ unsigned char byte; struct{ unsigned char SCTIE:1; unsigned char TCIE:1; unsigned char SCRIE:1; unsigned char ILIE:1; unsigned char TE:1; unsigned char RE:1; unsigned char RWU:1; unsigned char SBK:1; } bits; } scc2; #define SCC2_SCTIE_MASK 0x80 #define SCC2_TCIE_MASK 0x40 #define SCC2_SCRIE_MASK 0x20 #define SCC2_ILIE_MASK 0x10 #define SCC2_TE_MASK 0x08 #define SCC2_RE_MASK 0x04 #define SCC2_RWU_MASK 0x02 #define SCC2_SBK_MASK 0x01 #define _SCC2 (*((volatile scc2 *)(0x14))) #define SCC2 _SCC2.byte #define SCC2_SCTIE _SCC2.bits.SCTIE #define SCC2_TCIE _SCC2.bits.TCIE #define SCC2_SCRIE _SSC2.bits.SCRIE #define SCC2_ILIE _SCC2.bits.ILIE #define SCC2_TE _SCC2.bits.TE #define SCC2_RE _SCC2.bits.RE #define SCC2_RWU _SCC2.bit.RWU #define SCC2_SBK _SCC2.bit.SBK /*SCI Control Register 3*/ typedef union{ unsigned char byte; struct{ unsigned char Rs:1; unsigned char Ts:1; unsigned char DMARE:1; unsigned char DMATE:1; unsigned char ORIE:1; unsigned char NEIE:1; unsigned char FEIE:1; unsigned char PEIE:1; } bits; } scc3; #define SCC3_Rs_MASK 0x80 #define SCC3_Ts_MASK 0x40 #define SCC3_DMARE_MASK 0x20 #define SCC3_DMATE_MASK 0x10 #define SCC3_ORIE_MASK 0x08 #define SCC3_NEIE_MASK 0x04 #define SCC3_FEIE_MASK 0x02 #define SCC3_PEIE_MASK 0x01 #define _SCC3 (*((volatile scc3 *)(0x15))) #define SCC3 _SCC3.byte #define SCC3_Rs _SCC3.bits.Rs #define SCC3_Ts _SCC3.bits.Ts #define SCC3_DMARE _SCC3.bits.DMARE #define SCC3_DMATE _SCC3.bits.DMATE #define SCC3_ORIE _SCC3.bits.ORIE #define SCC3_NEIE _SCC3.bits.NEIE #define SCC3_FEIE _SCC3.bits.FEIE #define SCC3_PEIE _SCC3.bits.PEIE /*SCI Status Register 1*/ typedef union{ unsigned char byte; struct{ unsigned char SCTE:1; unsigned char TC:1; unsigned char SCRF:1; unsigned char IDLE:1; unsigned char OR:1; unsigned char NF:1; unsigned char FE:1; unsigned char PE:1; } bits; } scs1; #define SCS1_SCTE_MASK 0x80 #define SCS1_TC_MASK 0x40 #define SCS1_SCRF_MASK 0x20 #define SCS1_IDLE_MASK 0x10 #define SCS1_OR_MASK 0x08 #define SCS1_NF_MASK 0x04 #define SCS1_FE_MASK 0x02 #define SCS1_PE_MASK 0x01 #define _SCS1 (*((volatile scs1 *)(0x16))) #define SCS1 _SCS1.byte #define SCS1_SCTE _SCS1.bits.SCTE #define SCS1_TC _SCS1.bits.TC #define SCS1_SCRF _SCS1.bits.SCRF #define SCS1_IDLE _SCS1.bits.IDLE #define SCS1_OR _SCS1.bits.OR #define SCS1_NF _SCS1.bits.NF #define SCS1_FE _SCS1.bits.FE #define SCS1_PE _SCS1.bit.PE /*SCI Status Register 2*/ typedef union{ unsigned char byte; struct{ unsigned char :6; unsigned char BKF:1; unsigned char RPF:1; } bits; } scs2; #define SCS2_BKF_MASK 0x02 #define SCS2_RPF_MASK 0x01 #define _SCS2 (*((volatile scs2 *)(0x17))) #define SCS2 _SCS2.byte #define SCS2_BKF _SCS2.bits.BKF #define SCS2_RPF _SCS2.bits.RPF /*SCI Data Register */ typedef union{ unsigned char byte; struct{ unsigned char R7:1; unsigned char R6:1; unsigned char R5:1; unsigned char R4:1; unsigned char R3:1; unsigned char R2:1; unsigned char R1:1; unsigned char R0:1; } bits; } scdr; #define _SCDR (*((volatile scdr *)(0x18))) #define SCDR _SCDR.byte /*SCI Baud Rate Register */ typedef union{ unsigned char byte; struct{ unsigned char :2; unsigned char SCP1:1; unsigned char SCP0:1; unsigned char R :1; unsigned char SCR2:1; unsigned char SCR1:1; unsigned char SCR0:1; } bits; } scbr; #define SCBR_SP1_MASK 0x20 #define SCBR_SCP0_MASK 0x10 #define SCBR_R_MASK 0x08 #define SCBR_SCR2_MASK 0x04 #define SCBR_SCR1_MASK 0x02 #define SCBR_SCR0_MASK 0x01 #define _SCBR (*((volatile scbr *)(0x19))) #define SCBR _SCBR.byte #define SCBR_SCP1 _SCBR.bits.SCP1 #define SCBR_SCP0 _SCBR.bits.SCP0 #define SCBR_R _SCBR.bits.R #define SCBR_SCR2 _SCBR.bits.SCR2 #define SCBR_SCR1 _SCBR.bits.SCR1 #define SCBR_SCR0 _SCBR.bits.SCR0 #endif
hp:/usr/src/sdcc_examples/example/example_sdccmhc08_ap16# make clean ls | grep -v "\.*.[c|h]$" | grep -v "Makefile" | xargs rm -f
hp:/usr/src/sdcc_examples/example/example_sdccmhc08_ap16# make sdcc -V --verbose --fverbose-asm --std-c99 --model-small \ --main-return -mhc08 \ --code-loc 0x0860 --code-size 0x4000 \ --data-loc 0x0060 --iram-size 0x0400 --stack-loc 0x045f \ main.c sdcc: Calling preprocessor... + "/usr/local/bin/sdcpp" -nostdinc -Wall -std=c99 -obj-ext=.rel -DSDCC_MODEL_SMALL -DSDCC=310 -DSDCC_REVISION=7066 -DSDCC_hc08 -D__hc08 -isystem "/usr/local/bin/../share/sdcc/include/hc08" -isystem "/usr/local/share/sdcc/include/hc08" -isystem "/usr/local/bin/../share/sdcc/include" -isystem "/usr/local/share/sdcc/include" "main.c" sdcc: Generating code... sdcc: Calling assembler... + "/usr/local/bin/sdas6808" -plosgffwz "main.rel" "main.asm" sdcc: Calling linker... sdcc: Calling linker... + "/usr/local/bin/sdld6808" -nf "main.lk" hp:/usr/src/sdcc_examples/example/example_sdccmhc08_ap16#
host:/usr/src/sdcc_examples/example/example1# ls | grep -v "\.*.[c|h]$" | grep -v "Makefile" main.asm main.cdb main.lk main.lst main.map main.rel main.rst main.s19 main.sym
Ahí se encuentra el s19 para grabar en la memoria del microcontrolador.