Генерация одиночного импульса от таймера 1 в arduino nano
У меня есть код, который выдает один импульс с вывода D5 таймера 0 (основан на коде Джоша Левина), он отлично работает. Код ниже
#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);
}
Однако я хочу сгенерировать тот же импульс на выводе 10 или 9, который является таймером 1, поэтому немного изменю код, вот так
#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);
}
но это не работает, и я застрял, есть ли помощь? Я использую arduino nano
Спасибо
@Zahi Azmi, 👍0
1 ответ
Лучший ответ:
▲ 1
У Timer1 есть несколько дополнительных функций, поэтому вам нужно настроить регистры немного иначе, чем у timer0 (или timer2). Вам также нужно установить бит WGM13 в регистре TCCR1B.
Поскольку timer1 — это 16-битный таймер, вам необходимо изменить OSP_SET_AND_FIRE, чтобы он также использовал 16 бит.
И последнее: контакт 10 Arduino — это порт B, а не порт 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);
}
,
@Gerben
Смотрите также:
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- Как включить и выключить зуммер
- Прерывания таймера Arduino для PID
- Работа двигателя в течение 3 секунд непрерывно с прерыванием и без него
- ШИМ-сигнал с рабочим циклом 50 % и рассчитанной частотой
- Проблема с прескалером таймера Elegoo Nano
- Использование прерывания внутреннего таймера для чтения аналогового датчика
- Измерить звуковую частоту через длительность импульса