Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
CanchezAKG
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 18
Завершенные тесты: 1
1

AtMega16 Не читает логическое состояние входов

02.12.2018, 10:20. Просмотров 2728. Ответов 30

Здравствуйте, уважаемые форумчане. Спешу обратиться к вам с просьбой - помогите, пожалуйста, разобраться, почему мега16 (DIP-40, если что), не желает читать логическое состояние пинов. Уже мозг себе сломал, всё зависает на этапе проверки лог. 1 на PORTD0. Просто дальше код не выполняется, контроллер сообщает о невыполнении условия. При этом фактически на PORTD0 есть 5В, поданные с PORTB0. Нигде не нашел прямого запрета на подобные действия, да и контроллер не спешит дымиться. Подано питание на VCC, AVCC, земля на обоих GND, так что с питанием вроде бы всё ок. Код, как и проект для Протеуса для просмотра схемы (всё делалось точно по протеусу, за исключением подключения светодиодов - там резисторы стоят, ибо 5В диодов в магазине не было), прилагаю. Да, забыл сказать - в протеусе всё идеально, не работает именно в железе.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <avr/io.h>
#include <util/delay.h>
 
# define F_CPU = 1000000UL;
int correct_input (bool a) {
      DDRB = 0xFF;
      DDRC = 0xFF;
      DDRD = 0x00;
      PORTB = 0x01;
      if (PIND == 0b00000001){
          PORTB = 0x02;
          _delay_ms(500);
          PORTC = 0x01;
          if (PIND == 0b00000010){
              PORTB = 0x04;
              _delay_ms(500);
              PORTC = 0x03;
              if (PIND == 0b00000100){
                  PORTB = 0x08;
                  _delay_ms(500);
                  PORTC = 0x07;
                  if (PIND == 0b00001000){
                      PORTB = 0x10;
                      _delay_ms(500);
                      PORTC = 0x0F;
                      if (PIND == 0b00010000){
                          PORTB = 0x20;
                          _delay_ms(500);
                          PORTC = 0x1F;
                          if (PIND == 0b00100000){
                              PORTB = 0x40;
                              _delay_ms(500);
                              PORTC = 0x3F;
                              if (PIND == 0b01000000){
                                  PORTB = 0x80;
                                  _delay_ms(500);
                                  PORTC = 0x7F;
                                  if(PIND == 0b10000000){
                                      _delay_ms(500);
                                      PORTC = 0xFF;
                                      PORTB = 0x00;
                                      a=true;
                                  }else {a=false;}
                              }else {a=false;}
                          }else {a=false;}
                      }else {a=false;}
                  }else {a=false;}
              }else {a=false;}
          }
          else {a=false;}
      }
      else {
          
          a=false;
      }
      return a;
}
int main(void)
{
  if (correct_input(true)){
      
      DDRA = 0xFF;
      PORTA = 0x02;
      
  }
  else {
 _delay_ms(800);
  DDRA = 0x01;
  PORTA = 0x01;
 }
  
    /* Replace with your application code */
    while (1) 
    {
    
    }
}
0
Вложения
Тип файла: zip keylock.zip (16.8 Кб, 2 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2018, 10:20
Ответы с готовыми решениями:

ATMEGA16 мультиплексирование входов для АЦП и компаратора
Коллеги, рад приветствовать! Впервые на этом форуме, поэтому сильно не пинайте. Начал осваивать...

USBasp неправильно читает Flash, но правильно читает EEprom
Ребята выручайте, нужен мозговой штурм... Пару лет назад собрал USBasp, до недавнего времени...

Защита входов АЦП
Здравствуйте! Вопрос стоит в защите входов АЦП, процессор Silabs C8051F350. Защита нужна от...

Защита входов МК от помех
Здравствуйте, интересует следующий вопрос и возможные пути его решения. Есть МК 1882ВЕ53У, также...

Умножение чисел с входов Atmega 16
Здравствуйте может кто нибудь знает как на микроконтроллере Atmega16 в среде AVR Studio 4....

30
COKPOWEHEU
1154 / 817 / 192
Регистрация: 09.09.2017
Сообщений: 3,528
05.12.2018, 10:21 21
Код
        VCC
~~~+     ^
   |     |
   |     |
   |    \
   |     |
MK +-----+
   |     |
   |    _L
   |    | |
~~~+    |R|
        | |
         T
         |
        _L
        GND
И так на каждый вывод. Вместо выключателя оставите проводки, которые будете замыкать. Правда, обычно замыкают все же не на питание, а на землю: у контроллера есть встроенный подтягивающий резистор до питания, да и прерывания могут настраиваться на лог.0, но не на лог.1. Впрочем, в данном случае особой разницы нет, поскольку сопротивление встроенного резистора великовато для надежного срабатывания а прерываниями вы не пользуетесь.
Цитата Сообщение от CanchezAKG Посмотреть сообщение
И еще: 1 кОм хватит или нужно больше?
В общем случае зависит от требуемой помехозащищенности и потребления. Если потребление не критично (а в вашем случае, полагаю, так и есть), лучше поставить даже поменьше, где-то 100 - 1000 Ом.
Цитата Сообщение от CanchezAKG Посмотреть сообщение
Просто я так понял, что оно должно реагировать именно на температуру, которая в помещении, где всё делалось и в помещении, где производилась сборка была идентичной, а значит, должно быть идентично и поведение, но нет, наводки с Марса всё же присутствуют...
Температура на это тоже влияет (она вообще на все полупроводники влияет), но косвенно. В основном именно наводки из радиопомех, утечек по плате, внутренних шумов и утечек и тому подобного. Часто это можно наблюдать, прикоснувшись пальцем к выводу. Правда, есть риск, что вывод, а то и весь контроллер умрет от статического разряда, но это все же редкость.
Цитата Сообщение от CanchezAKG Посмотреть сообщение
И еще вопрос: какая максимально допустимая длина проводов для этой меги
Если не прикладывать дополнительных усилий по защите от помех и если на другом конце цифровой передатчик, то считается до 1 - 5 метров. Существенно увеличить длину можно если использовать коаксиальный кабель (оплетку на землю), еще лучше - дифференциальный сигнал. Или токовую петлю. В принципе, подтягивающий резистор можно рассматривать и как элемент токовой петли.
В целом, как и везде, степень параноидальности в защите от помех будет зависеть от критичности сбоя и допустимых затрат.
0
FFPowerMan
127 / 75 / 28
Регистрация: 11.10.2018
Сообщений: 452
05.12.2018, 11:35 22
Подтягивающий резистор 10(кОм). Схему посмотрите в Интернете. В самом микроконтроллер даже можно подключить подтягивающий резистор. Это, по-моему, нужно поставить порты на вход и в PORTD записать 1.
0
COKPOWEHEU
1154 / 817 / 192
Регистрация: 09.09.2017
Сообщений: 3,528
05.12.2018, 13:58 23
FFPowerMan, жаль, вы не прочитали мое сообщение.
В условии сильных помех (а у ТСа провод довольно длинный, да и места использования мы не знаем) получить на входе 200 мкВт вполне возможно. При резисторе же 100 Ом необходимая мощность составит 20 мВт
Включение встроенной подтяжки будет только мешать. Если, конечно, ТС не переделает схему.
0
FFPowerMan
127 / 75 / 28
Регистрация: 11.10.2018
Сообщений: 452
05.12.2018, 17:29 24
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
200 мкВт
- микровольт имеется ввиду?
0
CanchezAKG
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 18
Завершенные тесты: 1
05.12.2018, 21:50  [ТС] 25
Хмм, по Вашей схеме все будет работать отлично, но получится ряд vcc и ряд проводов на, ногу МК, в таком случае, если игроки, наприиер, должны соединить 5й провод и 8й, а они соединят, например, 7й и 8й, тут предположение, что 8я нога это мк, а 5я и 7я vcc, тоя имитатор все равно отработает так, будто бы провода вставлены верно, но это не так. Такой вариант не подойдет, ноя я новичок в мире мк, как можно все-таки облйти эту проблему со случайными значениями? Может, есть просто внешние модули, которые на это рассчитаны? На всякий случай объясню как оно должно работать: провод 1 соединяется с проводом 1а и, т.д., всего 8 пар. Если провод 1 будеи соединен с 2а, то такая комбинация должна считаться некорректной. Это если я правильно понял Ваше предложение, если нетбы, то поправьте меня, пожалуйста.

Добавлено через 5 минут
Сейчас я пытаюсь использовать как GND PORTB, а как то, что должно быть посажено на землю, PORTD. Соответственно, во время проверки конкретного пина остальные пины все находятся в лог.1 (уже поправил программу, теперь PORTD = 0xFF).
0
COKPOWEHEU
1154 / 817 / 192
Регистрация: 09.09.2017
Сообщений: 3,528
06.12.2018, 00:32 26
FFPowerMan, нет. Для переключения вывода нужно напряжение около половины питания. В худшем случае, когда питание составляет ~3 В, это составляет 1.5 В. Через резистор 10 кОм для этого должен протекать ток 150 мкА, что составляет 225 мкВт мощности.
Цитата Сообщение от CanchezAKG Посмотреть сообщение
если игроки, наприиер, должны соединить 5й провод и 8й, а они соединят, например, 7й и 8й,
Лучше опишите более подробно чего хотите добиться в результате. Из предыдущих описаний мне казалось, что с выводами будет соединяться провод, висящий на VCC.
Если нужна проверка соединений "каждый с каждым", циклически переключайте один вывод на выход с лог.1 и проверяйте на каком из остальных появится сигнал.
0
CanchezAKG
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 18
Завершенные тесты: 1
06.12.2018, 11:48  [ТС] 27
Ага, понял, спасибо, завтра перепишу код, попробую что выйдет на реальном устройстве и отпишусь. Заодно сниму видео на тему принципа работы, выполняемых функций и роли в игре.
0
CanchezAKG
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 18
Завершенные тесты: 1
08.12.2018, 19:15  [ТС] 28
Пока не получается глянуть, что там с предложенной схемой, но опробовал схему с подтяжкой к земле, отлично работает, спасибо)))
0
FFPowerMan
127 / 75 / 28
Регистрация: 11.10.2018
Сообщений: 452
08.12.2018, 20:20 29
Еще надо как-то попробовать убрать все эти if-ы. Дожлно быть решение попроще - ну мне так кажется, по крайней мере. Т.е. пихаете в порт какое-нибудь число(или оно там само формируется) и смотрите одним if-ом. - Я прав? Такое можно вообще сделать?
0
COKPOWEHEU
1154 / 817 / 192
Регистрация: 09.09.2017
Сообщений: 3,528
11.12.2018, 02:55 30
Насколько я понял, задача ТСа - проверить последовательность комбинаций значения определенного порта. Самым универсальным вариантом мне представляется массив и счетчик, но для одноразового проекта сойдут и if'ы.
0
FFPowerMan
127 / 75 / 28
Регистрация: 11.10.2018
Сообщений: 452
11.12.2018, 10:17 31
Я не так понял. У него просто соединятся PORTB и PORTD. В PORTB посылаются данные, а из PORTD они считываются. Так может быть как-то упростить эту процедуру. Либо 1 раз данные засылать, либо что-то другое сделать?
0
11.12.2018, 10:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2018, 10:17

Не могу понять почему Яндекс не читает мой Sitemap? а google читает.
Захожу в яндекс мастер выбираю sitemap а он мне пишет ошибка в файле sitemap невалидный sitemap Но...

Проблема с OCR Puma.Net (читает текст с одной картинки, но не читает с другой)
Здравствуйте, есть проект с оцр Puma.Net и есть 2 картинки 1ая и 2ая, только вот с первой картинки...

Дисковод читает аудиофайлы, а DVD-диски не читает
Всем привет! Дисковод читает аудиофайлы а DVD-диски не читает! Может какой драйвер надо!!!!...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru