Не меняется состояние вывода.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Сообщение Prosperous »

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

Код: Выделить всё


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

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


Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Уважаемый! А где

Код: Выделить всё

if(!PINC.0) PORTF= 0b00000000;
?
Docendo discimus
Контактная информация:
Реклама
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Сообщение Prosperous »

ну я ж говорю, только начал работать с микроконтроллерами ) Дописал эту строчку. Правда все равно не работет (
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Все ифы под while(1);

Код: Выделить всё

while(1)
{
if.........
if........
}
Docendo discimus
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

pyzhman писал(а):Все ифы под while(1);
ифов не надо вообще:

Код: Выделить всё

PORTF = PINC & 1;
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

+. Только для начинающего, как мне кажется, не понятно.
Docendo discimus
Контактная информация:
Реклама
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Сообщение Prosperous »

о, спасибо! заработало!!! :) А тогда еще вопрос. Кнопку нажимаю - состояние вывода порта F меняется на 1. Отпускаю - все равно 1. А как сделать так, чтобы после отпускания кнопки состояние вывода порта F менялось на 0?
Или тут надо делать какую - нибудь задержку, а потом принудительно сбрасывать?

P.S. да, не очень понятно, если честно :)
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

В настройках порта подтянуть вход к питанию

Код: Выделить всё

PORTC=0x01;
В железе кнопку между массой и входом PC0.
Docendo discimus
Контактная информация:
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Сообщение Prosperous »

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

Сообщение Мастер Ломастер »

Prosperous писал(а):Если так сделать, то получится наоборот - разомкнуто +, замкнуто -. Чтобы сделать замкнуто +, разомкнуто -, надо 1 контакт кнопки посадить на +, второй через резистор на землю и второй контакт до резистора соединить с PC0. И подтягивать этот вход к питанию не надо. Просимулировал - вроде работает :)
это верно, однако цель МК как раз в том, что для решения задачи вместо аппаратной обвязки по максимуму используются программные средства. поэтому логичнее отказаться от внешних компонентов (резистора), а для того, чтобы "при нажатии был плюс" использовать программную инверсию сигнала. хотя для программы что плюс, что минус (правильнее - 1 или 0) все равно, все это ЧИСЛА, и с ними можно делать все, что угодно.
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

еще не мешало бы добавить условие elsi
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Сообщение Prosperous »

а что этим условием проверять?
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Выполняя проверку по if вы ставите условие что будет если вывод в 1.
Но перехода в состояние 0 необходимо тоже описать, иначе получается так. МК ждет пока нет 1 на входе, затем перкидывает вывод и все - больше не возвращается в состояние 0
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Сообщение Prosperous »

2Meteor Так а вроде Мастер Ломастер выше привел пример, когда условия не нужны. И вроде все работает. (правда я не очень понял как). Вы предлагаете вернуть обратно условия? (как писал pyzhman, так и он, вроде, согласился, что у Мастер Ломастера оптимальнее). Или я чего то недопонимаю?
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

я вам поясню, как работает :) на примере поясню.

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

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

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

разумеется, бездумный (мой) вариант не пригоден для случая, когда получив белую карточку вы должны поставить на подоконник герань, а получив красную - поставить 33 холодных утюга :) понимаете о чем я?
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Сообщение Prosperous »

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

Сообщение Prosperous »

В общем на этом история не закончилась :) Постепенно наращиваю код программы и столкнулся вот с чем. По задумке, при нажатии на кнопку, первая нога порта 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(); вроде все заработало.
Хм... А чо не так то?
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Мля....... :facepalm:

Код: Выделить всё

PORTC=0x01;
Docendo discimus
Контактная информация:
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Сообщение Prosperous »

2pyzhman Я понимаю, что вызываю чувства типа "Господи, ну что за ДЕБИЛ!" Думаю мне можно сделать скидку на отсутсвие опыта :)
Хотелось бы прояснить на счет

Код: Выделить всё

PORTC=0x01;


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

Прокоментируйте, если вас не затруднит :)
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Стало быть железо оставлено свое. На будущее: коммутировать что-либо интереснее относительно земли. Ибо она везде. Кругом и рядом.

Код: Выделить всё

while(!(SPSR & (1<<SPIF)));
Здесь мы ждем принятый байт. Но чтобы его принять, нам нужна инициация посылки. Которая формируется ниже. :)
Docendo discimus
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»