i have a code that shot a single pulse from pin D5 timer 0 (based on josh levine code), it works fine. the code is below
#define OSP_SET_WIDTH(cycles) (OCR0B = 0xff-(cycles-1))
void osp_setup(uint8_t cycles) {
TCCR0B = 0;
TCNT0 = 0x00;
OCR0A = 0;
OSP_SET_WIDTH(cycles);
TCCR0A = _BV(COM0B0) | _BV(COM0B1) | _BV(WGM00) | _BV(WGM01);
TCCR0B = _BV(WGM02) | _BV(CS00);
DDRD |= _BV(5);
}
void osp_setup() {
osp_setup(1);
}
#define OSP_FIRE() (TCNT0 = OCR0B - 1)
#define OSP_INPROGRESS() (TCNT0>0)
#define OSP_SET_AND_FIRE(cycles) {uint8_t m=0xff-(cycles-1); OCR0B=m;TCNT0 =m-1;}
void setup()
{
osp_setup();
}
void loop()
{
OSP_SET_AND_FIRE(4);
delayMicroseconds(20);
}
however, i want to generate the same pulse in pin 10 or 9 which is timer 1, so a change the code a bit just like this
#define OSP_SET_WIDTH(cycles) (OCR1B = 0xff-(cycles-1))
void osp_setup(uint8_t cycles) {
TCCR1B = 0;
TCNT1 = 0x00;
OCR1A = 0;
OSP_SET_WIDTH(cycles);
TCCR1A = _BV(COM1B0) | _BV(COM1B1) | _BV(WGM10) | _BV(WGM11);
TCCR1B = _BV(WGM12) | _BV(CS10);
DDRD |= _BV(10);
}
void osp_setup() {
osp_setup(1);
}
#define OSP_FIRE() (TCNT1 = OCR1B - 1)
#define OSP_INPROGRESS() (TCNT1>0)
#define OSP_SET_AND_FIRE(cycles) {uint8_t m=0xff-(cycles-1); OCR1B=m;TCNT1 =m-1;}
void setup()
{
osp_setup();
}
void loop()
{
OSP_SET_AND_FIRE(4);
delayMicroseconds(20);
}
but it doesn't work, and i am stuck, any help? i use arduino nano
Thank you
1 Answer 1
Timer1 has a few extra features, so you need to set the registers slightly differently from timer0 (or timer2). You need to also set the WGM13 bit in the TCCR1B register.
Since timer1 is a 16 bit timer, you need to change OSP_SET_AND_FIRE to also use 16 bits.
Lastly; Arduino pin 10 is port B, not port D.
#define OSP_SET_WIDTH(cycles) (OCR1B = 0xff-(cycles-1))
void osp_setup(uint8_t cycles) {
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0x00;
OCR1A = 0;
OSP_SET_WIDTH(cycles);
TCCR1A = _BV(COM1B0) | _BV(COM1B1) | _BV(WGM10) | _BV(WGM11);
TCCR1B = _BV(WGM12) | _BV(WGM13) | _BV(CS10);
DDRB |= _BV(DDB2);//pin 10; PB2
}
void osp_setup() {
osp_setup(1);
}
#define OSP_FIRE() (TCNT1 = OCR1B - 1)
#define OSP_INPROGRESS() (TCNT1>0)
#define OSP_SET_AND_FIRE(cycles) {uint16_t m=0xffff-(cycles-1); OCR1B=m;TCNT1 =m-1;}
void setup()
{
osp_setup();
}
void loop()
{
OSP_SET_AND_FIRE(4);
delayMicroseconds(20);
}
it doesn't work
it didn't generate the desired signal
that is almost the same asit doesn't work
.... what did it generate?