Этюды для начинающих: blink и без delay, и без millis

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Феерично. Заинтриговался, чего тут так наобсуждали .. неужто ишо новый метод "моргать глазом" уже и без милиса, таймер и вовсе контроллера .. ан нет, всё те же и все об том же ..

Звиняюсь, что вклинился..

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Arhat109-2 пишет:

Феерично. Заинтриговался, чего тут так наобсуждали .. неужто ишо новый метод "моргать глазом" уже и без милиса, таймер и вовсе контроллера .. ан нет, всё те же и все об том же ..

Звиняюсь, что вклинился..

да - усё на конденсаторах и реле. только харкор - в жопу миллис!

Похожее изображение

Smith2007
Offline
Зарегистрирован: 30.10.2017

Новое исследование:

На вход 3 повешена кнопка.

По прерыванию int.0 (pin 3) вызываю процедуру, где происходит инкрементирование переменной. 

Для проверки вывожу значение в терминал.  Работает.

Теперь хочу запрограммировать Timer2 на генерацию прерывания в 1 сек.

d3,11 отключаю

При компиляции выходит ошибка, что переменная TCCR2A не определена

int _count = 0;
int freq = 0;

ISR(TIMER2_COMPA_vect) {
  freq = _count;
  _count = 0;
  Serial.print("freq= "); Serial.println(freq);
}

void signalCount(void) {
  _count++;
  Serial.println(_count);
}
 
void setup() {
    Serial.begin(115200);
    attachInterrupt(0, signalCount, FALLING);
    //TCCR1A = 0;          // Инвертирование пина 9 по сравнению
    //TCCR1A=1<<COM1A0;  // Переключение пина 9 по сравнению
    //TCCR1A=0x50;
    TCCR2A = 0; // Пины 3 и 11 отключаем 

    OCR2A = 15625u; // при делителе 1024, это 1 сек., если я нигде не лажанулся
    TIMSK2 = bit(OCIE2A);   // Разрешаем прерывание по сравнению с OCR2A
    TCCR2B = bit(CS22) | bit(CS21) | bit(CS20);  // Установить СТС режим и делитель частоты
 }
 
void loop() {}

Как в таком случае добраться до регистров второго таймера?

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Smith2007 пишет:

Теперь хочу запрограммировать Timer2 

А он у Вас есть?

Какой у Вас контроллер? Я уже как-то спрашивал, но Вы не ответили.

Smith2007
Offline
Зарегистрирован: 30.10.2017

Arduino Leonardo

BN: Arduino Leonardo
VID: 2341
PID: 8036
SN: (null)
ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Это не котроллер - это плата.

Обычно леонардо делают на базе ATmega32u4 (хотя, если клон, то там может стоять что угодно). 

Так вот, если у Вас действительно ATmega32u4 (убедитесь!), так и смотрите её даташит, а не ATmega328, который я Вам давал.

Открываем и смотрим. Таймеры №№ 0, 1, 3 и 4 есть, а таймера 2 - нету :(

так что никак Вы до него не доберётесь :(

P.S. Справедливости ради, он там есть, только недокументирован, но это не для игроков из Вашей лиги. Пока считайте, что его нет.

Smith2007
Offline
Зарегистрирован: 30.10.2017

Спасибо за информацию.

Да, действительно в описании есть таймеры 0,1,3,4. Таймера 2 - нет.

Стандартные функции ардуино какие таймеры используют? Тотже millis?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Smith2007, даже если бы вы запустили этот таймер недокументированными командами у вас всё равно бы ничего не получилось, т.к. он 8-битный. А вы хотели записать в его регистр 15625

Smith2007
Offline
Зарегистрирован: 30.10.2017

dimax пишет:

Smith2007, даже если бы вы запустили этот таймер недокументированными командами у вас всё равно бы ничего не получилось, т.к. он 8-битный. А вы хотели записать в его регистр 15625

Предпочту все же документированные возможности.

Переделал на timer3. Все сразу заработало. Собрал новую схему с новой программой. Пока не приехали  генератор с осцилографом - сложно чего-то отлаживать. Но я упрямый и буду дальше изучать.

Не до конца понимаю режимы WGMnx. Таймер правильно отрабатывает прерывание при WGM = 0100  (WGM32 в 1)

sim31
sim31 аватар
Offline
Зарегистрирован: 26.07.2017

Smith2007 пишет:

Переделал на timer3. Все сразу заработало. Собрал новую схему с новой программой. Пока не приехали  генератор с осцилографом - сложно чего-то отлаживать. Но я упрямый и буду дальше изучать.

Не до конца понимаю режимы WGMnx. Таймер правильно отрабатывает прерывание при WGM = 0100  (WGM32 в 1)

Поможет Proteus для эмуляции МК и Codevision AVR для конфигурирования микроконтроллера. Мне связка очень помогла в настройке таймеров, в Codevision можно режимы работы таймеров мышкой выбрать, а в Proteus проверить нет ли ошибок, даже к даташиту обращаться не нужно.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

sim31 пишет:

 даже к даташиту обращаться не нужно.

Красота!

batu
Offline
Зарегистрирован: 27.08.2013

Привет! Хорошие материалы делаешь. Хотел бы пообщаться. Не нашел как здесь в личку написать.. Можно в скайпе пообщаться. Есть предложение. skype batu1955

leks
Offline
Зарегистрирован: 22.10.2017
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Arduino UNO
//
////////////////////////
//
// Программа мигания светодиода /
//

unsigned int n = 0;

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

void loop()
{
    for (n = 0; n <= 50000; n++)
      {
        digitalWrite(13, HIGH);
      }
    for (n = 0; n <= 50000; n++)
      {
         digitalWrite(13, LOW);
      }
}

//
// Конец /
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Вот так начинал знакомство с Ардуино несколько месяцев назад.