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

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

02.12.2018, 10:20. Просмотров 2737. Ответов 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
ValeryS
Модератор
7407 / 5604 / 711
Регистрация: 14.02.2011
Сообщений: 19,069
Завершенные тесты: 1
02.12.2018, 10:37 2
Лучший ответ Сообщение было отмечено CanchezAKG как решение

Решение

Цитата Сообщение от CanchezAKG Посмотреть сообщение
Уже мозг себе сломал, всё зависает на этапе проверки лог. 1 на PORTD0.
А где ты это проверяешь?
вот тут
Цитата Сообщение от CanchezAKG Посмотреть сообщение
if (PIND == 0b00000001){
так это проверка всего порта, на пин 1 единица на остальных 0, это условие точно выполняется?
для проверки одного бита его необходимо выделить,например так
C
1
  if ((PIND& 0b00000001) == 0b00000001){
обрати внимание на скобки
0
CanchezAKG
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 18
Завершенные тесты: 1
02.12.2018, 11:24  [ТС] 3
Да, это условие выполняется, если на PIND0 лог. 0, то на PORTB 1-7 питание не подается, портб и д соединены между собой проводами, по принципу PORTB0 - PORTD0, PORTB1 - PORTD1 и т.д.

Добавлено через 2 минуты
Уточню, что рисует контроллер: он пишет, что условие подачи лог. 1 на PIND0 не выполняется, результат - bool a = false, PORTA0 = 1. Это у меня сигнализирует об ошибке, если бы при ошибке хоть одно условие выполнялось бы, то горел бы еще минимум 1 зеленый диод, их состояние при ошибке не сбрасывается.

Добавлено через 3 минуты
Подумал бы, что МК бракованный, если бы не тот факт, что в протеусе часто работает то, что работать не может. Я вот думаю, может, я чего в коде накосячил?.... Первый раз пишу, конечно, но так, поглядывая на код, явных ошибок не нахожу..... Уже думаю просто прикурить всё пины на выход и посмотреть, может, часть не работает, но это всё равно не отвечает на вопрос, почему же не производится опрос.

Добавлено через 17 минут
А, блин, на вопрос так и не ответил. Проверил мультиметром, 0.8V на остальных выводах МК, лог. 1 тут с 1.8V, так что должно быть всё ок.

Добавлено через 20 минут
Именно проверка всего порта нужна затем, что итоговый прибор должен проверять корректное подключение проводов между собой и если все провода соединены правильно, то подавать на PORTA1 лог.1, это открывает ардуинковское реле, благо ему логики для работы хватает.
0
FFPowerMan
129 / 76 / 29
Регистрация: 11.10.2018
Сообщений: 472
02.12.2018, 11:37 4
Ничего не понятно в Ваших словах. Используйте ту конструкцию, что Вам посоветовали:
C
1
if((PIND& 0b00000001) == 0b00000001){
И вообще я не понял, зачем нужно соединять порты снаружи. Делайте все внутри да и все.
Для множества if-ов используйте switch(){case}.
0
CanchezAKG
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 18
Завершенные тесты: 1
02.12.2018, 11:50  [ТС] 5
PowerMan, я так понял, что Вы не поняли, зачем оно надо. Объясняю: есть квест, на котором одна из задач игроков - починить поврежденный техником (актером) электрощит. Т.к. идиотов допускать людей без тех. образования до 220В нет, то нужен имитатор щитка, который и пытаемся сделать. То есть задача игроков - соединить провода в правильной последовательности, им-то неведомо, что это имитатор. При правильном соединении проводов должна открываться одна из дверей, за это отвечает реле. P.S. вечером попробую эту конструкцию, может быть, поможет, хотя я уже ни во что не верю. Но сейчас - спать) 2-е сутки на ногах) Спасибо огромное всем ответившим и тем, кто еще ответит, за то, что пытаетесь помочь)
0
Voland_
1679 / 1024 / 97
Регистрация: 04.01.2010
Сообщений: 3,436
02.12.2018, 16:07 6
Лучший ответ Сообщение было отмечено CanchezAKG как решение

Решение

CanchezAKG, посмотрите в настройки atmega16. По умолчанию у нее включен JTAG, который будет пересекаться с обычными GPIO.

