|
|
  |
Ввод/Вывод, помогите прозреть =) |
|
|
|
Feb 15 2007, 23:16
|
Участник

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

|
Уважаемые товарищи 8) Помогите прозреть. Я не первый, и не последний с подобным вопросом. Итак, исходные данные: 1) Моя плата http://smileymicros.com/download/Butterfly..._position=62:622)Схемка подключения переферии  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 на землю :?
|
|
|
|
|
Feb 15 2007, 23:27
|
Гуру
     
Группа: Свой
Сообщений: 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; // Кнопку подпереть По программе даже указывать не буду. Почитайте хотябы литературу для начинающих и посмотрите как это реализовано у других. Прямо на этом форуме. Введите в поиск что нибудь типа "для начинающих" или "дёрганье ногой".
|
|
|
|
|
Feb 15 2007, 23:32
|

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

|
Цитата Код DDRD = 0xFF; DDRB = 0xFF; // Настройка порта D и B для вывода 1.И что вы хотите прочитать с PINB? 2.Анализ идет по всему PINB. а не по биту.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Feb 15 2007, 23:46
|
Участник

Группа: Участник
Сообщений: 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 (истина, не ноль)) {дога нуль на порт с диодом} иначе {единицу на порт с диодом} или я неправ
|
|
|
|
|
Feb 16 2007, 00:17
|

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

|
Цитата(GIGAWAT @ Feb 16 2007, 01:46)  Ну вроде так: PINB в temp если (temp (истина, не ноль)) {дога нуль на порт с диодом} иначе {единицу на порт с диодом} или я неправ  В вашем случае можно и так. Ибо FALSE есть ноль, а TRUE есть все что кроме нуля. Но если допустим включить к PORTB еще одну кнопку, то уже нельзя будет определить нажатие каждой кнопки в отдельности. Поэтому удобней проверять тот бит порта, к которому включена интересующая вас кнопка. Например вот так: if (!(PINB & (1 << PB1))) {// Кнопка нажата .... .... .... } else {// Кнопка не нажата .... .... .... }
|
|
|
|
|
Feb 16 2007, 00:26
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(GIGAWAT @ Feb 16 2007, 00:46)  Собственно я прочитал в книге "Применение микроконтроллеров AVR. Схемы, алгоритмы, программы (Баранов В.Н.)". Там написано:
Вот... Порт вроде не сжог, ибо проверял на осцилографе уровни сигналов. Это ещё один и не самый яркий пример, как цитата вырванная из контекста вводит в заблуждение начинающих программеров. Итак. То что там написано (как не странно) совершенно правильно. Но это совсем не означает, что так надо и делать. Смысл написанного сводится к тому, что данные регистры имеют различный смысл. А чтобы это понять надо было полностью прочитать описание порта. Короче при выводе 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 (истина, не ноль)) {дога нуль на порт с диодом} иначе {единицу на порт с диодом} или я неправ  if((PINB & 1) == 0) то кнопка нажата
|
|
|
|
|
Feb 16 2007, 00:26
|

Профессионал
    
Группа: Свой
Сообщений: 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 (истина, не ноль)) Правильно, а что делается на других ногах? Такая конструкция хороша как "если нажата хоть одна кнопка", но не для единичного бита.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|