; File: PL513b.A51 Date: 12/09/93 ; ; /* (c) Copyright BLUE EARTH RESEARCH, MANKATO, MN 1993. */ ; /* All rights reserved. */ $ TITLE (X-10 TRANSMIT DRIVER) $ DEBUG XREF ERRORPRINT $ DATE (12-09-93) $ PW(94) PL(60) ; ΙΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ» ; Ί UPDATED X-10 TRANSMIT SOFTWARE DRIVER Ί ; ΘΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΌ ; ΥΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΈ ; ³ Written By: Thomas Bachmann ³ ; ³ Blue Earth Research, Mankato, MN 56001 ³ ; ΤΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΎ ; Note: This is an updated version of the X-10 software in the ; Micro User's Manual. It will now work on most 3-Phase power ; systems. It also supports Bright and Dim codes, where the ; unit code contains the number of codes to repeat. ; THE BASIC PROGRAM MUST LOAD THE FOLLOWING INTERNAL ; DATA MEMORY LOCATIONS: HOUSE DATA 18H ; House Code KEY DATA 19H ; Key or Unit Code CMD DATA 1AH ; Command or Function Code ; Other misc internal data memory locations: Count DATA 1BH n DATA 1CH Mask DATA 1DH ; -------- Function codes for Bright and Dim ---- Bright EQU 11 Dim EQU 9 ; -------- Hardware dependent definitions ------- OUTPUT BIT P1.0 ; Transmit output INPUT BIT P1.1 ; Zero crossing input CSEG AT 5000H SETB OUTPUT ; INITIAL ZERO ; Loop for a complete cycle to make sure timing is synchronized JB INPUT, $ ; WAIT FOR CLEAR JNB INPUT, $ ; WAIT FOR READY ; ------- Check for Bright/Dim codes ------------ MOV A,CMD CJNE A,#Dim,ChkBr SJMP BR_DIM ChkBr: CJNE A,#Bright,STD BR_DIM: XCH A,KEY ; Swap Key and Cmd registers MOV CMD,A MORE: ACALL START ; Bright/Dim Loop DJNZ CMD,MORE RET ; -------- Output the codes --------------------- STD: ACALL TWICE ; SEND HOUSE AND KEY CODES TWICE MOV Count,#6 ; WAIT 6 HALF CYCLES WAIT: ACALL SEND0 DJNZ Count,WAIT MOV KEY,CMD ; MOVE F(N) CODE TO KEY LOCATION TWICE: ACALL START START: ACALL SEND1 ; OUTPUT THREE ONES, ACALL SEND1 ; THEN ZERO ACALL SEND1 ACALL SEND0 MOV Mask,#0FH ; LOAD BYTE MULTIPLE MOV n,HOUSE ; LOAD HOUSE CODE ACALL MORE_BITS ; SEND HOUSE CODE MOV Mask,#1FH ; LOAD BYTE MULTIPLE MOV n,KEY ; LOAD KEY CODE MORE_BITS: MOV A,Mask INC A ; POINT TO BIT RR A MOV Mask,A ; SAVE NEW BIT ANL A,n ; MASK OFF ALL BITS JZ ZERO ; IF ZERO, SEND ZERO ACALL SEND1 ; OTHERWISE SEND ONE SJMP SKIP ZERO: ACALL SEND0 ; SEND ZERO SKIP: ACALL CMPL DJNZ Mask,MORE_BITS ; REPEAT UNTIL BIT 0 IS SENT. RET SEND1: ACALL Pulse ; Send the First Pulse ACALL Delay ; Wait for 1.77 mS ACALL Pulse ; Send the Second Pulse ACALL Delay ; Wait for 1.77 mS ACALL Pulse ; Send the Third Pulse SEND0: ; OUTPUT IS LOW JB INPUT,UPPER ; IN UPPER HALF CYCLE JNB INPUT, $ ; WAIT FOR CHANGE RET UPPER: JB INPUT, $ ; WAIT FOR CHANGE RET ; -------- Subroutine to output a pulse --------- Pulse: MOV Count,#200 ; REPEAT 200 TIMES CLR OUTPUT ; OUTPUT A ONE LOOP: NOP ; ONE CLOCK NOP ; TWO CLOCKS NOP ; THREE CLOCKS DJNZ Count,LOOP ; FIVE CLOCKS TOTAL SETB OUTPUT ; RETURN TO ZERO RET ; -------- Delay for three phase output --------- Delay: MOV Count,#221 ; Delay 1.77 mS LOOP1: NOP ; ONE CLOCK NOP ; TWO CLOCKS NOP NOP NOP NOP DJNZ Count,LOOP1 ; EIGHT CLOCKS TOTAL RET CMPL: JZ NEXT ACALL SEND0 RET NEXT: ACALL SEND1 RET END ; Following is the HEX file derived from the assembled source ; file. This can be used for directly loading the program via ; MONITOR-51 and almost any terminal program. :10500000D2902091FD3091FDE51AB409028003B4DD :105010000B0AC519F51A112BD51AFB221129751B7C :10502000061161D51BFB851A19112B115711571148 :10503000571161751D0F85181C1141751D1F8519AC :105040001CE51D0403F51D551C6004115780021159 :10505000611187D51DEB22116C117A116C117A1137 :105060006C2091043091FD222091FD22751BC8C255 :1050700090000000D51BFAD29022751BDD000000C5 :0F508000000000D51BF722600311612211572297 :00000001FF