Fake Cricket
From Just in Time
Revision as of 22:18, 27 August 2006 by 80.126.79.70 (talk)
A fake cricket is not a really useful application, but it is very simple to create and can be fun to drive people crazy. Or to hide and seek with children.
If you use a high-impedance speaker, it can be driven directly from the output pins of your microcontroller. A piezo element should also work, but might not give much output power with low voltages.
For a low-impedance speaker a simple 'amplifier' (transistor) should work.
Tip: Instead of connecting your output speaker with one pin to VDD/VSS, more output can be generated by connecting with two output pins and swapping them. This trick seems to work, and I think it works because a speaker is current-driven. For a piezo, it doesn't matter, since a piezo is voltage-driven.
Cricket sample code:
File cricket.asm
- Assembly code for a 4MHz PIC12F509 microcontroller
- Description
- Fake cricket sound for a 12F509
- Author
- Vincent
- Last Modified
- 17 / 8 / 06
- CPU configuration
processor 12f509
__config _IntRC_OSC & _WDT_OFF & _MCLRE_OFF
- =======================================
- Configuration (FUSE) BIT Definitions
- =======================================
_MCLRE_ON EQU 0FFFh
_MCLRE_OFF EQU 0FEFh
_CP_ON EQU 0FF7h
_CP_OFF EQU 0FFFh
_WDT_ON EQU 0FFFh
_WDT_OFF EQU 0FFBh
_LP_OSC EQU 0FFCh
_XT_OSC EQU 0FFDh
_IntRC_OSC EQU 0FFEh
_ExtRC_OSC EQU 0FFFh
- 509 defs
PCL equ H'02'
STATUS equ H'03'
OSCCAL equ H'05'
GPIO equ H'06'
Z equ H'02'
- variables
CounterA equ H'1F' ; delay counter
CounterB equ H'1E' ; delay counter
CounterC equ H'1D' ; delay counter
CounterD equ H'1C' ; delay counter
- statics
aupin equ H'00'
aupin2 equ H'01'
- Program
org 0 ; start at address 0
start:
movwf OSCCAL ; calibration bits
movlw 0 ; set tris read except for aupin
tris GPIO
mainloop:
call freq4500
call freq4200
call freq4500
call freq4200
call freq4500
call freq4200
call freq4500
call freq4200
none:
call secdelay
goto mainloop
- subs
freq4200: ; freq loop should be 238 cycles to get 4200Hz
movlw 0040h ; counter set for 11msec
movwf CounterD
loop42:
bcf GPIO,aupin
bsf GPIO,aupin2
call del42
bcf GPIO,aupin2
bsf GPIO,aupin
call del42
decfsz CounterD,1
goto loop42
retlw 0
freq4500: ; freq loop should be 222 cycles to get 4500Hz
movlw 002Dh ; counter set for 14msec
movwf CounterD
loop45:
bcf GPIO,aupin
bsf GPIO,aupin2
call del45
bcf GPIO,aupin2
bsf GPIO,aupin
call del45
decfsz CounterD,1
goto loop45
retlw 0
del42
movlw 0023h
movwf CounterA
loop4 decfsz CounterA,1
goto loop4
retlw 0
del45
movlw 0026h
movwf CounterA
loop5 decfsz CounterA,1
goto loop5
retlw 0
secdelay
- insert picloops code here
- PIC Time Delay = 8,0000040 s with Osc = 4,000000 MHz
movlw D'41'
movwf CounterC
movlw D'190'
movwf CounterB
movlw D'87'
movwf CounterA
sloop decfsz CounterA,1
goto sloop
decfsz CounterB,1
goto sloop
decfsz CounterC,1
goto sloop
retlw 0
end