ЗЫ: могу показать даже шишку от этих граблей , уже наступал.
1
CanchezAKG
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 18
Завершенные тесты: 1
03.12.2018, 08:43  [ТС] 7
Voland, так это же влияет только на порт с, разве нет?
0
ValeryS
Модератор
7407 / 5604 / 711
Регистрация: 14.02.2011
Сообщений: 19,069
Завершенные тесты: 1
03.12.2018, 09:03 8
Цитата Сообщение от CanchezAKG Посмотреть сообщение
# define F_CPU = 1000000UL;
у тебя частота точно 1 Мгц?
0
COKPOWEHEU
1169 / 827 / 197
Регистрация: 09.09.2017
Сообщений: 3,567
03.12.2018, 11:04 9
Цитата Сообщение от ValeryS Посмотреть сообщение
if ((PIND& 0b00000001) == 0b00000001){
Неудачная идея: есть риск ошибиться в записи. Лучше:
C
1
if( PIND & 0b00000001 )
а еще лучше
C
1
if( PIND & (1<<0) )
Для проверки не на 1, а на 0:
C
1
if( !(PIND & (1<<0)) )
Цитата Сообщение от CanchezAKG Посмотреть сообщение
Код, как и проект для Протеуса для просмотра схемы
Схему-то покажите. (нет, не проект протеуса, который неудобно открывать, а саму схему).
Вдруг вы там только замыкаете вывод на питание, а землю не подаете даже через подтягивающие резисторы?
0
ValeryS
Модератор
7407 / 5604 / 711
Регистрация: 14.02.2011
Сообщений: 19,069
Завершенные тесты: 1
03.12.2018, 11:51 10
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Неудачная идея: есть риск ошибиться в записи.
есть поэтому я так и не пишу, а пишу в шестнадцатеричные
по моему мнению, введение двоичных данных ,которых нет в стандарте,путь в никуда
это еще ладно 8 битные, а вот 32, 64 битные
0
COKPOWEHEU
1169 / 827 / 197
Регистрация: 09.09.2017
Сообщений: 3,567
03.12.2018, 12:57 11
Сдвигами все же нагляднее: обычно это не просто бит, а обладающий каким-то смыслом, описанным в даташите или схеме:
C
1
2
LED_PORT &=~ (1<<LED_BIT);
ADCSRA |= (1<<ADSC);
вместо
C
1
2
PORTB &= 0xDF;
ADCSRA |= 0x40;
Может, у вас волшебная память, но я лично не помню все биты всех регистров по номерам
0
CanchezAKG
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 18
Завершенные тесты: 1
03.12.2018, 16:04  [ТС] 12
Попробовал конструкцию, предложенную ValeryS. Не помогло..... Поведение то же. Бит JTAGEN снял, так же 0 эмоций, фунт презрения. Но, если убрать переход к другому условию от предыдущего, то вся эта байда начинает работать, вот только не проверяет корректность подключения проводов. Сейчас попробую внеси еще изменений, может быть, и заработает.

Добавлено через 2 часа 6 минут
УРРРАААА, ЗАРАБОТАЛО!!!!))) Я безумно счастлив, спасибо огромное ValeryS, без него ни за что бы не допер, что мега по умолчанию считает подвешенные в воздухе пины, настроенные как вход, как лог. 1. В протеусе всё наоборот) выкладываю код, который решил проблему. Так же спасибо Voland, напрочь про жтаг забыл)
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
78
79
80
81
82
83
84
85
86
87
88
89
90
/*
 * keylock.cpp
 *
 * Created: 30.11.2018 3:40:19
 * Author : 1
 */ 
 
#include <avr/io.h>
#include <util/delay.h>
 
