RC5 code

General discussion on mikroBasic.
Post Reply
Author
Message
juliovmd
Posts: 119
Joined: 02 Feb 2006 11:14
Location: Spain
Contact:

RC5 code

#1 Post by juliovmd » 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

ta1dr
Posts: 40
Joined: 19 Apr 2005 06:47

RC5

#2 Post by ta1dr » 10 Feb 2006 10:05

look here but that code write for proton+ you can easy convert MB
I tried it work well

www.picbasic.nl and select english click project

ahmet/TURKEY

juliovmd
Posts: 119
Joined: 02 Feb 2006 11:14
Location: Spain
Contact:

#3 Post by juliovmd » 10 Feb 2006 10:48

If, thanks, already I know it and I have proven it despite the instruction to set bits is individually not accepted by mBasic? example:

PROTON:
Command.1=0

MBASIC:
SetBit(Command,1)

mBasic accepts but of a condition in the curls? example:

While (a=1) AND (b=2) ' is possible?
... Expresions
Wend

Thanks

juliovmd
Posts: 119
Joined: 02 Feb 2006 11:14
Location: Spain
Contact:

#4 Post by juliovmd » 10 Feb 2006 16:38

I have made modifications and works Thanks for your aid very well :wink:

Post Reply

Return to “mikroBasic General”