Have you just tried to send this binary string with shiftout?
I think there is not much needed to make it work. Just send the string. Serout will not work here.
Ioannis
Have you just tried to send this binary string with shiftout?
I think there is not much needed to make it work. Just send the string. Serout will not work here.
Ioannis
Ioannis,
I have not used shiftout before... I have just tried..
This did not change the osc... still 1Mhz. Is my syntax ok?Code:SCK var portb.6 SDO var portb.7 shiftout SDO, SCK, 1, [%1100000011110111]
If you check it with the manual, I understand that you cannot send a binary string that way. You have to use, as with most of the commands, a variable. Either byte or word size defined on top.
So put the string in two byte variables or a word sized variable and then send it out with shiftout command. Check also if MSB or LSB is needed by the module.
The 1100000011110111 string is exaclty 16bits.
Ioannis
There is an example on the meLabs website showing how to use the synchronous serial port hardware to read/write from/to an SPI slave (e.g. RF12).Also, here is a link to a BasCOM program written for the RF12. While BasCOM is not PBP and an AVR chip is not a PIC, it should still give you a good understanding of what you need to do.
Last edited by dhouston; - 9th June 2008 at 12:49.
Ioannis,
I realised this not long after I posted.. I tried the following with no difference in results..
Tried with the HEX, and the binary values.Code:dout var word dout = $C0F7 shiftout SDO, SCK, 1, [dout]
I don't think it matters, but also tried [dout\16]
Dhouston,
Thanks for the links, I will study them closely tomorrow.
Thank for the link.
The program is written in German... but it is a great help.
regards,
Ambrogio
Hi,
Is this thread still open?
I would like to ask questions
Camerart
I’m struggling to find C code in this thread that isn’t directly converted to PBP.
C:
PBP:Code:temp|=DATA;
C falls short of PBP or asm for bitwise operations because you can never access a bit in a single instruction,Code:temp = temp|data'
hence the bit mask is being used in C to only write the set bits in the temp variable.
If you’re clocking the external chip, and then feeding the pic it’s output clock that would normally be a very good ideaCode:B800 = 1011100000000000 DATA = 0000000000001111 B800 | DATA = 1011100000001111
because once you send the command to PLL the external chip's clock higher, both chips are clocked at the higher speed,
and no timing adjustment of the SPI or SHIFTOUT routines should need adjusting,
EXCEPT for the fact that the pic’s instruction clock is divided by 4, so the two chip’s practical instruction timing is not increased evenly,
so you will need two different communication timings for the two different speeds of the external chip.
Nops in this function are a delay. The function (subroutine as you worked out) sends a single zero value out of the SPI bus.
If you were to set SCK low, and then high again in the very next instruction, the receiving device might miss the signal.
Especially if the external device runs slower than the transmitting device. You can use @nop in PBP.
Since there are several flavours of SPI, it would be better to reproduce this then use PBP SHIFTOUT (unless it’s already working).
They are really only turning two port bits on & off.
Code:writezero: portb.something = 0’ clear SPI data portb.something = 0’ clear clock pin, the receiver will look at the value of the SPI data bit now. delay portb.something = 1’ set the clock pin, the receiver will look for the next bit on the next rising edge (next time you call this function, or the writeone function).Code:void Write0( void ) { SDI=0; SCK=0; NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); SCK=1; NOP(); }
Last edited by Art; - 8th October 2016 at 10:50.
Bookmarks