' -----[ Title ]---------------------------------------------------------------- ' ' Animatronic Santa Claus Hack ' "Drunken Santa Prototype" ' ' File...... SANTA5.BSP ' Purpose... To control a Gemmy/Wal*Mart Santa Claus ' Author.... Josh McCormick ' E-mail.... jmccorm@yahoo.com ' Started... ' Updated... 10 DEC 2005 ' {$STAMP BS2p} ' -----[ Program Description ]-------------------------------------------------- ' ' TO BE FILLED IN ' ' -----[ Revision History ]----------------------------------------------------- ' ' -----[ Variables ]------------------------------------------------------------ ' QVStart CON 24 ' This is the slot that the actual messages start in QVTotal CON 19 ' This is the total number of messages in the system QVPos VAR Byte Servo VAR Byte MemPos VAR Word I2Cpin CON 8 I2Cread CON %10100000 I2Cwrite CON %10100001 QVPORT CON 1 QVSPEED CON 240 QVRESET VAR OUT3 HEADR VAR OUT12 HEADL VAR OUT13 s VAR Word temp VAR Byte t VAR Byte u VAR Byte ' Main: GOSUB Reset_Pins Servo=0 QVPos=0 Loop: GOSUB Reset_Sound GOSUB Center_Head WaitForIt: IF IN6=1 THEN NextSong IF IN5=1 THEN NextServo 'DEBUG DEC IN5,":",DEC IN6,13 'PAUSE 100 IF (IN10+IN11) = 0 THEN WaitForIt WaitForIt2: IF (IN10+IN11) <> 0 THEN WaitForIt2: MemPos=QvPos*1500 SEROUT QVPORT, QVSPEED, [QVStart+QVPos] QVPos = QVPos + 1 GOSUB Waiting OUTD=0 IF QvPos < QvTotal THEN Loop QVPos=0 GOTO Loop NextSong: QVPos = QVPos + 1 IF QvPos < QvTotal THEN NextSong2 QvPos=0 NextSong2: SEROUT QVPORT, QVSPEED, [21] ' say MESSAGE MemPos = 31000 GOSUB WAIT_Speech SEROUT QVPORT, QVSPEED, [QvPos] MemPos = 31000 GOSUB WAIT_Speech OUTD=0 GOTO WaitForIt NextServo: Servo = Servo + 1 IF Servo < 4 THEN NextServo2 Servo=0 SEROUT qvport, qvspeed, [22] ' say NORMAL MemPos = 31000 GOSUB WAIT_Speech OUTD=0 GOTO WaitForIt NextServo2: SEROUT QVPORT, QVSPEED, [23] ' say SERVO MemPos = 31000 GOSUB WAIT_Speech SEROUT QVPORT, QVSPEED, [Servo] MemPos = 31000 GOSUB WAIT_Speech OUTD=0 GOTO WaitForIt Waiting: IF servo > 0 THEN Waiting2: Waiting1: HIGH 4 INPUT 4 ' Reset the 50ms RC timer circuit I2CIN I2Cpin, I2Cread, Mempos.HIGHBYTE \Mempos.LOWBYTE, [u] 'DEBUG "====>",DEC u," s: ", DEC servo,13 IF (u.LOWNIB & %11) = %11 THEN loopit ' Make sure we don't set head to left AND right OUTD=u.LOWNIB Mempos = Mempos + 1 LOOPIT: IF IN10 = 1 THEN END_Waiting ' ADD CODE: Wait for button to be released IF (qvpos<>11) THEN LOOPIT_MIDDLE IF IN2 = 0 THEN LOOPIT_END ' THIS IS THE LIP GAG FOR SAYING #10 FOR s=1 TO 40 OUT14=1 PAUSE 40 OUT14=0 PAUSE 40 NEXT LOOPIT_MIDDLE: IF IN2 = 1 THEN END_Waiting LOOPIT_END: IF IN4 = 1 THEN LOOPIT ' Has 50ms passed? If not, loop around. GOTO Waiting1 End_Waiting: RETURN End_Waiting_Servo_Mode: QvPos=QvPos-1 MemPos=QvPos*1500 RETURN Waiting2: HIGH 4 INPUT 4 ' Reset the 50ms RC timer circuit I2CIN I2Cpin, I2Cread, Mempos.HIGHBYTE \Mempos.LOWBYTE, [u] IF servo=2 THEN servo2 IF servo=3 THEN servo3 u=u&%1100 IF IN5=0 THEN WaitingA u=u+1 GOTO WaitingC WaitingA: IF IN6=0 THEN WaitingC u=u+2 GOTO waitingc Servo2: U=U&%1011 IF IN5=0 AND IN6=0 THEN WaitingC u=u+4 GOTO waitingc servo3: u=u&%0111 IF IN5=0 AND IN6=0 THEN WaitingC u=u+8 WaitingC: I2COUT I2Cpin, I2Cwrite, Mempos.HIGHBYTE \Mempos.LOWBYTE, [u] Waiting3: 'DEBUG DEC u," s: ",DEC servo,13 OUTD=u.LOWNIB Mempos=Mempos+1 LOOPIT2: IF IN10 = 1 THEN END_Waiting_Servo_Mode ' ADD CODE: Wait for button to be released IF IN2 = 1 THEN END_Waiting_Servo_Mode IF IN4 = 1 THEN LOOPIT2 ' Has 50ms passed? If not, loop around. GOTO Waiting2 Wait_Speech: IF IN2 = 0 THEN Wait_Speech RETURN Reset_Sound: QVRESET=0 PAUSE 100 QVRESET=1 PAUSE 500 SEROUT QVPORT, QVSPEED, [$fc,45,$F0] PAUSE 50 RETURN Reset_Pins: MAINIO INPUT 2 INPUT 5 INPUT 6 INPUT 10 INPUT 11 OUTPUT 3 DIRD=15 OUTD=0 RETURN Center_Head: HEADR=1 PAUSE 500 HEADR=0 PAUSE 200 HEADR=1 PAUSE 500 HEADR=0 PAUSE 200 HEADL=1 PAUSE 500 HEADL=0 RETURN