Отговори на тема  [ 281 мнения ]  Отиди на страница Предишна  1 ... 9, 10, 11, 12, 13, 14, 15 ... 19  Следваща
I2C малко помощ 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
itso.t написа:
lcr написа:
Това е от китайската измервателна хапаратура :)

Като гледам картинките, китайската измервателна техника има достатъчен семпълрейт за да хване поне няколко семпъла за стабилна лог. 1.
Намали резисторите. Сега колко са, 4к7?


Първо беше с вътрешните PU. Сложих 10К и има минимална промяна. Сега ще пробвам с 4,7К.


Сря Авг 16, 2017 2:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: I2C малко помощ
LCR,

I2C_MasterRead(RXbuffer_forslave_1[0],1,2,&statusReadSlave1);
на моя компилатор дава грешка.
Така написано , шом ти минава без грешка - мажеш из паметта ,
да не би да е с & отпред?


Сря Авг 16, 2017 3:06 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
stefan63 написа:
LCR,

I2C_MasterRead(RXbuffer_forslave_1[0],1,2,&statusReadSlave1);
на моя компилатор дава грешка.
Така написано , шом ти минава без грешка - мажеш из паметта ,
да не би да е с & отпред?


С & и без & все минава. Последно, как трябва да е?

Върху този RXbuffer_forslave_1[0] трябва ли да се извърши някакво действие преди да се приравни на променливата D?


Сря Авг 16, 2017 3:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: I2C малко помощ
В извикването не трябва да има квадратни скоби [0], или ако има -отпред да има &.
Ако ти се получи четенето - Rxbuffer[0] ще се е променило от 0хЕЕ на това , което е дал слейва (само да не си го програмирал да отговаря с 0хЕЕ :) )


Сря Авг 16, 2017 3:46 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: I2C малко помощ
Потърси настройки на компилатора - настрой го да няма подтискане на грешки и предупреждения.


Сря Авг 16, 2017 3:47 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
Всичко е по дефолт и нищо не съм пипал.

При билдването ми дава само warning съощения:

:: warning: (1273) Omniscient Code Generation not available in Free mode
mcc_generated_files/i2c.c:225: warning: (520) function "_I2C_ErrorCountGet" is never called
mcc_generated_files/i2c.c:598: warning: (520) function "_I2C_MasterWrite" is never called
mcc_generated_files/i2c.c:708: warning: (520) function "_I2C_MasterWriteTRBBuild" is never called
mcc_generated_files/i2c.c:719: warning: (520) function "_I2C_MasterQueueIsEmpty" is never called
mcc_generated_files/i2c.c:724: warning: (520) function "_I2C_MasterQueueIsFull" is never called
mcc_generated_files/pin_manager.c:85: warning: (520) function "_PIN_MANAGER_IOC" is never called
mcc_generated_files/i2c.c:614: warning: (1498) pointer (I2C_MasterWrite@pflag) in expression may have no targets


Сря Авг 16, 2017 4:20 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
Четенето от Slave е успешно!

Всичко е "ток и жица" :)

Огромни благодарности на всички, които се включиха по темата и най-вече на Стефан :)

Без вас нямаше да се справя.

Бъдете живи и здрави! :)


Сря Авг 16, 2017 5:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: I2C малко помощ
](*,)

Все пак- аз не разбрах - кое/какво подкара кода ? Някъде нещо си разрешил?
Аз поне не схванах кое подкарва системата. Би трябвало някой да предизвика първото прекъсване , в архивирания код отвчера - не видях кой ще направи това. На нас също ни е интересно, не само на тебе :D


Сря Авг 16, 2017 6:24 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
Единствената причина за да не е работело четенето е било вкараното в цикъла условие за проверка на флага. С това условие и при отсъствие на реален slave отсреща, просто всичко спира там.

Насоката ти да зацикля функцията, да сложа времезакъснения, цъкане на порт и пр. ме насочи към това да спра проверката на флага и така всичко се отприщи.

Между другото, след като подкарах четенето, ми направи впечатление, че след няколко последователни ресета на master - а и успешно четене на променливата, отново се натъквах на спиране на цикъла поради проверката на флага. Накрая изобщо я махнах и всичко заспа. Явно тоя флаг се проверява някъде другаде и всичко си работи и без проверката му в цикъла. Абе нали работи. Това е важното :)


Сря Авг 16, 2017 6:36 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пет Юни 25, 2010 3:18 pm
Мнения: 363
Местоположение: Varna
Мнение Re: I2C малко помощ
stefan63 написа:
](*,)

Все пак- аз не разбрах - кое/какво подкара кода ? Някъде нещо си разрешил?
Аз поне не схванах кое подкарва системата. Би трябвало някой да предизвика първото прекъсване , в архивирания код отвчера - не видях кой ще направи това. На нас също ни е интересно, не само на тебе :D


