Цитата(aesok @ Dec 4 2006, 11:05)

Цитата(asf @ Dec 4 2006, 11:38)

Цитата(aesok @ Dec 4 2006, 10:24)

Цитата(asf @ Dec 4 2006, 10:41)

Цитата(aesok @ Dec 3 2006, 19:42)

Цитата(asf @ Dec 3 2006, 20:35)

так в том-то и дело, что на winavr не все так просто как на iar...
Как вы ипользуете макрос "_delay_us"? Покажите код.
Анатолий.
а что там может быть сверх естественного? _delay_us(6) и в путь
А "F_CPU" у вас определен? Как?
Анатолий.
#define F_CPU 8000000UL // 8 MHz
F_CPU Должна быть определенна в каждом файле где используеться delay.h и до включения этого файла. Надеюсь у вас так.
Проще F_CPU определьть только один раз в Makefile, например так:
DEFS = ... -D F_CPU=8000000UL ...
У вас она кстате она не переопределена в Makefile?
Какие конкретно задежки вы пытаетесь получить с помощю _delay_us? У _delay_us есть ограничение по максимальной длительности, которую можно с помощью нее получить.
И не забывайте что пограмные задержки гарантируют только то что задержка будет не менее указанной, но она может быть больше.
Например если во время выполнения задержки в 20 мкс (_delay_us(20)) выпониться прерывание длительностью 100 мкс, то общая задежка будет 120 мкс.
Как много прерываний в вашей программе?
Анатолий.
Я делаю так:
#define F_CPU 8000000UL // 8 MHz
#include <util/delay.h>
#define OW_DEL_A 6
#define OW_DEL_B 64
#define OW_DEL_C 60
#define OW_DEL_D 10
#define OW_DEL_E 9
#define OW_DEL_F 55
#define OW_DEL_G 0
#define OW_DEL_H 480
#define OW_DEL_I 70
#define OW_DEL_J 410
Функция:
char OW_DetectPresence(void)
{ char status;
// устанавливаем шину в ноль
OW_DDR |= OW_BUS_MASK;
// задержка H нахождения шины в 0
__delay_cycles(OW_DEL_H);
// освобождаем шину
OW_DDR &= ~OW_BUS_MASK;
// задержка I до окончания таймслота
__delay_cycles(OW_DEL_I);
// читаем состояние шины
status = OW_PIN & OW_BUS_MASK;
// задержка J до окончания таймслота
__delay_cycles(OW_DEL_J);
return status;
}
не дает необходимого результата, однако вот такая конструкция работает:
char reset(void) //ñáðîñ òàáëåòêè
{ //
int temp; //
asm("cli"); //Çàïðåòèòü âñå ïðåðûâàíèÿ
OW_DDR |= OW_BUS_MASK; //0 íà òàáëåòêó
delay(1440);
temp=160; //ðåàëüíûé ïåðâûé îòâåò - 79 !!!
OW_DDR &= ~OW_BUS_MASK; //1 íà òàáëåòêó
do
{
if(bit_is_set(OW_PIN,OW_BUS)) goto respons1;
}while(--temp);// æäåì îñâîáîæäåíèÿ ëèíèè
goto bad;
respons1:
temp=172; //ðåàëüíûé ïåðâûé îòâåò - 86 !!!
do
{
if(!bit_is_set(OW_PIN,OW_BUS)) goto respons2;
}while(--temp);// æäåì îòâåòà òàáëåòêè
goto bad;//íåò îòâåòà òàáëåòêè
respons2:
temp=2382;
////ðåàëüíûé ïåðâûé îòâåò - 1191 !!!
do
{
if(bit_is_set(OW_PIN,OW_BUS)) goto respons3;
}while(--temp);//æäåì îñâîáîæäåíèÿ ëèíèè
goto bad;
respons3:
asm("sei"); //ðàçðåøàåì ïðåðûâàíèÿ
return 1;//òàáëåòêà èíèöèàëèçèðîâàíà
bad: //îøèáêà íà øèíå
asm("sei"); //ðàçðåøàåì ïðåðûâàíèÿ
return 0;
}//;êîíåö ñáðîñà DALLASa //
где delay(l_) - это:
do
{
}while(--l_);
----------------------
а вот на _delay_us никак не получается добиться даже detect presents
прерывания есть, но я их отключаю на время записи и чтения бит