На OC3B сейчас приходит тактовый сигнал вызывающий прерывание от часов с частотой 1Гц, я так понял не с этим связано, весь таймер уже перечитал, некоторые вещи конечно мне не понятны, например таблица на странице 134 и как ее выставлять, регистров таких нет
во первых, если вы используете только выход OC3A от таймера, зачем вы включаете каналы B и C?
TCCR3A = 0b01010100;
Во вторых, какую таблицу на странице 134 вы имеете в виду? - таблицу 61? это таблица битов регистров TCCRnA и TCCRnB. Если вы не понимаете как их устанавливать - как же вы писали код выше?
я сейчас чистую программу создал там только это
ISR(TIMER0_COMPA_vect) { digitalWrite(36, digitalRead(36) ^ 1); } void setup() { noInterrupts(); TIMSK |= (1 << OCIE0); OCR0 = 0b00011011; TCCR0=0b00011011; // interrupts(); }Просто пытаюсь его запустить, по документации вроде все верно, вместо сравнения добавил в двоичном виде
Только так, в документации, переделал, но толку нет
TIMER0_COMP_vect
а не стартанул
ну теперь с выводом буду разбираться, этот таймер на прерывание, по времени, а первый на ножку OC1A,
вот так он должен работать 1 секунда, а на ослике 3,9 кГц меньше получить не удается
Вот так
19Гц, меньше не получить?
OCR0 = 7812; А ничего что OCR0 8 битный ??? 255 - максимум что можно туда записать !
С вашими познаниями лезть в прерывания и управление таймерами через регистры - РАНОВАТО !
Вот так вроде должны быть но там пусто
Да я уже понял что это предел, забыл что он 8 битный
Вот так вроде должны быть но там пусто
Надо ногу на ВЫВОД перенастроить !!!
7812 = 0x1E84
В регистр попадает 0x84, а можно 0xFF
Ну так по документации, должна менять состояние 1 же добавил на COM00
но тогда на светодиоде становится 3,9 кГц, а на этой лапке пусто
Ну так по документации, должна менять состояние 1 же добавил на COM00
Она меняет состояние - но нога по умолчанию ВХОД со всеми вытекающими...
Понял, сейчас попробую
8000000/(1024*256)~30 вызовов прерывания и 15 Гц на светодиоде
Да, заработала, спасибо
Вы даташит через строку читаете или через страницу ?
"note that the Data Direction Register (DDR) bit corresponding to OC0 pin must be set in order to enable the output driver"
Всем огромное спасибо за напутствие и за то что заставили доки читать, запустил 3 таймера
Извиняюсь, дальше разбираюсь с таймерами, решил все попробовать и опять не пойму почему не работает на лапку третий таймер
Все написал как в документации, обработчик прерывания поставил и светодиод мигает, но на лапу OC3A вывода нет, порт как выход я объявил.
CTC не включен !
WGM32 должен быть 1 => TCCR3B =0b000001011;
Все равно тишина
#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() { }У вас ноги не той системы видимо !
pinMode(3,OUTPUT);
PE, // PE3 ** D3
Походу да, заработало, спасибо
но на лапу OC3A вывода нет, порт как выход я объявил.
и как вам после этого помогать?
У вас ноги не той системы видимо !
да у него никакой нет. В коде всего 4 пинМоде, ровно по числу пинов прерываний. То есть выход OC3A он даже не пытался обьявлять
еще я не понял почему при такой настройке у меня на выходе
18,5кГц, кварц на 8 мГц
У меня открыты несколько скетчей, перепутал, извиняюсь
На OC3B сейчас приходит тактовый сигнал вызывающий прерывание от часов с частотой 1Гц, я так понял не с этим связано, весь таймер уже перечитал, некоторые вещи конечно мне не понятны, например таблица на странице 134 и как ее выставлять, регистров таких нет
во первых, если вы используете только выход OC3A от таймера, зачем вы включаете каналы B и C?
Во вторых, какую таблицу на странице 134 вы имеете в виду? - таблицу 61? это таблица битов регистров TCCRnA и TCCRnB. Если вы не понимаете как их устанавливать - как же вы писали код выше?
по таблицам выше, это какая-то обобщенная для двух таймеров что ли
по таблицам выше, это какая-то обобщенная для двух таймеров что ли
не для двух таймеров, а для двух регистров TTCRnA TCCRnB
Вы подписи-то в таблице читайте, там же все написано
А от этого такая частота и осталась
А от этого такая частота и осталась
весь код выкладывайте. Только проследите, чтобы выложить именно то, что у вас дает эту частоту, а не из "соседнего окна".
Ну таких регистров в одном таймере нет
Timer/Counter1 Control Register A – TCCR1A Timer/Counter3 Control Register A – TCCR3A
это два же таймера
#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() { }это весь
Ну таких регистров в одном таймере нет
каких? в таймере 1 - регистры TCCR1A TCCR1B, в таймере 3 - соответвенно TCCR3A TCCR3B
вы что там, курите?
и на каком пине у вас 18 КГц - на пине 3 или на пине 29?
Понял, они ниже, как-то хаотично, не курю
на пине 3 - 96Гц, на светодиоде 18,5кГц, странно
на пине 3 - 96Гц, на светодиоде 18,5кГц, странно
на светодиоде ничего странного, прерывание имеет заметную длительность и быстрее некоей частоты вызываться в принципе не может.
Выключите прерывание по OC3A, оставьте только вывод на пин. И скажите, какая частота на пине 3 после этого
отключил тактовый сигнал с часов, проверил осциллографом, ничего не изменилось, это не из-за них
отключил тактовый сигнал с часов, проверил осциллографом, ничего не изменилось, это не из-за них
ерундой не занимайтесь, сделайте то, что я сказал выше.
#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 Гц
И сигнал на ней немного корявый меандр с заскоком в минус, может в контроллере дело
а измеряете чем?
еще строчку 31 закомментите
HANTEK6022BE, на OC0 и OC1A такого не было
Так же, щас проц перепаяю у меня их много
Так же, щас проц перепаяю у меня их много
Так не бывает. чтобы один таймер работал, а другой нет. Ищите ошибку в коде
TCCR1A TCCR1B перед настройкой выствбьте в ноль
другой контроллер впаял новый, картина та же