Hello Everyone,
I just wanted to thank you guys, Darrel, Anand and BobK for your help and to show the results of Al Williams Stamp-to-Firecracker code translated into PBP. Maybe someone here that's thinking about getting involved with X10 will find it interesting. It works like a charm and I'm really pleased with the results. I'll do away with the push buttons tomorrow night and connect the LabXT outputs to this circuit and it should work great. Using X10 modules with the LabXT's remotext.bas sample program will make the remote control functions over the telephone really easy to implement.
Thanks Again
jessey
Code:
'************************************************************
'* Name : X10_firecracker.BAS *
'* Author : Al Williams, modifyed by Jessey Montgomery *
'* Date : 1/23/2006 *
'* Version : PBP ver 2.45, MicroCode Studio 2.1.0.7 *
'* : MPASM v03.60, EPIC Version 2.46 beta *
'* : 16F877 *
'************************************************************
'-------------------------- NOTES --------------------------'
' --------------
' | 16F877 |
' MCLR/Vpp ------> |1 40| <-----> RB7/PGD
' RA0/AN0 <-----> |2 39| <-----> RB6/PGC
' RA1/AN1 <-----> |3 38| <-----> RB5
' RA2/AN2/Vref- <-----> |4 37| <-----> RB4
' RA3/AN3/Vref+ <-----> |5 36| <-----> RB3/PGM
' RA4/TOCK1 <-----> |6 35| <-----> RB2
' RA5/AN4/SS <-----> |7 34| <-----> RB1
' RE0/RD/AN5 <-----> |8 33| <-----> RB0/INT0
' RE1/WR/AN6 <-----> |9 32| <----- Vdd +
' RE2/CS/AN7 <-----> |10 31| <----- Vss -
' + Vdd -----> |11 30| <-----> RD7/PSP7
' _ VSS -----> |12 29| <-----> RD6/PSP6
' OSC/CLKIN -----> |13 28| <-----> RD5/PSP5
' OSC2/CLKOUT <------ |14 27| <-----> RD4/PSP4
' RC0/T1OSO/TICK1 <-----> |15 26| <-----> RC7/RX/DT
' RC1/T1OSI/CCP2 <-----> |16 25| <-----> RC6/TX/CK
' RC2/CPP1 <-----> |17 24| <-----> RC5/SDO
' RC3/SCK/SCL <-----> |18 23| <-----> RC4/SD1/SDA
' RD0/PSP0 <-----> |19 22| <-----> RD3/PSP3
' RD1/PSP1 <-----> |20 21| <-----> RD2/PSP2
' --------------
'-----------------------------------------'
' Clear All The Variables And Each Port '
' Before Setting The TRIS Registers '
'-----------------------------------------'
Clear ' Set all ram registers to zero
PORTA = 0
PORTB = 0
PORTC = 0
PORTD = 0
PORTE = 0
'-----------VSS VDD MCLR Ect. Pins -----------'
' MCLR (Pin 1)
' VDD (Pin 11)
' VSS (Pin 12)
' OSC/CLKIN (Pin 13)
' OSC2/CLKOUT (Pin 14)
' VSS (Pin 31)
' Vdd (Pin 32)
'-----------SET THE TRIS PINS BEING USED-----------'
'-------------------- PORTA PINS --------------------'
TRISA.0 = 1 '(pin 2) NOT USED
TRISA.1 = 1 '(pin 3) NOT USED
TRISA.2 = 1 '(pin 4) NOT USED
TRISA.3 = 1 '(pin 5) NOT USED
TRISA.4 = 1 '(pin 6) NOT USED
TRISA.5 = 1 '(pin 7) NOT USED
'-------------------- PORTB PINS --------------------'
TRISB.0 = 1 '(pin 33) NOT USED
TRISB.1 = 1 '(pin 34) NOT USED
TRISB.2 = 1 '(pin 35) NOT USED
TRISB.3 = 1 '(pin 36) NOT USED
TRISB.4 = 1 '(pin 37) .......Pushbutton or input from LabXT
TRISB.5 = 1 '(pin 38) .......Pushbutton or input from LabXT
TRISB.6 = 1 '(pin 39) .......Pushbutton or input from LabXT
TRISB.7 = 1 '(pin 40) .......Pushbutton or input from LabXT
'-------------------- PORTC PINS --------------------'
TRISC.0 = 1 '(pin 15) NOT USED
TRISC.1 = 1 '(pin 16) NOT USED
TRISC.2 = 1 '(pin 17) NOT USED
TRISC.3 = 1 '(pin 18) NOT USED
TRISC.4 = 1 '(pin 23) NOT USED
TRISC.5 = 1 '(pin 24) NOT USED
TRISC.6 = 1 '(pin 25) NOT USED
TRISC.7 = 1 '(pin 26) NOT USED
'-------------------- PORTD PINS --------------------'
TRISD.0 = 0 '(pin 19) ........used to power the firecracker
TRISD.1 = 0 '(pin 20) ........used to power the firecracker
TRISD.2 = 1 '(pin 21) NOT USED
TRISD.3 = 1 '(pin 22) NOT USED
TRISD.4 = 1 '(pin 27) NOT USED
TRISD.5 = 1 '(pin 28) NOT USED
TRISD.6 = 1 '(pin 29) NOT USED
TRISD.7 = 1 '(pin 30) NOT USED
'-------------------- PORTE PINS --------------------'
TRISE.0 = 1 '(pin 8) NOT USED
TRISE.1 = 1 '(pin 9) NOT USED
TRISE.2 = 1 '(pin 10) NOT USED
DEFINE OSC 4 ' 4MHz crystal
@ __CONFIG _XT_OSC &_BODEN_OFF &_PWRTE_ON &_WDT_ON &_CP_OFF &_LVP_OFF
' turn off the Crossing page boundary warnings
@ errorlevel -306
ADCON1 = 7 ' Set PORTA and PORTE to digital
' Data for house and unit codes
housetbl data $60,$70,$40,$50,$80,$90,$A0,$B0,$E0,$F0,$C0,$D0
data $00,$10,$20,$30
unittbl data 0,$10,$8,$18,$40,$50,$48,$58
' This is a link to the orginal code below,
' http://www.awce.com/firecracker.htm
' Define Variables Here
' ---------------------
k VAR BYTE ' used in If-Then's instead of using GOTO's
K = 0
' byte to send
byt var byte
tmp var byte
i var BYTE 'was a nib
x var BYTE 'was a nib
state var bit(4)
house var byte '0=A 1=B...
unit var BYTE ' 0-15 (must be 0 for bright/dim) 'was a nib
cmd var BYTE ' 0=off 1=on 2=bright 3=dim 'was a nib
'Thanks to Darrel Taylor for coming up with this code routine
'for the mainloop...
'Added these var's to prevent receivers from constantly
'turning On/Off, in the mainloop, the push button
'IF-THEN's are only (looked at) executed when there's
'a change of state i.e. whenever a button is pressed.....
LastRequest_1 VAR BYTE
LastRequest_1 = 255
LastRequest_2 VAR BYTE
LastRequest_2 = 255
LastRequest_3 VAR BYTE
LastRequest_3 = 255
LastRequest_4 VAR BYTE
LastRequest_4 = 255
in11 VAR PORTB.4 ' (pin 37)..Pushbutton or input from LabXT
in10 VAR PORTB.5 ' (pin 38)..Pushbutton or input from LabXT
in9 VAR PORTB.6 ' (pin 39)..Pushbutton or input from LabXT
in8 VAR PORTB.7 ' (pin 40)..Pushbutton or input from LabXT
' Firecracker Interface (Al Williams)
' http://www.al-williams.com/awce
' These are the 3 connections to the firecracker are below...
' Wire Ground (DB9 pin 5)
rts VAR PORTD.0 ' pin 19 connects to DB9 pin 4 of the firecracker
dtr VAR PORTD.1 ' pin 20 connects to DB9 pin 7 of the firecracker
' The Firecracker header (2 bytes)
h1 con $D5
h2 con $AA
' the Firecracker footer (1 byte)
foot con $AD
gosub resetfirecracker
mainloop:
if in11 <> LastRequest_1 then
LastRequest_1 = in11
IF in11 = 0 THEN '...Push Button (pin 37) or input from LabXT
unit = 0 : cmd = 0
gosub sendcmd : pause 250
ENDIF
if in11 = 1 then
unit = 0 : cmd = 1
gosub sendcmd : pause 250
ENDIF
ENDIF
if in10 <> LastRequest_2 then
LastRequest_2 = in10
IF in10 = 0 THEN '...Push Button (pin 38) or input from LabXT
unit = 1 : cmd = 0
gosub sendcmd : pause 250
ENDIF
if in10 = 1 then
unit = 1 : cmd = 1
gosub sendcmd : pause 250
ENDIF
ENDIF
if in9 <> LastRequest_3 then
LastRequest_3 = in9
IF in9 = 0 THEN '...Push Button (pin 39) or input from LabXT
unit = 2 : cmd = 0
gosub sendcmd : pause 250
ENDIF
if in9 = 1 then
unit = 2 : cmd = 1
gosub sendcmd : pause 250
ENDIF
ENDIF
if in8 <> LastRequest_4 then
LastRequest_4 = in8
IF in8 = 0 THEN '...Push Button (pin 40) or input from LabXT
unit = 3 : cmd = 0
gosub sendcmd : pause 250
ENDIF
if in8 = 1 then
unit = 3 : cmd = 1
gosub sendcmd : pause 250
ENDIF
ENDIF
IF k = 0 THEN mainloop ' continue checking for button presses...
' End of example program
' Send command
sendcmd:
byt=h1
gosub sendbyte
byt=h2
gosub sendbyte
read housetbl+house,byt
if unit<9 then lowunit
byt=byt+4
lowunit:
gosub sendbyte
byt=$20
if cmd=0 then addunit
byt=0
if cmd=1 then addunit
byt=$88
if cmd=2 then nounit
byt=$98
if cmd=3 then nounit
' huh???
addunit:
read unittbl+(unit//8),tmp
byt=byt+tmp
nounit:
gosub sendbyte
byt=foot
gosub sendbyte
return
' Send 1 raw byte
sendbyte:
debug hex byt," "
for i=0 to 7
if (byt & $80) = $80 then xmit1
gosub send0
nextbit:
pause 1
byt=byt*2
next
return
' Send a 1
xmit1:
gosub send1
IF k = 0 THEN nextbit
' Send bits (0 or 1)
send0:
low rts
pause 1
high rts
return
send1:
low dtr
pause 1
high dtr
return
' Always reset firecracker first
resetfirecracker:
low rts
low dtr
pause 50 ' reset
high rts
high dtr
pause 50
return
END
Bookmarks