RC5 code
Posted: 10 Feb 2006 08:31
Where I can find I cosay in mBasic to receive code RC5?
I have already seen the pascal codification but not to become it, they can help me?
My converted code is:
program Rc
const RCV_PIN as byte = 7 '** receiving pin
dim HalfBitTime as byte
dim HasError as byte
dim FullBitTime as byte
dim RC5Code as word
'** This function returns 16 bits extracted from RC5 signal and sets
'** the error indicator to true if an error occurs
Sub function Get_RC5(dim Erro as byte)as word
dim tmp as byte
dim INDF1 as byte
dim RC5Receiver_Get_Rc5_result_2 as byte
dim FSR0L as byte
dim FSR0H as byte
dim FSR1L as byte
dim FSR1H as byte
erro = true '** Initialize error flag
'** It is better to use indirect addressing. In this way we can store
'** results longer than a word, by using less code.
'** Moreover, by using indirect addressing we do not have to worry about
'** memory banking in assembly.
'** We will move the address of the result variable into FSR0 register.
'** All the same, we will use FSR1 register for accessing PORTD.
'** Take the address of the upper byte of the result
asm
movlw RC5Receiver_Get_Rc5_result_2
movwf FSR0L
movlw @RC5Receiver_Get_Rc5_result_2
movwf FSR0H
end asm
'** Take the address of PORTD
asm
movlw PORTD
movwf FSR1L
movlw 255
movwf FSR1H
end asm
'** We wil try to decode the sequence "1-1-0"
'** Wait for the first rising edge
'** Note that this is a dead loop if there is no signal on input pin
while TestBit(INDF1, RCV_PIN) = 0
'** The rising edge has occured, now we will try to decode "1-1-0" sequence
'** The first "1" in "1-1-0"
'** Start sampling at the middle of the active high
tmp = HalfBitTime >> 1 '** Wait for the quarter of a bit- just after the rising edge
Delay_us(10)
'** It is much faster to use the assembly for iterration.
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
'** At this point, we are at the middle of the first half of the pulse.
'** We should see a logic "1", otherwise there are two possibilities:
'** 1. Synchronization did not measure HalfBitTime well due to noise
'** 2. Trasmitter is sending non-symetrical pulses
'** The resolution is to exit and to try to syncronize again:
Delay_us(10) '** The practice shows we need to compensate errors in
Delay_us(10) '** measuring the HalfBitTime.
asm
btfss INDF1, RCV_PIN
return
end asm
'** The second "1" in "1-1-0"
tmp = FullBitTime '** We will wait full bit time in order to intercept
Delay_us(10) '** the second "1"
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
Delay_us(10)
Delay_us(10) '** We should meet logic "1" at this point, otherwise an error occured
asm
btfss INDF1, RCV_PIN
return
end asm
'** The last zero in "1-1-0" sequence
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
Delay_us(10)
Delay_us(10) '** We should meet logic "0" at this point, otherwise an error occured
asm
btfsc INDF1, RCV_PIN
return
end asm
'** So far so good, we have successfully detected "1-1-0" sequence
'** Now, we will sample the imcoming 16 bits of the message and set
'** the result appropriately
result = 0 '** Initialize result
'** It is the time to start sampling the incoming bits
'** Wait for the whole bit interval
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
'** sample the current bit
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 7
end asm
'** repeat the sequence 15 more times, once for each bit
'** wait for the whole interval
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 6
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp,F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 5
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp,F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 4
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 3
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 2
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 1
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, MANRXPIN
bsf INDF0, 0
end asm
'** Now process the lower byte of the result
asm
movlw RC5Receiver_Get_Rc5_result_1
movwf FSR0L
movlw @RC5Receiver_Get_Rc5_result_1
movwf FSR0H
end asm
'** Wait for the whole bit interval
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
' sample the current bit
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 7
end asm
' wait for the whole interval
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 6
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 5
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 4
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 3
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 2
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 1
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, MANRXPIN
bsf INDF0, 0
end asm
'** Indicate success
erro = false
wend
end sub
main:
TRISB = 0 '** PORTB and PORTC as outputs
TRISC = 0
Man_Receive_Config(PORTD,7) '** Configure and synchronize receiver
HalfBitTime = Man_Synchro '** This function returns the length of
'** a half of the manchester bit length.
'** The length is given in multiples of 10us.
'** It is assumed that one bit lasts
'** no more than 255*10us = 2550 ms
FullBitTime = HalfBitTime << 1 '** Duration of a manchester bit
while true
RC5Code = Get_RC5(HasError) '** Try to get 16 bits of data
if HasError then
HalfBitTime = Man_Synchro '** Try to synchronize again
else
PORTB = Lo(RC5Code) '** Write the received word on
PORTC = Hi(RC5Code) '** PORTB and PORTC
End if
wend
end.
Thanks
I have already seen the pascal codification but not to become it, they can help me?
My converted code is:
program Rc
const RCV_PIN as byte = 7 '** receiving pin
dim HalfBitTime as byte
dim HasError as byte
dim FullBitTime as byte
dim RC5Code as word
'** This function returns 16 bits extracted from RC5 signal and sets
'** the error indicator to true if an error occurs
Sub function Get_RC5(dim Erro as byte)as word
dim tmp as byte
dim INDF1 as byte
dim RC5Receiver_Get_Rc5_result_2 as byte
dim FSR0L as byte
dim FSR0H as byte
dim FSR1L as byte
dim FSR1H as byte
erro = true '** Initialize error flag
'** It is better to use indirect addressing. In this way we can store
'** results longer than a word, by using less code.
'** Moreover, by using indirect addressing we do not have to worry about
'** memory banking in assembly.
'** We will move the address of the result variable into FSR0 register.
'** All the same, we will use FSR1 register for accessing PORTD.
'** Take the address of the upper byte of the result
asm
movlw RC5Receiver_Get_Rc5_result_2
movwf FSR0L
movlw @RC5Receiver_Get_Rc5_result_2
movwf FSR0H
end asm
'** Take the address of PORTD
asm
movlw PORTD
movwf FSR1L
movlw 255
movwf FSR1H
end asm
'** We wil try to decode the sequence "1-1-0"
'** Wait for the first rising edge
'** Note that this is a dead loop if there is no signal on input pin
while TestBit(INDF1, RCV_PIN) = 0
'** The rising edge has occured, now we will try to decode "1-1-0" sequence
'** The first "1" in "1-1-0"
'** Start sampling at the middle of the active high
tmp = HalfBitTime >> 1 '** Wait for the quarter of a bit- just after the rising edge
Delay_us(10)
'** It is much faster to use the assembly for iterration.
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
'** At this point, we are at the middle of the first half of the pulse.
'** We should see a logic "1", otherwise there are two possibilities:
'** 1. Synchronization did not measure HalfBitTime well due to noise
'** 2. Trasmitter is sending non-symetrical pulses
'** The resolution is to exit and to try to syncronize again:
Delay_us(10) '** The practice shows we need to compensate errors in
Delay_us(10) '** measuring the HalfBitTime.
asm
btfss INDF1, RCV_PIN
return
end asm
'** The second "1" in "1-1-0"
tmp = FullBitTime '** We will wait full bit time in order to intercept
Delay_us(10) '** the second "1"
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
Delay_us(10)
Delay_us(10) '** We should meet logic "1" at this point, otherwise an error occured
asm
btfss INDF1, RCV_PIN
return
end asm
'** The last zero in "1-1-0" sequence
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
Delay_us(10)
Delay_us(10) '** We should meet logic "0" at this point, otherwise an error occured
asm
btfsc INDF1, RCV_PIN
return
end asm
'** So far so good, we have successfully detected "1-1-0" sequence
'** Now, we will sample the imcoming 16 bits of the message and set
'** the result appropriately
result = 0 '** Initialize result
'** It is the time to start sampling the incoming bits
'** Wait for the whole bit interval
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
'** sample the current bit
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 7
end asm
'** repeat the sequence 15 more times, once for each bit
'** wait for the whole interval
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 6
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp,F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 5
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp,F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 4
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 3
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 2
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 1
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, MANRXPIN
bsf INDF0, 0
end asm
'** Now process the lower byte of the result
asm
movlw RC5Receiver_Get_Rc5_result_1
movwf FSR0L
movlw @RC5Receiver_Get_Rc5_result_1
movwf FSR0H
end asm
'** Wait for the whole bit interval
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
' sample the current bit
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 7
end asm
' wait for the whole interval
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 6
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 5
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 4
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 3
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 2
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, RCV_PIN
bsf INDF0, 1
end asm
tmp = FullBitTime
Delay_us(10)
asm
decfsz RC5Receiver_Get_Rc5_local_tmp, F
goto $-2
end asm
asm
btfsc INDF1, MANRXPIN
bsf INDF0, 0
end asm
'** Indicate success
erro = false
wend
end sub
main:
TRISB = 0 '** PORTB and PORTC as outputs
TRISC = 0
Man_Receive_Config(PORTD,7) '** Configure and synchronize receiver
HalfBitTime = Man_Synchro '** This function returns the length of
'** a half of the manchester bit length.
'** The length is given in multiples of 10us.
'** It is assumed that one bit lasts
'** no more than 255*10us = 2550 ms
FullBitTime = HalfBitTime << 1 '** Duration of a manchester bit
while true
RC5Code = Get_RC5(HasError) '** Try to get 16 bits of data
if HasError then
HalfBitTime = Man_Synchro '** Try to synchronize again
else
PORTB = Lo(RC5Code) '** Write the received word on
PORTC = Hi(RC5Code) '** PORTB and PORTC
End if
wend
end.
Thanks