PDA

View Full Version : From c to pbp



savnik
- 22nd July 2007, 09:07
How to change this code to picbasic pro.Also i want to use xtal 4MHZ


#include <16f84a.h>
#fuses HS,NOWDT,PROTECT,PUT
#use delay(clock=20000000) //one instruction=0.2us
//////////////////////////// HS1YWN /////////////////////////////////

void main()
{
int ltime;
SET_TRIS_B(0x00);
for (ltime=0;ltime<50;ltime++)
{
output_high(PIN_B7);
delay_ms(50);
output_low(PIN_B7);
delay_ms(50);
}

while (TRUE)
{
output_b(0x01);
delay_cycles(59);
output_b(0x02);
delay_cycles(59);
output_b(0x41);
delay_cycles(59);
output_b(0x42);
delay_cycles(59);
}
}
/////////////////////// the end !! ////////////////////////////////////////

Jerson
- 22nd July 2007, 11:49
Here you go, 'unverified' code.


@ device PIC16f84, HS, NOWDT, PROTECT, PUT

ltime var word
PIN_B7 var PORTB.7

TRISB = 0
for ltime = 0 to 50
PIN_B7 = 1
pause 50
PIN_B7 = 0
pause 50
next

while (1)
PORTB = 1
pause_us(59)
PORTB = 2
pause_us(59)
PORTB = $41
pause_us(59)
PORTB = $42
pause_us(59)
wend
/////////////////////// the end !! ////////////////////////////////////////

T.Jackson
- 22nd July 2007, 12:47
That was very nice of you, Jerson, to take the time to do that. I think I agree with your conversion - while I have no prior knowledge of C, I'm studying Java at the moment and starting to many similarities between them.

savnik
- 22nd July 2007, 14:17
Here you go, 'unverified' code.


@ device PIC16f84, HS, NOWDT, PROTECT, PUT

ltime var word
PIN_B7 var PORTB.7

TRISB = 0
for ltime = 0 to 50
PIN_B7 = 1
pause 50
PIN_B7 = 0
pause 50
next

while (1)
PORTB = 1
pause_us(59)
PORTB = 2
pause_us(59)
PORTB = $41
pause_us(59)
PORTB = $42
pause_us(59)
wend
/////////////////////// the end !! ////////////////////////////////////////

Thank you.I will try.

Bruce
- 22nd July 2007, 15:27
If you're going to convert this to produce the same timing at 4MHz, you'll
need to use an assembler delay routine.

At 20MHz, like the original C version, delay_cycles(59); gives you a delay of
59 * 200nS instruction cycles. 59 * 200nS = 11.8uS.

PAUSEUS at 4MHz is limited to a minimum delay period of 24uS, and with an
instruction time of 1uS at 4MHz, you're still going to be off by a minimum of
200nS.

12uS is about as close as you can get to the original 11.8uS delay period.



' For 4MHz use XT_OSC
@ DEVICE PIC16F84A, XT_OSC,WDT_OFF,PROTECT_OFF,PWRT_ON

DEFINE OSC 4
ltime VAR BYTE

GOTO Main

PAUSE12: ' CALL to here = 2uS
ASM
GOTO $+1 ; 2uS
GOTO $+1 ; 2uS
GOTO $+1 ; 2uS
GOTO $+1 ; 2uS
RETURN ; 2uS (12uS total delay time)
ENDASM

Main:
TRISB = 0
FOR ltime = 0 TO 49 ' 50 loops total
PORTB.7 = 1
PAUSE 50
PORTB.7 = 0
PAUSE 50
NEXT ltime

WHILE (1)
PORTB = 1
CALL PAUSE12
PORTB = 2
CALL PAUSE12
PORTB = $41
CALL PAUSE12
PORTB = $42
CALL PAUSE12
WEND

END
This would give you very close to the same program & timing. The difference
is the delay between port updates in the WHILE loop are 12uS VS 11.8uS.

savnik
- 22nd July 2007, 16:16
Thank you.
I want to test this code with Attached Image.
At port.0 and port.1 must have 38khz and at port.6 must have 19khz

