При наличии1, зажечь светодиод на ноге РВ3

Обсуждаем контроллеры компании Atmel.
Ответить
Аватара пользователя
vintorez
Родился
Сообщения: 4
Зарегистрирован: Пт янв 20, 2012 07:43:21
Откуда: Томск

При наличии1, зажечь светодиод на ноге РВ3

Сообщение vintorez »

начинаю осваивать микроконтроллер и не могу понять что не так с простой программулиной. По идее она должна отслеживать состояние на входе РВ0 и при наличии там 1, зажечь светодиод на ноге РВ3
код:
#include <avr/io.h>
int main(void)
{ DDRB=0b111110;
while (PINB==0b000000)
{
PORTB=0b001000;
}
}

(схема во вложении)
Запускаю в протеусе и ничего не происходит. как ни переключай switch светодиод не горит. Может я неправильно условие цикла задаю? Помогите с кодом.
Вложения
tiny.JPG
(92.67 КБ) 395 скачиваний
Реклама
codenamehawk
Вымогатель припоя
Сообщения: 528
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: Помогите разобраться

Сообщение codenamehawk »

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

while (PINB==0b000000)
Ты считываешь состояние всех ног порта, а они могут быть не равны нулю.

Попробуйте так

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

while ((PINB & 0x01) == 0x01 )
Вторую ошибку сами найдете.
Реклама
metan
Вымогатель припоя
Сообщения: 593
Зарегистрирован: Ср янв 06, 2010 10:01:46

Re: При наличии1, зажечь светодиод на ноге РВ3

Сообщение metan »

IMHO, начинать осваивать что-либо стоит с чтения литературы.
Например, Белов А.В. - Создаем устройства на микроконтроллерах. Первый же пример - ваш
Аватара пользователя
Dr. Alex
Это не хвост, это антенна
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков
Контактная информация:

Re: При наличии1, зажечь светодиод на ноге РВ3

Сообщение Dr. Alex »

Хм. Вам, для начала, нужно определить, какие ноги будут работать на выход, а какие на вход!!!!

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

.............
DDRB|= (1<<PB3);// Нога РВ3 на ВЫХОД
DDRB&= ~(1<<PB0);// Нога РВ0 на вход
.............
:shock: УПС..... не заметил - объявили)))))))
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18629
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: При наличии1, зажечь светодиод на ноге РВ3

Сообщение ARV »

vintorez писал(а):не могу понять что не так с простой программулиной. По идее она должна отслеживать состояние на входе РВ0 и при наличии там 1, зажечь светодиод на ноге РВ3
код:
#include <avr/io.h>
int main(void)
{ DDRB=0b111110;
while (PINB==0b000000)
{
PORTB=0b001000;
}
}
не понятно лично мне другое - зачем пытаются отвечать те, кто не понимает сам? ведь кроме, как поставить в тупик своими советами, другого результата они не добьются...

теперь о программе:
вы написали буквально следующее: пока на всех пинах порта B нули, выводить в порт B 1 в 4-ю линию, а в остальные 0. а теперь смотрите: если изначально у вас на пинах НЕ ВСЕ НУЛИ (что очень веротяно, ибо они болтаются в воздухе), условие цикла НЕ ВЫПОЛНЯЕТСЯ, и main завершается, не успев начаться. это раз.

далее, если вдруг чисто случайно на пинах окажутся нули, то первым же выводом в порт единички вы снова прекращаете работу цикла и на этом так же точка.

понятны проблемы? теперь о том, как их решать.
1. главный цикл main - это святое, всегда должен выглядеть только так

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

while(1){
// тут что-то делаем
}
это значит вечный цикл. МК - это вам не Windows, завершаться main не должна.

2. теперь с опросом пинов и выводом в них. как проверить состояние одного пина, не смешивая их с остальными, см. здесь: http://arv.radioliga.com/content/view/191/49/ как устанавливать только один нужный бит, не трогая остальные, смотри здесь: http://arv.radioliga.com/content/view/187/49/ как сбрасывать только один бит, не меняя остальные, см. здесь: http://arv.radioliga.com/content/view/188/49/

3. подводя итог, ваша программа должна иметь такой "костяк":

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

int main(void){
   // настраивем ТОЛЬКО нужные порты (пины) на вывод
   // выводим только в нужные порты (пины) единички
   while(1){
      if(проверяем_состояние_нужного_пина)
         // устанавливаем нужный пин в 1
      else 
         // устанавливаем нужный бит в 0
   }
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
vintorez
Родился
Сообщения: 4
Зарегистрирован: Пт янв 20, 2012 07:43:21
Откуда: Томск

Re: При наличии1, зажечь светодиод на ноге РВ3

Сообщение vintorez »

AVR, огромное спасибо! Хорошо что есть такие люди как Вы. Информации по ссылкам оч не хватало.
Книга Белова есть, но из нее я так не понял как настроить порт(для моего случая). Перечитаю еще раз.
И спасибо админу :) а то я уже голову сломал.
Реклама
Ответить

Вернуться в «AVR»