Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ввод/Вывод
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
GIGAWAT
Уважаемые товарищи 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 на землю :?
SasaVitebsk
Цитата(GIGAWAT @ Feb 16 2007, 00:16) *
Суть: Диод поключенный к PD0 никак нихочет гореть когда я закорачиваю PB1 на землю :?


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

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

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

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

По программе даже указывать не буду. Почитайте хотябы литературу для начинающих и посмотрите как это реализовано у других. Прямо на этом форуме. Введите в поиск что нибудь типа "для начинающих" или
"дёрганье ногой".
beer_warrior
Цитата
Код
DDRD = 0xFF;    DDRB = 0xFF; // Настройка порта D и B для вывода

1.И что вы хотите прочитать с PINB?
2.Анализ идет по всему PINB. а не по биту.
GIGAWAT
Собственно я прочитал в книге "Применение микроконтроллеров AVR. Схемы, алгоритмы, программы (Баранов В.Н.)".
Там написано:
Нажмите для просмотра прикрепленного файла

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

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

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

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

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

if (!(PINB & (1 << PB1)))
{// Кнопка нажата
....
....
....
}
else
{// Кнопка не нажата
....
....
....
}
SasaVitebsk
Цитата(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) то кнопка нажата
beer_warrior
Даташиты надо читать, а не научпоп.
Смотрим раздел Ports as General Digital I/O на схему.
Что видим:
1 PINx - подключен всегда.
2.PORTx - через элемент Z
3.DDRx - управляет этим элементом.
Т.е. пока DDRx в 1, на ноге состояние задается PORTx. Если два источника - значит, кто кого перетянет. И не факт, что без выгорания.
И только при DDRx в 0 можно уверенно говорить о входном сигнале в PINx.
Цитата
если (temp (истина, не ноль))

Правильно, а что делается на других ногах?
Такая конструкция хороша как "если нажата хоть одна кнопка", но не для единичного бита.
=GM=
И уберите while(1) после else, а то там программа зациклится намертво.

Код
    if (temp)
        {

        cbi(PORTD,PD0);
        _delay_ms(0.240);
        }
    else
        while(1)
        {
        sbi(PORTD,PD0);
        }
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.