*********************************** * Temecommande communication * * For 68Hc11f1 * * July 31th, 2001 * * Laurent SAINT-MARCEL * * lstmarcel@yahoo.fr * *********************************** * ******************************* BASE EQU $1000 PILE EQU $1FF * serial port BAUD EQU $2B SCCR1 EQU $2C SCCR2 EQU $2D SCSR EQU $2E SCDR EQU $2F TDRE EQU $80 RDRF EQU $20 * io port PORTF EQU $05 PORTA EQU $00 DDRA EQU $01 NO_RCV EQU $FF * IO_1 RMB 1 IO_2 RMB 1 IO_3 RMB 1 IO_4 RMB 1 IO RMB 1 * IO_VALUE_1 RMB 2 IO_VALUE_2 RMB 2 IO_VALUE_3 RMB 2 IO_VALUE_4 RMB 2 * IO_MASK RMB 1 IO_END RMB 1 IO_NBR RMB 1 * ***************************** * PROGRAM POSITION IN EPROM * ***************************** ORG $FE00 ** START OF EEPROM. $F800 FOR 68hc11E2 LDX #BASE ** Base register LDS #PILE ** Stack address BRA RESET * ********* * RESET * ********* RESET BSR SCI_INI ** initialize serial port JSR IO_INI ** initialize io CLR PORTF,X JMP MAIN ** jump to main program * ***************** * SERIAL PORT * ***************** **** Init serial port **** SCI_INI CLR SCCR1,X LDD #$300C STAA BAUD,X ** 9600 bauds STAB SCCR2,X ** Transmitter and receiver enabled RTS * **** send one byte on serial port : register A **** SCI_SND PSHA SCI_SN1 LDAA SCSR,X ** sci status register ANDA #TDRE ** Write Data register empty ? BEQ SCI_SN1 ** if No => retry PULA STAA SCDR,X ** write data on serial port RTS * **** receive two bytes from serial port and store them in register A **** SCI_RCV LDAA SCSR,X ** sci status register ANDA #RDRF ** Read Data register full ? BEQ SCI_RC2 ** if No => retry LDAA SCDR,X ** read data from serial port RTS SCI_RC2 LDAA #NO_RCV ** Register A filled with FF if nothing waiting on serial port RTS * ***************** * IO * ***************** **** IO_ INITIALIZE **** IO_INI CLR DDRA,X ** port A = input LDAA #%00001000 ** 4 input to check STAA IO_NBR LDAA #$01 ** IO pin to check STAA IO_1 LDAA #$02 STAA IO_2 LDAA #$04 STAA IO_3 LDAA #$08 STAA IO_4 RTS * **** IO_COMPUTE **** * Set IO to read, read value, store it, next io... IO_CMP LDAA IO_NBR STAA IO_END * * will read signal 4 (change the order by moving these blocks LDAA IO_4 STAA IO JSR IO_RD0 * compute IO IO_SAV4 STY IO_VALUE_4 * store value * * will read signal 1 LDAA IO_1 STAA IO JSR IO_RD0 IO_SAV1 STY IO_VALUE_1 * * will read signal 2 LDAA IO_2 STAA IO JSR IO_RD0 IO_SAV2 STY IO_VALUE_2 * * will read signal 3 LDAA IO_3 STAA IO JSR IO_RD0 IO_SAV3 STY IO_VALUE_3 * IO_FIN RTS **** READ IO **** * compute time IO is up IO_RD0 LDY #$0000 ** init counter LDAA PORTA,X ANDA IO CMPA IO BNE IO_RD1 RTS ** if signal already up, return IO_RD1 LDAA PORTA,X ANDA IO CMPA IO BNE IO_RD1 ** wait signal up IO_RD2 INY LDAA PORTA,X ANDA IO CMPA IO BEQ IO_RD2 ** wait signal down RTS * *** IO_SND on serial port * 2 bytes sent by IO PIN IO_SND LDAA IO_NBR STAA IO_END * LDD IO_VALUE_1 JSR SCI_SND TBA JSR SCI_SND LDAA IO_END RORA BCS IO_FIN * LDD IO_VALUE_2 JSR SCI_SND TBA JSR SCI_SND LDAA IO_END RORA BCS IO_FIN * LDD IO_VALUE_3 JSR SCI_SND TBA JSR SCI_SND LDAA IO_END RORA BCS IO_FIN * LDD IO_VALUE_4 JSR SCI_SND TBA JSR SCI_SND LDAA IO_END RORA BCS IO_FIN * ***************** * DELAY * ***************** DELAY PSHX LDX #$10 DELAY2 DEX BNE DELAY2 PULX RTS ***************** * INFINITE LOOP * ***************** LOOP BRA LOOP * **************** * MAIN PROGRAM * **************** MAIN INC PORTF,X * display it on PORT F JSR IO_CMP JSR SCI_RCV * read a character from serial port CMPA #$FF * if no character on serial port BEQ MAIN JSR IO_SND * send it back BRA MAIN * *********************************** * SET Boot stack pointer position * *********************************** ORG $FFFE FDB $FE00 * $F800 FOR 68hc11E2 * ORG $BFFE FDB $FE00 * $F800 FOR 68hc11E2 * END