ATTINY2313a

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

  1. vgs

    vgs Нуб

    Всем, доброго времени суток. Недавно заинтересовался микроконтроллерами, но столкнулся с проблемой работы порта на вход.
    МК: ATTINY2313a
    Программатор: USBasp
    Датчик движения: HC-SR501
    RGB светодиод с общим анодом.на 5В

    Подключил светодиод, задал на ножку PB0 порт на выход DDRB = 0xFF. Затем посылаю сигнал, светодиод моргает, все работает. Но если пытаюсь подключить датчик движения (провод data на ножку PD2), то на вход МК не реагирует.
    Порт выставлен на прием DDRD = 0x00;
    Наличие сигнала проверяю строчкой if(PIND2 == 1) { // код для мограния светодиода }
    Подключаю все напрямую, без резисторов. В документации читал, что порт на вход может принимать до 5В. Уже пробовал вытащить data провод от датчика и периодически подсоединять 5В на ножку МК. Код моргания светодиода все равно не выполняется. Датчик рабочий, т.к. при подключение к ардуино работает исправно.
    Подскажите пожалуйста, что я делаю не так?
     
  2. rkit

    rkit Гуру

    if(PIND & (1 << 2))

    #define PIND2 2
     
  3. Limoney

    Limoney Гик

    не аrduino?
     
  4. vgs

    vgs Нуб

    Нет не ардуино
     
  5. vgs

    vgs Нуб

    спасибо, изменения видны. Но почему-то светодиод сам загорается, даже если нет движения с различным периодом, от 5 до 20 секунд
     
  6. Limoney

    Limoney Гик

    А покажите свой код. Если не секрет. А вообще, нужно подключить подтягивающий резистор
     
  7. vgs

    vgs Нуб

    Код (C++):
    #include <avr/io.h>
    #include <avr/delay.h>

    #define PIND2 2


    int main(void)
    {  
        DDRB = 0b00000001;
        DDRD = 0x00;      
           
        while (1)
        {  
            PORTB = 0b00000001;
            if(PIND & (1 << 2))
            {          
                PORTB = 0b00000000;
                _delay_ms(1000);          
            }                                  
        }
    }
    А как его подключить? К диоду или к датчику? На сколько Ом?
     
  8. vgs

    vgs Нуб

    Для наглядности накидал схемку подключения в паинте
     

    Вложения:

    • 1.png
      1.png
      Размер файла:
      6,4 КБ
      Просмотров:
      602
  9. vgs

    vgs Нуб

    Сделал следующим образом, подключил питание и землю к ардуино, всю эту схему подключил к зарядке от сотки. вынес на балкон, датчик стал реагировать на движения, но правда загорается светодиод по 2 раза с интервалом в 5 секунд (скорее всего потому что я крутил резисторы на датчике). На поведение датчика до этого момента, я грешу на программатор, мне кажется он сбрасывает состояние МК или что-то в этом роде. Да и работает он с какими то непонятными ошибками

    Код (Text):
    avrdude: warning: cannot set sck period. please check for usbasp firmware update.
    avrdude: AVR device initialized and ready to accept instructions
    avrdude: Device signature = 0x1e910a
    avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
             To disable this feature, specify the -D option.
    avrdude: erasing chip
    avrdude: warning: cannot set sck period. please check for usbasp firmware update.
    avrdude: reading input file "E:\Arduino\SinaProg 2.1.1\MoveSensor.hex"
    avrdude: input file E:\Arduino\SinaProg 2.1.1\MoveSensor.hex auto detected as Intel Hex
    avrdude: writing flash (94 bytes):
    avrdude: 94 bytes of flash written
    avrdude: verifying flash memory against E:\Arduino\SinaProg 2.1.1\MoveSensor.hex:
    avrdude: load data flash data from input file E:\Arduino\SinaProg 2.1.1\MoveSensor.hex:
    avrdude: input file E:\Arduino\SinaProg 2.1.1\MoveSensor.hex auto detected as Intel Hex
    avrdude: input file E:\Arduino\SinaProg 2.1.1\MoveSensor.hex contains 94 bytes
    avrdude: reading on-chip flash data:
    avrdude: verifying ...
    avrdude: 94 bytes of flash verified

    avrdude: safemode: Fuses OK

    avrdude done.  Thank you.
     
  10. Airbus

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

    А так?
    Код (C++):

    #define F_CPU 1000000UL  // 1 MHz
    #include <avr/io.h>
    #include <avr/delay.h>

    void main(void)
    {
    DDRB=0xFF; //Порт D на выход
    while (1)        //Погнали!
      {
      if (PIND.2==0)    //Если на втором пине ноль
      { PORTB.0=1; }  // Тушим светодиод
      else                    //Если на втором пине единичка
      {
      PORTB.0=1;      //то мигаем
      _delay_ms(200);
      PORTB.0=0;
      _delay_ms(200);
      }
      };
    }
     
     
    Последнее редактирование: 5 окт 2016
  11. rkit

    rkit Гуру

    "#define PIND2 2" в код вставлять не надо. Это я привел, что этот макрос значит, чтобы было понятно, что предыдущий код делает.
     
  12. ostrov

    ostrov Гуру

    Такое не любой компилятор возьмет.
     
  13. Airbus

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

    Почему?Вначале было взято из CD книги Белова упр.4 выглядело так
    Код (C++):
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V1.24.4 Standard
    Automatic Program Generator
    © Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    e-mail:office@hpinfotech.com

    Project : Prog4
    Version : 1
    Date    : 06.01.2006
    Author  : Belov                          
    Company : Book                          
    Comments:
    Пример 4
    Мигающий светодиод


    Chip type           : ATtiny2313
    Clock frequency     : 4,000000 MHz
    Memory model        : Tiny
    External SRAM size  : 0
    Data Stack size     : 32
    *****************************************************/


    #include <tiny2313.h>
    #include <delay.h>

    // Declare your global variables here

    void main(void)
    {
    // Declare your local variables here

    // Crystal Oscillator division factor: 1
    CLKPR=0x80;
    CLKPR=0x00;

    // Input/Output Ports initialization
    // Port A initialization
    // Func2=In Func1=In Func0=In
    // State2=T State1=T State0=T
    PORTA=0x00;
    DDRA=0x00;

    // Port B initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    // State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
    PORTB=0xFF;
    DDRB=0xFF;

    // Port D initialization
    // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State6=P State5=P State4=P State3=P State2=P State1=P State0=P
    PORTD=0x7F;
    DDRD=0x00;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=FFh
    // OC0A output: Disconnected
    // OC0B output: Disconnected
    TCCR0A=0x00;
    TCCR0B=0x00;
    TCNT0=0x00;
    OCR0A=0x00;
    OCR0B=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // Interrupt on any change on pins PCINT0-7: Off
    GIMSK=0x00;
    MCUCR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;

    // Universal Serial Interface initialization
    // Mode: Disabled
    // Clock source: Register & Counter=no clk.
    // USI Counter Overflow Interrupt: Off
    USICR=0x00;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;

    while (1)
       {
       if (PIND.0==1)
         { PORTB.0=1; }  // Тушим светодиод
       else
         {
         PORTB.0=1;
         delay_ms(200);
         PORTB.0=0;
         delay_ms(200);
         }
       };
    }
     
    Под Кодвижн. Я немного поправил потому как у Человека видимо Winawr или AVR Studio. Мож где и ошибся....Но общий смысл думаю понятен?
     
  14. ostrov

    ostrov Гуру

    AVS, равно как и IDE не понимают такое:
    Код (C++):
    PORTB.0=1;
    Это чисто Кодевижнские костылики, подозреваю, что аналог digitalWrite(), то есть функция а не прямая отправка бита в регистр. То есть и работает медленнее чем:
    Код (C++):
    PORTB |= 1;
     
  15. Limoney

    Limoney Гик

    Если не изменяли по умолчанию fuse биты, то тактовая частота 1MHz. WinAVR
    Код (C++):
    #include <avr/io.h>
    #define F_CPU 1000000UL
    #include <util/delay.h>

    #define  WRPOTRTB  PORTB // Регистр ПОРТ B
    #define MODEPORTB DDRB   // Регистр направления данных порта В
    #define READPINB  PINB   // Регистр состояние пинов порта
    /* до тех пор пока датчик не сработал на линии датчика низкий уровень,
       если датчик сработал, то на линии датчика устанавливается высокий уровень */

    #define HCSR_PIN  PB0   // к этому пину подключен датчик движения
    #define LED_PIN   PB1   // к этому пину подключен светодиод

    int main(void)
    {
      // настраиваем пин LED_PIN как выход, пин HCSR_PIN как выход, другие порты также входы
      MODEPORTB |= ( 1 << LED_PIN );

      while (1) {
        // если датчик сработал,
        if ( READPINB & ( 1 << HCSR_PIN ) ) {
          WRPOTRTB |= ( 1 << LED_PIN );   //то включаем светодиод
        } else {
          WRPOTRTB &= ~ ( 1 << LED_PIN ); // иначе выключаем светодиод
        }
        _delay_ms(10);
      }
    }
     
     

    Вложения:

    • Image 25.jpg
      Image 25.jpg
      Размер файла:
      23,2 КБ
      Просмотров:
      738
  16. Airbus

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

    Хех!Только что проверил-Winawr сжевал и даже НЕХ код выдал
    Код (C++):
    :1000000012C017C016C015C014C013C012C011C052
    :1000100010C00FC00EC00DC00CC00BC00AC009C07C
    :1000200008C007C006C011241FBECFEDCDBF02D04F
    :100030000FC0E6CF8FEF81BB4FEF24E234EF42BB1E
    :10004000C9010197F1F712BAC9010197F1F7F7CF8A
    :04005000F894FFCF52
    :00000001FF
    Так получается понимает?Этож битовые операции...
    А вообще такую фигню лучше на Асме писать и быстрее и шансов запутаться меньше.
     
    Последнее редактирование: 5 окт 2016
  17. vgs

    vgs Нуб

    Atmel studio. Попробую на выходных или после, потом отпишусь
     
  18. vgs

    vgs Нуб

    и да, ребята, всем спасибо, за вашу помощь и отзывчивость. Я наверное недели 2 голову ломал, что не так! Еще и время свободное редко выпадает, вот ходил и грузился, что я не так сделал.
     
  19. ostrov

    ostrov Гуру

    Это не битовая операция, это функция такая специфичная. AVS ее не понимает. Проверить не трудно же.