See more projects using micros:
Elektor,EPE,Silicon Chip
4 ALARM SOUNDS chip $2.50
To order [send an email](mailto:colin@elechelp.com?Subject=4 Alarm Sounds&Body=Please e-mail the cost of 4 Alarm Sounds $2.50 posted by air mail to my country:****___**** and send details of how I can pay for it. My name is:____) to us and we will reply with the details.
This project is a miniature 1-chip alarm. All you need is a tilt switch, battery and piezo to produce a complete alarm.
If you want a very high output, you can add a Darlington buffer transistor, piezo tweeter and a 10mH choke.
The chip does all the work.
It sits in sleep mode (100 microamps) and waits for the enable line to go high via the tilt switch.
It then produces a SPACE GUN alarm for approx 3 minutes and goes into sleep mode again.
The .asm and .hex for 4 Alarm Sounds chip with Space Gun selected when A0 and A1
HIGH, is in the following files:


Below is the program written by the original designer of the project. It is complex and contains an instruction: movlw wabl_dir_mask ;change direction This instruction is now allowed. Possibly it should be: movfw wabl_dir_mask ;change direction. I don’t know how he was able to compile the program. I could not assemble it.
Read through the program then look at the next program for PIC12F629. It is shorter, easier to read, has better sounds, includes sleep mode (100microamps) and a 3 minute timer. You can always learn from other peoples work.
Here are some of the things to consider.
decf dwell,1 ; test if dwell = 0 btfsc ZERO
has been replaced with:
decfsz dwell,1 ; test if dwell = 0 goto $-2 ;go up the program two instructions
movlw b'00100001' xorwf GPIO,1 ;toggle bits 0 & 5
This makes GP0 and GP5 change state each time the sub-routine is executed. You do not need to know the previous state of either line. They change state each time the sub-routine is called. 3. Instruction: goto $+1 uses 2 cycles and saves writing: nop nop and saves one line of code.
; alarmt.asm
__CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT
GPIO equ 6
STATUS equ 3
PC equ 2
#define CARRY STATUS,0
#define ZERO STATUS,2
#define outa GPIO,0 ;Output to Piezo - toggles with GPIO,5
#define modea GPIO,1 ;Input A0 determines 1 of 4 sounds: 00, 01, 10, 11
#define modeb GPIO,2 ;Input A1 determines 1 of 4 sounds: 00, 01, 10, 11
#define enbf GPIO,3 ;tied LOW
#define enbt GPIO,4 ;HIGH input enables the chip to produce sounds
#define outb GPIO,5 ;Output to Piezo - toggles with GPIO,0
;Files for temporary storage:
bits equ 0Ah ;flags file
temp equ 0Bh ;temporary storage
dwell equ 0Ch ;cycles
count equ 0Dh ;delay
steps equ 0Eh ;dwell
cnth equ 0Fh ;counter HIGH
cntl equ 10h ;counter LOW
#define flag bits,1 ;flags file, bit 1 = 0Ah,1
#define wabl_dir bits,2 ;flags file, bit 2 = 0Ah,2
#define wabl_dir_mask bits,4 ;flags file, bit 4 = 0Ah,4
;*************************************
;Program starts HERE
;*************************************
esetvec org 0
movlw 0D0h ;1101 0000
movwf option_reg ;Weak pull-up and Pin-change disabled
;Option is normally 1111 1111 - so 0D0h has no effect
movlw 1Eh ;0001 1110
movwf GPIO ;Make GP 0 and 5 LOW for piezo
movwf trisio ;Make GP4 input
top1
bcf wabl_dir ;clear flags bit 2
bcf flag ;clear bit 1 in flags file
top
btfss enbt ;test GPIO,4 - Chips is enabled when HIGH
goto top1 ;micro goes here when enable low - loops 4 instructions above
nop ;micro goes here when enable HIGH - then to rrf below!!
btfsc enbf ;Tied LOW!! - will always be "clear" - LOW
goto top1 ;micro can never go HERE.
;micro always goes here
;The following creates a miniature Table:
rrf GPIO,w;GPIO will have 0000 0xx0 via A0 and A1
andlw 3 ;after rrf the result will be: 0000 00xx
addwf PC,1 ;masks all but the two lowest bits and adds to Program Counter
goto mode0 ;jumps here if A0 and A1 LOW
goto mode1 ;jumps here if A0 HIGH and A1 LOW
goto mode2 ;jumps here if A0 LOW and A1 HIGH
goto mode3 ;jumps here if A0 and A1 HIGH
mode3 ;mode 3 SIREN
i1 movlw 37 ;set frequency delay
movwf count
movlw 6 ; set number of frequency steps
movwf steps
i2
movlw 0x20 ; 0010 0000 set frequency dwell delay 64d
movwf dwell
alarm1 ; send 1 cycle
call alarm1_set
movlw 1Fh ;0001 1111
movwf GPIO ;Makes GP0 HIGH GP5 LOW
call alarm1_clr
out1
decfsz dwell,1 ; test if any more cycles
goto alarm1
movlw 5 ; step frequency delay
subwf count,1
decfsz steps,1 ; test if last step in progress
goto i2 ;
goto top ;see if Enable is still HIGH and loop again
;Enable must go LOW to stop alarm
mode0 ;init mode 0 CONSTANT
movlw 35 ; set frequency delay
movwf count
call alarm1_set; send 1 cycle
movlw 1Fh ; 0001 1111
movwf GPIO ;Makes GP0 HIGH - GP5 LOW
call alarm1_clr
nop
goto top ;see if Enable is still HIGH and loop again
;Enable must go LOW to stop alarm
;
mode1 ;init mode 1 CHIRP
bcf flag ;clear bit1 in bits file - flags file
movlw 35 ; set frequency delay
movwf count ;put 35 into Count file
movlw 1 ;
movwf cnth ;put 1 in counter HIGH file
clrf cntl ;clear counter LOW file
mode1a
call alarm1_set; set 1st pulse
movlw 1Fh ; 0001 1111
movwf GPIO ;Makes GP0 HIGH - GP5 LOW
call alarm1_clr
decfsz cntl,1 ; decrement and test counters
goto mode1a
decfsz cnth,1
goto mode1a
movlw 2 ; set pause delay to counters
movwf cnth ; pause = ~6*cnth*~255us
clrf cntl
mode1b
nop
nop
nop
decfsz cntl,1 ; decrement and test counters
goto mode1b
decfsz cnth,1
goto mode1b
movlw 1 ;init second pulsed delay to counters
movwf cnth
clrf cntl
mode1c ; send 1 cycle
call alarm1_set
movlw 1Fh ; 0001 1111
movwf GPIO ;Makes GP0 HIGH - GP5 LOW
call alarm1_clr
decfsz cntl,1 ; decrement and test counters
goto mode1c
decfsz cnth,1
goto mode1c
goto top ;see if Enable is still HIGH and loop again
;Enable must go LOW to stop alarm
mode2 ;init mode 2 WARBLE
btfsc flag ; test control flag
goto mode2fa
movlw 0x19 ; init frequency delay
movwf count
mode2e
movlw 8 ; init number of frequency steps
movwf steps
mode2b
movlw 5 ; init frequency dwell
movwf dwell
mode2a
decf dwell,1 ; test if dwell = 0
btfsc ZERO
goto mode2d
call alarm1_set ;set 1 cycle
movlw 1Fh
movwf GPIO
call alarm1_clr
goto mode2a
mode2d
decf steps,1 ; test if more steps
btfsc ZERO
goto mode2f
btfss wabl_dir ; test warble direction
goto mode2g
movlw 5
subwf count,1 ; increment frequency
goto mode2b
mode2g
movlw 5 ; decrement frequency
addwf count,1
goto mode2b
mode2f
bsf flag ; set control flag
goto top ;see if Enable is still HIGH and loop again
;Enable must go LOW to stop alarm
mode2fa
movlw wabl_dir_mask ; change direction
xorwf bits,1
movlw 7 ; reload number of frequency steps
movwf steps
goto mode2b
alarm1_set ; set 1 cycle sub-service
movlw 3Eh ; 0011 1110 Make GP0 LOW - GP5 HIGH
movwf GPIO ;toggles GP0 and 5
alarm1_clr ; copy and decrement frequency delay
movfw count ;set for *4 to define pulse frequency
movwf temp
Dec2 ; 14+2*(4*temp*~1us)= frequency
nop
decfsz temp,1
goto Dec2
clrf GPIO ; leave all output lines LOW
retlw 0
end
The .asm and .hex for 4 Alarm Sounds chip with Space Gun selected when A0 and A1 HIGH, is in the following files:
; alarm_4Sounds.asm for PIC12F629 29-1-2010
;
;This program has goto mode 2,3 changed to produce
;SPACE GUN with A0 and A1 HIGH
;quiescent current = 100microamps
;
;
;
; --+------------ +5v
; | | |
; +--- | -----------------|\[\]|----+
; | |Vdd ---v--- | | |
; | +---|1 Gnd| piezo |
; | | | |
; +--------|GP5 GP0|--------------+
; | |
; Enable-----|GP4 GP1|----A0
; | |
; +----|GP3 GP2|----A1
; | -------
; | PIC12F629
; |
; |
; ----+---------- 0v
;
radix dec
include "p12f629.inc"
errorlevel -302 ; Don't complain about BANK 1 Registers
__CONFIG _MCLRE_OFF & _CP_OFF &
_WDT_OFF & _INTRC_OSC_NOCLKOUT ;Internal osc.
STATUS equ 3
PC equ 2
#define CARRY STATUS,0
#define ZERO STATUS,2
#define outa GPIO,0 ;
#define modea GPIO,1 ;
#define modeb GPIO,2 ;
#define enbf GPIO,3 ;
#define enbt GPIO,4 ;
#define outb GPIO,5 ;
flags equ 20h ;flags file
temp equ 21h
delA equ 22h
delB equ 23h
dwell equ 25h ;cycles
count equ 26h ;delay
steps equ 27h ;dwell
cnth equ 28h
cntl equ 29h
org 0
goto setup
nop
nop
nop
nop
goto Enable
SetUp movlw b'00001111' ;0001 1111
movwf GPIO ;Make GP 0 HIGH and GP5 LOW for piezo & GP4 low
bsf status,rp0 ;Bank 1
movlw b'00011110'
movwf trisio ;Make GP1,2,3,4 input GP0,5 output
movlw b'10000110' ;Turn off T0CKI, prescaler for TMR0 = 1:128
movwf option_reg
bsf intcon,3 ;enable GPIO state change int
bsf intcon,7 ;enable global interrupt GIE
bsf IOC,4 ;enables interrupt on GPIO 4
bcf status,rp0 ;bank 0
movlw 07h ;Set up W to turn off Comparator ports
movwf CMCON ;must be placed in bank 0
clrf delA
movlw .140 ;for 3 minutes
movwf delB
;look for enable HIGH
goto $+1
goto $+1
decfsz temp,1
goto $-3
movf GPIO,w ;clears the Int-on-change flag
bsf status,rp0 ;Bank 1
bcf intcon,gpif
bcf status,rp0 ;bank 0
nop
sleep
nop ;micro goes to ISR at address 04!!!!!!!!!
Enable call _3min
btfsc GPIO,1 ;Test A0
goto $+4 ;A0=High
btfsc GPIO,2 ;A0=Low Test A1
goto mode3 ;A0=Low A1=high
goto mode0 ;A0=Low A1=low
btfsc GPIO,2 ;A0=High Test A1
goto mode2 ;A0=High A1=high This program produces SPACE GUN
goto mode1 ;A0=High A1=low with A0 and A1 HIGH
;mode 0 CONSTANT 2.2kHz tone A0=Low A1=low
mode0 movlw .20 ; set frequency
movwf count
call toggle
btfsc GPIO,4 ;test GPIO,4 - High Input enables chip to produce tone
goto $-4
goto Enable
;mode 1 CHIRP A0=High A1=low
mode1
movlw 35 ;set frequency delay
movwf count ;put 35 into Count file
movlw 1
movwf cnth ;put 1 in counter HIGH file
clrf cntl ;clear counter LOW file
mode1a call toggle
decfsz cntl,1 ;decrement and test counters
goto mode1a
decfsz cnth,1
goto mode1a
movlw 2 ;set pause delay to counters
movwf cnth
clrf cntl
mode1b nop
nop
nop
decfsz cntl,1 ;decrement and test counters
goto mode1b
decfsz cnth,1
goto mode1b
movlw 1 ;init second pulsed delay to counters
movwf cnth
clrf cntl
mode1c
call toggle
decfsz cntl,1 ;decrement and test counters
goto mode1c
decfsz cnth,1
goto mode1c
btfsc GPIO,4 ;test GPIO,4 - High Input enables chip to produce tone
goto mode1
goto Enable
;SPACE GUN A0=Low A1=high
mode2
movlw 7 ;number of steps
movwf steps
mode2a
movlw 5 ;dwell
movwf dwell
call toggle
decfsz dwell,1 ; test if dwell = 0
goto $-2
movlw 5
subwf count,1 ;increment frequency
btfss GPIO,4 ;test GPIO,4 - High Input enables chip to produce tone
goto Enable ;see if Enable is still HIGH and loop again
decfsz steps,1 ;test if more steps
goto mode2a
goto mode2
mode3 ;mode 3 SIREN A0=High A1=high
movlw 37 ;set frequency
movwf count
movlw 6 ; set number of steps
movwf steps
mode3a movlw 0x20 ; 0010 0000 set dwell
movwf dwell
mode3b call toggle
decfsz dwell,1 ; test if any more cycles
goto mode3b
movlw 5 ; step frequency delay
subwf count,1
decfsz steps,1 ; test if last step in progress
goto mode3a ;
btfsc GPIO,4 ;test GPIO,4 - High Input enables chip to produce tone
goto mode3
goto Enable
toggle movf count,0
movwf temp
goto $+1
goto $+1
decfsz temp,1
goto $-3
movlw b'00100001'
xorwf GPIO,1 ;toggle bits 0 & 5
retlw 00
_3min decfsz delA
retlw 00
decfsz delB
retlw 00
goto SetUp
end
The PIC12F629 chip is available for $2.50 with 4 Alarm Sounds.hex burnt into it.
You will just need a small PC board, mercury switch, battery, switch, and piezo to complete the alarm.
If you are going to burn the program yourself, you will need a PICkit-2 programmer, a 6 pin to 5 pin adapter to connect between the PICkit-2 programmer and the Project ($1.50) and the above components.
You should read about programming PIC chips by clicking this link: Start here with PIC12F629
Quick Links
Legal Stuff
Social Media