Tuesday, August 12, 2014

BUJJI BUG part 7A

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
 BUJJI 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.
Here is the HEX code
:020000040000FA :100000000301B001B101000083160F168F120F1704 :10001000831285010730990083169F0139308500CE :10002000C030920083121214921012150C309500F9 :10003000831601309B001C141A081C181D288312FB :10004000B500B6003030350203182E2810303602C5 :10005000031C31288312051C34287F283030B5005A :1000600034283030B5003428831601309B008312C9 :10007000B503350883169A001C1555309D00AA302B :100080009D009C149C184228831256200A30350289 :10009000031C31282A28831601309B001C141A08DF :1000A0001C1850288312B100B5000800FF30B200C0 :1000B000B3000230B400B20B5B28B30B5B28B40B67 :1000C0005B280800FF30B0004B20B00B6528B10B57 :1000D0006528080085146030930062208510930124 :1000E00062208028851460309300622062206220A4 :1000F0008510930162208028851093018028831247 :0A010000851E6A28051E72287C285F :00000001FF

No comments:

Post a Comment