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

LED на порту все равно горит

Добавлено: Чт апр 23, 2009 16:22:05
lkote68
Уважаемые Коты Чет мануалы не помагают. Прога меряет 10 термометров и по запросу выводит значения через UART.

// Port C initialization
In Func4=In Func3=In Func2=In Func1=In Func0=Out
5=T State4=T State3=T State2=T State1=T State0=1
PORTC=0x01;
DDRC=0x01;
while(1){}
Горит все соответствует.

PORTC=0x01;
DDRC=0x01;
потом если в while(1){
PORTC.0 = 0;
}
Не горит что также соответствует.

Решил пока идет измерение пусть горит когда закончилось измерение гаснет. Поставил в начале функции измерения
PORTC.0 = 1;
измерение 10 термометров
PORTC.0 = 0;

и вот так горит.

while (1)
{
// ResponceFunc();
// MeasureFunc();
//
PORTC.0 = 1;
delay_ms(1000);
PORTC.0 = 0;
}

Нет правда гаснет на тот момент пока отсылаются данные. Чего я собственно не хотел.

LED на порту все равно горит

Добавлено: Чт апр 23, 2009 17:44:28
lkote68
Вот еще фишку для себя открыл
ежели
PORTC=0x01;
DDRC=0x01;
while (1)
{
PORTC.0 = 0;
delay_ms(200);
PORTC.0 = 1;
delay_ms(200);
};
Мигает ярко и красиво ежели
PORTC=0x01;
DDRC=0x00;
while (1)
{
PORTC.0 = 1;
delay_ms(200);
PORTC.0 = 0;
delay_ms(200);
};
Тускло Кто может объяснить Скважность одинаковая. Мабуть дело в подтягивающем резисторе. Ток вот не соображу до конца.

Re: LED на порту все равно горит

Добавлено: Чт апр 23, 2009 18:34:04
kupriyanov
lkote68 писал(а): PORTC=0x01;
DDRC=0x00;

Тускло Кто может объяснить Скважность одинаковая. Мабуть дело в подтягивающем резисторе. Ток вот не соображу до конца.
Прочитай даташит!!!
DDRC=0x00;

этой строкой ты устанавливаешь ногу порта на вход....
(в этом случае бит 0 регистра PORTC управляет подтягивающим резистором, а не состоянием выхода)
а тут:
while (1)
{
PORTC.0 = 1;
delay_ms(200);
PORTC.0 = 0;
delay_ms(200);
};

ты подключаешь или выключаешь подтягивающий резистор... Понятное дело что через подтягивающий резистор светодиод ярко гореть не будет...

Re: LED на порту все равно горит

Добавлено: Чт апр 23, 2009 18:40:35
kupriyanov
lkote68 писал(а):
Решил пока идет измерение пусть горит когда закончилось измерение гаснет. Поставил в начале функции измерения
PORTC.0 = 1;
измерение 10 термометров
PORTC.0 = 0;

и вот так горит.

.
Цикл повторяется видимо настолько часто, что время между опросами гораздо меньше времени опроса всех 10 датчиков...так что в вашем решении включения светодиода на момент опроса смысла нет...

LED на порту все равно горит

Добавлено: Чт апр 23, 2009 20:47:35
lkote68
С несвечением в первом случае я разобрался Фишка в том что светодиод загорается потом идет измерение (оно длинное) а вот гасится светодиод иголкой и сразу снова загорается тут все уже понятно.
Прочитай даташит!!!
DDRC=0x00;
этой строкой ты устанавливаешь ногу порта на вход....
(в этом случае бит 0 регистра PORTC управляет подтягивающим резистором, а не состоянием выхода)
а CodeVision грит
Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
State5=T State4=T State3=T State2=T State1=T State0=1
PORTC=0x01;
DDRC=0x01;

Тобишь PORTC=0x01 == Func = Out
DDRC=0x01 == State=1

Re: LED на порту все равно горит

Добавлено: Чт апр 23, 2009 22:32:11
ibiza11
lkote68 писал(а):
Тобишь PORTC=0x01 == Func = Out
DDRC=0x01 == State=1
а почему не наоборот??? не понимаю почему не рассматриваешь два варианта, раз уж в даташит трудно заглянуть!!! :evil: :evil: :evil:

Добавлено: Чт апр 23, 2009 23:25:13
BCluster
DDR=Data DiRection елки)
когда в программе ты пишешь PORTC.0 = 1; а не DDR.0 = 1;
И когда в порт пишешь значение PORTC=0xFF а не DDR=0xFF
Проверяется просто
PORTC.5 например замени на (PORTC>>5)&0x01, кстати данная конструкция удобна если надо гонять по битам порта в цикле)