упс извините. в плюсах пишу, но можно и просто сишную. так-то взял на гитхабе - вроде прицепилась к иаровскому проекту, пробую запустить.
Добавлено after 41 minute 3 seconds:
ARV писал(а):
Рекомендую библиотечку Peter Fleury Неоднократно пользовался, доволен полностью.
Спасибо. Скачал, посмотрел. Пока что гитхабовская в проект подключена - если скомпрометирует себя, то возьмусь за Вашу. DiHalt-овское чудо пытался использовать когда-то. Тогда я мало понимал в С-ях и это было кошмаром . P.S. А разница то совсем небольшая между либой Питера и выложеной на гитхабе
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
а как вы производите обработку ошибок ? или перезагрузку модуля ? Если произошло замыкание на линии то встала вся программа ?
а если случится ядерная война - устройство должно продолжать работать?
я всегда оцениваю вероятность тех или иных событий. если б я делал военное изделие, я бы думал о том, как поступить при КЗ шины и2ц на землю или еще при каком-то форсмажоре. но если я делаю, допустим, часы - что должно случиться с часами, чтобы это КЗ возникло, и надо ли стремиться сохранить работоспособность остальной части электроники в этом случае?
допустим, в телевизоре у вас есть и2ц память с настройками. и вот у вас телек перестал включаться - есть ли для вас, как потребителя, разница: вышел из строя центральный процессор телека или "просто КЗ" на шине и2ц?
по-моему, ваши опасения надуманы. хотя, может быть, как раз вы военные изделия и разрабатываете... во всяком случае я вообще никак не обрабатываю ошибки, если это не требуются протоколом обмена.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
а как вы производите обработку ошибок ? или перезагрузку модуля ? Если произошло замыкание на линии то встала вся программа ?
В данном случае, эти проблемы должен решать софт, который использует драйвер. Я пишу функции которые возвращают код ошибки в зависимости от того, какая функция драйвера возвратила ошибку. Допустим функция должна передать последовательность байт. Она сперва делает старт с посылкой адреса и режима. Вернула 1? Тогда делаем ретурн из нашей функции и возвращаем ошибку i2c_NO_RESPONSE, например. И так далее. Дело Вашей фантазии сколько ошибок наопределять и какие ветвления по-настраивать. Но это софтверные решения - код ждет пока байт отправится, придет аск/нот-аск. Как я уже писал выше, есть достаточно изначально запутанный драйвер на прерываниях и тот подход будет по-профессиональней. Но у меня задача попроще.
я тут в своем гитхабовском драйвере неприятный момент обнаружил. Там стоят программные затычки вида while(!(TWCR&(1<<TWINT)) ); и если у нас слейв заглючит, или линии уйдут в 0 то получаем зависание программы. Пока что грешу на это, т-к протеус уже полчаса лопатит программу без зависаний.
Всем привет, возникла такая проблема, разбираюсь с TWI ,написал обработчик прерываний с выводом сообщений о прерываниях на UART(не удите за столь длинные Chr-вские массивы) , вроди бы все проходит как надо , есть ответ после старта , после передачи , после приемы и после према последнего байта. Но!!! Вот беда , после чтения регистра TWDR я вижу НУЛЬ!!!!!!!!! Подскажите, что не так ? Забыл , подключаю датчик Minimu 9 v3 Giro к Atmega 8 через аппаратный TWI. Код прилагаю ниже , а так же скриншоты терминала. Подскажите что не так уже месяц голову ломаю. На скринах данные идут после 3го с конца бита 0x3A в Hex, кстати , функция передачи работатет, проверят записывая вместо TWDR константу.
for (int i=0; i <=Tsize; i++) { UDR = strng[i]; while(!(UCSRA&(1<<UDRE))); // Устанавливается, когда регистр свободен }
}
void twi_Init(void) { TWBR = ( ( (F_CPU)/(SCL_F)-16 ) /2 ) ; TWSR = 0; //Очищаются биты TWPS0 и TWPS1 } void start() { TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWSTA); } void stop() { //формируем состояние СТОП, сбрасываем флаг, запрещаем прерывания TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWSTO)|(0<<TWIE); } void not_interrupt() { TWCR = (1<<TWEN)|(0<<TWIE)|(0<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC); //запретить прерывание } /*данная функция производит подготовку буффера для интерфейса TWI , после чего запускает Start массив заполняется в соответсвии с битом записи чтения если поступил бит чтеня , то записывается только первый байт данных иначе записываетя весь массив до size*/ void set_array_TWI(uint8_t array_a[],uint8_t size,uint8_t wr)//в size указываем размер массива без SLA , тоесть количесво байт для приема или же передачи { uint8_t i; while(TWCR & (1<<TWIE)); // ;ждем освобождения модуля TWI //методом проверки флага разрешения прерывания , который //сбрасывается после СТОП writeread=wr; buffer[0]=array_a[0] ; size_buf=size; if ((array_a[0]==(Accel<<1)) || (array_a[0]==(Giro<<1))) { //если задано ЗАПИСЬ , то сохраняем весь массив for (i=1; i<=size;i++) { buffer[i]=array_a[i] ; } } start();}
ISR(TWI_vect) { switch (TWSR & 0xf8) { case 0x08://сигнал START передан send_UartChar("Start "); TWDR=buffer[0]; //передаем SLA+W or SLA+R pointerforREAD=0; pointer=1; TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT); //сбрасываем флаг TWINT break;
case 0x10://сигнал REPEATED START передан send_UartChar("RepeatedStart "); pointerforREAD=0; pointer=1;//сбросили указатель массива (буффера) TWDR=buffer[0]; //послали SLA+RW TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT); //сбрасываем флаг TWINT break;
case 0x30: //— Байт отправлен, ACK не получен send_UartChar("ByteSendNACK "); TWDR=buffer[pointer]; //повторно отпраляем бай данных TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT); //сбрасываем флаг TWINT break;
case 0x18://Адрес для записи передан, ответ (ACK) получен send_UartChar("SLA+W,ACK "); if (pointer<=size_buf) { TWDR=buffer[pointer]; TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT); //сбрасываем флаг TWINT pointer++; } break;
case 0x28:// Байт отправлен, ACK получен send_UartChar("ByteSend,ACK "); if (pointer<=size_buf) { TWDR=buffer[pointer]; TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT); //сбрасываем флаг TWINT pointer++; } else { switch(writeread) { case 1: stop(); default: not_interrupt(); } } break;
case 0x40://Адрес для чтения передан, ответ (ACK) получен if (pointer<size_buf) { TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);//если это не предпоследний принятый байт, формируем подтверждение } else { TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT); //если приняли предпоследний байт, подтверждение не формируем } send_UartChar("SendSLA+R,ACK"); break;
case 0x50: // — Данные получены, ACK передан buffer_read[pointerforREAD]=TWDR; pointerforREAD++; send_UartChar("GetByteACK:"); if (pointerforREAD<size_buf-1) { TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA);//если это не предпоследний принятый байт, формируем подтверждение } else { TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT); //если приняли предпоследний байт, подтверждение не формируем } break;
case 0x58:// — Данные получены, ACK не передан< buffer_read[pointerforREAD]= TWDR; send_UartChar("GetByteNACK:"); send_UartInt(buffer_read,pointerforREAD); stop(); break;
case 0x48:// — Адрес для чтения передан, устройство не откликнулось case 0x20:// — Адрес для записи передан, устройство не откликнулось case 0x38:// — Контроллер потерял шину (вылез еще один контроллер) default: send_UartChar("error"); not_interrupt(); break; } }
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения