1. В сообществе нашего форума Вконтакте создан раздел по продаже электронных компонентов.
    Каждый может продать в нем свои залежавшиеся детали. Подробности здесь.

Вопросы по программированию AVR в Atmel Studio для начинающих

Тема в разделе "Средства разработки для AVR/PIC/ARM/ПЛИС", создана пользователем Buba_Chkhadze, 18 мар 2015.

  1. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.491
    Симпатии:
    371
    Адрес:
    Талгар
    Всем спасибо :)
    Но это не все, вопросы еще будут
  2. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.491
    Симпатии:
    371
    Адрес:
    Талгар
    вопрос уже созрел: вот тут в верхней строчке я вижу значение PORTD 00000001, тут понятно, а вот
    PORTB откуда знает какую ногу подключить из восьми , во второй строке ?

    Код:
     if ((PIND & 0x01)==0x00)
         PORTB|=(1<<0);
         else
         PORTB&=~(1<<0);
  3. Олегыч

    Олегыч В доску свой

    Сообщения:
    37
    Симпатии:
    5
    PORTB|=(1<<0); Здесь мы записываем (сдвигаем вот таким знаком <<) единичку в нулевой разряд, если бы ты написал "PORTB|=(1<<3)" то в таком случае запишешь 1 в 3-й разряд
    PORTB&=~(1<<0); В этом случае пишем в 0-вой разряд не 1, а 0. Данный знак "~" инвертирует состояние то есть 1 заменяет на 0
  4. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.491
    Симпатии:
    371
    Адрес:
    Талгар
    тут я разобрался, теперь не могу прочитать PD1
    если пишу
    if ((PIND & 0x02)==0x00)
    PORTB|=(1<<1);
    else
    PORTB&=~(1<<1);
    то ничего не происходит, т.е. не работает
    Последнее редактирование: 20 мар 2015
  5. Олегыч

    Олегыч В доску свой

    Сообщения:
    37
    Симпатии:
    5
    схема та же?
  6. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.491
    Симпатии:
    371
    Адрес:
    Талгар
    да, просто следующий порт подключаю , вход PD1 и выход РВ1
  7. Олегыч

    Олегыч В доску свой

    Сообщения:
    37
    Симпатии:
    5
    Ищи косяк в протеусе
  8. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.491
    Симпатии:
    371
    Адрес:
    Талгар
    что , все правильно ?

    весь код вот так выглядит
    Код:
    {
         if ((PIND & 0x01)==0x00)
         PORTB|=(1<<0);
         else
         PORTB&=~(1<<0);
    }
    {
         if ((PIND & 0x02)==0x00)
         PORTB|=(1<<1);
         else
         PORTB&=~(1<<1);
    }
  9. Олегыч

    Олегыч В доску свой

    Сообщения:
    37
    Симпатии:
    5
    #include <avr/io.h>
    #define F_CPU 1000000UL
    #include <util/delay.h>
    #include <stdio.h>
    int main(void)
    {
    DDRD = 0x00; // порт D на вход
    PORTD = 0xFF; // установить 1
    DDRB = 0xFF; // порт В на выход
    PORTB = 0x00; // установить 0
    while(1)
    {
    if ((PIND & 0x01)==0x00)
    PORTB|=(1<<0);
    else
    PORTB&=~(1<<0);

    if ((PIND & 0x02)==0x00)
    PORTB|=(1<<1);
    else
    PORTB&=~(1<<1);

    }
    }
    Весь твой код все работает
  10. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.491
    Симпатии:
    371
    Адрес:
    Талгар
    наверное фигурные скобки не там стоят.... щас
  11. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.491
    Симпатии:
    371
    Адрес:
    Талгар
    точно, все дело было в скобках :)
  12. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.491
    Симпатии:
    371
    Адрес:
    Талгар
    да хотел спросить, никак что то не могу сделать приоритет на кнопки
    надо бы чтобы когда на входе PD2 или PD3 кнопки нажаты, кнопки на входах PD4 и PD5 не работали\отключались
    как это сделать ?
    вот код
    Код:
    int  main(void)
    {
        DDRD  = 0x00; // порт D на вход
        PORTD = 0xFF; // установить 1
        DDRB  = 0xFF; // порт В на выход
        PORTB = 0x00; // установить 0
        while(1)
        {
         if ((PIND & 0x01)==0x00)                             //если PD0 = 0, то PB0 = 1 и наоборот
         PORTB|=(1<<0);
         else
         PORTB&=~(1<<0);
       
         if ((PIND & 0x02)==0x00)                             //если PD1 = 0, то PB1 = 1 и наоборот
         PORTB|=(1<<1);
         else
         PORTB&=~(1<<1);
       
          if (((PIND & 0x04)==0x00) | ((PIND & 0x10)==0x00))  //если PD2 и\или PD4  = 0, то PB2 = 1 и наоборот
         PORTB|=(1<<2);
          else
         PORTB&=~(1<<2);
         
         if (((PIND & 0x08)==0x00) | ((PIND & 0x20)==0x00))  //если PD3 и\или PD5  = 0, то PB3 = 1 и наоборот
         PORTB|=(1<<3);
         else
         PORTB&=~(1<<3);
        
    
  13. Олегыч

    Олегыч В доску свой

    Сообщения:
    37
    Симпатии:
    5
    А зачем мне не понятно? Даже при нажатой кнопке PD2, если вдруг зажмут кнопку PD4 ничего не произойдет.
  14. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.491
    Симпатии:
    371
    Адрес:
    Талгар
    главное чтобы не сработали одновременно PD2 c PD5; и PD3 с PD4;
    т.е. в данном случае там стоят две сдвоенные кнопки перекидного типа, одна кнопка PD2 PD3 и gnd, вторая PD4 PD5 и gnd, каждая
    подключает массу либо к одному порту PD4 (PD2) либо к другому PD5 (PD3), нажатие кнопок в разные стороны крайне не допустимо.
    собственно кнопка на PD4 PD5 является дублирующей, и хотелось бы ее отключать на время работы кнопки PD2 PD3
    важно чтобы не произошло одновременное включение портов PB2 и PB3

    схема кнопки
    кнопка.jpg
  15. koteika

    koteika В доску свой

    Сообщения:
    768
    Симпатии:
    118
    Род занятий:
    программирование
    Насчет math.h в авр студии 6 вроде, без нее не работает delay.h .. это к разработчикам кароче... ну и я ее лепил по привычке. надо проверить будет робить без нее или нет(под линуксом)..

    math.h это стандартная сишная библиотека математических функций.
  16. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.491
    Симпатии:
    371
    Адрес:
    Талгар
    так как всё таки сделать приоритеты для кнопок ?
  17. koteika

    koteika В доску свой

    Сообщения:
    768
    Симпатии:
    118
    Род занятий:
    программирование
    как то так
    if (если нажата кнопка PD2 или нажата кнопка PD3)
    if(((PIND & 0x02)==0x00) || ((PIND & 0x03)==0x00))
    {
    DDRD = 1<<PD5; делаем пин PD5 мк выходом, а не входом.. и 5 кнопка не будет робить
    }
    Buba_Chkhadze нравится это.
  18. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.491
    Симпатии:
    371
    Адрес:
    Талгар
    ох блин, я об этом не подумал, завтра попробую, спасибо :)
  19. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.491
    Симпатии:
    371
    Адрес:
    Талгар
    чот не получается, не работает. :( и протеус желтые квадратики стал показывать, кстати что они значат ?
    есть синие - земля, красные - VCC, а желтые кто ?
  20. .ctor

    .ctor В доску свой

    Сообщения:
    720
    Симпатии:
    209
    Род занятий:
    парогенератор
    Адрес:
    Алматы
    ага. и при попытке нажатии на кнопку вешаем порт мк прямиком на землю, если пользователь нажмет кнопку. все 40 доступных миллиампер. пик бы сразу умер)))

Поделиться этой страницей