...Из ваших двух ответов собрал один и всё заработало... .... 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 (не появился).
В той программе, которую написал Барсик я смог добиться, чтобы загорались светодиоды (причём не совсем те, что я ожидал), и не всегда. Тоесть можно было тыкать в три порта повсякому и иногда светодиоды загорались.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения