реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Ввод/Вывод, помогите прозреть =)
GIGAWAT
сообщение Feb 15 2007, 23:16
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 9-02-07
Из: Санкт-Петербург
Пользователь №: 25 221



Уважаемые товарищи 8) Помогите прозреть.
Я не первый, и не последний с подобным вопросом.
Итак, исходные данные:
1) Моя плата http://smileymicros.com/download/Butterfly..._position=62:62

2)Схемка подключения переферии


3)Программка 8)
======================================
#include <avr/io.h>
#include <avr/delay.h>

int main (void)
{
DDRD = 0xFF;
DDRB = 0xFF; // Настройка порта D и B для вывода
unsigned char temp;

while (1)
{
cbi(PORTB,PB1);
_delay_ms(0.485);
sbi(PORTB,PB1);
_delay_ms(0.065);

temp=PINB;
if (temp)
{

cbi(PORTD,PD0);
_delay_ms(0.240);
}
else
while(1)
{
sbi(PORTD,PD0);
}
}

}
=========================================
Суть: Диод поключенный к PD0 никак нихочет гореть когда я закорачиваю PB1 на землю :?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 15 2007, 23:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(GIGAWAT @ Feb 16 2007, 00:16) *
Суть: Диод поключенный к PD0 никак нихочет гореть когда я закорачиваю PB1 на землю :?


Вы же сами пишете
DDRB = 0xFF; // Настройка порта D и B для вывода

Но порт B должен быть настроен на ввод! Иначе что вы там увидите. Надеюсь вы пока не спалили однокристалку выводя в этот порт 1 и садя его ч/з кнопку на землю.

Правильнее будет так

DDRB = 0xfe; // B0 на вывод
PORTB != 1; // Кнопку подпереть

По программе даже указывать не буду. Почитайте хотябы литературу для начинающих и посмотрите как это реализовано у других. Прямо на этом форуме. Введите в поиск что нибудь типа "для начинающих" или
"дёрганье ногой".
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Feb 15 2007, 23:32
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
Код
DDRD = 0xFF;    DDRB = 0xFF; // Настройка порта D и B для вывода

1.И что вы хотите прочитать с PINB?
2.Анализ идет по всему PINB. а не по биту.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
GIGAWAT
сообщение Feb 15 2007, 23:46
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 9-02-07
Из: Санкт-Петербург
Пользователь №: 25 221



Собственно я прочитал в книге "Применение микроконтроллеров AVR. Схемы, алгоритмы, программы (Баранов В.Н.)".
Там написано:

Прикрепленное изображение


Вот...
Порт вроде не сжог, ибо проверял на осцилографе уровни сигналов.

Цитата(beer_warrior @ Feb 15 2007, 23:32) *
Цитата
Код
DDRD = 0xFF;    DDRB = 0xFF; // Настройка порта D и B для вывода

1.И что вы хотите прочитать с PINB?
2.Анализ идет по всему PINB. а не по биту.

Ну вроде так:
PINB в temp
если (temp (истина, не ноль)) {дога нуль на порт с диодом} иначе {единицу на порт с диодом}
или я неправ cranky.gif
Go to the top of the page
 
+Quote Post
kada
сообщение Feb 16 2007, 00:17
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 106
Регистрация: 23-05-05
Из: Ташкент
Пользователь №: 5 324



Цитата(GIGAWAT @ Feb 16 2007, 01:46) *
Ну вроде так:
PINB в temp
если (temp (истина, не ноль)) {дога нуль на порт с диодом} иначе {единицу на порт с диодом}
или я неправ cranky.gif

В вашем случае можно и так. Ибо FALSE есть ноль, а TRUE есть все что кроме нуля.
Но если допустим включить к PORTB еще одну кнопку, то уже нельзя будет определить нажатие каждой кнопки в отдельности. Поэтому удобней проверять тот бит порта, к которому включена интересующая вас кнопка. Например вот так:

if (!(PINB & (1 << PB1)))
{// Кнопка нажата
....
....
....
}
else
{// Кнопка не нажата
....
....
....
}
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 16 2007, 00:26
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(GIGAWAT @ Feb 16 2007, 00:46) *
Собственно я прочитал в книге "Применение микроконтроллеров AVR. Схемы, алгоритмы, программы (Баранов В.Н.)".
Там написано:

Прикрепленное изображение


Вот...
Порт вроде не сжог, ибо проверял на осцилографе уровни сигналов.


Это ещё один и не самый яркий пример, как цитата вырванная из контекста вводит в заблуждение начинающих программеров. smile.gif

Итак. То что там написано (как не странно) совершенно правильно. Но это совсем не означает, что так надо и делать. Смысл написанного сводится к тому, что данные регистры имеют различный смысл. А чтобы это понять надо было полностью прочитать описание порта. Короче при выводе 1 в порт и закоротке её на землю ток по данной ноге будет стремится к бесконечности и будет ограничен лишь мощностью ноги порта (может быть свыше 40ма правда), сопротивлением контакта кнопки, мощностью источника. Что данная нога выйдет из строя - нет ни каких сомнений. Это лишь вопрос времени. Ещё раз привожу правильную инициализацию порта

DDRB = 0xfe; // B0 на ввод
PORTB != 1; // Кнопку подпереть


Цитата
Цитата(beer_warrior @ Feb 15 2007, 23:32) *

Цитата
Код
DDRD = 0xFF;    DDRB = 0xFF; // Настройка порта D и B для вывода

1.И что вы хотите прочитать с PINB?
2.Анализ идет по всему PINB. а не по биту.

Ну вроде так:
PINB в temp
если (temp (истина, не ноль)) {дога нуль на порт с диодом} иначе {единицу на порт с диодом}
или я неправ cranky.gif


if((PINB & 1) == 0) то кнопка нажата
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Feb 16 2007, 00:26
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Даташиты надо читать, а не научпоп.
Смотрим раздел Ports as General Digital I/O на схему.
Что видим:
1 PINx - подключен всегда.
2.PORTx - через элемент Z
3.DDRx - управляет этим элементом.
Т.е. пока DDRx в 1, на ноге состояние задается PORTx. Если два источника - значит, кто кого перетянет. И не факт, что без выгорания.
И только при DDRx в 0 можно уверенно говорить о входном сигнале в PINx.
Цитата
если (temp (истина, не ноль))

Правильно, а что делается на других ногах?
Такая конструкция хороша как "если нажата хоть одна кнопка", но не для единичного бита.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Feb 16 2007, 01:47
Сообщение #8


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



И уберите while(1) после else, а то там программа зациклится намертво.

Код
    if (temp)
        {

        cbi(PORTD,PD0);
        _delay_ms(0.240);
        }
    else
        while(1)
        {
        sbi(PORTD,PD0);
        }


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 11:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01438 секунд с 7
ELECTRONIX ©2004-2016