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

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

я сейчас чистую программу создал там только это

ISR(TIMER0_COMPA_vect)
{
  digitalWrite(36, digitalRead(36) ^ 1);
}
void setup() {
noInterrupts();
  TIMSK |= (1 << OCIE0);
  OCR0 = 0b00011011;
  TCCR0=0b00011011;
  //
  interrupts();
  }

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

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

Только так, в документации, переделал, но толку нет

TIMER0_COMP_vect

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

а не стартанул

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

ну теперь с выводом буду разбираться, этот таймер на прерывание, по времени, а первый на ножку OC1A,

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

вот так он должен работать 1 секунда, а на ослике 3,9 кГц меньше получить не удается

TIMSK |= (1 << OCIE0);
  OCR0 = 7812;
  TCCR0=0b00011111;

 

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

Вот так

TIMSK |= (1 << OCIE0);
  OCR0 = 7812;
  TCCR0=0b00000111;

19Гц, меньше не получить?

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

OCR0 = 7812; А ничего что OCR0 8 битный ??? 255 - максимум что можно туда записать !

С вашими познаниями лезть в прерывания и управление таймерами через регистры - РАНОВАТО !

3d_killer
Offline
Зарегистрирован: 13.06.2018
 TIMSK |= (1 << OCIE0);
  OCR0 = 7812;
  TCCR0=0b00010111;

Вот так вроде должны быть но там пусто

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

Да я уже понял что это предел, забыл что он 8 битный

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

3d_killer пишет:

 TIMSK |= (1 << OCIE0);
  OCR0 = 7812;
  TCCR0=0b00010111;

Вот так вроде должны быть но там пусто

Надо ногу на ВЫВОД перенастроить !!!

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

7812 = 0x1E84

В регистр попадает 0x84, а можно 0xFF

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

Ну так по документации, должна менять состояние 1 же добавил на COM00

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

но тогда на светодиоде становится 3,9 кГц, а на этой лапке пусто

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

3d_killer пишет:

Ну так по документации, должна менять состояние 1 же добавил на COM00

Она меняет состояние - но нога по умолчанию ВХОД со всеми вытекающими...

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

Понял, сейчас попробую

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

TIMSK |= (1 << OCIE0);
OCR0 = 0xFF;
TCCR0=0b00010111;

8000000/(1024*256)~30 вызовов прерывания и 15 Гц на светодиоде

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

Да, заработала, спасибо

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

Вы даташит через строку читаете или через страницу ?

"note that the Data Direction Register (DDR) bit corresponding to OC0 pin must be set in order to enable the output driver"

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

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

  noInterrupts();
  ETIMSK |= (1 << OCIE3A);//устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A
  TCCR3A = 0;             //Сброс контрольного регистра А
  OCR3A   = 3125;          //8000/64
  TCCR3B =0b00001100;     //Запуск счетчика с делителем 64 устанавливаем режим СТС (сброс по совпадению), остановка 0b00001000
  // Clear registers
  TIMSK |= (1 << OCIE1A);
  TCCR1A = 0b01000000;
  OCR1A = 3125;
  TCCR1B=0b00001101;
  //
  TIMSK |= (1 << OCIE0);
  OCR0 = 255;
  TCCR0=0b00010111;
  interrupts();
  }

 

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

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

  ETIMSK |= (1 << OCIE3A);
  TCCR3A = 0b01010100;          
  OCR3A   = 6250;         
  TCCR3B =0b00000011;

Все написал как в документации, обработчик прерывания поставил и светодиод мигает, но на лапу OC3A вывода нет, порт как выход я объявил.

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

CTC не включен !

WGM32 должен быть 1 => TCCR3B =0b000001011;

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);
  noInterrupts();
ETIMSK |= (1 << OCIE3A);
TCCR3A = 0b01010100;          
OCR3A   = 6250;         
TCCR3B =0b00001011;
  //******************************************************************
  //Запуск таймера
  //******************************************************************
    // Clear registers
 // TIMSK |= (1 << OCIE1A);
 //   TCCR1A = 0b01000000;
 //   OCR1A = 1000;
 //   TCCR1B=0b00001101;
///
 // TIMSK |= (1 << OCIE0);
//  OCR0 = 255;
//  TCCR0=0b00010111;
attachInterrupt(4, INT_4, FALLING);
  interrupts();
  }




void loop() {
  
  
}

 

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

У вас ноги не той системы видимо !

pinMode(3,OUTPUT);

PE, // PE3 ** D3

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

Походу да, заработало, спасибо

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

3d_killer пишет:

 но на лапу OC3A вывода нет, порт как выход я объявил.

и как вам после этого помогать?

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

Komandir пишет:

