Страница 1 из 1

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

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

(схема во вложении)
Запускаю в протеусе и ничего не происходит. как ни переключай switch светодиод не горит. Может я неправильно условие цикла задаю? Помогите с кодом.

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

Добавлено: Пн апр 14, 2014 22:25:44
codenamehawk

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

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

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

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

while ((PINB & 0x01) == 0x01 )
Вторую ошибку сами найдете.

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

Добавлено: Вт апр 15, 2014 09:25:52
metan
IMHO, начинать осваивать что-либо стоит с чтения литературы.
Например, Белов А.В. - Создаем устройства на микроконтроллерах. Первый же пример - ваш

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

Добавлено: Вт апр 15, 2014 09:38:18
Dr. Alex
Хм. Вам, для начала, нужно определить, какие ноги будут работать на выход, а какие на вход!!!!

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

.............
DDRB|= (1<<PB3);// Нога РВ3 на ВЫХОД
DDRB&= ~(1<<PB0);// Нога РВ0 на вход
.............
:shock: УПС..... не заметил - объявили)))))))

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

Добавлено: Вт апр 15, 2014 10:32:35
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
   }
}

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

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