|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 1:27 pm
| Автор |
Съобщение |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Първо беше с вътрешните PU. Сложих 10К и има минимална промяна. Сега ще пробвам с 4,7К.
|
| Сря Авг 16, 2017 2:48 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: I2C малко помощ
LCR,
I2C_MasterRead(RXbuffer_forslave_1[0],1,2,&statusReadSlave1); на моя компилатор дава грешка. Така написано , шом ти минава без грешка - мажеш из паметта , да не би да е с & отпред?
|
| Сря Авг 16, 2017 3:06 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
С & и без & все минава. Последно, как трябва да е? Върху този RXbuffer_forslave_1[0] трябва ли да се извърши някакво действие преди да се приравни на променливата D?
|
| Сря Авг 16, 2017 3:40 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: I2C малко помощ
В извикването не трябва да има квадратни скоби [0], или ако има -отпред да има &. Ако ти се получи четенето - Rxbuffer[0] ще се е променило от 0хЕЕ на това , което е дал слейва (само да не си го програмирал да отговаря с 0хЕЕ  )
|
| Сря Авг 16, 2017 3:46 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: I2C малко помощ
Потърси настройки на компилатора - настрой го да няма подтискане на грешки и предупреждения.
|
| Сря Авг 16, 2017 3:47 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 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 |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Четенето от Slave е успешно! Всичко е "ток и жица"  Огромни благодарности на всички, които се включиха по темата и най-вече на Стефан  Без вас нямаше да се справя. Бъдете живи и здрави! 
|
| Сря Авг 16, 2017 5:48 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: I2C малко помощ
Все пак- аз не разбрах - кое/какво подкара кода ? Някъде нещо си разрешил? Аз поне не схванах кое подкарва системата. Би трябвало някой да предизвика първото прекъсване , в архивирания код отвчера - не видях кой ще направи това. На нас също ни е интересно, не само на тебе 
|
| Сря Авг 16, 2017 6:24 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Единствената причина за да не е работело четенето е било вкараното в цикъла условие за проверка на флага. С това условие и при отсъствие на реален slave отсреща, просто всичко спира там. Насоката ти да зацикля функцията, да сложа времезакъснения, цъкане на порт и пр. ме насочи към това да спра проверката на флага и така всичко се отприщи. Между другото, след като подкарах четенето, ми направи впечатление, че след няколко последователни ресета на master - а и успешно четене на променливата, отново се натъквах на спиране на цикъла поради проверката на флага. Накрая изобщо я махнах и всичко заспа. Явно тоя флаг се проверява някъде другаде и всичко си работи и без проверката му в цикъла. Абе нали работи. Това е важното 
|
| Сря Авг 16, 2017 6:36 pm |
|
 |
|
Stoimen
Ранг: Популярен
Регистриран на: Пет Юни 25, 2010 3:18 pm Мнения: 363 Местоположение: Varna
|
 Re: I2C малко помощ
I2C1_MasterRead() вика I2C1_MasterTRBInsert(). В I2C1_MasterTRBInsert() има следното PIR1bits.SSP1IF = true; Това вдига флага за прекъсване от SSP1, а в прекъсването се вика I2C1_ISR();
|
| Сря Авг 16, 2017 8:04 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 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 |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Това са фактите и всеки може да го тества. Залагам една бира на това, че ще изпадне в същата ситуация. Аз не твърдя, че проверката на флага е излишна. Нямаше да го сложат там, ако беше така. Само че няма логика, когато нещо с флага не е наред, цикълът просто да спре. Бива да рестартира комуникацията или каквото и да е, ама да спре...... Може и да греша, но все си мисля, че ако ще се прави тази проверка на това място, следва да се чака някакъв таймаут да пристигнат данните и после да се премине, към друго действие вместо спиране.
Както и да е....
В заключение трябва да се отбележи това, че I2C кодът на MCC, макар и малко сложен и трудно разбираем за хора, като мен, все пак си е ОК и върши добра работа.
|
| Сря Авг 16, 2017 8:30 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: I2C малко помощ
сега не знам как си я правил тая проверка, по преднит страници гледам имаш един while() ако на това му викаш проверка, първо не е проверка и второ тоя подход така написан е много рисков. Много пъти съм писал, за мен while е много опасен оператор и трябва да се избягва ако изрично не си осигуриш изход, обикновенно по таймоут. С тия while() ти ще висиш там до безкрай, или докато не те ресетне WDT ако си го пуснал, ама след това пак там ще отидеш най-вероятно 
|
| Сря Авг 16, 2017 8:50 pm |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Re: I2C малко помощ
PIR1bits.SSP1IF = true пуска целия цирк, а статуса се ъпдейтва в I2C_Stop(...), или ако има бъс колизия - в I2C_ISR(). От това следва, че изобщо няма нужда от празен while, достатъчно е отвеме-навреме статуса да се полва, а през това време да се върши нещо друго.
|
| Сря Авг 16, 2017 8:53 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 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 } Видях го мамка му, таз червена точкозапетайка не съм видял ! Нама емотикон за чупене на глава с къртач ](./images/smilies/eusa_wall.gif)
|
| Сря Авг 16, 2017 9:11 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|