ARDUINO Проблемы с таймерами

tushonca

✩✩✩✩✩✩✩
27 Июл 2024
3
0
Здравствуйте великие форумчане, битый час мучаюсь с регистром TCCR1B у первого таймера 328 меги, всё хорошо, но 1 беда, таймер даже не пытается тактироваться, регистры CS12 CS11 CS10 тупо нехотят записываться, при чтении получаю бред полный (целых 2 бита в CS12), испробовал кучу вариантов записи, в регистры , ничего не помогает, оно тупо не хочет их писать, решил, может нанка бракованная, взял другую результат тот же. Что самое странное, это то, что первая половина регистра работает исправно, пишется, читается, но именно эти 3 бита нехотят! Прошу помочь.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
531
158
Приведите короткий полный пример кода, где вы пишите в TCCR1B , потом читаете из TCCR1B и отправляете прочитанное в serial.
Serial.println(TCCR1B, HEX);
И напишите, что получаете от Serial в мониторе COM порта.
 

tushonca

✩✩✩✩✩✩✩
27 Июл 2024
3
0
Timer1Tests:
void timerSetup() {

  TCCR1A = (0<<COM1A1) | (1<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10); // CTC, togling OC1A

  TCCR1B = (1<<ICNC1) | (1<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10); // CTC, no clock

  TCCR1C = (1 << FOC1A) | (1 << FOC1B);

}



void timer1SetFreq(unsigned int newFreq) {

  OCR1AH = (newFreq & 0b1111111100000000) >> 8;

  OCR1AL = (newFreq & 0b0000000011111111);

}



byte tmr1clckTypes[6] = {00000000, 00000001, 00000010, 00000011, 00000100, 00000101}; // 0 - off, 1 - /1, 2 - /8, 3 - /64, 4 - /256, 5 - /1024

void timer1SetPresc(byte prescalerMode) {

  bool a = (tmr1clckTypes[prescalerMode] & 00000100) >> 2;

  bool b = (tmr1clckTypes[prescalerMode] & 00000010) >> 1;

  bool c = tmr1clckTypes[prescalerMode] & 00000001;

  TCCR1B = (a << CS12) | (b << CS11) | (c << CS10);

}
Здравствуйте, вот мой код, который я писал по описанию регистров в даташите, неработает только запись в биты при этом я пробовал разные конструкции (в том числе подобное: TCCR1B |= 0000101) но всё время при вызове Serial.println(CS12, BIN) я получаю 10, при вызове Serial.println(CS11, BIN) получаю 1, а при Serial.println(CS10, BIN) всегда получаю 0, также при попытке прочтения всего TCCR1B (Serial.println(TCCR1B, BIN)) получаю 1000.
Также при попытке прочитать регистры до вызова функций я получаю одно и тоже (10 1 0 1000)

Забыл уточнить, компилировал с разными ядрами (original core, GyverCore), и заливал на разные платы, всё равно результат - незаписываемые биты.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
531
158
@tushonca,
> но всё время при вызове Serial.println(CS12, BIN) я получаю 10
Потому, что CS12 это константа равная 2 и это порядковый номер бита CS12 в байте TCCR1B
Прочитайте например
 

bort707

★★★★★★✩
21 Сен 2020
3,109
918
таймер даже не пытается тактироваться
А чего вы ожидали, если вы во все регистры тактирования пишете нули?
TCCR1B = (1<<ICNC1) | (1<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10); // CTC, no clock
У вас же даже в комментарии написано - "no clock" - и это правда, при таких значениях регистра таймер остановлен.

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

tushonca

✩✩✩✩✩✩✩
27 Июл 2024
3
0
@bort707, это функции, которые я использовал, а после в void setup я их вызывал по очереди, пример:
C++:
void setup() {
  timer1Setup();
  timer1SetFreq(65000);
  timer1SetPresc(5);
}
@tushonca,

Потому, что CS12 это константа равная 2
А вот про это я думал, но значит читаю неправильно.

Проблема решена, я как всегда забыл про великий PORTD (ну или pinMode()) извиняюсь за просто так созданную тему

Извиняюсь, не PORTD, а DDRD