# define F_CPU = 1000000UL;
int correct_input (bool a) {
      DDRB = 0xFF;
      DDRC = 0xFF;
      DDRD = 0x00;
      PORTD = 0x00;
      PORTB = 0b11111110;
      _delay_ms(500);
      if ((PIND& 0b11111110) == 0b11111110){
          PORTB = 0b11111101;
          _delay_ms(500);
          PORTC = 0x01;
      
     
          if ((PIND& 0b11111101) == 0b11111101){
              PORTB = 0b11111011;
              _delay_ms(500);
              PORTC = 0x03;
          
              if ((PIND& 0b11111011) == 0b11111011){
                  PORTB = 0b11110111;
                  _delay_ms(500);
                  PORTC = 0x07;
              
                  if ((PIND& 0b11110111) == 0b11110111){
                      PORTB = 0b11101111;
                      _delay_ms(500);
                      PORTC = 0x0F;
                  
                      if ((PIND& 0b11101111) == 0b11101111){
                          PORTB = 0b11011111;
                          _delay_ms(500);
                          PORTC = 0x1F;
                      
                          if ((PIND& 0b11011111) == 0b11011111){
                              PORTB = 0b10111111;
                              _delay_ms(500);
                              PORTC = 0x3F;
                         
                              if ((PIND& 0b10111111) == 0b10111111){
                                  PORTB = 0b01111111;
                                  _delay_ms(500);
                                  PORTC = 0x7F;
                             
                                  if((PIND& 0b01111111) == 0b01111111){
                                      _delay_ms(500);
                                      PORTC = 0xFF;
                                      PORTB = 0x00;
                                      a=true;
                                  }else {a=false; PORTB = 0xFF;}
                              }else {a=false; PORTB = 0xFF;}
                          }else {a=false; PORTB = 0xFF;}
                      }else {a=false; PORTB = 0xFF;}
                  }else {a=false; PORTB = 0xFF;}
              }else {a=false; PORTB = 0xFF;}
          }else {a=false; PORTB = 0xFF;}
      } else {a=false; PORTB = 0xFF;}
                                 
      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
COKPOWEHEU
1169 / 827 / 197
Регистрация: 09.09.2017
Сообщений: 3,567
03.12.2018, 16:16 13
Цитата Сообщение от CanchezAKG Посмотреть сообщение
ни за что бы не допер, что мега по умолчанию считает подвешенные в воздухе пины, настроенные как вход, как лог. 1.
Очевидно, что до сих пор "не допер".
Мега просто считывает состояние портов, а уж что на них будет зависит от схемы. Если они именно висят в воздухе без подтяжки к земле или питанию, на них будет неопознанная болтанка из-за различных помех. И контроллер может принять это за 0, за 1 или за хаотичное переключение.
Именно об этом я говорил:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Схему-то покажите. (нет, не проект протеуса, который неудобно открывать, а саму схему).
Вдруг вы там только замыкаете вывод на питание, а землю не подаете даже через подтягивающие резисторы?
Стандартные варианты подключения кнопок:
- кнопка с переключением, которая соединяет вывод либо с питанием, либо с землей. Используется относительно редко.
- кнопка на замыкание, соединяющая с питанием. Используется только вместе с внешним резистором, подтягивающим к земле. В случае AVR также используется редко.
- кнопка на замыкание, соединяющая с землей. Используется либо с внешним резистором на питание, либо с внутренним подтягивающим резистором (DDRx=0, PORTx=1). Самый распространенный случай.
0
Voland_
1679 / 1024 / 97
Регистрация: 04.01.2010
Сообщений: 3,436
03.12.2018, 16:18 14
Цитата Сообщение от CanchezAKG Посмотреть сообщение
так это же влияет только на порт с
Да, действительно, только на порт C,
Цитата Сообщение от CanchezAKG Посмотреть сообщение
DDRB = 0xFF;
Цитата Сообщение от CanchezAKG Посмотреть сообщение
мега по умолчанию считает подвешенные в воздухе пины, настроенные как вход, как лог. 1
...разве? в меге это состояние floating, а floading - это телепающееся состояние, заивисит от температуры и т.д.
0
CanchezAKG
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 18
Завершенные тесты: 1
04.12.2018, 00:33  [ТС] 15
Там прикол именно в том, что нужно соединить провода, подвешенные в воздухе, в правильной последовательности. Это как кодовый замок, только наборной панелью служит состояние пинов.

Добавлено через 6 часов 39 минут
Интересу ради попробовал мегу включить после 5 мин. на улице - все ок работает и попробовал нагреть ее до 50 градусов феном, так же все превосходно. Так что нея, состояние все же фиксировано. Ну, и л мне с конкретным экземпляром повезло...
0
COKPOWEHEU
1169 / 827 / 197
Регистрация: 09.09.2017
Сообщений: 3,567
04.12.2018, 11:19 16
Безнадежно. Читать CanchezAKG не умеет.
Три раза ему писал что надо подпаять резисторы, после чего замыкать чем угодно и куда угодно.
Ладно, не хочет делать по-человечески, пусть ловит глюки в финальной модели. Ведь у него "все же фиксировано", он проверил на целом одном контроллере в целых полутора экспериментах!
1
CanchezAKG
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 18
Завершенные тесты: 1
04.12.2018, 19:55  [ТС] 17
COKPOWEHEU прошу прощения, что произвел такое впечатление, просто я так и не понял, куда подпаять резистор-то нужно? И еще: 1 кОм хватит или нужно больше? Просто сейчас под рукой только килоомные, больше нету( Сейчас еще подумал, имеется в виду на провод, идущий от входа, а входы назначить как лог. 1?
0
CanchezAKG
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 18
Завершенные тесты: 1
04.12.2018, 19:58  [ТС] 18
Да, схемы нету вообще, могу только прицепить фотку либо скрин из протеуса, на фотке будет ничего не понятно, там проводов овердофига, они закрывают собой всё.
0
Миниатюры
AtMega16 Не читает логическое состояние входов  
CanchezAKG
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 18
Завершенные тесты: 1
04.12.2018, 20:02  [ТС] 19
Интересу ради попробовал мегу включить после 5 мин. на улице - все ок работает и попробовал нагреть ее до 50 градусов феном, так же все превосходно. Так что нея, состояние все же фиксировано. Ну, и л мне с конкретным экземпляром повезло...
Прошу прощения, полежало оно денек и понял, что был не прав.... Просто я так понял, что оно должно реагировать именно на температуру, которая в помещении, где всё делалось и в помещении, где производилась сборка была идентичной, а значит, должно быть идентично и поведение, но нет, наводки с Марса всё же присутствуют... И еще вопрос: какая максимально допустимая длина проводов для этой меги, если для соединения проводов используется ШВВП 0.75 сечением?
0
CanchezAKG
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 18
Завершенные тесты: 1
04.12.2018, 20:09  [ТС] 20
Сколько понял, должно быть так, верно?
0
Миниатюры
AtMega16 Не читает логическое состояние входов  
04.12.2018, 20:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2018, 20:09

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

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

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


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

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

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