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

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

  1. forzub

    forzub Нуб

    я сейчас разбираюсь, как это делается. я смотрю на бит SPIEN и сравниваю со своим значением, а фьюзы беру с сайта "паятель"
     
  2. ostrov

    ostrov Гуру

    Блин у меня нет Аттини13, есть Аттиня85 только. А у нее другие частоты внутренние 6,4 и 8Мгц. Может вам переключить на 8, чтобы совпало?
     
  3. forzub

    forzub Нуб

    я могу на 9.6, 4.8 и 1,2 МГц
    сейчас попробовал частоту 1.2 и пределитель 1/64. не работает.
    пересчитал частоту.
    при пределителе 1/1 похоже - 1,295 МГц
    а при 1/8 - 1.592МГц

    делит, что ли неправильно? ))
     
    Последнее редактирование: 14 апр 2016
  4. ostrov

    ostrov Гуру

    В общем я попробовал сделать на Attiny85, скорее всего у 13 таймеры такие же, надо просто подогнать цифры к вашей частоте. Могу попробовать. Получилась вот такая программка:
    Код (C++):
    //8Мгц E2, DF

    void setup() {
      DDRB = 0b00011111;

      cli();
      TCCR0A = 0b10000010;     // A при совпадении в 0
      TCCR0B = 0b00000001;     // 1
      OCR0A = 0x72;           // 13.8ms
      TIMSK = 0b00010000;       // прерывание А
      sei();
    }

    void loop() {
      while (1);
    }

    ISR(TIMER0_COMPA_vect)//обработчик прерывания по совпадению А таймера 1, счетчик сбрасывается в 0
    {
      PORTB = PORTB ^ 0b00001111;
    }
     
    Анализатор показывает 36КГц практически очень точно. Если нужно до наносекунд, можно поиграть с OSR0A или откалибровать внутренний генератор через регистр OSCCAL.

    [​IMG]
     
  5. ostrov

    ostrov Гуру

    Для 13 попробуйте так. Установите фъюзы low: 0x79, high: 0xFF. Залейте вот эту программку (мигать будет ногой 1, которая напротив земли):
    Код (C++):

    // Attiny13
    //4.8Мгц 0x79, 0xFF

    void setup() {
      DDRB = 0b0000000010;

      cli();
      TCCR0A = 0b10000010;     // A при совпадении в 0
      TCCR0B = 0b00000001;// 1
      OCR0A = 0x3D; // 13.96ms
      TIMSK0 = 0b00000100;// прерывание А
      sei();
    }

    void loop() {
    }

    ISR(TIM0_COMPA_vect)//обработчик прерывания по совпадению А таймера 1, счетчик сбрасывается в 0
    {
      PORTB = PINB ^ 0b00000010;
    }
     
     
    Последнее редактирование: 15 апр 2016
  6. forzub

    forzub Нуб

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

    можете расшифровать мне фьюзы. я пока не понимаю как их записывать в таком виде?
     
    Последнее редактирование: 14 апр 2016
  7. ostrov

    ostrov Гуру

    Я не знаю какой программатор вы юзаете, но любой показывает фъюзы в виде цифр. Убедитесь, что стоят именно те, которые я написал. Вот на примере аврдудла:

    [​IMG]
     
  8. forzub

    forzub Нуб

    у меня такой))
    upload_2016-4-14_23-52-54.png
     
  9. ostrov

    ostrov Гуру

    Нормальный поставьте, который показывает сумму.

    Нашел я у себя таки Attiny13, проверил, все работает (см. выше).

    [​IMG]
     
  10. forzub

    forzub Нуб

    спасибо. Я понял, что для меня сейчас весь вопрос сводится к тому, что бы найти лог анализатор, как у вас)))
    кстати, вы не пробовали пределитель изменять. я так и не понимаю, почему при увеличении делителя перестают идти импульсы?((
     
  11. ostrov

    ostrov Гуру

    Потому что даже при /8 начнутся искажения порядка 30%. Найдите калькулятор таймеров, я вот поставил на планшет, хорошо и быстро видно все.
     
  12. ostrov

    ostrov Гуру

    Заработал генератор то? Интересно же напрасны труды или нет?
     
  13. forzub

    forzub Нуб

    только вечером смогу попробовать. Только проконтролировать опять же будет не на чем. Заказал сегодня такой же аналоговый анализатор, правда приедет не скоро )))
    )))) бог с ними, с 30%. эта штука сама физически не выдает импульсы при увеличении. Мне интересно почему.
     
  14. ostrov

    ostrov Гуру

    С чего взяли что не ввдает то? Может выдает? Если мониторите светодиодом, то на такой частоте глазами ничего не увидишь.
     
  15. forzub

    forzub Нуб

    Я думаю, что то светодиод должен хоть как-то но светиться. Хоть тускло, но должен. Уж очень получаются небольшие временные промежутки. Но ни Ардуина, ни светодиод не подают никаких признаков жизни. Судя по всему - так никак быть не должно, ну и на то, что аттини подпаленная, тоже сомнения есть ))) короче - сюр какой-то )))
    кстати, там в таймере есть два регистра сравнения, зачем именно два? Получается только для двух каналов ШИМ с одинаковой частотой, так, что ли?
     
  16. ostrov

    ostrov Гуру

    Нефига он не светится, что характерно. Хотя по приборам - должен!
     
  17. forzub

    forzub Нуб

    странно... загрузил вашу прогу... на ардуине все по нулям (((
     
  18. ostrov

    ostrov Гуру

    Какой Ардуине? Написано под Аттини13!
     
  19. ostrov

    ostrov Гуру

    А, на Ардуине имитирующей анализатор? Может проблемы в ней? Программа может там какая то не такая?
     
  20. forzub

    forzub Нуб

    я же об этом и говорил, что нечем частоту измерить, присоединил для этих целей ардуину и через прерывание считал импульсы )))))

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

    даже пределитель нормально начал делить на 64, 256 и 1024 )))) что-то я с этой функцией таймера совсем запутался. это явно не потому, что счетный регистр в ручную устанавливался. не потому же, что нормал.... отличие только в том, что ножка была подключена к таймеру. ну не могло же из-за этого....


    программа ардуино простая:
    void setup() {

    attachInterrupt(1, rpm, RISING);
    Serial.begin(9600);
    tval=micros();
    flag11=0;
    }
    void rpm()
    {
    val++;
    }

    void loop() {
    // put your main code here, to run repeatedly:
    if ((micros()-tval)>=1000000)
    {
    if (flag11==2)
    {
    Serial.print(val1);

    }
    Serial.print(" rpm ");
    Serial.print(val);
    Serial.print(" val ");
    Serial.println((micros()-tval));
    val =0;
    tval=micros();
    }
    }
     
    Последнее редактирование: 16 апр 2016