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

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

3d_killer пишет:

другой контроллер впаял новый, картина та же

не удивительно.

Давайте еще раз с самого начала. Оставьте в коде только управление OC3A. все остальное уберите. Таймер перед настройкой выключите, регистры обнулите.

3d_killer
Offline
Зарегистрирован: 13.06.2018
//#include <DS3231.h>               //Часы
//DS3231  rtc(SDA, SCL);
//ISR(TIMER3_COMPA_vect)
//{
//  digitalWrite(29, digitalRead(29) ^ 1);
//}
ISR(TIMER0_COMP_vect)
{
  //digitalWrite(36, digitalRead(36) ^ 1);
}
ISR(TIMER1_COMPA_vect)
{
  //digitalWrite(30, digitalRead(30) ^ 1);
}
//void INT_4()   
//{
//  digitalWrite(30, digitalRead(30) ^ 1);
//}
void setup() {
   // rtc.begin();
  //rtc.setOutput(OUTPUT_SQW);
  //rtc.setSQWRate(SQW_RATE_1);
  Serial1.begin(9600);
  // put your setup code here, to run once:
  pinMode(29, OUTPUT);
  pinMode(30, OUTPUT);
  pinMode(36, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(3,OUTPUT);
  noInterrupts();
//ETIMSK |= (1 << OCIE3A);
TCCR3A = 0b01000000;          
OCR3A   = 1;         
TCCR3B =0b00001001;
  //******************************************************************
  //Запуск таймера
  //******************************************************************
    // Clear registers
  TIMSK |= (1 << OCIE1A);
    TCCR1A = 0b01000000;
    OCR1A = 1;
    TCCR1B=0b00001001;
///
  TIMSK |= (1 << OCIE0);
  OCR0 = 1;
  TCCR0=0b00010001;
//attachInterrupt(4, INT_4, FALLING);
  interrupts();
  }
void loop() {  
}

активировал и другие, остальное убрал

OC1A - 96Гц

OC0 - 15,6кГц

OC3A - 96Гц

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

из фьюзов только SKSEL1=1 (биты с инверсией), кварц 8МГц стоит

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

Подозреваю что дело скорее всего в программе, даже такой код выдает 500Гц

#include <MsTimer2.h>

// Switch on LED on pin 13 each second


void flash() {
  static boolean output = HIGH;
  
  digitalWrite(13, output);
  output = !output;
}

void setup() {
  pinMode(13, OUTPUT);

  MsTimer2::set(1, flash); // 500ms period
  MsTimer2::start();
}

void loop() {
}

Осциллограф проверил генератором, все четко, у меня других предположений нет

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

3d_killer пишет:

из фьюзов только SKSEL1=1 (биты с инверсией), кварц 8МГц стоит

для работы от кварца 8 МГц согласно даташиту  все биты SKSEL должны быть сброшены в инверсной нотации

см таблицу 8 на стр 38

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

Сейчас на старой версии попробую и потом сброшу SKSEL1 в 0 не хочется доктором пользоваться выпаивать опять

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

попробовал старую версию и в AVRDUDE снял все галки зашил фьюзы, контроллер работает, но не изменилось ничего, я честно в недоумении

3d_killer
Offline
Зарегистрирован: 13.06.2018
//#include <DS3231.h>               //Часы
//DS3231  rtc(SDA, SCL);
//ISR(TIMER3_COMPA_vect)
//{
//  digitalWrite(29, digitalRead(29) ^ 1);
//}
ISR(TIMER0_COMP_vect)
{
  //digitalWrite(36, digitalRead(36) ^ 1);
}
ISR(TIMER1_COMPA_vect)
{
  //digitalWrite(30, digitalRead(30) ^ 1);
}
void timerCallback() {
  
}
//void INT_4()   
//{
//  digitalWrite(30, digitalRead(30) ^ 1);
//}
void setup() {
   // rtc.begin();
  //rtc.setOutput(OUTPUT_SQW);
  //rtc.setSQWRate(SQW_RATE_1);
  Serial1.begin(9600);
  // put your setup code here, to run once:
  pinMode(29, OUTPUT);
  pinMode(30, OUTPUT);
  pinMode(36, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(3,OUTPUT);
  noInterrupts();
//ETIMSK |= (1 << OCIE3A);
TCCR3A = 0b01000000;          
OCR3A   = 100;         
TCCR3B =0b00001001;
  //******************************************************************
  //Запуск таймера
  //******************************************************************
    // Clear registers
  TIMSK |= (1 << OCIE1A);
    TCCR1A = 0b01000000;
    OCR1A = 100;
    TCCR1B=0b00001001;
///
  TIMSK |= (1 << OCIE0);
  OCR0 = 100;
  TCCR0=0b00010001;
//attachInterrupt(4, INT_4, FALLING);
  interrupts();
}
void loop() {  
}

поправил значения счетчиков на 100

1 - 41,6кГц

0 - 15,6

3 - 41,6кГц

я что-то связи не вижу

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

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



void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
digitalWrite(13, !digitalRead(13));
delay(1000);
}

 

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

импульсы 501 мГц (мили)

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

3d_killer пишет:
поправил значения счетчиков на 100

1 - 41,6кГц

близко к правде, должно быть 40 КГц

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

задержку убрал 18,5 кГц, но это понятно, долгая функция

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

вот я заметил такое что маленькие значения записанные в регистр и большие свыше 2000 в 16 разрядный, как-то глючат что ли

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

уберите все лишнее


void setup() {
  
  pinMode(3,OUTPUT);
  noInterrupts();
TCCR3A =0;
TCCR3B=0;
TCNT3 =0;
TCCR3A = 0b01000000;          
OCR3A   = 1;         
TCCR3B =0b00001001;
  interrupts();
}
void loop() {  
}

 

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

так у меня не такой код сейчас

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

3d_killer пишет:

так у меня не такой код сейчас

ну а такой работает? что выдает7

3d_killer
Offline
Зарегистрирован: 13.06.2018
//#include <DS3231.h>               //Часы
//DS3231  rtc(SDA, SCL);
//ISR(TIMER3_COMPA_vect)
//{
//  digitalWrite(29, digitalRead(29) ^ 1);
//}
ISR(TIMER0_COMP_vect)
{
  //digitalWrite(36, digitalRead(36) ^ 1);
}
ISR(TIMER1_COMPA_vect)
{
  //digitalWrite(30, digitalRead(30) ^ 1);
}
void timerCallback() {
  
}
//void INT_4()   
//{
//  digitalWrite(30, digitalRead(30) ^ 1);
//}
void setup() {
   // rtc.begin();
  //rtc.setOutput(OUTPUT_SQW);
  //rtc.setSQWRate(SQW_RATE_1);
  Serial1.begin(9600);
  // put your setup code here, to run once:
  pinMode(29, OUTPUT);
  pinMode(30, OUTPUT);
  pinMode(36, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(3,OUTPUT);
  noInterrupts();
//ETIMSK |= (1 << OCIE3A);
TCCR3A = 0b01000000;          
OCR3A   = 400;         
TCCR3B =0b00001001;
  //******************************************************************
  //Запуск таймера
  //******************************************************************
    // Clear registers
  TIMSK |= (1 << OCIE1A);
    TCCR1A = 0b01000000;
    OCR1A = 400;
    TCCR1B=0b00001001;
///
  TIMSK |= (1 << OCIE0);
  OCR0 = 250;
  TCCR0=0b00010001;
//attachInterrupt(4, INT_4, FALLING);
  interrupts();
}
void loop() {  
}

1 и 3 ровно по 10 кГц выдают, 0 не меняется 15,6 вроде

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

тот код 95Гц выдает, только проверил

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

честно шлворя, я вас не понимаю. Если мы пытаемся понять, как управлять выходом таймера 3 - для чего вы в коде упорно держите столько мусора? - другие таймеры, какие-то прерывания...

Добейтесь сначала, чтобы один таймер работал, потом добавляйте остальное

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

Так вот же новый скетч создал

void setup() {
  
  pinMode(3,OUTPUT);
  noInterrupts();
TCCR3A =0;
TCCR3B=0;
TCNT3 =0;
TCCR3A = 0b01000000;          
OCR3A   = 1;         
TCCR3B =0b00001001;
  interrupts();
}
void loop() {  
}

 

3d_killer
Offline
Зарегистрирован: 13.06.2018
void setup() {
  
  pinMode(3,OUTPUT);
  noInterrupts();
TCCR3A =0;
TCCR3B=0;
TCNT3 =0;
TCCR3A = 0b01000000;          
OCR3A   = 100;         
TCCR3B =0b00001001;
  interrupts();
}
void loop() {  
}

38кГц-41кГц прыгает

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

а так

void setup() {
  
  pinMode(3,OUTPUT);
  noInterrupts();
TCCR3A =0;
TCCR3B=0;

TCCR3A = 0b01000000;    
TCCR3B =0b00001001;      
OCR3AH   = 0;        
OCR3AL   = 1; 

  interrupts();
}
void loop() {  
}

 

3d_killer
Offline
Зарегистрирован: 13.06.2018
void setup() {
  
  pinMode(3,OUTPUT);
  noInterrupts();
TCCR3A =0;
TCCR3B=0;
TCNT3 =0;
TCCR3A = 0b01000000;          
OCR3A   = 120;         
TCCR3B =0b00001001;
  interrupts();
}
void loop() {  
}

33.3 кГц четко держится, может это предел?

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

95 Гц выдает на том что вы прислали

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

3d_killer пишет:
38кГц-41кГц прыгает

ну уж прыгать почти на 10% в цифровой технике оно никак не может. Код, как мне кажется, нормальный.

Ищите косяки в схеме.  Либо осцил неправильно включен, либо не работает. либо кварц на атмеге неверно разведен

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

я все, у меня идеи кончились.

Атмеги128 у меня нет, прверить ваши измышления не на чем.

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

Я честно говоря с утра сижу ищу такие темы, но ничего толкового не нашел, время требуется же на сброс счетчика и переключение порта, просто не понятны рамки выставления минимального лимита для текущего делителя

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

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

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

у меня вот nano есть сейчас из любопытства попробую

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

3d_killer пишет:

время требуется же на сброс счетчика и переключение порта

насколько я знаю, при аппаратном управлении выходом таймера это время равно одному такту или около того.

Кроме того, даже если это время больше - это никак не обьясняет, почему у вас на делителе 1 получается 96 Гц, а на делителе 100 - 40 КГц

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

давайте эксперимент, для интереса 16 мгц кварц поставлю, фьюзы только гляну

 

 

3d_killer
Offline
Зарегистрирован: 13.06.2018
  TIMSK |= (1 << OCIE1A);
    TCCR1A = 0b01000000;
    OCR1A = 100;
    TCCR1B=0b00001001;

100кГц на выходе, уменьшение OCR1A начинаются скачки, то больше то меньше, это на 16 МГц

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

Вы же давно в этой теме, меня очень интересует вопрос, увеличение частоты ведет к уменьшению помехоустойчивости, нигде не нашел ответа на данный вопрос?

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

Все же, попереставлял значения 70кгц максимально, потом прыжки есть

  TIMSK |= (1 << OCIE1A);
    TCCR1A = 0b01000000;
    OCR1A = 114;
    TCCR1B=0b00001001;

 

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

вобщем так и получилось в 2 раза больше на этом кварце

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

питание от программатора кварц рядом с процом земля чистая и грязная разведены, так что на это не буду грешить, если бы я 220 подавал, тогда есть вероятность

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

Спасибо что потратили на меня свое время

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

на 328 nano так же, хотелось бы для себя эти лимиты определить когда делитель переставлять

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

взял обычную Нану, контроллер атмега328, кварц 16 МГц

код

void setup() {
  
  pinMode(9,OUTPUT);
  noInterrupts();
TCCR1A =0;
TCCR1B=0;
TCNT1 =0;
TCCR1A = 0b01000000;          
OCR1A   = 1;         
TCCR1B =0b00001001;
  interrupts();
}
void loop() {  
}

 

на 9м пине ровно 4 МГц, как и должно быть.

Вывод - ищите косяки у себя.

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

Интересно, буду ковырять, спасибо за тест

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

запустите мой код на стандартной покупной Нано, где вы не меняли кварц и фьюзы

если на выходе не будет 4 МГц  - скорее всего у вас осцил неисправен

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

ок, отпишусь

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

я этот код записал на плату меги 128 только пин 13 поставил, 4мгц ровно

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

завтра уже регистры сравню

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

3d_killer пишет:

я этот код записал на плату меги 128 только пин 13 поставил, 4мгц ровно

и что же изменилось? почему раньше было 96 Гц? :)

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

ссылку на миникоре с описанием атмеги 128 дайте, которую вы используете

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

регистры изначально сброшены, может в этом дело

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

Это мега коре https://github.com/MCUdude/MegaCore

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

попробовал

TCCR1A =0;
TCCR1B=0;
TCNT1 =0;

в этом дело

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

большое спасибо