Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » Как правильно написать?

Страниц (4): [1] 2 3 4 »
 

1. beam - 25 Февраля, 2010 - 18:07:05 - перейти к сообщению
Привет всем,Сделал я один девайс,к которому прицепил оптопару.....мне нужно вот что.... при открытии фототранзистора плюс идет на вход потра PD4 кпримеру.... и чтобы это вызывало на выполнение программу...неважно какую...как правильно написать.....пишу на WinAwr....Заранее благодарен.
(Добавление)
а когда на порт ничего не идет чтобы МК прогу не вызывало
2. lamakazzz - 25 Февраля, 2010 - 19:07:00 - перейти к сообщению
Почему не искали на сайте?

Внешние прерывания
3. beam - 06 Марта, 2010 - 09:32:35 - перейти к сообщению
нет......вы не так поняли....=)...нужно вот што....когда фототранзистор открыт....тогда идет на выполнение программа.....както вот так вроде ....if (!(PINС & (1<<PINС5)))...- тоесть проверить ноль скажем или проверить плюс на линии 5 порта С...и если скажем там 1 тодолжна идти на выполнение программа...
4. nest - 06 Марта, 2010 - 11:48:43 - перейти к сообщению
beam, т.е. когда "вдруг" на ноге появлась лог. "1", то должно выполниться какая то программа? - Этим как раз и занимается прерывание по лог. уровню. Так что направление вам указали верное :)
5. beam - 06 Марта, 2010 - 13:04:15 - перейти к сообщению
нет......вы не так поняли....=)...нужно вот што....когда фототранзистор открыт....тогда идет на выполнение программа.....както вот так вроде ....if (!(PINС & (1<<PINС5)))...- тоесть проверить ноль скажем или проверить плюс на линии 5 порта С...и если скажем там 1 тодолжна идти на выполнение программа... я просто правильно написать не могу
6. nest - 06 Марта, 2010 - 13:15:13 - перейти к сообщению
не "што", а "что".

есть две возможности обработки логического состояния на входе:
- опрашивать (проверять) постоянно в цикле.
- заставить работать прерывание.

если вы хотите через if (!(PINС & (1<<PINС5))), то вам нужно в программе по возможности чаще проходить через эту конструкцию.

Если сделать на прерывании - достаточно его сконфигурировать, и прерывание сработает само, когда нужное состояние появится.
7. beam - 06 Марта, 2010 - 13:15:35 - перейти к сообщению
ясно
8. beam - 07 Марта, 2010 - 00:27:13 - перейти к сообщению
мне нужно к примеру ..при появлении на PC1 "плюса" загорались светодиоды портаC и D
....а когда на ПЦ1 ноль то чтобы ничего не горело.....как написать это?=)буду благодарен за помощь.
9. ОЛЕГ - 07 Марта, 2010 - 00:40:50 - перейти к сообщению
WHILE (PINС & (1<<PINС1))
{горят светодиоды;}
10. beam - 07 Марта, 2010 - 00:48:27 - перейти к сообщению
А где эту запись поставить?=)
(Добавление)
если можно то поподробней напишите пожалуйста...ато я неочень в этих делах пока што=)
11. ОЛЕГ - 07 Марта, 2010 - 00:53:16 - перейти к сообщению
Циклы в языке программирования С и.
(Добавление)
nest пишет:
не "што", а "что".
Улыбка
(Добавление)
CODE:

Бла-бла-бла, подключаем библиотеки.

int main(void)
{
Бла-бла-бла, конфигурируем порты.

while(1)
{

while(на какой-то ноге что-то)
{светодиоды горят;}

светодиоды не горят;
}
}
12. beam - 07 Марта, 2010 - 01:05:14 - перейти к сообщению
...неполучается почемуто...можете написать примероно как будет вот моя программа
мне нужно к примеру ..при появлении на PC1 "плюса" загорались светодиоды портаC и D
....а когда на ПЦ1 ноль то чтобы ничего не горело


#define F_CPU 8000000UL // 8 MHz
#include <avr/io.h>
#include <avr/delay.h>

int main(void) // начало основой программы
{
DDRD = 0xff;
DDRC = 0xff;



while(1) {

DDRD = 0xff;
DDRC = 0xff;
PORTD &= ~(1<<0);
_delay_ms(0.02);
PORTD |= 1<<0;
_delay_ms(0.02);
PORTD &= ~(1<<1);
_delay_ms(0.02);
PORTD |= 1<<1;
_delay_ms(0.02);
PORTD &= ~(1<<2);
_delay_ms(0.02);
PORTD |= 1<<2;
_delay_ms(0.02);
PORTD &= ~(1<<3);
_delay_ms(0.02);
PORTD |= 1<<3;
_delay_ms(0.02);
PORTC &= ~(1<<2);
_delay_ms(0.02);
PORTC |= 1<<2;
_delay_ms(0.02);
PORTC &= ~(1<<3);
_delay_ms(0.02);
PORTC |= 1<<3;
_delay_ms(0.02);
PORTC &= ~(1<<5);
_delay_ms(0.02);
PORTC |= 1<<5;
_delay_ms(0.02);
PORTC &= ~(1<<4);
_delay_ms(0.02);
PORTC |= 1<<4;
_delay_ms(0);



}
}
13. ОЛЕГ - 07 Марта, 2010 - 01:18:13 - перейти к сообщению
_delay_ms(0.02);- по-моему, бред. Нужны целые числа.
Это во-первых.
Во-вторых, у Вас порты неправильно сконфигурированы. Если порт сконфигурировать выходом, то ему будет по-барабану, сколько кнопок на нем висит и что там подается.
И резисторы подтягивающие включить нужно.

Написано тут: http://myrobot.ru/stepbystep/pr_mcports.php
Вы читали?
14. beam - 07 Марта, 2010 - 01:26:05 - перейти к сообщению
Ладно ...давайте по очереди....зачем нужны подтягивающие резисторы?...и если не трудно напищите пожалуйста начало с кнокой мое программе...(я ставлю оптопару)..заранее благодарен.
15. ОЛЕГ - 07 Марта, 2010 - 03:14:00 - перейти к сообщению
Вашу программу я уже написал выше. Вам нужно только подставить свои порты.
Подтягивающие резисторы нужны для того, чтобы установить по умолчанию на порте 0 или 1.
В Вашем случае, раз с кнопки идет 1, Вам нужно выставить по умолчанию 0. Иначе кнопка как бы будет всегда нажата.
Вам необходимо сконфигурировать порты таким образом, чтобы включение светодиодов на выходах порта С не затрагивало логический уровень на входе порта С, где у Вас висит кнопка.

Например:
DDRC = 0b11111110; //порт С- выход, но пин0 порта С- вход с кнопки
PORTC = 0b00000000; //установить на всех выходах логический 0

DDRD = 0b11111111; //порт D- целиком выход
PORTD = 0b00000000;//установить на всех выходах логический 0
(Добавление)



Я прошу прощения, обратите, пожалуйста внимание на предыдущий пост от 00:53:16, там была ошибка в коде, я исправил. Забыл обозначить главную функцию, сразу к циклу перешел.