Помогите настроить таймер

3d_killer
Offline
Зарегистрирован: 13.06.2018

Необходимо настроить таймер на 0,1 секунду, частота 8МГц

  TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10); // настраиваем делитель
  TIMSK |= (1<<TOIE1); // разрешаем прерывание по переполнению таймера
  TCNT1 = 64456; 

 

sadman41
Offline
Зарегистрирован: 19.10.2016
3d_killer
Offline
Зарегистрирован: 13.06.2018

Спасибо тебе, добрый человек

3d_killer
Offline
Зарегистрирован: 13.06.2018

Странно, вроде так, но на выходе частота по ослику 7,8кГц

  TCCR1B = (0<<CS12)|(0<<CS11)|(1<<CS10); // настраиваем делитель
  TIMSK |= (1<<TOIE1); // разрешаем прерывание по переполнению таймера
  TCNT1 = 13568;        // выставляем начальное значение 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

А тактовая чистая скоко (по ослику)?

3d_killer
Offline
Зарегистрирован: 13.06.2018

а как на проце ее замерять, на кварце стазу проц вырубает

3d_killer
Offline
Зарегистрирован: 13.06.2018

и тут совсем данные то разнятся, мне нужно получить 10Гц, а на выходе кГц

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, как... Предделитель =1, наверное и CTC на таймере заюзать.

sadman41
Offline
Зарегистрирован: 19.10.2016

https://www.arduinoslovakia.eu/application/timer-calculator

#define ledPin 13

void setupTimer1() {
  noInterrupts();
  // Clear registers
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;

  // 10 Hz (8000000/((3124+1)*256))
  OCR1A = 3124;
  // CTC
  TCCR1B |= (1 << WGM12);
  // Prescaler 256
  TCCR1B |= (1 << CS12);
  // Output Compare Match A Interrupt Enable
  TIMSK1 |= (1 << OCIE1A);
  interrupts();
}

void setup() {
  pinMode(ledPin, OUTPUT);
  setupTimer1();
}

void loop() {
}

ISR(TIMER1_COMPA_vect) {
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
}

 

3d_killer
Offline
Зарегистрирован: 13.06.2018

TCCR1A мне использовать нельзя, нужна эта лапа для tone TCCR3A занята другим таймером

3d_killer
Offline
Зарегистрирован: 13.06.2018

то есть OCIE1A и OCIE3A нельзя

sadman41
Offline
Зарегистрирован: 19.10.2016

Вопрос был какой? Настроить таймер. С словацким исходником работает на нужной частоте?

3d_killer
Offline
Зарегистрирован: 13.06.2018

5 Гц показывает

3d_killer
Offline
Зарегистрирован: 13.06.2018

и ругалось на TIMSK3 поставил ETIMSK

3d_killer
Offline
Зарегистрирован: 13.06.2018

Atmega128 у меня

sadman41
Offline
Зарегистрирован: 19.10.2016

Хорошо, что не Байкал и узнали мы об этом не через полгода.

3d_killer
Offline
Зарегистрирован: 13.06.2018

извиняюсь

3d_killer
Offline
Зарегистрирован: 13.06.2018

мне в программе просто нужно 2 таймера и свободная лапа OC1A

3d_killer
Offline
Зарегистрирован: 13.06.2018

Попробовал первый таймер и как не меняй число 244 Гц выдает и все

  TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
   TIMSK |= (1 << OCIE1A); // Enable CTC interrupt
   OCR1A   = 100; // Set CTC compare value to 1Hz at 1MHz AVR clock, with a prescaler of 64
   TCCR1B |= ((1 << CS10) | (1 << CS11)); // Start timer at Fcpu/64

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Вы хотите на ноге частоту получить или в прерывании ? Вот тут:

http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/pomogite-nastr...

прерывание вызывается 10 раз в секунду, но диод моргает 5 раз в секунду, так как на одно моргание уходит два вызова прерывания.

Что бы моргало 10 раз в секунду надо делитель на 64 и число сброса 6249.

3d_killer
Offline
Зарегистрирован: 13.06.2018

на ноге мне нужно чтобы работала функция tone, и еще 2 прерывания чтобы работали на библиотеке MegaCore я так понял можно настроить только таймеры 1 и 3, на нулевой выдает кучу ошибок что не знает таких, да и которые знает не удается настроить выдает постоянно одну и ту же частоту какое бы я число сброса не поставил, главное что на тестовой плате arduino nano все работает хорошо на 328p чипе, а вот с atmega128 какая-то засада

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

3d_killer пишет:

на ноге мне нужно чтобы работала функция tone

10 Гц ?

Почему вы MegaCore называете библиотекой ??? Это просто пакет поддержки плат. Там прост сопоставлены имена регистров, констант ... с их физическим расположением в памяти процессора.

3d_killer
Offline
Зарегистрирован: 13.06.2018

не tone нужно менять в программе (шаговым управлять через драйвер), а прерывания отдельно должны работать одно на 10 гц, а другое на 1000 или даже больше (для считывания кнопок)

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

тоне от того же таймера что и прерывания 10 Гц?

3d_killer
Offline
Зарегистрирован: 13.06.2018

вчера ковырял файлы чтобы сравнить где же в нано прописаны эти:

error: 'TCCR0B' was not declared in this scope
так и не нашел, на Atmega128 они не работают, хотя в ней по описанию 4 таймера
3d_killer
Offline
Зарегистрирован: 13.06.2018

нет оно так думаю работать не будет, нужно tone на той лапе отдельно и 2 любые другие таймера, но нормально не хочет работать ни один

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

