ATtiny85

Тема в разделе "Микроконтроллеры AVR", создана пользователем 47Rus, 7 май 2018.

  1. 47Rus

    47Rus Нуб

    Всем привет!Хочу спросить, почему не работает этот код в тини85?
    В программирование я полный нуль.
    Вот этот код:
    Код (C++):
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/sleep.h>
    #include <util/delay.h>

    #define X1_BIT PB0
    #define X2_BIT PB1

    //Сколько времени должа быть
    //катушка под напругой
    #define ENERGISE_TIME 60

    // global variable to count the number of overflows
    volatile uint16_t tot_overflow;


    volatile uint8_t polarity = 0;

    void tick(void)
    {
      PORTB |= (1 << X1_BIT);
      PORTB &= ~(1 << X2_BIT);
    }

    void tock(void)
    {
      PORTB |= (1 << X2_BIT);
      PORTB &= ~(1 << X1_BIT);
    }

    void reset(void)
    {
      PORTB &= ~(1<< X1_BIT);
      PORTB &= ~(1<< X2_BIT);
    }

    // Отправьте импульс на
    //тактовый модуль
    void pulseClock(void)
    {
      if (polarity == 0) {
        tick();
        _delay_ms(ENERGISE_TIME);
        reset();
        polarity = 1;
      }
      else
      {
        tock();
        _delay_ms(ENERGISE_TIME);
        reset();
        polarity = 0;
      }
    }
    // initialize timer, interrupt and variable
    int timer0_init(void)
        {
        // set up timer with prescaler = 256
        TCCR0B |= (1 << CS02);
     
        // initialize counter
        TCNT0 = 0;
        // enable overflow interrupt
        TIMSK |= (1 << TOIE0);
      // enable global interrupts
       sei();
    // initialize overflow counter variable
        tot_overflow = 0;
     
        }
    ISR(TIMER0_OVF_vect)
      {
      // keep a track of number of overflows
         tot_overflow++;
       }

    int main(void)
       {
    // connect led to pin PC0
         DDRB = (1<<X1_BIT)|(1<< X2_BIT);
      reset();
      // initialize timer
           timer0_init();
       
    // loop forever
          while(1)
        {
     
         // check if the timer count reaches 53
              if (TCNT0 >=135)
                {
    // check if no. of overflows = 12
          if (tot_overflow >= 915)
            {
                   pulseClock();
         
                   TCNT0 = 0;// reset counter
                   tot_overflow = 0;// reset overflow counter
                   }
               }
            }
         }
     
    Последнее редактирование: 7 май 2018
  2. Airbus

    Airbus Радиохулиган Модератор

    Хороший Вопрос!А что должен работать в тини85 ?
     
  3. 47Rus

    47Rus Нуб

    Мне надо включать два порта PB0,PB1 по очереди с интервалом ровно минуту.
     
    Последнее редактирование: 7 май 2018
  4. b707

    b707 Гуру

    И нафига тут прерывания и таймеры? - все можно сделать на миллис и код будет раз в пять короче
     
    Airbus нравится это.
  5. ostrov

    ostrov Гуру

    Делается в несколько строк.
     
  6. 47Rus

    47Rus Нуб

    Это нужно для управления вторичными часами.На катушку часов нужно подовать импульсы.
    Вот я и подумал что таймеры и прерывания будут точней.
     
  7. ostrov

    ostrov Гуру

    millis() тоже отсчитывается прерываниями и delay() тоже. Главное запустить МК от кварца, а не от внутреннего генератора импульсов. В идеале еще сделать коррекцию по температуре, но это уже для перфекционистов. )
     
    Airbus нравится это.
  8. 47Rus

    47Rus Нуб

    Уважаемый ostrov не могли бы, вы на мурмулить код?Без коррекции температуры.
     
  9. ostrov

    ostrov Гуру

    Напишите точно что должно быть.
     
  10. 47Rus

    47Rus Нуб

    На двигатель часов нужно подавать импульсы чередующейся полярности длительностью примерно 100 мс. Каждый импульс перемещает минутную стрелку на одну минуту.К примеру:"PB0=1,PB1=0"через 100мс на портах нули.
    Через минуту:"PB0=0,PB1=1" через 100мс нули.
     
  11. ostrov

    ostrov Гуру

    Делал такие часы башенные, правда не на AVR, а на плате для компа. Сейчас не вспомню название мотор-редуктора уже. А подводить как думаете? У меня они автоматом догоняли или ждали при запуске, смотря что быстрее.
     
  12. ostrov

    ostrov Гуру

    И да, силенок у пина хватит на стрелку сдвинуть? Я не помню сколько там в мА. Или у вас схема с транзисторами? Можно и порт спалить на раз два.
     
  13. ostrov

    ostrov Гуру

    Компа под рукой нет, поэтому нормально оформить не могу и проверить тоже. Попробуйте

    В сетап:
    Код (C++):
    DDRB = 0b00000011;[
    PORTB = 0;
    В луп:
    Код (C++):
    PORTB = 1;
    delay(100); // длительность имульса в мм
    PORTB = 0;
    delay(59900); // ждем до полной мин (60000-импульс)
    PORTB = 2;
    delay(100);
    PORTB = 0;
    delay(59900);
    Это самый простой вариант "в лоб". Можно по разному. А вообще в часах много чего кроме тикалки обычно требуется.
     
    Последнее редактирование: 8 май 2018
  14. 47Rus

    47Rus Нуб

    Пины будут управлять транзисторами.А подвод у них отвёрткой продуман.Так что подвод не нужен.
     
  15. ostrov

    ostrov Гуру

    А, пардоньте, раз в минуту дергать стрелками, значить вместо delay(900) ставим delay(59900). Сами переключения и джамп выполняются за наносекунды, ими можно принебречь.
     
  16. 47Rus

    47Rus Нуб

    Код сверху с tot_overflow в протеусе работает Atmega16 F_CPU = 1000000.Как его в attiny в пихать?
     
  17. ostrov

    ostrov Гуру

    Скомпилить в hex, установить правильные фьюзы и прошить.
     
  18. Airbus

    Airbus Радиохулиган Модератор

    Классный у нас форум.Пишем коды компилим.Еще бы по воздуху прошивать как esp8266.Я вон тоже за 2 дня 2 скетча выдал на гора.Ни думать не хотят ни учиться ни хотя бы погуглить.
     
    ostrov нравится это.
  19. warman

    warman Гик

    Бред про отвертку. Там оно для первоначальной установки. Вряд ли вы будете после каждого сбоя питания бегать подводить на всём шлейфе вторичные часы. Непрактично и неудобно, да и ставит вопрос об адекватности решения.
    В интернете гуглом находятся куда как более корректные автоматизированные решения. Например у Кота на форуме https://radiokot.ru/circuit/digital/home/122/
     
  20. 47Rus

    47Rus Нуб

    Всем спасибо! По совету ostrova прошил мк и заработало!
    warman шлейфа не будет.Это ради спортивного интереса.
     
    Последнее редактирование: 8 май 2018