Actions

Fake Cricket

From Just in Time

Revision as of 22:14, 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:


<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 </code>