У вас ноги не той системы видимо !

да у него никакой нет. В коде всего 4 пинМоде, ровно по числу пинов прерываний. То есть выход OC3A он даже не пытался обьявлять

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

еще я не понял почему при такой настройке у меня на выходе

ETIMSK |= (1 << OCIE3A);
TCCR3A = 0b01010100;          
OCR3A   = 1;         
TCCR3B =0b00001001;

18,5кГц, кварц на 8 мГц

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

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

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

На OC3B сейчас приходит тактовый сигнал вызывающий прерывание от часов с частотой 1Гц, я так понял не с этим связано, весь таймер уже перечитал, некоторые вещи конечно мне не понятны, например таблица на странице 134 и как ее выставлять, регистров таких нет

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

во первых, если вы используете только выход OC3A от таймера, зачем вы включаете каналы B и C?

TCCR3A = 0b01010100; 

Во вторых, какую таблицу на странице 134 вы имеете в виду? - таблицу 61? это таблица битов регистров TCCRnA и TCCRnB. Если вы не понимаете как их устанавливать - как же вы писали код выше?

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

по таблицам выше, это какая-то обобщенная для двух таймеров что ли

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

3d_killer пишет:

по таблицам выше, это какая-то обобщенная для двух таймеров что ли

не для двух таймеров, а для двух регистров TTCRnA TCCRnB

Вы подписи-то в таблице читайте, там же все написано

3d_killer
Offline
Зарегистрирован: 13.06.2018
TCCR3A = 0b01000000;

А от этого такая частота и осталась

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

3d_killer пишет:

TCCR3A = 0b01000000;

А от этого такая частота и осталась

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

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

Ну таких регистров в одном таймере нет

Timer/Counter1 Control Register A – TCCR1A Timer/Counter3 Control Register A – TCCR3A

это два же таймера

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(3,OUTPUT);
  noInterrupts();
ETIMSK |= (1 << OCIE3A);
TCCR3A = 0b01000000;          
OCR3A   = 1;         
TCCR3B =0b00001001;
  //******************************************************************
  //Запуск таймера
  //******************************************************************
    // Clear registers
 // TIMSK |= (1 << OCIE1A);
 //   TCCR1A = 0b01000000;
 //   OCR1A = 1000;
 //   TCCR1B=0b00001101;
///
 // TIMSK |= (1 << OCIE0);
//  OCR0 = 255;
//  TCCR0=0b00010111;
attachInterrupt(4, INT_4, FALLING);
  interrupts();
  }
void loop() {  
}

это весь

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

3d_killer пишет:

Ну таких регистров в одном таймере нет

каких? в таймере 1 - регистры TCCR1A TCCR1B, в таймере 3 - соответвенно TCCR3A TCCR3B

вы что там, курите?

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

и на каком пине у вас 18 КГц - на пине 3 или на пине 29?

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

Понял, они ниже, как-то хаотично, не курю

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

на пине 3 - 96Гц, на светодиоде 18,5кГц, странно

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

3d_killer пишет:

на пине 3 - 96Гц, на светодиоде 18,5кГц, странно

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

Выключите прерывание по OC3A, оставьте только вывод на пин. И скажите, какая частота на пине 3 после этого

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

отключил тактовый сигнал с часов, проверил осциллографом, ничего не изменилось, это не из-за них

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

3d_killer пишет:

отключил тактовый сигнал с часов, проверил осциллографом, ничего не изменилось, это не из-за них

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

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(3,OUTPUT);
  noInterrupts();
ETIMSK |= (1 << OCIE3A);
TCCR3A = 0b01000000;          
OCR3A   = 1;         
TCCR3B =0b00001001;
  //******************************************************************
  //Запуск таймера
  //******************************************************************
    // Clear registers
 // TIMSK |= (1 << OCIE1A);
 //   TCCR1A = 0b01000000;
 //   OCR1A = 1000;
 //   TCCR1B=0b00001101;
///
 // TIMSK |= (1 << OCIE0);
//  OCR0 = 255;
//  TCCR0=0b00010111;
//attachInterrupt(4, INT_4, FALLING);
  interrupts();
  }
void loop() {  
}

так и идет 96 Гц

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

И сигнал на ней немного корявый меандр с заскоком в минус, может в контроллере дело

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

а измеряете чем?

еще строчку 31 закомментите

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

HANTEK6022BE, на OC0 и OC1A такого не было

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

Так же, щас проц перепаяю у меня их много

 

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

3d_killer пишет:

Так же, щас проц перепаяю у меня их много

 

 Так не бывает. чтобы один таймер работал, а другой нет. Ищите ошибку в коде

TCCR1A TCCR1B перед настройкой выствбьте в ноль

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

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