UPDATE:
I finally achieved a transmission above 200kHz, 240kHz more exactly.
Like you said Pylon, can not use delaymicroseconds(..) due to the delays inserted. Then i used nop asm delays and i got what i wanted.
__asm__("nop\n\t");
each one is 62.5 ns so with help of oscilloscope i timed them individually. Result is shown below.
#include "VLC.h"
MANCHESTERClass::MANCHESTERClass() //constructor
{
TxPin = TxDefault;
pinMode(TxPin, OUTPUT); // sets the digital pin 4 default as output
}//end of constructor
void MANCHESTERClass::SetPW(unsigned int interval)
{
HALF_BIT_INTERVAL = interval; // user sets the pulse width of half bit
}//end of set half pulse width
void MANCHESTERClass::SetTxPin(char pin)
{
if (pin <=7)
TxPin = pin; // user sets the digital pin as output
else if ((pin >= 8) || (pin <= 13))
TxPin = pin - 8; // user sets the digital pin as output
DDRB = DDRB | B0000001 | (1 << TxPin);
//pinMode(TxPin, OUTPUT); // sets the digital pin 4 default as output
}//end of set transmit pin
void MANCHESTERClass::Transmit(unsigned int data)
{
unsigned char byteData[2] = { data >> 8, data & 0xFF};
TransmitBytes(2, byteData);
}
void MANCHESTERClass::TransmitBytes(unsigned char numBytes, unsigned char *data)
{
// Setup last send time so we start transmitting in 10us
/*
// Send 14 0's
for( int i = 0; i < 14; i++) {
//send capture pulses - sendzero()
PORTB = B00000001;
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
PORTB = B00000000;
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
//__asm__("nop\n\t");
}
//end of capture pulses
// Send a single 1 - start data pulse
PORTB = B0000000;
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
PORTB = B00000001;
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
*/
// Send the user data
for (unsigned char i = 0; i < numBytes; i++) {
for (uint8_t mask = 0x01; mask; mask <<= 1) {
if (data[i] & mask) {
//sendone()
PORTB = B00000000;
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
PORTB = B00000001;
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
}
else {
//sendzero()
PORTB = B00000001;
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
PORTB = B00000000;
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
}
}//end of byte
}//end of data
//sendzero(); //end of capture pulses
//sendzero(); //end of capture pulses
}//end of send the data
MANCHESTERClass MANCHESTER;
Got some error bits, especially when i send many 1's but i can live with that.
Working on the receiving part...will make an update once i get some results.
Thank you for support,
Fernando Oliveira