Dear all,
Here the BUJJI BUG comes in a Nutcase.
The pictures and circuit diagram of Bujji Bug is given below.
Assembly code and HEX are given below for the BUJJI BUG
Here the BUJJI BUG comes in a Nutcase.
The pictures and circuit diagram of Bujji Bug is given below.
Here is the HEX codeBUJJI BUG ; CODE FOR automatic DIT and DASH generation along with sidetone @650Hz ; Here GPIO 5 (pin no. 2 of IC) and GPIO 4 (pin no 3 of IC) is pulled to HIGH by the resistor ; home made paddle is connected to this pins, ; when it is pulled to one side (right side) The KEY OUT GPIO 1 (pin no 6 of IC) is sent to HIGH (5 Volts) ; and LOW (0 V) with a delay. It will continue till the paddle is released. ; when the paddle is pulled to otherside (left side) the KEY OUT GPIO 1(pin no 6 of IC) is sent to HIGH(5 Volts). ; and LOW (0 V) with a delay of 3XDIT (3 times of the dit). ; During the IDLE state (middle) the GPIO 1(pin no 6 of IC) is sent to LOW(0 Volts) without any sidetone. ; To verify we connect an LED from pin no 6 with a resistor of 2K7 and speaker is connected to GPIO 2 with LM386 for sidetone. ; GPIO 0 is pulled to high through a resistro when is connected during ON time the speed can be controlled. ;################################################################################################################# ; Selecting the PIC12F683 Micro controller ;################################################################################################################# list p = 12F683 ; Selected 12F683 #include<p12F683.inc> ; Includeing the headerfile ;################################################################################################################# ; These general purpose registers used in the program. ;################################################################################################################# CBLOCK 0X30 ; Starting Address/location of the registers COUNT1 ; Location 0X30 is referred as COUNT1 in the program COUNT2 ; Location 0X31 is referred as COUNT2 in the program COUNT3 ; Location 0X32 is referred as COUNT3 in the program COUNT4 ; Location 0X33 is referred as COUNT4 in the program COUNT5 ; Location 0X34 is referred as COUNT5 in the program COUNT6 ; Location 0X35 is referred as COUNT6 in the program COUNT7 ; Location 0X36 is referred as COUNT7 in the program ENDC ; end the block ;################################################################################################################# ; Starting of our programe ;################################################################################################################# ORG 0X00 ; Starting address for microcontroller program CLRW ; Clearing the W register CLRF COUNT1 ; Clearing the COUNT1 register at power ON time CLRF COUNT2 ; Clearing the COUNT2 register at power ON time NOP ; NO operation ; NOP ; This location is reserved for INTERRUPT and ; hence we always code the fifth line as NOP ;################################################################################################################# ; Setting the Internal clock frequency to 2MHz ;################################################################################################################# BSF STATUS,RP0 ; Selecting the bank 1 BSF OSCCON,IRCF0 ; Internal Oscillator frequency can be configured by BCF OSCCON,IRCF1 ; enabling the appropriate registers in the OSCCON register BSF OSCCON,IRCF2 ; IRCF0, IRCF1,IRCF2 are the bits to select the various frequency ranges ; Here we have configured 2MHz clock speed to reduce power consumption ;################################################################################################################# ; Setting the input and output ports ;################################################################################################################# BCF STATUS,RP0 ; changing to bank 0 CLRF GPIO ; Clearing the INPUT OUTPUT port registers MOVLW 0X07 ; Moving the "7(HEX)" into the W register MOVWF CMCON0 ; Comparators are disabled BSF STATUS,RP0 ; Changing to bank 1, because the ANSEL,TRISIO,T2CON are in bank 1 CLRF ANSEL ; please see BUJJI BUG part 1 MOVLW 0X39 ; moving "39(HEX)" value into W register MOVWF TRISIO ; making the GP0, GP3,GP4,GP5(pin no 5 of IC)as a input and ; GP1(pin no 6 of IC),GP2,OUTPUTS ;################################################################################################################# ; Initialising the PWM for sidetone ;################################################################################################################# MOVLW 0XC0 ; writing the value C0(HEX) into the W register MOVWF PR2 ; passing the value into PR2 register BCF STATUS,RP0 ; selecting the bank 0 BSF T2CON,T2CKPS0 ; TIMER2 prescalar value is initiaizing as 1:4 ratio by setting T2CKPS0 bit BCF T2CON,T2CKPS1 ; and clearing the T2CKPS1 bit in the T2CON register BSF T2CON,TMR2ON ; Enabling the TIMER2 by setting the bit TMR2ON MOVLW 0X0C ; Writing the value "12" into the W register MOVWF CCP1CON ; Configuring the GP3 (pin no 5) as PWM OUTPUT ;################################################################################################################# ; Reading the EEPROM data ;################################################################################################################# BSF STATUS,RP0 ; Selecting the bank 0 MOVLW 0X01 ; Writing value 01 (HEX) into W register MOVWF EEADR ; Selecting the address 1 in EEPROM to read BSF EECON1,RD ; Enabling the RD bit to Read the data from EEPROM MOVF EEDATA,W ; Moving the EEPROM data into the W register wait_to_read1 BTFSC EECON1,RD ; Varifying whether the data is written into EEPROM or not GOTO wait_to_read1 ; If yes skip this line otherwise otherwise goto wait_to_read BCF STATUS,RP0 ; Coming back to BANK 0 MOVWF COUNT6 ; Passing the value from W register to COUNT6 MOVWF COUNT7 ; Passing the value from W register to COUNT7 ;################################################################################################################# ; Verifying the EEPROM data is within the limit of 30 and 10 ;################################################################################################################# MOVLW 0X30 ; Passing the value into W register SUBWF COUNT6,0 ; Substract the valu in count6 register with 30(HEX) BTFSC STATUS,C ; Check the status of the carry, if clesr skip the next line GOTO value ; Not clear goto value MOVLW 0X10 ; Passing the value into W register SUBWF COUNT7,0 ; Substract the valu in count6 register with 10(HEX) BTFSS STATUS,C ; Check the status of the carry, if set skip the next line GOTO value1 ; if clear goto value1 check1 BCF STATUS,RP0 ; Changing to bank 0 BTFSS GPIO,0 ; Check the GPIO 1 is set or clear GOTO write_EEPROM ; if clear goto EEPROM write GOTO begin ; Otherwise goto begin value MOVLW 0X30 ; Passing the value into W register MOVWF COUNT6 ; Passing the value from W register to COUNT6 GOTO write_EEPROM ; goto EEPROM_WRITE value1 MOVLW 0x30 ; Passing the value into W register MOVWF COUNT6 ; Passing the value from W register to COUNT6 GOTO write_EEPROM ; goto EEPROM_WRITE ;################################################################################################################# ; Write the value into EEPROM and decrement the value based on the condition ;################################################################################################################# write_EEPROM BSF STATUS,RP0 ; Changing to bank 1 MOVLW 0X01 ; Writing value 0 into W register MOVWF EEADR ; Selecting the Address 0 in EEPROM to write BCF STATUS,RP0 ; selecting the bank 0 DECF COUNT6,F ; Decrement the COUNT6 register value by 1 MOVF COUNT6,W ; pass the value into the W register BSF STATUS,RP0 ; Selecting the bank 1 MOVWF EEDATA ; Selecting the value 10 (HEX) to write into EEPROM BSF EECON1,WREN ; Enabling the WRITE cycle MOVLW 0X55 ; Writing value 55 (HEX) into W register MOVWF EECON2 ; Passing the value into the EECON2 REGISTER MOVLW 0XAA ; Writing value AA (HEX) into W register MOVWF EECON2 ; Passing the value into the EECON2 REGISTER ; Without the above four step the data cannot read into the EEPROM BSF EECON1,WR ; Enabling WR bit of EECON1 to write into the EEPROM wait_to_write BTFSC EECON1,WR ; Varifying whether the data is written into EEPROM or not GOTO wait_to_write ; If yes skip this line otherwise goto wait BCF STATUS,RP0 ; Selecting the bank 0 CALL delay ; call the delay MOVLW 0X0A ; pass the value A (HEX) into W register SUBWF COUNT6,0 ; Substract the value in count6 register with A(HEX) ; BTFSS STATUS,C ; Check the status of the carry, if set skip the next line GOTO value1 ; if clear goto value 1 GOTO check1 ; goto mo ;################################################################################################################# ; Read the EEPROM data into count2 for the generation of DELAY ;################################################################################################################# read_EEPROM BSF STATUS,RP0 ; Changing to bank 1 MOVLW 0X01 ; Writing value 55 (HEX) into W register MOVWF EEADR ; Selecting the address 0 in EEPROM to read BSF EECON1,RD ; Enabling the RD bit to Read the data from EEPROM MOVF EEDATA,W ; Moving the data into the W register wait_read BTFSC EECON1,RD ; Varifying whether the data is written into EEPROM or not GOTO wait_read ; If yes skip this line otherwise goto wait1 BCF STATUS,RP0 ; Coming back to BANK 0 MOVWF COUNT2 ; Writing the EEPROM DATA MOVWF COUNT6 ; Writing the EEPROM data into COUNT6 RETURN ; Return to the function ;################################################################################################################### ; Loop for geneation of 1 Sec DELAY ;################################################################################################################### delay MOVLW 0XFF ; Pass the value into W register MOVWF COUNT3 ; Pass the value from W register to COUNT3 MOVWF COUNT4 ; Pass the value from W register to COUNT4 MOVLW 0X02 ; Pass the value into W register MOVWF COUNT5 ; Pass the value from W register to COUNT4 L1 DECFSZ COUNT3,F ; decrement the value by 1 in COUNT3 register if zero skip next line GOTO L1 ; Goto L1 DECFSZ COUNT4,F ; decrement the value by 1 in COUNT4 register if zero skip next line GOTO L1 ; Goto L1 DECFSZ COUNT5,F ; decrement the value by 1 in COUNT5 register if zero skip next line GOTO L1 ; Goto L1 RETURN ;################################################################################################################### ; Loop for the generation of 96 msec DELAY ;################################################################################################################### pause MOVLW 0XFF ; move "FF(HEX)" value into the W register MOVWF COUNT1 ; presetting COUNT1 register with the value of W register CALL read_EEPROM ; CALL the read_EEPROM wait DECFSZ COUNT1,F ; Decrement and check whether count1 register is zero, if zero skip next instruction GOTO wait ; otherwise go to wait DECFSZ COUNT2,F ; Decrement and check whether count2 register is zero, if zero skip next instruction GOTO wait ; go to wait RETURN ; going back to the program code ; every CALL function should end with RETURN ;################################################################################################################### ; Loop for DIT generation ;################################################################################################################### ditON BSF GPIO,1 ; when input is low(0 V)make the GPIO pin no 1 as high(LED IS ON) MOVLW 0X60 ; Writing the value 60 (HEX) into W register MOVWF CCPR1L ; Passing the value into the CCPR1L register to SWITCH ON the tone CALL pause ; Call delay BCF GPIO,1 ; Clearing the GP1 pin (0 V) (LED is OFF) CLRF CCPR1L ; Clear the CCPR1L register to remove the sidetone CALL pause ; Call delay GOTO check ; goto check to CHECK the condition and repeat the loop forever ;################################################################################################################### ; LOOP for DASH GENERATION ;################################################################################################################### dashON BSF GPIO,1 ; make the GPIO 1 (pin no 6 of IC) to HIGH MOVLW 0X60 ; Writing the value 60 (HEX) into W register MOVWF CCPR1L ; Passing the value into the CCPR1L register to SWITCH ON the tone CALL pause ; call delay CALL pause ; call delay CALL pause ; call delay BCF GPIO,1 ; Clearing the GP1 pin (0 V) (LED is OFF) CLRF CCPR1L ; Clearing the CCPR1L register to SWITCH OFF the side tone CALL pause ; call delay GOTO check ; goto check to CHECK the condition ;################################################################################################################### ; Loop to IDLE STATE ;################################################################################################################### OFF BCF GPIO,1 ; when the input is high(5 V) make the GPIO pin no 1 as LOW(LED iS OFF) CLRF CCPR1L ; Clear CCPR1L register to remove the sidetone ;.................................................................................................................... GOTO check ; goto check to CHECK the condition and repeat the loop ;################################################################################################################### ; Main loop to check the DIT and DASH ;################################################################################################################### begin BCF STATUS,RP0 check BTFSS GPIO,5 ; checking the input status of the GP5( pin no 2 of IC) GOTO ditON ; if it is Clear(ZERO) goto dashON otherwise BTFSS GPIO,4 ; checking the input status of the GP6( pin no 3 of IC) GOTO dashON ; goto dashON GOTO OFF ; goto OFF END ; end of the program ;################################################################################################################### ; END OF THE PROGRAM ;################################################################################################################### ; NOTE 1: This program is running with 2MHZ clock ; NOTE 2: program memory will begin from the address 0X00 ; NOTE 3: we can configure the internal clock to work at various frequencies ; OSCCON register is used to select the frequencies ; NOTE 4: ANSEL Register is used to select the analog I/O. ; By clearing it we are making all pins as DIGITAL IO ports ; NOTE 5: we are not using any comparators in our program ; so we are disabling them by passing the value "7" into CMCON0 ; NOTE 6: The value in CCPR1L is used to set the DUTY CYCLE of PWM OUT OF PR2 value. ; NOTE 7: one instruction cycle consists of 4 oscillations, to execute one instruction ; it wil take 2 usec since clock is 2 MHz ; DECFSZ and GOTO instruction will take 2 instruction cycle each ; 255usec* 8 = 2 mses ; repeating the loop for 48 times => 96 msec of delay. ; NOTE 8: 17 INSTRUCTIONS USED out of 35 INSTRUCTIONS ; 7 GENERAL PURPOSE REGISTER ; 14 SPECIAL FUNCTION REGISTER used out of 38 ; 133 bytes of program memory used out of 256bytes.
:020000040000FA :100000000301B001B101000083160F168F120F1704 :10001000831285010730990083169F0139308500CE :10002000C030920083121214921012150C309500F9 :10003000831601309B001C141A081C181D288312FB :10004000B500B6003030350203182E2810303602C5 :10005000031C31288312051C34287F283030B5005A :1000600034283030B5003428831601309B008312C9 :10007000B503350883169A001C1555309D00AA302B :100080009D009C149C184228831256200A30350289 :10009000031C31282A28831601309B001C141A08DF :1000A0001C1850288312B100B5000800FF30B200C0 :1000B000B3000230B400B20B5B28B30B5B28B40B67 :1000C0005B280800FF30B0004B20B00B6528B10B57 :1000D0006528080085146030930062208510930124 :1000E00062208028851460309300622062206220A4 :1000F0008510930162208028851093018028831247 :0A010000851E6A28051E72287C285F :00000001FF