Чек сопротивление с пина ATtiny13

Тема в разделе "Микроконтроллеры AVR", создана пользователем Hottab, 6 фев 2015.

  1. Hottab

    Hottab Нерд

    Всем привет! Есть небольшое устройство для включение ПК, собирал его на ардуине, но для эксплуатации выходит дороговато, решил перенести всё на ATtiny13, небольшие проблемы возникли с языком AVR каким образом можно запускать светодиод, в зависимости от сопротивления фото сенсора? На языке Ардуино всё выглядит так:
    Код (Text):

    int led = 2;
    int sens = 0;

    void setup(){
      analogReference(DEFAULT);
      pinMode(led, OUTPUT);
    }
    void loop(){
      int  val = analogRead(sens);
      if(val >= 700){
        digitalWrite(led,HIGH);
        delay(300);
        digitalWrite(led,LOW);
        delay(60000);
      }
    }
     
    А как же это будет в AVR студии, пока сделал ту же функцию, но включение не от аналогового сигнала, а от простого сигнала, подскажите как изменить на код с ардуино, спасибо!
    Код (Text):
    #define F_CPU 9600000 //частота Tiny13
    #include <avr/io.h> //библиотека AVR
    #include <util/delay.h> // библиотека задержки времяни

    int main(void) //иноциализация микроконтроллера
    {
        DDRB = 0b110111; /*3-я ножка будет работает на вход цифравого
        сигнала, остальные на выход.*/
        PORTB = 0b001000;//перед началом цикла даём на все ножки 0, кроме входящей ножки
        while(1) //бесконечный цикл, пока будут выполнятся условия.
        {
            if (!bit_is_clear(PINB, 3)) //выполнять условия если на 3-ю ножку поступит сигнал
            {
                PORTB = (0 << 2)|(1 << 1)|(0 << 0); //сигнал на ножку PB6.
                _delay_ms(300); //задержка 300мс.
                PORTB = 0b000000; //отключаем сигнал
                _delay_ms(6000); //задержка 6000мс.
            }
        }
    }
     
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    дорого - понятие относительное. Купи клон Arduino Mini (в России 320 р. самовывоз, в Китае 90 р. с учетом доставки).
     
  3. Hottab

    Hottab Нерд

    ATtiny13 25р_)
     
  4. Hottab

    Hottab Нерд

    Мне для ИТ проекта, всё нужно преподнести наиболее выгодно коммерческой стороны да и дивайс нужно собрать в плату 1, я не ардуино плату же буду прикреплять к плате своего дивайса) Если только МК вытащить с неё
     
  5. geher

    geher Гуру

    1. AtTiny можно программировать через IDE со всеми analogRead, digitalRead и проч.
    Для "помигать светодиодом" памяти хватит.

    2. Можно посмотреть на реализацию analogRead в библиотеках Arduino IDE

    Код (Text):
    int analogRead(uint8_t pin)
    {
        uint8_t low, high;

    #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
        if (pin >= 54) pin -= 54; // allow for channel or pin numbers
    #elif defined(__AVR_ATmega32U4__)
        if (pin >= 18) pin -= 18; // allow for channel or pin numbers
    #elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__)
        if (pin >= 24) pin -= 24; // allow for channel or pin numbers
    #elif defined(analogPinToChannel) && (defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__))
        pin = analogPinToChannel(pin);
    #else
        if (pin >= 14) pin -= 14; // allow for channel or pin numbers
    #endif
     
    #if defined(__AVR_ATmega32U4__)
        pin = analogPinToChannel(pin);
        ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
    #elif defined(ADCSRB) && defined(MUX5)
        // the MUX5 bit of ADCSRB selects whether we're reading from channels
        // 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high).
        ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
    #endif

        // set the analog reference (high two bits of ADMUX) and select the
        // channel (low 4 bits).  this also sets ADLAR (left-adjust result)
        // to 0 (the default).
    #if defined(ADMUX)
        ADMUX = (analog_reference << 6) | (pin & 0x07);
    #endif

        // without a delay, we seem to read from the wrong channel
        //delay(1);

    #if defined(ADCSRA) && defined(ADCL)
        // start the conversion
        sbi(ADCSRA, ADSC);

        // ADSC is cleared when the conversion finishes
        while (bit_is_set(ADCSRA, ADSC));

        // we have to read ADCL first; doing so locks both ADCL
        // and ADCH until ADCH is read.  reading ADCL second would
        // cause the results of each conversion to be discarded,
        // as ADCL and ADCH would be locked when it completed.
        low  = ADCL;
        high = ADCH;
    #else
        // we dont have an ADC, return 0
        low  = 0;
        high = 0;
    #endif

        // combine the two bytes
        return (high << 8) | low;
    }
     
    В начале идет преобразование номера пина в номер канала АЦП.
    Потом собственно считывание текущего состояния при помощи АЦП.
    analog_reference - это номер варианта опорного напряжения (по умолчанию 0)

    Также можно посмотреть реализацию данной функции в дополнении к Arduino IDE для программирования ATTiny, которая будет, наверное, ближе к требуемому.
     
    Последнее редактирование: 7 фев 2015
  6. Hottab

    Hottab Нерд

    Тоесть я могу как то законектить USB asp программатор напрямую к Ардуино студио и шить отуда? А как выбрать плату за основу? или через программатор ардуиновский как-то это можно реализовать? Ну не совсем "помигать светодиодом", помигать транзистором, который в свою очередь помигает релюшкой, ну прицеп тот же.

    Вобще я хотел узнать существует может какой то конвертер, который мог бы переделать написанное на Ардуине, в скетч который бы поняла AVR Studio, много проектов просто на ардуинке, если браться за их реализацию, в любом случае придётся работать с чистыми микроконтроллерами, я так понимаю наипростейший способ будет это освоить AVR всю, я читал про АЦП, но особо так и не понял как это всё реализовать может подскажите доступную литературу?
     
  7. Unixon

    Unixon Оракул Модератор

    Хотите пользоваться функциями библиотеки Wiring - подключайте ее файлы в проект. Arduino IDE делает это автоматически, в других C/C++ IDE это придется сделать ручками.
    Файлы Wiring лежат в
    arduino/hardware/arduino/cores/arduino
    arduino/hardware/variants/*
    + библиотеки в
    arduino/libraries/*
    .
     
  8. Airbus

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

    Хех!Тиня13 мега вешь!Хотя стоит уже и не 25 а 60 рублей.Но заморачиваться с Си а тем более с Wiring не стал бы.Всё проще пишем на Асме компилим в Студии и шьём.Вот здесь занимательные эксперименты с тини13. http://tinyurl.com/kfpuple Всё расписано что как и чем.В вашем случае как то так:
    .include"tn13def.inc"
    sbi DDRB, 4 ;РВ4 - выход (светодиод LED)
    sbi PORTB, 2 ;Включение подтягивающего резистора на РВ2 (кнопка SB)
    sbic PINB, 2 ;Если РВ2=0 (кнопка нажата), пропустить след. строку
    sbi PORTB, 4 ;Установка РВ4 в 1 (выключение светодиода)
    sbis PINB, 2 ;Если РВ2=1 (кнопка отпущена), пропустить след. строку
    cbi PORTB, 4 ;Установка РВ4 в 0 (включение светодиода)
    Ножка 3 (РВ4)выход Ножка 7(РВ2)вход Естественно номера ножек можно переписать под Ваши цели.Можно добавить функции задержки если надо
    Компилим в Студии без проблем!Получилось
    :020000020000FC
    :100000000DC0189518951895189518951895189568
    :1000100018951895C49A0ED0C4980CD00FE90DBF4E
    :100020000FEF07BB08BB00E40BBF0ABF01E005BF31
    :100030007894FFCF65E15BE44BEB4150504060406A
    :04004000E0F7089548
    :00000001FF
    Эту байду и шьём в контроллер.На Си код получился бы раза в два больше
     
    Последнее редактирование: 12 фев 2015
  9. Unixon

    Unixon Оракул Модератор

    А теперь представьте, что вам понадобилось сменить контроллер или встроить реализованный функционал в уже существующую прошивку для какого-нибудь PIC / ARM / etc. Вместо перекомпиляции и легких правок вы получаете полное переписывание от и до. Ассемблер не портируем, ему место в критичных местах программы в библиотеке под соответствующий контроллер.

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

    p.s. Впрочем, для крошечных микроконтроллеров типа ATtiny это, может быть, вполне оправдано, если иначе невозможно реализовать нужную функциональность в их очень ограниченном объеме памяти.
     
    Последнее редактирование: 13 фев 2015
  10. Hottab

    Hottab Нерд

    Некогда не сталкивался с Асамблером, мне удобнее на си, а ещё лучше на упрощённом си Ардуины
     
  11. Airbus

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

    100% Согласен. Кросплатформенность-несомненный Сишный плюс.Просто для мелочи типа т-13 и программ типа ВКЛ/ВЫКЛ ИМХО лучше и проще написать на Асме (для меня во всяком случае)Да и Асм под AVR логичный и понятный если в Си разбираешься то всё Елементарно не то что Асм под PIC.(я его так и не вкурил пишу только на Си)Я это и показал хотя бы сам написал не так а через прерывание INT0. И вообще я бы эту штуку спаял на 2х КТ315 и релюхе.
    Под Т13 не напишете.Там нет такой платы.Тока Си.И там всё равно те же регистры та же инициализация почти такие же прерывания только операнды другие.