ХЗ где вы смотрите ! https://ww1.microchip.com/downloads/en/DeviceDoc/doc2467.pdf стр. 103

TCCR0B там реально НЕТ !!!

 

3d_killer
Offline
Зарегистрирован: 13.06.2018

а это не он

8-bit Timer/Counter0 with PWM and Asynchronous Operation

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Таймер есть ! Регистры у него зовутся иначе !!!

3d_killer
Offline
Зарегистрирован: 13.06.2018

хоть бы пример был с этими регистрами, ппц весь инет перерыл

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Timer/Counter Control Register – TCCR0

Timer/Counter Register – TCNT0

Output Compare Register – OCR0

Asynchronous Status Register – ASSR

Timer/Counter Interrupt Mask Register – TIMSK

Timer/Counter Interrupt Flag Register – TIFR

Special Function IO Register – SFIOR

Не знаю как на 128ом, но обычно таймер0 используется в скетчах как системный для millis, delay и прочего ...

3d_killer
Offline
Зарегистрирован: 13.06.2018

да я увидел регистры, но не знаю что в них писать

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

В даташите же расписано все от и до !

3d_killer
Offline
Зарегистрирован: 13.06.2018

все равно ошибки такого плана

note: suggested alternative: 'TCCR1A'
 TCCR0A = (1<<WGM01);
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Где вы там нашли TCCR0A ?

3d_killer
Offline
Зарегистрирован: 13.06.2018

в документации на другом сайте по этому счетчику

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Ну если в 128 регистры называются по другому - значит надо что то поменять или нет ???

3d_killer
Offline
Зарегистрирован: 13.06.2018

да, пытаюсь

3d_killer
Offline
Зарегистрирован: 13.06.2018

А функции tone мешают прерывания? (почему-то), шаговик дергается раз в секунду, скорее всего по времени получается прерывание от часов каждую секунду, и на осциллографе это хорошо видно.

b707
Offline
Зарегистрирован: 26.05.2017

3d_killer -Почему вы читаете какие-то левые описания для других МК? Ведь есть отдельный даташит на атмегу 128 - там и смотрите!

Что касается проблем с прерываниями - не видя вашего кода, сказать. почему у вас "прерывание дергается" - невозможно. Судя по вопросам выше - вы в коде наверняка наворотили черти что...

3d_killer
Offline
Зарегистрирован: 13.06.2018

Сейчас сделал так

  ETIMSK |= (1 << OCIE3A);//устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A
  TCCR3A = 0;             //Сброс контрольного регистра А
  OCR3A   = 125;          //8000/64
  TCCR3B =0b00001011;     //Запуск счетчика с делителем 64 устанавливаем режим СТС (сброс по совпадению), остановка 0b00001000
  //******************************************************************
  //Запуск таймера
  //******************************************************************
    // Clear registers
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  // 10 Hz (8000000/((3124+1)*256))
  OCR1A = 1562;
  // CTC
  TCCR1B |= (1 << WGM12);
  // Prescaler 256
  TCCR1B |= (1 << CS12);
  // Output Compare Match A Interrupt Enable
  TIMSK |= (1 << OCIE1A);

Так же работает внешнее прерывание с часов, которое сбрасывает сторожевой таймер

attachInterrupt(4, INT_4, FALLING);

tone вызывается один раз при старте на лапе 13 PB5 (OC1A)

 

b707
Offline
Зарегистрирован: 26.05.2017

Теперь еще раз сформулируйте понятным языком. что именно тут не работает.

код нужно выкладывать ВЕСЬ

 

3d_killer
Offline
Зарегистрирован: 13.06.2018

Тут все работает, но tone каждую секунду прерывается на очень короткое время и далее возобновляется

3d_killer
Offline
Зарегистрирован: 13.06.2018

мне казалось что tone работает как ШИМ и не зависит от прерываний в программе, но информации не нашел

b707
Offline
Зарегистрирован: 26.05.2017

3d_killer пишет:

tone вызывается один раз при старте на лапе 13 PB5 (OC1A)

 

если вы пытаетесь в одной программе использовать первый таймер в своем коде и в функции tone() - надо после каждого использования tone настраивать таймер заново.

А лучше просто отказаться от готовой функции tone() и написать вывод частоты на пин самостоятельно через регистры

3d_killer
Offline
Зарегистрирован: 13.06.2018

так прерывания не сбиваются, все работает просто tone говорю же каждую секунду останавливается на короткий промежуток времени и запускается заново на той же частоте

b707
Offline
Зарегистрирован: 26.05.2017

3d_killer пишет:

мне казалось что tone работает как ШИМ и не зависит от прерываний в программе, но информации не нашел

посмотрите исходник tone для атмеги128, если оно на аппаратном ШИМе - то влиять не должно, а если на программном(через прерывание) - то конечно другие интерррапты будут влиять

Написал выше - не используйте tone, пишите самостоятельно

3d_killer
Offline
Зарегистрирован: 13.06.2018

Так как первый и третий таймеры у меня задействованы получается через регистры мне нужно это делать на нулевом таймере?

3d_killer
Offline
Зарегистрирован: 13.06.2018

Вот вроде написал на нулевой таймер но он что-то не стартует

TIMSK |= (1 << OCIE0);
  OCR0 = 125;
  TCCR0=0b00000001;

 

3d_killer
Offline
Зарегистрирован: 13.06.2018

переписал, но все равно молчит

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Может проще нам рассказать что и на каких ногах должно быть? Плюс какие прерывания должны вызываться ? Без общей картины - одно чинится, другое ломается !!!