Например TDA7294

Форум РадиоКот • Просмотр темы - Не меняется состояние вывода.
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пн авг 18, 2025 05:43:18

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 40 ]  1,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Не меняется состояние вывода.
СообщениеДобавлено: Пт мар 02, 2012 09:07:04 
Встал на лапы

Зарегистрирован: Ср янв 18, 2012 19:37:10
Сообщений: 129
Рейтинг сообщения: 0
Добрый день! Начал работать с микроконтроллерами совсем недавно. В общем, по нажатию кнопки необходимо поменять состояние вывода. Задача тривиальнейшая. Но код в симуляторе не работает. Либо я очень сильно туплю, любо одно из двух. Прямо вера в жизнь теряется. :)
Подскажите, если не сложно, где я не прав. Контроллер ATMEGA128. Кнопка висит на первой ноге порта С. Меняется состояние первой ноги порта F.

Код:

PORTC=0x00;
DDRC=0x00;
PORTF=0x00;
DDRF=0x01;

if (PINC.0 ==1){
PORTF=0b00000001;
}




Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Пт мар 02, 2012 09:12:23 
Друг Кота
Аватар пользователя

Карма: 49
Рейтинг сообщений: 392
Зарегистрирован: Вс июл 12, 2009 19:15:29
Сообщений: 7013
Откуда: Ижевск
Рейтинг сообщения: 0
Уважаемый! А где

Код:
if(!PINC.0) PORTF= 0b00000000;


?

_________________
Docendo discimus


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Пт мар 02, 2012 09:21:25 
Встал на лапы

Зарегистрирован: Ср янв 18, 2012 19:37:10
Сообщений: 129
Рейтинг сообщения: 0
ну я ж говорю, только начал работать с микроконтроллерами ) Дописал эту строчку. Правда все равно не работет (


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Пт мар 02, 2012 09:25:57 
Друг Кота
Аватар пользователя

Карма: 49
Рейтинг сообщений: 392
Зарегистрирован: Вс июл 12, 2009 19:15:29
Сообщений: 7013
Откуда: Ижевск
Рейтинг сообщения: 0
Все ифы под while(1);

Код:
while(1)
{
if.........
if........
}

_________________
Docendo discimus


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Пт мар 02, 2012 09:38:56 
Поставщик валерьянки для Кота

Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45
Сообщений: 1995
Откуда: Цветочный город
Рейтинг сообщения: 0
pyzhman писал(а):
Все ифы под while(1);
ифов не надо вообще:
Код:
PORTF = PINC & 1;

_________________
битва с дураками проиграна, победители торжествуют. слава победителям!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Пт мар 02, 2012 09:49:45 
Друг Кота
Аватар пользователя

Карма: 49
Рейтинг сообщений: 392
Зарегистрирован: Вс июл 12, 2009 19:15:29
Сообщений: 7013
Откуда: Ижевск
Рейтинг сообщения: 0
+. Только для начинающего, как мне кажется, не понятно.

_________________
Docendo discimus


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Пт мар 02, 2012 09:53:57 
Встал на лапы

Зарегистрирован: Ср янв 18, 2012 19:37:10
Сообщений: 129
Рейтинг сообщения: 0
о, спасибо! заработало!!! :) А тогда еще вопрос. Кнопку нажимаю - состояние вывода порта F меняется на 1. Отпускаю - все равно 1. А как сделать так, чтобы после отпускания кнопки состояние вывода порта F менялось на 0?
Или тут надо делать какую - нибудь задержку, а потом принудительно сбрасывать?

P.S. да, не очень понятно, если честно :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Пт мар 02, 2012 10:00:13 
Друг Кота
Аватар пользователя

Карма: 49
Рейтинг сообщений: 392
Зарегистрирован: Вс июл 12, 2009 19:15:29
Сообщений: 7013
Откуда: Ижевск
Рейтинг сообщения: 0
В настройках порта подтянуть вход к питанию
Код:
PORTC=0x01;


В железе кнопку между массой и входом PC0.

_________________
Docendo discimus


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Пт мар 02, 2012 10:37:59 
Встал на лапы

