...Из ваших двух ответов собрал один и всё заработало... .... while (!PINB.1==0); ....
Если Вы ждёте лог. 0, то while (!PINB.1==0); работать будет, но это лёгкий садизм. Лучше писать так:
while (PINB.1);
Будет работать точно так же. Или так:
while (PINB.1==1);
А в чём разница? Я так понимаю, если написать 0, то сработает если я подам на вывод минус, а если поставить 1, то на вывод надо подавать плюс?
В данном случае мне минус даже удобнее (если бы применять в реале), а вот с индукционных и оптических датчиков надо чтобы был плюс.
Барсик писал(а):
Будет работать точно так же.
Что-то не работала.
Цитата:
Или так: while (PINB.1==1);
А так не пробовал...
P.S. Попробовал, не работает. Тогда прога без сигнала начинает работать дальше. А как тогда сделать чтобы срабатывало от +5В?
P.P.S. Оказывается забыл ! вначале убрать. Действительно, работает точно так-же, тоесть нужен логический 0. Разницу не уловил.
То микроконтроллер (или вход в лучшем случае) сгорит нафиг. На вход можно подавать только положительное напряжение величиной от нуля до напряжения питания. От величины этого напряжения зависит, что считает микроконтроллер при опросе состояния входа - 1 или 0. Если напряжение выше некоторого порога, то будет считана 1, если ниже некоторого порога, то будет считан 0.
Если у Вас на входе высокий уровень (лог. 1), а Вы ждёте, пока появится низкий (лог. 0), то следует писать while (PINB.1);
Если у Вас на входе низкий уровень (лог. 0), а Вы ждёте, пока появится высокий (лог. 1), то следует писать while (!PINB.1);
Кстати, на входе можно включить внутренний подтягивающий резистор, который подтягивает вход к +5 вольтам. Если вход висит в воздухе, то будет считываться лог. 1. А если вход посадить на землюто будет считываться лог. 0.
Последний раз редактировалось Барсик Пт фев 13, 2009 17:46:36, всего редактировалось 1 раз.
То микроконтроллер (или вход в лучшем случае) сгорит нафиг. На вход можно подавать только положительное напряжение величиной от нуля до напряжения питания.
Ну я имел ввиду минус питания, тоесть 0 (включал через резистор)
Цитата:
Если у Вас на входе высокий уровень (лог. 1), а Вы ждёте, пока появится низкий (лог. 0), то следует писать while (PINB.1); Если у Вас на входе низкий уровень (лог. 0), а Вы ждёте, пока появится высокий (лог. 1), то следует писать while (!PINB.1);
А как сделать, чтобы на входе был низкий уровень? Когда я пишу (!PINB.1), то программа не ждёт сигнала а продолжает работу, как будто сигнал уже был.
Кстати, я заметил (когда делал для логического 0), что срабатывает даже от простого прикосновения к выходу (и даже от прикосновения пластмассовой линейкой). Вылечилось путём подачи +5 В через резистор 10 Ком. Но я вот что подумал, если +5 В не подавать, то наверное таким образом можно сделать сенсорные кнопки?
А вот такой вопрос:
Как сделать так, чтобы при подаче сигнала на PINB.1, появлялся сигнал на PORTD.1. А при подаче сигнала на PINB.2, сигнал появлялся на PORTD.2?
Ну тоесть чтобы не последовательно все команды шли, а либо так, либо по другому (типа как ветвящийся алгоритм).
Что-то я нифига не понял, что Вы хотите.
Чтобы при подаче сигнала на PINB.1, появлялся сигнал на PORTD.1 надо написать:
PORTD.1 = PINB.1;
PORTD.2 = PINB.2;
И засунуть это в цикл, чтобы опрос портов происходил достаточно часто. Если Ваша программа занята чем-то другим и не может опрашивать эти порты, то необходимо использовать прерывания. Организовать прерывания от таймера, чтобы они происходили с нужной Вам частотой, и засунуть в обработчик прерывания эти строчки.
А насчёт "ветвящегося алгоритма" я ваще ничего не понял, что Вы имели в виду.
Ну вот например дошла программа до определённой строки и остановилась (ждёт сигнала). Если сигнал поступил на PINB.1, то выполняется одна чатсть программы, а если на PINB.2, то выполняется другая часть.
И еще:
Имеется ЖК дисплей WINSTAR WHC0802B-NGA-CT. Инфы по этому дисплею я нифига не нашёл, знаю только что там 16 выводов и микросхема. Каким способом можно разобраться, как его подключать?
И что вообще с ним можно сделать для начала? (Ну чисто для обучения. На практике мне от этого дисплея пока ничего не надо).
Так бы сразу и написали бы. Для подобных случаев существует конструкция "Switch". Странно, но в "Руководство полного идиота по программированию (на языке Си)" ссылку на которое http://lib.ru/CTOTOR/starterkit.txt давал Pippeytz, я ничего не нашёл про "Switch". Вероятно, полные идиоты эту конструкцию не используют... Но мы то с Вами другие...
Код:
unsigned char i = 0; while (1) {
// ждём лог. 1 на одном из входов do { i = PINB; // считали все выводы сразу i = i & 0b00001110; // маскируем разряды, которые нам не нужны }while(!i); // будет крутиться в цикле, пока на одном из выводов PINB.1, PINB.2, PINB.3 // не появится лог. 1
// Где-то вылезла лог. 1. Разбираемся где именно. // если на PINB.1, то значение i будет 2 // если на PINB.2, то значение i будет 4 // если на PINB.3, то значение i будет 8 switch (i) { case 2: // значит лог. 1 появилась на PINB.1 // выполняем соответствующий кусок кода PORTD.1 = 1; // например. // вообще, здесь можно писать много всего... break; //всё, что надо сделали, вывалваемся из switch case 4: // значит лог. 1 появилась на PINB.2 // выполняем соответствующий кусок кода PORTD.2 = 1; // например. // вообще, здесь можно писать много всего... break; //всё, что надо сделали, вывалваемся из switch case 8: // значит лог. 1 появилась на PINB.3 // выполняем соответствующий кусок кода PORTD.3 = 1; // например. // вообще, здесь можно писать много всего... break; //всё, что надо сделали, вывалваемся из switch
default: // а это тот самый случай, кода вылезло нечто не предусмотренное // предыдущими случаями. Можно ничего не писать, а можно написать // интрукции и на этот случай } // это конец оператора switch
// дальше программа продолжается с этого места // .....................
Что-то не совсем понял про эту Switch. При компиляции ошибки не находит, но программа не работает. Тоесть не реагирует на сигналы. В чём причина, так и не понял. Даже попробовал не свою прогу, а вот то, что Вы написали (просто скопировал как есть), эффект тот-же.
Прикрутите к CodeVisionAVR отладчик AVR Studio. И получите массу удовольствий. В том числе можно будет смотреть значения переменных. Как это сделать, написано в http://pro-radio.ru/controllers/6585/
SeregaT писал(а):
...что Вы написали (просто скопировал как есть), эффект тот-же.
Ещё бы. Это же не вся программа, а фрагмент. И не просто фрагмент, а иллюстрация. Кстати, там нигде нет, чтобы выходы порта D устанавливались в ноль.
Гляньте пожалуйста, вот где тут может быть ошибка?
Цитата:
#include <mega8> #include <delay> // Declare your global variables here unsigned char i = 0; void main(void) { PORTD=0x00; //Выставляем все выходы порта D на 0, то есть, выключаем весь порт D DDRD=0xFF; //Делаем порт D, как выход, чтобы на выходах порта было напряжение 5В while (1)
// ждём лог. 1 на одном из входов do { i = PINB; // считали все выводы сразу i = i & 0b00001110; // маскируем разряды, которые нам не нужны }while(!i); // будет крутиться в цикле, пока на одном из выводов PINB.1, PINB.2, PINB.3 // не появится лог. 1
switch(i) { case 2: PORTD.1=1; break; //Если i равно 2 то выполняем PORTB.1=1, и вываливаем из скрипта } };
Тоесть если я правильно понял, то при подаче сигнала на PINB.1 (да вообще-то пробовал все PIN), должен появиться сигнал на PORTD.1 (не появился).
В той программе, которую написал Барсик я смог добиться, чтобы загорались светодиоды (причём не совсем те, что я ожидал), и не всегда. Тоесть можно было тыкать в три порта повсякому и иногда светодиоды загорались.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения