;------------------------------------------ ; HC908 Example #4 ;------------------------------------------ ;Filename: example4.asm ;HC908QT/QY Programmer ;written by Kenrick Chin ;Version 1.00 ;2003 Dec 22 - First writing ;HC908 SCI, ADC tests ;This program tests and demonstrates a number ;HC908 features ;1. It demonstrates how to send serial data ; via PTA0 to a host PC at 9600 baud ; using the internal clock trimmed to 12.8MHZ ;2. It tests the 8-bit ADC ;3. It transmits the 8-bit value as two ; hexadecimal characters ;Target code is written to flash memory ;Terminal Emulator required TERM ;------------------------------------------ ; MCU Hardware Definitions ;------------------------------------------ SRAM EQU $80 DATA EQU $94 FLASH EQU $EE00 WATCHDOG EQU $FFFF PORTA EQU $00 PORTB EQU $01 DDRA EQU $04 DDRB EQU $05 INTSCR EQU $1D CONFIG2 EQU $1E CONFIG1 EQU $1F OSCTRIM EQU $38 ;timer TSC EQU $20 TCNTH EQU $21 TCNTL EQU $22 TMODH EQU $23 TMODL EQU $24 TOF EQU 7 TOIE EQU 6 TSTOP EQU 5 TRST EQU 4 COPD EQU 0 RSTEN EQU 0 ;ADC ADSCR EQU $3C ADR EQU $3E ADICLK EQU $3F COCO EQU 7 ;------------------------------------------------ ; ROM routines ;------------------------------------------------ ;AUX ROM jump vectors GETBYTE EQU $2800 RDRVRNG EQU $2803 ERARNGE EQU $2806 PRGRNGE EQU $2809 DELNUS EQU $280C ;MONITOR ROM routines GETPUT EQU $FE8E PUTBYTE EQU $FEA1 ONEBIT EQU $FEC5 ;ROM variables CTRLBYT EQU $88 CPUSPD EQU $89 LADDR EQU $8A LADDR.H EQU $8A LADDR.L EQU $8B THEDATA EQU $8C MASSBIT EQU 6 ;------------------------------------------------ ; Communications Protocal ;------------------------------------------------ STX EQU $3A ;':' ERAS EQU $55 ;'U' PGERAS EQU $AA ;'*' PGM EQU $25 ;'%' RUN EQU $4A ;'J' ACK EQU $41 ;'A' NACK EQU $4E ;'N' CHK EQU $58 ;'X' ;------------------------------------------------ ; Start of SRAM space used by binary loader ;------------------------------------------------ ORG DATA .addr.H DS 1 .addr.L DS 1 .nbytes DS 1 .sum DS 1 ;------------------------------------------------ ; Bootstrap Loader ;------------------------------------------------ .boot BOOT RSP ;mass erase BSET MASSBIT CTRLBYT LDHX #FLASH JSR ERARNGE .main BSR .getc STA .sum ;first byte CMP #STX BNE .main BSR .getc CBEQA #PGM .program BRA .main .program BSR .getaddr BSR .getc STA .nbytes ;save number of bytes ;assume bytes fall on page boundaries ;so that LADDR.H does not change DECA ADD LADDR.L STA LADDR.L LDHX #THEDATA ;set buffer address .next1 BSR .getc ;get data bytes STA ,X ;store data into buffer INCX ;point to next address DEC .nbytes BNE .next1 BSR .getc ;get checksum BEQ .pgm LDA #CHK ;checksum error BRA .ack ;setup for programming ;nbytes in THEDATA array ;H-X is destination address ;LADDR(2) is last destination address ;Globals: CPUSPD, CTRLBYT, THEDATA, LADDR(2) .pgm LDHX .addr.H JSR PRGRNGE ;program flash LDA #ACK .ack JSR PUTBYTE BRA .main ;get next 2 bytes into addr.H, addr.L ;also preset LADDR.H, LADDR.L .getaddr BSR .getc STA .addr.H STA LADDR.H BSR .getc STA .addr.L STA LADDR.L RTS ;get one byte and accumulate sum .getc JSR GETBYTE PSHA ADD .sum STA .sum PULA RTS ENDB .boot ;------------------------------------------------ ; Start of Application ;------------------------------------------------ OSCK EQU 128 ;oscillator trim for 12.8MHz ;------------------------------------------------ ; DATA Segment ;------------------------------------------------ ORG SRAM ;------------------------------------------------ ; CODE Segment ;------------------------------------------------ ORG FLASH start MOV #%01000000 CONFIG2 ;setup CPU MOV #%00001001 CONFIG1 MOV #OSCK OSCTRIM ;initialize ports BSET 0 DDRA ;set PTA0 for output BSET 0 DDRB ;initialize A/D converter MOV #$60 ADICLK MOV #$22 ADSCR ;adc channel PTA4 ;initialize timer ;set for MOD 2500 = $61A8 MOV #$61 TMODH MOV #$A8 TMODL ;start timer, divide by 64 clock MOV #%00010110 TSC ;------------------------------------------------ ; main program loop ;------------------------------------------------ loop BSET 0 PORTB BCLR 0 PORTB BRA loop main BRCLR COCO ADSCR main ;wait for conversion LDA ADR ;read a/d register TAX BSR hex JSR newln ;send CR/LF main1 BRCLR TOF TSC main1 ;wait for overflow flag BCLR TOF TSC ;clear flag BSET 0 PORTB main2 BRCLR TOF TSC main2 ;wait for overflow flag BCLR TOF TSC ;clear flag BCLR 0 PORTB BRA main ;------------------------------------- ; ASCII codes ;------------------------------------- SPACE EQU $20 ZERO EQU $30 NINE EQU $39 LF EQU $0A CR EQU $0D ;------------------------------------------------ ; Software SCI ;------------------------------------------------ TXD EQU 0 ;use PTA0 as output TIMEK.L EQU 65 ;timer constant for 9600 baud ;put character ;output data to serial port using PTA0 ;enter with A = 8-bit character ;unchanged: H,X,A putc PSHX PSHA LDX #10 ;set loop counter ;write hi then lo MOV #1,TMODH MOV #TIMEK.L,TMODL BSET TRST TSC ;reset timer BCLR TOF TSC ;clear TOF BCLR TSTOP TSC ;start timer BCLR TXD, PORTA ;start bit .putc1 BRCLR TOF TSC .putc1 ;wait for one bit time BCLR TOF TSC ;clear TOF flag DBNZX .nextbit BSET TSTOP TSC ;stop timer PULA PULX RTS .nextbit SEC RORA BCC .lobit BSET TXD,PORTA BRA .putc2 .lobit BCLR TXD,PORTA .putc2 BRA .putc1 ;send new line ;unchanged: H,X,A newln PSHA LDA #CR BSR putc LDA #LF BSR putc PULA RTS ;------------------------------------------------ ; Binary to Hex Conversion ;------------------------------------------------ ;hex printout ;enter with A = 8-bit byte ;send two hex chars hex NSA BSR hex1 NSA BSR hex1 RTS ;single hex output ;enter with A = 4-bit nibble hex1 PSHA AND #$0F ADD #ZERO CMP #NINE BLS hex11 ADD #7 hex11 JSR putc PULA RTS ;------------------------------------------------ ; Interrupt Vectors ;------------------------------------------------ ORG $FFFE FDB start END ;------------------------------------------------ ; End of Example #4 ;------------------------------------------------