Зарегистрирован: Ср янв 18, 2012 19:37:10
Сообщений: 129
Рейтинг сообщения: 0
Если так сделать, то получится наоборот - разомкнуто +, замкнуто -. Чтобы сделать замкнуто +, разомкнуто -, надо 1 контакт кнопки посадить на +, второй через резистор на землю и второй контакт до резистора соединить с PC0. И подтягивать этот вход к питанию не надо. Просимулировал - вроде работает :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Пт мар 02, 2012 10:43:39 
Поставщик валерьянки для Кота

Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45
Сообщений: 1995
Откуда: Цветочный город
Рейтинг сообщения: 0
Prosperous писал(а):
Если так сделать, то получится наоборот - разомкнуто +, замкнуто -. Чтобы сделать замкнуто +, разомкнуто -, надо 1 контакт кнопки посадить на +, второй через резистор на землю и второй контакт до резистора соединить с PC0. И подтягивать этот вход к питанию не надо. Просимулировал - вроде работает :)
это верно, однако цель МК как раз в том, что для решения задачи вместо аппаратной обвязки по максимуму используются программные средства. поэтому логичнее отказаться от внешних компонентов (резистора), а для того, чтобы "при нажатии был плюс" использовать программную инверсию сигнала. хотя для программы что плюс, что минус (правильнее - 1 или 0) все равно, все это ЧИСЛА, и с ними можно делать все, что угодно.

_________________
битва с дураками проиграна, победители торжествуют. слава победителям!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Пт мар 02, 2012 12:25:03 
Друг Кота
Аватар пользователя

Карма: 9
Рейтинг сообщений: 96
Зарегистрирован: Пн июл 13, 2009 14:37:39
Сообщений: 3961
Откуда: Московская область, наукоград.....
Рейтинг сообщения: 0
еще не мешало бы добавить условие elsi

_________________
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Пт мар 02, 2012 13:02:04 
Встал на лапы

Зарегистрирован: Ср янв 18, 2012 19:37:10
Сообщений: 129
Рейтинг сообщения: 0
а что этим условием проверять?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Пт мар 02, 2012 13:12:34 
Друг Кота
Аватар пользователя

Карма: 9
Рейтинг сообщений: 96
Зарегистрирован: Пн июл 13, 2009 14:37:39
Сообщений: 3961
Откуда: Московская область, наукоград.....
Рейтинг сообщения: 0
Выполняя проверку по if вы ставите условие что будет если вывод в 1.
Но перехода в состояние 0 необходимо тоже описать, иначе получается так. МК ждет пока нет 1 на входе, затем перкидывает вывод и все - больше не возвращается в состояние 0

_________________
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Пт мар 02, 2012 13:35:46 
Встал на лапы

Зарегистрирован: Ср янв 18, 2012 19:37:10
Сообщений: 129
Рейтинг сообщения: 0
2Meteor Так а вроде Мастер Ломастер выше привел пример, когда условия не нужны. И вроде все работает. (правда я не очень понял как). Вы предлагаете вернуть обратно условия? (как писал pyzhman, так и он, вроде, согласился, что у Мастер Ломастера оптимальнее). Или я чего то недопонимаю?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Пт мар 02, 2012 14:08:49 
Поставщик валерьянки для Кота

Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45
Сообщений: 1995
Откуда: Цветочный город
Рейтинг сообщения: 0
я вам поясню, как работает :) на примере поясню.

представьте себе, что вам кто-то дает карточку белого или красного цвета, а вы должны показать кому-то третьему точно такую же. есть вариант, когда вы берете карточку, определяете ее цвет, затем выбираете из своих карточек нужную и показываете ее третьему. я же вам предложил вариант, когда вы берете карточку и не глядя на нее сразу ее же и показываете - вам оно надо, какого она цвета?

вариант с if-else - это вариант с АНАЛИЗОМ, т.е. смотрим на карточку, думаем и т.д. мой вариант - БЕЗ АНАЛИЗА: передаем не глядя и не думая.

в вашем примере с кнопкой все просто: что считали с одного порта, то же самое вывели и на другой. не глядя :)))

разумеется, бездумный (мой) вариант не пригоден для случая, когда получив белую карточку вы должны поставить на подоконник герань, а получив красную - поставить 33 холодных утюга :) понимаете о чем я?

_________________
битва с дураками проиграна, победители торжествуют. слава победителям!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Пт мар 02, 2012 14:21:53 
Встал на лапы

Зарегистрирован: Ср янв 18, 2012 19:37:10
Сообщений: 129
Рейтинг сообщения: 0
))) Да, предельно. В моем случае по поводу условий проверки можно не заморачиваться, поэтому ваш вариант подходит оптимально. А в будущем обязательно буду условиями пользоваться


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Сб мар 03, 2012 11:58:35 
Встал на лапы

Зарегистрирован: Ср янв 18, 2012 19:37:10
Сообщений: 129
Рейтинг сообщения: 0
В общем на этом история не закончилась :) Постепенно наращиваю код программы и столкнулся вот с чем. По задумке, при нажатии на кнопку, первая нога порта F формирует высокий уровень сигнала, который подается на ногу внешнего прерывания другого контроллера. После обработки прерывания второй контроллер инициирует передачу данных по SPI (он мастер). Первый контроллер принимает данные и выводит их на ноги порта Е. Проблема в том, что после написания функции SPI - slave, первый вывод порта F опять таки не хочет менять свое состояние. Как они взаимосвязаны ума не приложу.
Код:
#include <spi.h>

unsigned char SPI_receive(void)
{
unsigned char data;
while(!(SPSR & (1<<SPIF)));
data = SPDR; 
return data;
}

void main(void)
{
PORTB=0x00;
DDRB=0x08;

PORTC=0x00;
DDRC=0x00;

PORTE=0x00;
DDRE=0xFF;

PORTF=0x00;
DDRF=0x01;

SPCR=0x40;
SPSR=0x00;

PORTE = SPI_receive();
while (1)
{
PORTF= PINC&1;
};



после комментирования строки PORTE = SPI_receive(); вроде все заработало.
Хм... А чо не так то?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Сб мар 03, 2012 12:53:49 
Друг Кота
Аватар пользователя

Карма: 49
Рейтинг сообщений: 392
Зарегистрирован: Вс июл 12, 2009 19:15:29
Сообщений: 7013
Откуда: Ижевск
Рейтинг сообщения: 0
Мля....... :facepalm:
Код:
PORTC=0x01;

_________________
Docendo discimus


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Сб мар 03, 2012 13:18:33 
Встал на лапы

Зарегистрирован: Ср янв 18, 2012 19:37:10
Сообщений: 129
Рейтинг сообщения: 0
2pyzhman Я понимаю, что вызываю чувства типа "Господи, ну что за ДЕБИЛ!" Думаю мне можно сделать скидку на отсутсвие опыта :)
Хотелось бы прояснить на счет
Код:
PORTC=0x01;


Выше я писал, что в моем варианте подключения кнопки, такую строку, вроде как, можно не писать. Возможно я ошибаюсь.
Если же принципиально важно написание такой строки, то (я ее дописал, раскомментировал PORTE = SPI_receive(); и просимулировал) состояние вывода порта F не изменилось. А вот когда эта строка закоментирована - работает.

Прокоментируйте, если вас не затруднит :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не меняется состояние вывода.
СообщениеДобавлено: Сб мар 03, 2012 14:26:09 
Друг Кота
Аватар пользователя

Карма: 49
Рейтинг сообщений: 392
Зарегистрирован: Вс июл 12, 2009 19:15:29
Сообщений: 7013
Откуда: Ижевск
Рейтинг сообщения: 0
Стало быть железо оставлено свое. На будущее: коммутировать что-либо интереснее относительно земли. Ибо она везде. Кругом и рядом.
Код:
while(!(SPSR & (1<<SPIF)));

Здесь мы ждем принятый байт. Но чтобы его принять, нам нужна инициация посылки. Которая формируется ниже. :)

_________________
Docendo discimus


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 40 ]  1,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y