keithdoxey
- 22nd July 2007, 16:45
Thank you.
I want to test this code with Attached Image.
At port.0 and port.1 must have 38khz and at port.6 must have 19khz

You may get the code to work but I dont see how that schematic is going to work if you are trying to build a stereo encoder for an FM transmitter.

Both audio inputs are labelled as {RIGHT} sorry...R IN L IN {end of edit} instead of right and left and the circuit appears to just chop both inputs up at a rate of 38kHz. Presumably the PIC is outputing the two 38kHz signals out of phase otherwise you may as well use the same signal !!!

FM broadcasts were designed to be Mono compatable so have a mono audio signal (L+R) with a difference signal (L-R) carried on a 38kHz subcarrier.

The 19kHz carrier is to operate the pilot indicator in the receiver and switch on the demux to regenerate the original Left and Right signals from Mono + Side.

http://www.irational.org/sic/radio/tech.html#Stereo

gives a block schematic of a stereo encoder which is totally different from what your schematic seems to do.

Bruce
- 22nd July 2007, 18:13
For 38kHz on RB0 & RB1, and 19kHz on RB6, you'll need to modify the delay
routines. This should work for ~38kHz & 19kHz. It's off by a few 100Hz, but
a lot closer than the other version.


' For 4MHz use XT_OSC
@ DEVICE PIC16F84A, XT_OSC,WDT_OFF,PROTECT_OFF,PWRT_ON

' For 4MHz use
DEFINE OSC 4
ltime VAR BYTE
TRISB = 0

GOTO Main

PAUSE9:
ASM
GOTO $+1 ; 2uS
GOTO $+1 ; 2uS
GOTO $+1 ; 2uS
NOP ; 1uS
RETURN ; 2uS
ENDASM

PAUSE7:
ASM
GOTO $+1 ; 2uS
GOTO $+1 ; 2uS
NOP ; 1uS
RETURN ; 2uS
ENDASM

Main:
FOR ltime = 0 TO 49 ' 0 TO 49 = 50 loops total
PORTB.7 = 1
PAUSE 50
PORTB.7 = 0
PAUSE 50
NEXT ltime

WHILE 1=1
PORTB = 1
CALL PAUSE9 ' CALL = 2uS
PORTB = 2
CALL PAUSE9
PORTB = $41
CALL PAUSE9
PORTB = $42
CALL PAUSE7 ' Compensates for GOTO beginning of WHILE loop
WEND

END

savnik
- 23rd July 2007, 06:38
I have made the pcb and these days i will try if work.

savnik
- 28th July 2007, 08:43
I have made the pcb and these days i will try if work.
Thank you Bruce
I test and work , but it should not all the delays they is same; PAUSE9

Edit: I use the code as you post , without any change.

Jerson
- 28th July 2007, 14:43
The delays shown by Bruce are mistakenly wrong. The original code shows delay_cycles(59) That is delay for 59 cycles. So, by using Bruce's code as a start, you can make the delay for 59 cycles. This will give you the correct timings. Another thing, the oscillator is 20MHz. So, the initial define has to be


define OSC 20000000

cntr byte 1

delay_cycles59: ' 2 cycles to get here

asm
MOVLW 11 ' 1 cycle
MOVWF _cntr ' 1 cycle
loop: DECFSZ _cntr,F ' 1 cycles (3*17+1 = 52)
GOTO loop ' 2 cycles
nop ' 1 cycle
return ' 2 cycles

endasm


The above has a subroutine to give you an exact delay of 59 cycles. You can call the function from PBP like this


gosub delay_cycles59

Bruce
- 28th July 2007, 16:58
Per Savniks' original post,
How to change this code to picbasic pro.Also i want to use xtal 4MHZ
I think he's looking for a similar function, but with a 4MHz osc VS 20MHz.

If not, then of course the timing in my example would indeed be wrong.

savnik
- 2nd August 2007, 07:20
Per Savniks' original post,
I think he's looking for a similar function, but with a 4MHz osc VS 20MHz.

If not, then of course the timing in my example would indeed be wrong.
Yes , I was looking for a similar function, but with a 4MHz Xtal.