Как же меня достали i2c и любые приборы, которые не толерантны к пяти вольтам. Ну пипец просто. Скажите, есть люди, у которых не было затяжных проблем с i2C?
Вот залипает и все бит BF на каждом втором чтении. То ли не проталкивается принятый бит в буфер, то ли бит вообще не принимается, ти ли флаг липнет. Анализатор пиковский не помогает (вшивая все-таки штукенция)
[Ad]D0[RX]15[RX]07[Ad]D0[RX]16[RX]1B
Write event triggered. <- Что он вот тут имеет ввиду вообще не ясно. Почему-то только на каждом втором цикле записи пишет это.
Добавлено спустя 3 минуты 55 секунд: Кстати залипает еще и бит ADON. Вроде бы на нескольких МК. чип pic16f1827, ревизия пятая, эррата не признается ни в чем.
Добавлено спустя 1 час 50 минут 1 секунду: Вот удалось частично поймать мастер на передаче. Странное поведение линии SDA между пересылкой байтов, она, почему-то, отпускается. А судя по даташиту - не должна. Завтра попробую поймать что там на приеме творится. OSL - тоже лажовый анализатор, хотя на порядки лучше PLA.
Добавлено спустя 11 минут 39 секунд: Да вроде нормально ITG3200 отвечает адресом своим.... Хрень какая-то
В pic16f1827 2 модуля i2c. Соедини их и протестируй на каком-нибудь примере, а потом переходи на внешние железки.
dccharacter писал(а):Вот удалось частично поймать мастер на передаче. Странное поведение линии SDA между пересылкой байтов, она, почему-то, отпускается. А судя по даташиту - не должна.
В i2c, при передаче последнего байта, может не устанавливаться ACK (noACK). Используется для пакетной передачи данных. Может оно? Резисторы стоят на + питания? Еще могу посоветовать тестировать на низкой частоте (100кгц)...
Добавлено спустя 6 минут 20 секунд: Удержание scl в нуле в активном состоянии - нормально, данные на sda могут меняться только при нуле на scl, иначе будет пойман start или stop.
Добавлено спустя 32 минуты 13 секунд: пффффффф, весь инет кишит засадой: dccharacter + i2c + pic16f1827, аж с 2011 года, ужос, надо помогать бедному зверю
Уж помоги, что ли, пожалуйста Вот репа: https://github.com/dccharacter/RC_RX.X Цапани к ней что-нить i2c-шное и проверь плз - работает ли. Поскольку я там уже неделю как слон в посудной лавке, код уже превратился черти во что.
Если периф. узел выключен, то не будет генериться флаг "IF" и соотв. isr, а если узел вкл. то незачем проверять "IE". Далее, ты настроил ADC на чтение в isr. Сразу после чтения запускаешь новое преобразование:
АЦП - штука быстрая, за n тактов - происходит новое прерывание от ацп. А нужно тебе это для жутко медленного v_bat_sample. Если ты запустишь дебаггер (можно чисто софтовый), то увидишь что твоя прога все время крутится в isr adc. При выходе из прерывания, выполняется всего несколько команд основной программы и происходит очередное прерывание от adc.
Если периф. узел выключен, то не будет генериться флаг "IF" и соотв. isr, а если узел вкл. то незачем проверять "IE".
Ты это! Чего говоришь-то! Флаги один хрен взводятся. Надо пруфов? The ADIF bit is set at the completion of every conversion, regardless of whether or not the ADC interrupt is enabled.
Dmitry__ писал(а):Далее, ты настроил ADC на чтение в isr. Сразу после чтения запускаешь новое преобразование:
АЦП - штука быстрая, за n тактов - происходит новое прерывание от ацп. А нужно тебе это для жутко медленного v_bat_sample. Если ты запустишь дебаггер (можно чисто софтовый), то увидишь что твоя прога все время крутится в isr adc. При выходе из прерывания, выполняется всего несколько команд основной программы и происходит очередное прерывание от adc.
Я тож xc8, линуховый, ладно, потом гляну инклуды...
dccharacter писал(а):Ты это! Чего говоришь-то! Флаги один хрен взводятся. Надо пруфов? The ADIF bit is set at the completion of every conversion, regardless of whether or not the ADC interrupt is enabled.
Ну, дык, если отключить adc или таймер (не прерывание!), то не будет ADIF или TMR0IF взводиться, ибо модуль отключен. А если у тебя эти модули вкл. то зачем проверять IF??? Даже если не откл. adc, но больше не взводить GO_nDONE, то сброшенный ADIF больше не установится, будет однократное преобразование...
Там вообще история вывода АДЦ в прерывания такая - флаг ГОДАН виснет. В эррате пишут, что исправили, а на самом деле нет. Но что так часто делаю - да, моя совсем плохой.
В ожидания определенное время, если за опред. время биты не сбросились (например за 20мс.) то переходить на сброс i2c модуля. Т.к. вылавливать ошибки модуля в бесконечном цикле ожидания - засада для коммерческих программ.
Я ж в ассемблере ни бум бум! Что бесконечные циклы - зло, я в курсе, да...
Но оно летает. Уже летает. Пока только одно управляющее воздействие - ручка газа. Даже без элеровнов. Дергается немножко, но, я думаю, можно настройками ПИД-а сделать так, что вообще будет сидеть как родная...
Я так понял, основное зло было из-за большого времени обработки прерываний. Лучше доводи isr до идеала, а в основной программе можно быдлокодить. Про проверку флагов IE уже говорил, еще совет по isr: У тебя обработка isr делается кучей if идущих друг за другом. Это плохо, т.к. одно частое прерывание (например от ADC) будет запускать всю цепочку проверок IF. Лучше после каждого типа прерывания делать return. И самые частые прерывания делать первыми. Если установятся 2 и более прерываний одновременно, то после обработки одного прер. управление передается основной прогр. и тут же происходит след. прерывание (т.к. флаг if не был очищен). T.e. было так:
Вертолет стал примерно в полтора раза тяжелее оригинала. На старте видно, как он начинает вращаться - это еще не выросла интегральная состовляющая ПИД-а. Вертолет дергается - это связано с регулярным провалом замера напряжения батареи и привязки ШИМ-а к нему (выпендрился зачем-то). После отвязки рывки пропали. Компенсирующую работу ПИД-а видно очень хорошо на 1:36, когда вертолет уходит от оператора - хвост мелко дергается туда сюда. Не задействован хвостовой винт, поэтому вертолет перемещается в горизонтальной плоскости из-за передней центровки (и частично боковой) и потоков воздуха, созданных своим же винтом. Потоки достаточно сильные, так как вертолет тяжелый, и его сносит элементарно. Ему вообще ничего кроме легкого дуновения ничего не нужно.
Из бонусов - несоклько раз смог пролететь через дверь. На оригинале не получалось (как сейчас понимаю - из-за сильно передней центровки и высокой скорости). Вообще убедился, что на оригинальной плате где-то прячется гира. Ну никак нельзя без нее.
Добавлено спустя 2 часа 16 секунд: Дим, ну че скажешь-то???