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 - это святое, всегда должен выглядеть только так
это значит вечный цикл. МК - это вам не 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
}
}