вопрос по работе таймера ATtiny13

Тема в разделе "Микроконтроллеры AVR", создана пользователем forzub, 13 апр 2016.

  1. forzub

    forzub Нуб

    Добрый день. Решил сделать ИК барьер, в качестве генератора пачек импульсов 36 кГц взял ATtiny13.
    Использовал частоту 4.8 МГц, пределитель = 1. Режим работы -Normal. В прерывании устанавливалось начальное значение счетного регистра (256-Х), где Х - количество тактов соответствовавшее половинке длины импульсов частоты 36КГц.
    Установил флаг инвертирования сигнала на ножке COA при переполнении счетного регистра.

    Что бы проверить выходную частоту (нет осциллографа) решил использовать ардуино мега. Такты с Тини13 подавал на Int0 ардуины и считал количество импульсов за 1000 миллисекунд. В результате получил очень интересный опыт:
    во-первых, начальные значения счетного регистра отличались от расчетных. Х пришлось укоротить примерно в двое.
    во-вторых, частота АТтини установленной на БрэдБоарде почему-то отличается от частоты Аттини впаянной в плату при тех же деталях обвязки, корректировать пришлось программно.
    в-третьих, при попытке установить пределитель в 1/64 и выше, ардуина вообще перестала регистрировать какие-либо импульсы.

    Плиз ответьте, если кто знает причину такого поведения МК. Я пока думаю, как можно проверить другими способами.
     
  2. ostrov

    ostrov Гуру

    Тайминги проверять не охота, надеюсь все верно.

    Прерывание ноги Меги настроено на спад, подъем или изменение?

    Как без осциллографа узнали, что частота изменилась?
     
  3. forzub

    forzub Нуб

    Ноги настроены на подъем, хотя пробовал и спад и изменение.

    Вот вся проблема в отсутствии осциллографа. Идея была посчитать количество прерываний по подъему (спаду) в секунду, что бы хоть приблизительно сориентироваться. Вчера подсоединил на вывод АТтини светодиод и попробовал поиграть с пределителем (на случай, если проблема с ардуиной) При значениях 1/1 и 1/8 светодиод светится, при больших - нет.
    Так же заметил, что если отключить Тини, то int0 ардуины "шумит". Я притянул его к земле 10к резистором, а потом сделал RC цепочку. Шум ушел, но число срабатывай прерывания опять же было не стабильно и значения гуляли от значений емкости. Т.е. как я понимаю, вход ножки прерывания, даже не знаю как описать... непонятно, что считает.
     
  4. ostrov

    ostrov Гуру

    Зачем rc цепочку сделали? Она же импульсы давит. Притянуть не мешает к земле или, лучше, питанию. Расчитать частоту можно при желании довольно точно, особенно если тактоваться МК будет от внешнего кварца. Только надо решить что нужно, равномерные прямоугольники?
     
  5. forzub

    forzub Нуб

    Знаний маловато, где-то увидел, что помогает от "дребезга". Ну пока мне эта ситуация не понятна пробую по всякому )))

    Рассчитать то можно, но поскольку Тини13 работает как-то странно, в данном случае пределитель таймера, хочется все-таки проверить, что на выходе. В теории все просто, а вот на практике постоянно какие-то мелочи всплывают )).
    Мне нужно подавать на светодиод импульсы, что бы он моргал с частотой 36 кГц. Думаю, что идеальность прямоугольности тут не очень важна )
     
  6. ostrov

    ostrov Гуру

    Дребезг это другое, там наоборот нужно пропустить лишние импульсы, а вам их пропускать не нужно.

    Напишите мне в виде тайминга сколько времени должен гореть светодиод и сколько должен не гореть.
     
  7. forzub

    forzub Нуб

    по моим расчетам, 36 кГц это 27,778 мкс.
    следовательно, 13,889 мкс светодиод горит и столько же не горит.
     
  8. ostrov

    ostrov Гуру

    Для таких периодов делитель максимум на 8 может быть использован. При 8Мгц и делителе 8 OCR всего лишь 0s0D. 14 мкс причем округленно будет. Код нужно написать?
     
  9. forzub

    forzub Нуб

    если вас не затруднит, можете мне объяснить принцип использования пределителя, почему только на 8 в данной ситуации? частота 4.8 МГц
     
  10. ostrov

    ostrov Гуру

    Если 4.8МГц, то даже 8 много, нужно оставить 1. Предделитель делит кол во тиков для того, чтобы их было поменьше. Это удобно для случаев, когда требуются длинные периоды, т.к. счетчик ограничен 8 битами (или 16). У вас же период очень маленький, если установить предделитель 64, например, нужное кол-во будет просто пропущено.
     
  11. forzub

    forzub Нуб

    это понятно, не понятно, почему он не генерирует импульсы если установить большее значение.
     
  12. ostrov

    ostrov Гуру

    Вероятно потому, что время на сработку прерывания меньше чем число пропущенных тиков предделителя.
     
  13. forzub

    forzub Нуб

    4,8 МГц -это 0,208 мкс
    количество тактов у меня 256-31 = 225
    пределитель = 64
    время одного такта - 13,312 мкс
    время: 2.9952 мс
    пределитель = 256
    время одного такта - 53,3248 мкс
    время: 11.998 мс

    т.е. времени хватает. я ставил промежуток ожидания - 10 сек.
    видимо или бракованная тини13 или я что-то не знаю (((((
     
  14. ostrov

    ostrov Гуру

    Я сегодня вечером на 85 попробую. Что то вы не то делаете, похоже. Не видел я бракованых AVR, только горелые.

    А частоту как выставили? Фъюзы в студию.
     
  15. forzub

    forzub Нуб

    LOW
    SPIEN - on
    EESAVE- off
    WDTON- off
    CKDIV8- off
    SUT1- on
    SUT0- on
    CKSEL1- on
    CKSEL0- off

    HIGH
    SELFPRGEN- off
    DWEN- off
    BODLEVEL1- off
    BODLEVEL0- off
    RSTDISBL- off
    -----------------------------------------------------

    #include <avr/io.h>
    #include <avr/interrupt.h>


    ISR (TIM0_OVF_vect)
    {

    TCNT0 = 256-66; // 66? 31
    }
    int main(void)
    {
    TCCR0B = 0; // стоп-таймер
    TCCR0A = (0<<COM0A1)|(1<<COM0A0)|(0<<WGM01)|(0<<WGM00);
    // режим Нормал инверсия при переполнении

    TCNT0 = 256-66; // срабатывает каждые 66 тактов
    TIFR0 =(1<<TOV0); // сброс флагов
    TIMSK0 |=(1<<TOIE0); // прерывание при переполнении
    TCCR0B |= (0<<CS02)|(0<<CS01)|(1<<CS00);

    DDRB |= (1<<PB0);
    asm("sei");

    while (1)
    {
    asm("nop");
    }
    }
     
  16. ostrov

    ostrov Гуру

    Фъюзы можно цифрами? Мне так проще и быстрее. LOW и HIGH.
     
    Последнее редактирование: 15 апр 2016
  17. forzub

    forzub Нуб

    LOW
    SPIEN - 0
    EESAVE- 1
    WDTON- 1
    CKDIV8- 1
    SUT1- 0
    SUT0- 0
    CKSEL1- 0
    CKSEL0- 1

    HIGH
    SELFPRGEN- 1
    DWEN- 1
    BODLEVEL1- 1
    BODLEVEL0- 1
    RSTDISBL- 1
     
  18. ostrov

    ostrov Гуру

    Цифрами это: LOW 0xDE, HIGH 0x4F
    И так ошибиться нельзя.
    Приеду домой, проверю все внимательно. Таймеры предпочитаю по совпадению делать, а не по переполнению, но это не суть.
     
    Последнее редактирование: 15 апр 2016
  19. forzub

    forzub Нуб

    сорри. буду знать
     
  20. ostrov

    ostrov Гуру

    Напишите уже. Проблема в том, что где то под 0 и 1 понимают разные установки. Вот например CKDIV8 у вас вкл или выкл я не знаю, а это деление таймера на 8 сразу по умолчанию.