I2C1_MasterRead() вика I2C1_MasterTRBInsert().
В I2C1_MasterTRBInsert() има следното
PIR1bits.SSP1IF = true;
Това вдига флага за прекъсване от SSP1, а в прекъсването се вика I2C1_ISR();


Сря Авг 16, 2017 8:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: I2C малко помощ
Поне час съм се зверил из сорсовете ти , и не можах да рабера - кое кара влака - кой стартира i2c автомата с прекъсванията.
Би трябвало да е функцията Insert , но не мога да я схвана. Твоите обяснения, как проверката на флагове блокира системата - не ми звучат логично, утре ще ти изскочи някоя мотика оттам.
Успех!

Стоимене,
PIR1bits.SSP1IF = true;
е при условие ,че статусът на i2c_state!=IDLE.
E,при ресет тоя статус се установява в IDLE.
Не намерих кой и къде извън прекъсването пипа i2c_state, та да може да се изпълнят горните условия.
Би трябвало да е в Build /Insert , но не успявам да го видя.


Сря Авг 16, 2017 8:15 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
Това са фактите и всеки може да го тества. Залагам една бира на това, че ще изпадне в същата ситуация.
Аз не твърдя, че проверката на флага е излишна. Нямаше да го сложат там, ако беше така. Само че няма логика, когато нещо с флага не е наред, цикълът просто да спре. Бива да рестартира комуникацията или каквото и да е, ама да спре......
Може и да греша, но все си мисля, че ако ще се прави тази проверка на това място, следва да се чака някакъв таймаут да пристигнат данните и после да се премине, към друго действие вместо спиране.

Както и да е....

В заключение трябва да се отбележи това, че I2C кодът на MCC, макар и малко сложен и трудно разбираем за хора, като мен, все пак си е ОК и върши добра работа.


Сря Авг 16, 2017 8:30 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: I2C малко помощ
сега не знам как си я правил тая проверка, по преднит страници гледам имаш един while() ако на това му викаш проверка, първо не е проверка и второ тоя подход така написан е много рисков. Много пъти съм писал, за мен while е много опасен оператор и трябва да се избягва ако изрично не си осигуриш изход, обикновенно по таймоут. С тия while() ти ще висиш там до безкрай, или докато не те ресетне WDT ако си го пуснал, ама след това пак там ще отидеш най-вероятно :)


Сря Авг 16, 2017 8:50 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: I2C малко помощ
stefan63 написа:
... кое кара влака - кой стартира i2c автомата с прекъсванията....

PIR1bits.SSP1IF = true пуска целия цирк, а статуса се ъпдейтва в I2C_Stop(...), или ако има бъс колизия - в I2C_ISR(). От това следва, че изобщо няма нужда от празен while, достатъчно е отвеме-навреме статуса да се полва, а през това време да се върши нещо друго.


Сря Авг 16, 2017 8:53 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: I2C малко помощ
void I2C_MasterTRBInsert(
uint8_t count,
I2C_TRANSACTION_REQUEST_BLOCK *ptrb_list,
I2C_MESSAGE_STATUS *pflag)
{

// check if there is space in the queue
if (i2c_object.trStatus.s.full != true)
{
*pflag = I2C_MESSAGE_PENDING;

i2c_object.pTrTail->ptrb_list = ptrb_list;
i2c_object.pTrTail->count = count;
i2c_object.pTrTail->pTrFlag = pflag;
i2c_object.pTrTail++;

// check if the end of the array is reached
if (i2c_object.pTrTail == (i2c_tr_queue + I2C_CONFIG_TR_QUEUE_LENGTH))
{
// adjust to restart at the beginning of the array
i2c_object.pTrTail = i2c_tr_queue;
}

// since we added one item to be processed, we know
// it is not empty, so set the empty status to false
i2c_object.trStatus.s.empty = false;

// check if full
if (i2c_object.pTrHead == i2c_object.pTrTail)
{
// it is full, set the full status to true
i2c_object.trStatus.s.full = true;
}

}
else
{
*pflag = I2C_MESSAGE_FAIL;
}

// for interrupt based
if (*pflag == I2C_MESSAGE_PENDING)
{
while(i2c_state != S_MASTER_IDLE) ;
{
// force the task to run since we know that the queue has
// something that needs to be sent
PIR1bits.SSP1IF = true;
}
} // block until request is complete

}

Видях го мамка му, таз червена точкозапетайка не съм видял !
Нама емотикон за чупене на глава с къртач ](*,)


Сря Авг 16, 2017 9:11 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 281 мнения ]  Отиди на страница Предишна  1 ... 9, 10, 11, 12, 13, 14, 15 ... 19  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни