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

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

3d_killer пишет:

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

а теперь поменяйте на таймер3 и пин на 3.

НИЧЕГО НЕ ДОБАВЛЯЙТЕ

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

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

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

поменял, тоже 4 Мгц на OC3A

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

только на нулевом 31.25кГц

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

3d_killer пишет:

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

да нет, дело не в этом.

Похорошему надо начинать с обнуления регистров, чтобы предыдущие настройки не мешали. Но в данном случае это не имеет значения

 

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

3d_killer пишет:

TCCR0 =0;
TCCR0=0;
TCNT0 =0;
  TIMSK |= (1 << OCIE0);
  OCR0 = 1;
  TCCR0=0b00010001;

только на нулевом 31.25кГц

на 16 МГц так и должно быть, читайте даташит внимательнее. Если CTC включите - будет 4 МГц, как на других таймерах

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

Вот тут не понял, делителя нет, предел счетчика 1, одинаково же должно быть

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

3d_killer пишет:

Вот тут не понял, делителя нет, предел счетчика 1, одинаково же должно быть

СТС забыли

3d_killer пишет:

Вот тут не понял, делителя нет, предел счетчика 1

без СТС предел счетчика 255

16 МГц / (256 *2) = 31.25 КГц

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

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

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

да не за что

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Все элементарно.
Кто то читает по диагонали и невнимательно.
Тема уже не единожды обсуждалась на форуме.
При заливке ЛЮБОГО скетча, он подстраивает таймеры на нужные ему частоты. Для запуска tone()/millis() и тд и тп.
Соответственно без предварительного обнуления регистра, устанавливать в нем биты бессмысленно...

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

3d_killer пишет:

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

Жаль что вам мозг нельзя перепаять так же быстро...

 

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

Вы очень любезны

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

А как еще ? Настроить прерывания от таймера на 4 такта = 2 Мгц и ждать их в прерывании, где внутри digitaRead digitalWrite - это нонсенс !

Голое прерывание на АСМ с одним SBI и одним RETI и то не каждый раз срабатывает при 24 тактах таймера !!!

	.cseg
	.org	0
	JMP	Start
	.org	OC3Aaddr
	SBI	PINF,PF0
	RETI

Start:
	CLR	R16
	OUT	SREG,R16
	LDI	R16,high(RAMEND)
	OUT	SPH,R16
	LDI	R16,low(RAMEND)
	OUT	SPL,R16
	SBI	DDRE,PE3
	LDI	R16,(1<<PF0)
	STS	DDRF,R16
	LDI	R16,(1<<OCIE3A)
	STS	ETIMSK,R16
	LDI	R16,high(11)
	STS	OCR3AH,R16
	LDI	R16,low(11)
	STS	OCR3AL,R16
	LDI	R16,(1<<COM1A0)
	STS	TCCR3A,R16
	LDI	R16,(1<<WGM32)|(1<<CS30)
	STS	TCCR3B,R16
	SEI

Loop:
	RJMP	Loop

;====================================================================

Только при 26 (меняем 11 на 12) тактах начинает работать правильно ! Из них полезных всего 2 !!!

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

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

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

Komandir, да не о прерываниях речь.

Тут другое интересно. Один и тот же код - из сообщения #114 - по словам ТС сначала выдавал 96 Гц, а потом когда я достал Нану и  доказал человеку, что код рабочий - и у него стал генерить 4 МГц, как положено :)

3d_killer Ну как так-то?

Подозреваю, что вы опять что-то перепутали и либо запускали не этот код или измеряли частоту на неверном пине или еще что... не обижайтесь, но нельзя быть настолько невнимательным. Когда вы делаете совсем не то, что пишете - найти ошибку очень трудно.

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

Если режим работы таймера меняется, то первым делом надо таймер остановить - выставить все биты делителя в 0. Поменять настройки и потом включать.

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

не, и пин верный и код я запускал тот который присылал, после добавления данных строк заработало же

TCCR0 =0;
TCCR0=0;
TCNT0 =0;

 

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

3d_killer пишет:

не, и пин верный и код я запускал тот который присылал, после добавления данных строк заработало же

TCCR0 =0;
TCCR0=0;
TCNT0 =0;

Код, который я вам выкладывал в сообщении 114 - уже содержит эти строчки. Но он, по вашему уверению, у вас не работал. Так что либо вы вчера врали. что запускали мой код, либо вы неисправимый путаник и ваши руки делают не то, о чем думает голова.

 

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

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

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

больше ничего нет, он опять 95 Гц выдает, ппц какой-то

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

вчера заработало, сегодня не работает я честно в растерянности 

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

3d_killer пишет:

вчера заработало, сегодня не работает я честно в растерянности 

про то и говорю. Нет у вас уверенности в том, что вы делаете - потому ничего и не выходит.

Но я больше с вами ночами сидеть не буду,  сами косяк ищите.

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

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

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

Выслал HEX - 2 МГц на OC3A

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

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

...дело было не в бобине...)))

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

А что с фьюзами ? Внешний кварц - все cksel и sut надо поднимать.

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

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

//#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 =0;
TCCR3B=0;
TCNT3 =0;
TCCR3A = 0b01000000;          
OCR3A   = 1;         
TCCR3B =0b00001001;
  //******************************************************************
  //Запуск таймера
  //******************************************************************
    // Clear registers
TCCR1A =0;
TCCR1B=0;
TCNT1 =0;
  TIMSK |= (1 << OCIE1A);
    TCCR1A = 0b01000000;
    OCR1A = 1;
    TCCR1B=0b00001001;
///
TCCR0 =0;
TCCR0=0;
TCNT0 =0;
  TIMSK |= (1 << OCIE0);
  OCR0 = 1;
  TCCR0=0b00011001;
//attachInterrupt(4, INT_4, FALLING);
  interrupts();
}
void loop() {  
}

вчера, то есть это было уже сегодня в 2 или 3 ночи не помню, все выходы заработали как выставлено, а теперь не работает, то есть выход на лапы есть но совсем что-то не то что выставлено 

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

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

#include <DS3231.h>               //Часы
DS3231  rtc(SDA, SCL);
#include <avr/wdt.h>
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() 
  {
    wdt_reset();
    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);
  cli();
  TIMSK =0;
  ETIMSK =0;
  attachInterrupt(4, INT_4, FALLING);
  //
  TCCR3A =0;
  TCCR3B=0;
  ETIMSK |= (1 << OCIE3A);
  TCNT3 =0;
  TCCR3A = 0b01000000;          
  OCR3A   = 78;         
  TCCR3B =0b10001011;
  //
  TCCR1A =0;
  TCCR1B=0;
  TCNT1 =0;  
  TIMSK |= (1 << OCIE1A);
  TCCR1A = 0b01000000;
  //OCR1A = 78;
  OCR1A = 0;
  //TCCR1B=0b10001011;
  TCCR1B=0b10001001;
  //
  TCCR0 =0;
  TCCR0=0;
  TCNT0 =0;
  TIMSK |= (1 << OCIE0);
  OCR0 = 156;
  TCCR0=0b00011111;  
  sei();
  wdt_enable(WDTO_2S);
}
void loop() 
{
    
}

 

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

это вот тут вы пытаетесь 1600 Гц получить или где?

//
  TCCR1A =0;
  TCCR1B=0;
  TCNT1 =0;  
  TIMSK |= (1 << OCIE1A);
  TCCR1A = 0b01000000;
  //OCR1A = 78;
  OCR1A = 0;
  //TCCR1B=0b10001011;
  TCCR1B=0b10001001;

ничего похожего не вижу.

Вы даташит-то прочитали или продолжаете вслепую биты в регистрах тасовать? Зачем в TCCR!B старший бит используется, посмотрите.

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

Да прочитал я все, я не имел в виду именно 1600, любую частоту которую я выставляю, осликом вижу в 2 раза меньшую.

Вобще как-то странно работает, вот например весь код:

#include <DS3231.h>               //Часы
DS3231  rtc(SDA, SCL);
#include <avr/wdt.h>
#include <DS3231.h>               //Часы
Time times;
ISR(TIMER3_COMPA_vect)
{
  //digitalWrite(29, digitalRead(29) ^ 1);
  //Serial1.println(TCNT3);
}
ISR(TIMER0_COMP_vect)
{
  //digitalWrite(36, digitalRead(36) ^ 1);
}
ISR(TIMER1_COMPA_vect)
{
  //digitalWrite(30, digitalRead(30) ^ 1);
}
ISR(TIMER2_COMP_vect)
{
  //digitalWrite(31, digitalRead(31) ^ 1);
}
ISR(INT4_vect)
{
  wdt_reset();
  //digitalWrite(32, digitalRead(32) ^ 1);
}
void setup() {
  rtc.begin();
  rtc.setOutput(OUTPUT_SQW);
  rtc.setSQWRate(SQW_RATE_1);
  Serial.begin(19200);
  Serial1.begin(19200);
  // put your setup code here, to run once:
  pinMode(29, OUTPUT);
  pinMode(30, OUTPUT);
  pinMode(31, OUTPUT);
  pinMode(32, OUTPUT);
  pinMode(36, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,INPUT);
  pinMode(15,OUTPUT);
  cli();
  TIMSK =0;
  ETIMSK =0;
  EICRB = (1<<ISC41);  // Setting it equal is good here *IF* you want to ensure all other bits are clear, in this test code we do
  EIFR |= (1<<INTF4);  // Write a 1 to clear any possible pending interrupt
  EIMSK = (1<<INT4);
  //attachInterrupt(4, INT_4, FALLING);
  //
  TCCR3A =0;
  TCCR3B=0;
  ETIMSK |= (1 << OCIE3A);
  TCNT3 =0;
  TCCR3A = 0b01000000;          
  OCR3A   = 78;         
  TCCR3B =0b10001011;
  //
  TCCR1A =0;
  TCCR1B=0;
  TCNT1 =0;  
  TIMSK |= (1 << OCIE1A);
  TCCR1A = 0b01000000;
  OCR1A = 78;
  TCCR1B=0b10001011;
  //
  TCCR0 =0;
  TCCR0=0;
  TCNT0 =0;
  TIMSK |= (1 << OCIE0);
  OCR0 = 15;
  TCCR0=0b00011111;
  //
  //TCCR2=0;
  //TCNT2 = 0; 
  //TIMSK = (1<<OCIE2);
  //TCCR2=0b00101100;
  //OCR2 = 100;
  sei();
  wdt_enable(WDTO_2S);
}
void loop() 
{
  delay(3000);
  cli();
  TCCR1A =0;
  TCCR1B=0;
  TCNT1 =0;  
  TIMSK |= (1 << OCIE1A);
  TCCR1A = 0b01000000;
  OCR1A = 178;
  TCCR1B=0b10001011;
  sei();
}

 

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

когда я включаю таймер2, то ложится все, отдельно он отлично работает, далее в таком виде в loop, выставление другой частоты не работает, а стоит мне закомментировать таймер 3, то то, что находится в loop начинает работать, это как так вообще может быть?

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

3д киллер, я больше не буду вам помогать, потому что это бесполезно. Вы не слушаете ничего того, что вам говорят .
Вы задаете вопрос про одно, а код выкладываете про другое. Как я могу ответить,почему частота неверная, если вы не показали код, как ее настраиваете?
И вечно эта неряшливость в коде. Какие-то закомментированные куски, пустые прерывания, всякий мусор...
Вам писали уже про прерывания, я только что писал про лишние биты... И что - опять херня в коде.

Я долго терпел, но надоело. Трахайтесь сами.

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

подавление шума

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

убрал его, ничего не поменялось. Просто я его ставил, пробовал, так как не работает

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

3d_killer пишет:

подавление шума


какого нахер шума? Вы идиот? Это работает только в режиме захвата! Где у вас захват в коде?Вы когда даташит прочитаете?

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

Короче, нахер. Когда ДШ выучите наизусть - тогда приходите.

3d_killer
Offline
Зарегистрирован: 13.06.2018
  TCCR3A =0;
  TCCR3B=0;
  ETIMSK |= (1 << OCIE3A);
  TCNT3 =0;
  TCCR3A = 0b01000000;          
  OCR3A   = 78;         
  TCCR3B =0b00001011;
  //
  TCCR1A =0;
  TCCR1B=0;
  TCNT1 =0;  
  TIMSK |= (1 << OCIE1A);
  TCCR1A = 0b01000000;
  OCR1A = 78;
  TCCR1B=0b00001011;
  //
  TCCR0 =0;
  TCCR0=0;
  TCNT0 =0;
  TIMSK |= (1 << OCIE0);
  OCR0 = 78;
  TCCR0=0b00011011;

вот все по документации, должны работать одинаково, OC1A - 800Гц,OC3A - 800Гц, OC0 - 1600Гц

 

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

а не, у них нет делителя 32

  //
  TCCR3A =0;
  TCCR3B=0;
  ETIMSK |= (1 << OCIE3A);
  TCNT3 =0;
  TCCR3A = 0b01000000;          
  OCR3A   = 78;         
  TCCR3B =0b00001011;
  //
  TCCR1A =0;
  TCCR1B=0;
  TCNT1 =0;  
  TIMSK |= (1 << OCIE1A);
  TCCR1A = 0b01000000;
  OCR1A = 78;
  TCCR1B=0b00001011;
  //
  TCCR0 =0;
  TCCR0=0;
  TCNT0 =0;
  TIMSK |= (1 << OCIE0);
  OCR0 = 78;
  TCCR0=0b00011100;

вот так все на 64