![]() |
![]() |
![]() |
|
|
|||||||
| Micro Controllers Discuss all aspects of micro controllers - building them, coding them, etc. All controllers are welcome - PIC, BASIC, Z8 Encore!, etc. |
|
|
Thread Tools | Display Modes |
|
|
(permalink) |
|
Experienced Member
|
Ok i modified the code for all who would like ot understand it more....
If anything looks wrong please comment on it Code:
;AtomSoft Conversion to 18F1320 ;Tutorial 5.2 - Nigel Goodwin 2002 ;Sony SIRC IR transmitter LIST p=18F1320 ;tell assembler what chip we are using include <p18F1320.inc> ;include the defaults for the chip CONFIG OSC = INTIO2, WDT = OFF, LVP = OFF, DEBUG = ON ;sets the configuration settings (oscillator type etc.) cblock 0x00 ;start of general purpose registers count1 ;used in delay routine counta ;used in delay routine countb count PCount Delay_Count Bit_Cnt Data_Byte Dev_Byte Rcv_Byte Pulse endc IR_Port Equ PORTB ;Set IR_Port to equal your IR Port IR_Tris Equ TRISB ;Set IR_Tris to equal IR Tris IR_Bit Equ 0x01 ;Set IR_Bit to equal the bit on the port your IR LED is on SW_Port Equ PORTA ;Set SW_Port to equal your button port SW_Tris Equ TRISA ;Set SW_Tris to equal your button tris SW1_Bit Equ 7 ;Set SW1_Bit to equal the bit on the port of your first button SW2_Bit Equ 6 ;Set SW1_Bit to equal the bit on the port of your second button CMD1 Equ 0x00 ;Set this to equal to the Command to send when you press button 1 CMD2 Equ 0x01 ;Set this to equal to the Command to send when you press button 2 org 0x00 ;Start of Code Start MOVLW 0x62 ;Used to set OSCCON to 4Mhz MOVWF OSCCON BCF IR_Port, IR_Bit ;Make IR Port Bit Low BCF IR_Tris, IR_Bit ;Make IR Port Bit Output BSF SW_Tris, SW1_Bit ;Make Switch 1 Input BSF SW_Tris, SW2_Bit ;Make Switch 2 Input BSF SW_Port, SW1_Bit ;Make Switch 1 High BSF SW_Port, SW2_Bit ;Make Switch 2 High Read_Sw BTFSS SW_Port, SW1_Bit ;Check if SW1 went Low CALL Command1 ;Yes is did so call command #1 BTFSS SW_Port, SW2_Bit ;SW1 did go low or finished so check SW2 now CALL Command2 ;SW2 went low so call command #2 GOTO Read_Sw ;Loop back Command1 MOVLW CMD1 ;Move the Byte in CMD1 to WREG CALL TXIR RETLW 0x00 Command2 MOVLW CMD2 ;Move the Byte in CMD2 to WREG CALL TXIR RETLW 0x00 PulseIR MOVWF PCount ;Move WREG contents to PCount PLoop BSF IR_Port, IR_Bit ;Beginning of pulse NOP NOP NOP NOP NOP NOP NOP ;7uS Long Pulse BCF IR_Port, IR_Bit ;Flat Line End pulse NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DECFSZ PCount, F ;15-18uS Long FlatLine End Pulse if count is 0... Return GOTO PLoop ;Pulse Again RETLW 0 FlatLine MOVWF PCount NPLoop BCF IR_Port, IR_Bit ;Flatline for 25uS NOP NOP NOP NOP NOP NOP NOP BCF IR_Port, IR_Bit NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DECFSZ PCount, F GOTO NPLoop RETLW 0 Tx_Start MOVLW d'96' ;Move 96 to WREG which is the pulse number for 2.4mS which is START Burst CALL PulseIR ;Pulse IR with 96 in WREG MOVLW d'24' ;Move 24 to WREG which is the pulse number for 600uS CALL FlatLine ;Send a FlatLine RETLW 0x00 Tx_One MOVLW d'48' ;Move 48 to WREG which is the number for a Logical 1 which is 1.2mS CALL PulseIR ;Pulse IR with 48 in WREG MOVLW d'24' ;Another FlatLine CALL FlatLine RETLW 0x00 Tx_Zero MOVLW d'24' ;Move 24 to WREG which is the number for a Logical 0 which is 600uS CALL PulseIR MOVLW d'24' ;Send FlatLine for 600uS CALL FlatLine RETLW 0x00 TXIR MOVWF Data_Byte ;Collect Info from WREG and Place in Dat_Byte MOVLW 0x07 ;Move 0x07 to Bit_Cnt which is the Command Bit Length MOVWF Bit_Cnt CALL Tx_Start ;Send Start Burst Dev_Loop RRCF Data_Byte ;Rotate Right f through Carry BTFSC STATUS , C ;Check if the carry is a 0 if so skip... call Tx_One ;If its a 1 then send a 1 BTFSS STATUS , C ;Check if the carry is a 1 if so skip... call Tx_Zero ;If its a 0 then send a 0 DECFSZ Bit_Cnt , f ;Decrement f, Skip if 0 GOTO Dev_Loop movlw D'16' ;Input your Device ID Here movwf Dev_Byte ;Move the device ID to Dev_Byte MOVLW 0x05 ;Set Bit_Cnt to 5 since thats the Device ID Length to send MOVWF Bit_Cnt Dev_Loop2 RRCF Dev_Byte , f BTFSC STATUS , C call Tx_One BTFSS STATUS , C call Tx_Zero DECFSZ Bit_Cnt , f GOTO Dev_Loop2 retlw 0x00 Delay255 movlw 0xff ;delay 255 mS goto d0 Delay100 movlw d'100' ;delay 100mS goto d0 Delay50 movlw d'50' ;delay 50mS goto d0 Delay27 movlw d'27' ;delay 27mS goto d0 Delay20 movlw d'20' ;delay 20mS goto d0 Delay5 movlw 0x05 ;delay 5.000 ms (4 MHz clock) d0 movwf count1 d1 movlw 0xC7 movwf counta movlw 0x01 movwf countb Delay_0 decfsz counta, f goto $+2 decfsz countb, f goto Delay_0 decfsz count1 ,f goto d1 retlw 0x00 END |
|
|
|
|
|
(permalink) |
|
Experienced Member
|
20 Mhz Code
Code:
;AtomSoft Conversion to 18F248 @ 20Mhz ;Tutorial 5.2 - Nigel Goodwin 2002 ;Sony SIRC IR transmitter LIST p=18F248 ;tell assembler what chip we are using include <p18F248.inc> ;include the defaults for the chip CONFIG OSC = HS, WDT = OFF, LVP = OFF ;sets the configuration settings (oscillator type etc.) cblock 0x00 ;start of general purpose registers count1 ;used in delay routine counta ;used in delay routine countb PCount Delay_Count Bit_Cnt Data_Byte Dev_Byte Pulse d1 d2 endc IR_Port Equ PORTB ;Set IR_Port to equal your IR Port IR_Tris Equ TRISB ;Set IR_Tris to equal IR Tris IR_Bit Equ 4 ;Set IR_Bit to equal the bit on the port your IR LED is on SW_Port Equ PORTC ;Set SW_Port to equal your button port SW_Tris Equ TRISC ;Set SW_Tris to equal your button tris SW1_Bit Equ 4 ;Set SW1_Bit to equal the bit on the port of your first button SW2_Bit Equ 5 ;Set SW1_Bit to equal the bit on the port of your second button CMD1 Equ 0x00 ;Set this to equal to the Command to send when you press button 1 CMD2 Equ 0x01 ;Set this to equal to the Command to send when you press button 2 org 0x00 ;Start of Code Start BCF IR_Port, IR_Bit ;Make IR Port Bit Low BCF IR_Tris, IR_Bit ;Make IR Port Bit Output BSF SW_Tris, SW1_Bit ;Make Switch 1 Input BSF SW_Tris, SW2_Bit ;Make Switch 2 Input BSF SW_Port, SW1_Bit ;Make Switch 1 High BCF SW_Port, SW2_Bit ;Make Switch 2 High Read_Sw BTFSS SW_Port, SW1_Bit ;Check if SW1 went Low CALL Command1 ;Yes is did so call command #1 BTFSS SW_Port, SW2_Bit ;SW1 did go low or finished so check SW2 now CALL Command2 ;SW2 went low so call command #2 GOTO Read_Sw ;Loop back Command1 MOVLW CMD1 ;Move the Byte in CMD1 to WREG CALL TXIR RETLW 0x00 Command2 MOVLW CMD2 ;Move the Byte in CMD2 to WREG CALL TXIR RETLW 0x00 PulseIR MOVWF PCount ;Move WREG contents to PCount PLoop BSF IR_Port, IR_Bit ;Beginning of pulse CALL Delay7 ;7uS Long Pulse BCF IR_Port, IR_Bit ;Flat Line End pulse CALL Delay18 ;17uS Long Pulse DECFSZ PCount, F ;15-18uS Long FlatLine End Pulse if count is 0... Return GOTO PLoop ;Pulse Again RETLW 0 FlatLine MOVWF PCount NPLoop BCF IR_Port, IR_Bit ;Flatline for 25uS CALL Delay7 ;7uS Long Pulse NOP NOP CALL Delay18 ;17uS Long Pulse DECFSZ PCount, F GOTO NPLoop RETLW 0 Tx_Start CALL Delay60 MOVLW d'96' ;Move 96 to WREG which is the pulse number for 2.4mS which is START Burst CALL PulseIR ;Pulse IR with 96 in WREG MOVLW d'23' ;Move 24 to WREG which is the pulse number for 600uS CALL FlatLine ;Send a FlatLine RETLW 0x00 Tx_One MOVLW d'48' ;Move 48 to WREG which is the number for a Logical 1 which is 1.2mS CALL PulseIR ;Pulse IR with 48 in WREG MOVLW d'20' ;Another FlatLine CALL FlatLine RETLW 0x00 Tx_Zero MOVLW d'23' ;Move 24 to WREG which is the number for a Logical 0 which is 600uS CALL PulseIR MOVLW d'20' ;Send FlatLine for 600uS CALL FlatLine RETLW 0x00 TXIR MOVWF Data_Byte ;Collect Info from WREG and Place in Dat_Byte MOVLW 0x07 ;Move 0x07 to Bit_Cnt which is the Command Bit Length MOVWF Bit_Cnt CALL Tx_Start ;Send Start Burst Dev_Loop RRCF Data_Byte ;Rotate Right f through Carry BTFSC STATUS , C ;Check if the carry is a 0 if so skip... call Tx_One ;If its a 1 then send a 1 BTFSS STATUS , C ;Check if the carry is a 1 if so skip... call Tx_Zero ;If its a 0 then send a 0 DECFSZ Bit_Cnt , f ;Decrement f, Skip if 0 GOTO Dev_Loop movlw D'16' ;Input your Device ID Here movwf Dev_Byte ;Move the device ID to Dev_Byte MOVLW 0x05 ;Set Bit_Cnt to 5 since thats the Device ID Length to send MOVWF Bit_Cnt Dev_Loop2 RRCF Dev_Byte , f BTFSC STATUS , C call Tx_One BTFSS STATUS , C call Tx_Zero DECFSZ Bit_Cnt , f GOTO Dev_Loop2 retlw 0x00 Delay7 movlw 0x09 movwf d1 Delay7_0 decfsz d1, f goto Delay7_0 NOP retlw 0x00 Delay18 movlw 0x1A movwf d1 Delay18_0 decfsz d1, f goto Delay18_0 NOP NOP retlw 0x00 Delay60 movlw 0x5E movwf d1 movlw 0xEB movwf d2 Delay60_0 decfsz d1, f goto $+4 decfsz d2, f goto Delay60_0 goto $+2 nop retlw 0x00 END Last edited by AtomSoft; 16th May 2008 at 02:03 AM. |
|
|
|
| Bookmarks |
| Thread Tools | |
| Display Modes | |
|
|
|
|
||||
| Thread | Thread Starter | Forum | Replies | Latest |
| Capacitor Charge/Discharge question | ThermalRunaway | General Electronics Chat | 23 | 1st June 2007 01:20 PM |
| Basic Transmission question | CamNuge | General Electronics Chat | 2 | 8th March 2006 10:08 PM |
| Question about bank selection, 16F628A, Nigel's tutorial | kcn | Micro Controllers | 4 | 13th March 2005 06:23 AM |
| a question about nigel's tutorial | jijita | Micro Controllers | 3 | 2nd July 2004 09:03 PM |
| PBX question | waqar | Electronic Projects Design/Ideas/Reviews | 0 | 30th March 2003 06:21 PM |