зачем делать СВОЮ библиотеку и идти по граблям других
По граблям - это твой код использовать. Потому и пишем свое что такие криворукие как ты такой говнокод публикуют. Рекомендации лучших собаководов. Уверен что контроль ACK стр.53-55 реализован согласно стандарту? Хоть раз пробовал узнать, приняты ли данны или и так сойдет )))
Таких устройств - валом. И если твой код работает с 1602 прошлого века, в котором такого нет то это ниче не значить. Теперь смотри, ты выставил SCL в 1, так просто порт в HIGH, а не как положено отпустил в расчете что подтяжка есть к VCC. А слейв сделал 0 для задержки синхронизации. Что сгорит первым? прием ACK аналогично.
всегда на ассемблере пишешь, что тогда тут делаешь.??
Logik
код писался для управления одним простым устройством и не претендует на гениальность, а тем более для использования как библиотеки и выложен как пример. Я читал твой предыдущий пост по этому поводу.
DIVGENY Для Wire надо писать именно 0x29 и она сама сделает 0x52 при чтении и 0x53 при записи.
зачем делать СВОЮ библиотеку и идти по граблям других
#define sda 4 //? #define scl 5 //? char Data = 0; int8_t i8; void iic_SetSDA() { PORTC |= (1 << sda); // delayMicroseconds(30); delayMicroseconds(5); } void iic_ClrSDA() { PORTC &= ~(1 << sda); // delayMicroseconds(30); delayMicroseconds(5); } char iic_GetSDA() { return (PINC & (1<<sda)) != 0; } void iic_SetSCL() { PORTC |= (1 << scl); // delayMicroseconds(30); delayMicroseconds(10); } void iic_ClrSCL() { PORTC &= ~(1 << scl); // delayMicroseconds(30); delayMicroseconds(5); } char iic_GetSCL() { return (PINC & (1<<scl)) != 0; } void iic_Start() { iic_ClrSDA(); } void iic_Write(char c) { int i; for(i=0;i<8;i++) { iic_ClrSCL(); if(c & 0x80) iic_SetSDA(); else iic_ClrSDA(); c = c << 1; iic_SetSCL(); } iic_ClrSCL(); iic_ClrSDA();//ACK iic_SetSCL(); } char iic_Read() { int i; char c = 0; iic_ClrSCL();//! DDRC &= ~(1 << sda);//in iic_SetSDA(); for(i=0;i<8;i++) { iic_ClrSCL();//5us delayMicroseconds(5); iic_SetSCL(); c = c << 1; if(PINC & (1 << sda)) c++; } iic_ClrSCL(); DDRC |= (1 << sda);//out iic_SetSDA();//NACK iic_SetSCL(); return c; } void iic_Stop() { iic_ClrSCL(); iic_ClrSDA(); iic_SetSCL(); iic_SetSDA(); } void iic_init() { DDRC |= (1 << sda) | (1 << scl);//out PORTC |= (1 << sda) | (1 << scl);//1 } void iic_read(char addr) { iic_Start(); iic_Write(addr); Data = iic_Read(); } void setup(){ iic_init(); //------------------- инициализация XX iic_Start(); iic_Write(0xXX); iic_Stop(); //------------------- } void loop () { }voidiic_Write(charc) {045inti;046for(i=0;i<8;i++) {047iic_ClrSCL();048if(c & 0x80) iic_SetSDA();049elseiic_ClrSDA();050c = c << 1;051iic_SetSCL();052}053iic_ClrSCL();054iic_ClrSDA();//ACK055iic_SetSCL();056}Да уж. На ассемблере этот кусочек кода будет раз в 20 короче и во столько-же раз бысрее. "библиАтекари )))
зачем делать СВОЮ библиотеку и идти по граблям других
По граблям - это твой код использовать. Потому и пишем свое что такие криворукие как ты такой говнокод публикуют. Рекомендации лучших собаководов. Уверен что контроль ACK стр.53-55 реализован согласно стандарту? Хоть раз пробовал узнать, приняты ли данны или и так сойдет )))
Почитай, здесь доступно http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh_xmega_a/19_3.htm
Обрати внимание например на
19.3.7. Синхронизация и задержка импульсов синхронизации
Все подключенные к шине устройства, при необходимости снижения скорости передачи или вставки пауз на время обработки данных, могут продлить длительность низкого уровня сигнала синхронизации. Это достигается путем принудительного удержания линии SCL в низком состоянии.
Предусмотрено три типа задержки импульсов синхронизации (см. рисунок 19.8).
Таких устройств - валом. И если твой код работает с 1602 прошлого века, в котором такого нет то это ниче не значить. Теперь смотри, ты выставил SCL в 1, так просто порт в HIGH, а не как положено отпустил в расчете что подтяжка есть к VCC. А слейв сделал 0 для задержки синхронизации. Что сгорит первым? прием ACK аналогично.
замечангия приняты и отчасти справедливы.
-NMi-
всегда на ассемблере пишешь, что тогда тут делаешь.??
Logik
код писался для управления одним простым устройством и не претендует на гениальность, а тем более для использования как библиотеки и выложен как пример. Я читал твой предыдущий пост по этому поводу.
всем удачи и беригите нервы...
Нашы нервы - из толстых проводов, нам ничо не страшна.
-NMi-
всегда на ассемблере пишешь
что тогда тут делаешь.??
Почти ВСЕГДА, если критично ко времени и размеру кода!
Чо делаю - с ДеДом бухаю!!!