roboforum.ru

Технический форум по робототехнике.

порты не работают на вход :(

порты не работают на вход :(

Grover » 03 фев 2008, 16:21

схема простая работает на "штуке" (см топик "наши достижения").
ATmega8 + L293D

прошиваю вот такую программу (WinAVR):
Код: Выделить всёРазвернуть
   #include <avr/io.h>
   #include <avr/delay.h>
   #define F_CPU 8000000UL  // 16 MHz
   
   void M_Front(void)
   {
      PORTD |= _BV(PD0);      // установить "1"
      PORTD |= _BV(PD1);      // установить "1"
      PORTD &=~_BV(PD2);      // установить "0"
      PORTD |= _BV(PD3);      // установить "1"
      PORTD &=~_BV(PD4);      // установить "0"
   }
   void M_Stop(void)
   {
      PORTD &= ~_BV(PD0);      // установить "0"
      PORTD &= ~_BV(PD1);      // установить "0"
      PORTD &= ~_BV(PD2);      // установить "0"
      PORTD &= ~_BV(PD3);      // установить "0"
      PORTD &= ~_BV(PD4);      // установить "0"
   }
   int main(void)              // начало основой программы
   {
   short i;
   DDRD = 0b00011111;            // все выводы порта D сконфигурировать как выходы+
 
    while (1) {
   if (PIND & (1<<5)){
              M_Front();
           for (i = 1; i < 8; i = i + 1)
           {
           _delay_ms(250);   // Ждем 0.25 сек.
           }
   
           M_Stop();  // установить "0" на всех линиях порта D
           for (i = 1; i < 16; i = i + 1)
           {
      _delay_ms(250);   // Ждем 0.25 сек.
           }
            }
}       // закрывающая скобка бесконечного цикла
}      // закрывающая скобка основной программы


беда в том, что при не подключенном PD5 двигалели вращаются.
т.е. (PIND & (1<<5)) возвращает True, хотя 100% ножка МК висит в воздухе.

Re: порты не работают на вход :(

rig » 03 фев 2008, 19:23

так там не понятно что на ножке, вот если ее подтянуть к 0 или 1 резистором совсем по другому будет.

Re: порты не работают на вход :(

avr123.nm.ru » 03 фев 2008, 19:27

Grover писал(а): 100% ножка МК висит в воздухе.


А зачем она висит ? Не любишь определенности ?

Re: порты не работают на вход :(

Grover » 03 фев 2008, 20:12

что означает слово "подтянуть" ?

Re: порты не работают на вход :(

Myp » 03 фев 2008, 20:15


Re: порты не работают на вход :(

rig » 03 фев 2008, 20:19

соединить через резистор 10-100 ком с + или -
будет гарантированно + или -
можно воспользоватся внутренним резистором, есть там такой.
в курсе действительно подробно описан этот момент

Re: порты не работают на вход :(

Grover » 03 фев 2008, 21:22

прошу меня простить :oops:

я сделал вывод: "Прочитал? Понял! - молодец, прочитай еще раз."

да, действительно, в avr123 есть ответ на мой вопрос.

Re: порты не работают на вход :(

Myp » 03 фев 2008, 21:30

а теперь буть добр напиши сюда
чтобы можно было новичкам посмотреть твою тему и найти решение
либо просто прочитать и узнать чтото новое


короче понял сам расскажи другому :)

Re: порты не работают на вход :(

Grover » 03 фев 2008, 21:58

угу, как смогу :)

в программе:
Код: Выделить всёРазвернуть
...
...
DDRD = 0b00011111;       // пины с 0 по 4 выходы, а пины 5,6,7 - входы.
PORTD = 0b11100000;    // ВАЖНО: на пины 0 - 4 установил 0 (нет сигнала), а пины 5,6,7 установил 1, т.е. МК сама подаст логическую 1.
...
...
// Вместо if (PIND & (1<<5)), что означало если пин 5 содержит логическую 1, то ...
// пишем:
if (!(PIND & (1<<5))){ // означает: Если пин 5 НЕ содержит лог.1, то ...


на плате:
ножку МК, которая отвечает за ПИН 5 порта D (на atmega8 это №11), припаеваем к кнопке, кнопку с "другой стороны" припаеваем к резистору, а резистор на МИНУС !!!.

Что получилось:
получилось, что МК с программой реагирует не на наличие сигнала, а на его отсутствие.

какой в этом смысл:
как начал делать я : ножка через кнопку висит на ПЛЮС МК, а программа ждет пока кнопку нажмут и на кнопке появится ПЛЮС (лог.1)

именно тут и возникает трудность, если ножка ни к чему не присоединена, то это еще не значит, что на ней ни чего нет !!!.

И Я стал действовать от обратного: на ножке всегда ПЛЮС (лог.1) - это делает сама МК без пояльника - для этого и записываем в пин входа единицу, и если эту ножку "закоротить" на минус (коротить не надо - через резистор), то ток с пина убежит к МИНУСУ, а на ПИНЕ останется НОЛЬ.
И программу переделал так, что работает по отсутствии сигнала.

короче, по принципу от обратного.

во... правильно? я свободен? :roll:

Re: порты не работают на вход :(

rig » 03 фев 2008, 22:21

не, ни фига не свободен. садись тройка.
Grover писал(а):DDRD = 0b00011111; // пины с 0 по 4 выходы, а пины 5,6,7 - входы.PORTD = 0b11100000; // ВАЖНО: на пины 0 - 4 установил 0 (нет сигнала), а пины 5,6,7 установил 1, т.е. МК сама подаст логическую 1.

все правильно кроме последней фразы, хотя смысл рядом
Grover писал(а):пины 5,6,7 установил 1, т.е. МК сама подаст логическую 1.

это называется включил подтягивающие резисторы
Port is an 8-bit bi-directional I/O port with internal pull-up resistors (selected for each
bit).
1.jpg

Grover писал(а):если эту ножку "закоротить" на минус (коротить не надо - через резистор), то ток с пина убежит к МИНУСУ, а на ПИНЕ останется НОЛЬ.

резистор совсем не обязательно, яб сказал больше он там не нужен если схема не требует.
с подтягивающим резистором всегда получаешь 1 на входе, садишь любым способом ногу на землю получаешь НОЛЬ.

Re: порты не работают на вход :(

Grover » 03 фев 2008, 22:40

так, а если ну вот очень надо реагировать на ПЛЮС ?

Re: порты не работают на вход :(

rig » 03 фев 2008, 22:48

а если хоть немножко подумать?
подсказка: все перевернуть с ног на голову

Re: порты не работают на вход :(

Grover » 04 фев 2008, 09:26

с ног на голову...
подтянуть МИНУС к пину, т.е. в программе в пин входа записываю 0 (Z состояние), на схеме подключаю ножку к МИНУСУ.
Кнопка будет соединять этот же пин с плюсом? сразу догадываюсь, что тут без сопративления на минус надо ставить...

?

Re: порты не работают на вход :(

$ilent » 04 фев 2008, 10:24

Минусы вообще не подтягиваются.
Исправь обработку кнопки if (PIND & (1<<5)) и всё.

Re: порты не работают на вход :(

rig » 04 фев 2008, 14:59

$ilent писал(а):Минусы вообще не подтягиваются.

почему нет? В МК переход 1-0-1 примерно по середине питания.
легко можно ножку через резистор на минус и кнопкой коммутировать на плюс. яб сделал без зазрений совести.
Grover писал(а):подтянуть МИНУС к пину, т.е. в программе в пин входа записываю 0 (Z состояние),

получаем ножку ни к чему не подсоединенную - это не подтяжка.
подтяжка будет внешним резистором.


Rambler\'s Top100 Mail.ru counter