|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 10:04 am
| Автор |
Съобщение |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: I2C малко помощ
EEPROM_Buffer[0] =X;
|
| Нед Юли 30, 2017 8:38 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Благодаря! Това означава ли, че slave ще праща към master - а съдържанието на целия EEPROM буфер? Т.е - да запиша следващата променлива в EEPROM_Buffer[1] и т.н. ? От страна на master - а MCC генерира следната конфигурация: i2c1.c :  |  |  |  | Код: #include "i2c1.h"
/** I2C Driver Queue Status Type
@Summary Defines the type used for the transaction queue status.
@Description This defines type used to keep track of the queue status. */
typedef union { struct { uint8_t full:1; uint8_t empty:1; uint8_t reserved:6; }s; uint8_t status; }I2C_TR_QUEUE_STATUS;
/** I2C Driver Queue Entry Type
@Summary Defines the object used for an entry in the i2c queue items.
@Description This defines the object in the i2c queue. Each entry is a composed of a list of TRBs, the number of the TRBs and the status of the currently processed TRB. */ typedef struct { uint8_t count; // a count of trb's in the trb list I2C1_TRANSACTION_REQUEST_BLOCK *ptrb_list; // pointer to the trb list I2C1_MESSAGE_STATUS *pTrFlag; // set with the error of the last trb sent. // if all trb's are sent successfully, // then this is I2C1_MESSAGE_COMPLETE } I2C_TR_QUEUE_ENTRY;
/** I2C Master Driver Object Type
@Summary Defines the object that manages the i2c master.
@Description This defines the object that manages the sending and receiving of i2c master transactions. */
typedef struct { /* Read/Write Queue */ I2C_TR_QUEUE_ENTRY *pTrTail; // tail of the queue I2C_TR_QUEUE_ENTRY *pTrHead; // head of the queue I2C_TR_QUEUE_STATUS trStatus; // status of the last transaction uint8_t i2cDoneFlag; // flag to indicate the current // transaction is done uint8_t i2cErrors; // keeps track of errors
} I2C_OBJECT ;
/** I2C Master Driver State Enumeration
@Summary Defines the different states of the i2c master.
@Description This defines the different states that the i2c master used to process transactions on the i2c bus. */
typedef enum { S_MASTER_IDLE, S_MASTER_RESTART, S_MASTER_SEND_ADDR, S_MASTER_SEND_DATA, S_MASTER_SEND_STOP, S_MASTER_ACK_ADDR, S_MASTER_RCV_DATA, S_MASTER_RCV_STOP, S_MASTER_ACK_RCV_DATA, S_MASTER_NOACK_STOP, S_MASTER_SEND_ADDR_10BIT_LSB, S_MASTER_10BIT_RESTART, } I2C_MASTER_STATES;
/** Section: Macro Definitions */
/* defined for I2C1 */
#ifndef I2C1_CONFIG_TR_QUEUE_LENGTH #define I2C1_CONFIG_TR_QUEUE_LENGTH 1 #endif
#define I2C1_TRANSMIT_REG SSP1BUF // Defines the transmit register used to send data. #define I2C1_RECEIVE_REG SSP1BUF // Defines the receive register used to receive data.
// The following control bits are used in the I2C state machine to manage // the I2C module and determine next states. #define I2C1_WRITE_COLLISION_STATUS_BIT SSP1CON1bits.WCOL // Defines the write collision status bit. #define I2C1_MODE_SELECT_BITS SSP1CON1bits.SSPM // I2C Master Mode control bit. #define I2C1_MASTER_ENABLE_CONTROL_BITS SSP1CON1bits.SSPEN // I2C port enable control bit.
#define I2C1_START_CONDITION_ENABLE_BIT SSP1CON2bits.SEN // I2C START control bit. #define I2C1_REPEAT_START_CONDITION_ENABLE_BIT SSP1CON2bits.RSEN // I2C Repeated START control bit. #define I2C1_RECEIVE_ENABLE_BIT SSP1CON2bits.RCEN // I2C Receive enable control bit. #define I2C1_STOP_CONDITION_ENABLE_BIT SSP1CON2bits.PEN // I2C STOP control bit. #define I2C1_ACKNOWLEDGE_ENABLE_BIT SSP1CON2bits.ACKEN // I2C ACK start control bit. #define I2C1_ACKNOWLEDGE_DATA_BIT SSP1CON2bits.ACKDT // I2C ACK data control bit. #define I2C1_ACKNOWLEDGE_STATUS_BIT SSP1CON2bits.ACKSTAT // I2C ACK status bit.
#define I2C1_7bit true /** Section: Local Functions */
void I2C1_FunctionComplete(void); void I2C1_Stop(I2C1_MESSAGE_STATUS completion_code);
/** Section: Local Variables */
static I2C_TR_QUEUE_ENTRY i2c1_tr_queue[I2C1_CONFIG_TR_QUEUE_LENGTH]; static I2C_OBJECT i2c1_object; static I2C_MASTER_STATES i2c1_state = S_MASTER_IDLE; static uint8_t i2c1_trb_count = 0;
static I2C1_TRANSACTION_REQUEST_BLOCK *p_i2c1_trb_current = NULL; static I2C_TR_QUEUE_ENTRY *p_i2c1_current = NULL;
/** Section: Driver Interface */
void I2C1_Initialize(void) { i2c1_object.pTrHead = i2c1_tr_queue; i2c1_object.pTrTail = i2c1_tr_queue; i2c1_object.trStatus.s.empty = true; i2c1_object.trStatus.s.full = false;
i2c1_object.i2cErrors = 0;
// R_nW write_noTX; P stopbit_notdetected; S startbit_notdetected; BF RCinprocess_TXcomplete; SMP High Speed; UA dontupdate; CKE disabled; D_nA lastbyte_address; SSP1STAT = 0x00; // SSPEN enabled; WCOL no_collision; CKP Idle:Low, Active:High; SSPM FOSC/4_SSPxADD_I2C; SSPOV no_overflow; SSP1CON1 = 0x28; // ACKTIM ackseq; SBCDE disabled; BOEN disabled; SCIE disabled; PCIE disabled; DHEN disabled; SDAHT 100ns; AHEN disabled; SSP1CON3 = 0x00; // Baud Rate Generator Value: SSPADD 3; SSP1ADD = 0x03;
// clear the master interrupt flag PIR1bits.SSP1IF = 0; // enable the master interrupt PIE1bits.SSP1IE = 1; }
uint8_t I2C1_ErrorCountGet(void) { uint8_t ret;
ret = i2c1_object.i2cErrors; return ret; }
void I2C1_ISR ( void ) { static uint8_t *pi2c_buf_ptr; static uint16_t i2c_address = 0; static uint8_t i2c_bytes_left = 0; static uint8_t i2c_10bit_address_restart = 0;
PIR1bits.SSP1IF = 0;
// Check first if there was a collision. // If we have a Write Collision, reset and go to idle state */ if(I2C1_WRITE_COLLISION_STATUS_BIT) { // clear the Write colision I2C1_WRITE_COLLISION_STATUS_BIT = 0; i2c1_state = S_MASTER_IDLE; *(p_i2c1_current->pTrFlag) = I2C1_MESSAGE_FAIL;
// reset the buffer pointer p_i2c1_current = NULL;
return; }
/* Handle the correct i2c state */ switch(i2c1_state) { case S_MASTER_IDLE: /* In reset state, waiting for data to send */
if(i2c1_object.trStatus.s.empty != true) { // grab the item pointed by the head p_i2c1_current = i2c1_object.pTrHead; i2c1_trb_count = i2c1_object.pTrHead->count; p_i2c1_trb_current = i2c1_object.pTrHead->ptrb_list;
i2c1_object.pTrHead++;
// check if the end of the array is reached if(i2c1_object.pTrHead == (i2c1_tr_queue + I2C1_CONFIG_TR_QUEUE_LENGTH)) { // adjust to restart at the beginning of the array i2c1_object.pTrHead = i2c1_tr_queue; }
// since we moved one item to be processed, we know // it is not full, so set the full status to false i2c1_object.trStatus.s.full = false;
// check if the queue is empty if(i2c1_object.pTrHead == i2c1_object.pTrTail) { // it is empty so set the empty status to true i2c1_object.trStatus.s.empty = true; }
// send the start condition I2C1_START_CONDITION_ENABLE_BIT = 1; // start the i2c request i2c1_state = S_MASTER_SEND_ADDR; }
break;
case S_MASTER_RESTART:
/* check for pending i2c Request */
// ... trigger a REPEATED START I2C1_REPEAT_START_CONDITION_ENABLE_BIT = 1;
// start the i2c request i2c1_state = S_MASTER_SEND_ADDR;
break;
case S_MASTER_SEND_ADDR_10BIT_LSB:
if(I2C1_ACKNOWLEDGE_STATUS_BIT) { i2c1_object.i2cErrors++; I2C1_Stop(I2C1_MESSAGE_ADDRESS_NO_ACK); } else { // Remove bit 0 as R/W is never sent here I2C1_TRANSMIT_REG = (i2c_address >> 1) & 0x00FF;
// determine the next state, check R/W if(i2c_address & 0x01) { // if this is a read we must repeat start // the bus to perform a read i2c1_state = S_MASTER_10BIT_RESTART; } else { // this is a write continue writing data i2c1_state = S_MASTER_SEND_DATA; } }
break;
case S_MASTER_10BIT_RESTART:
if(I2C1_ACKNOWLEDGE_STATUS_BIT) { i2c1_object.i2cErrors++; I2C1_Stop(I2C1_MESSAGE_ADDRESS_NO_ACK); } else { // ACK Status is good // restart the bus I2C1_REPEAT_START_CONDITION_ENABLE_BIT = 1;
// fudge the address so S_MASTER_SEND_ADDR works correctly // we only do this on a 10-bit address resend i2c_address = 0x00F0 | ((i2c_address >> 8) & 0x0006);
// set the R/W flag i2c_address |= 0x0001;
// set the address restart flag so we do not change the address i2c_10bit_address_restart = 1;
// Resend the address as a read i2c1_state = S_MASTER_SEND_ADDR; }
break;
case S_MASTER_SEND_ADDR:
/* Start has been sent, send the address byte */
/* Note: On a 10-bit address resend (done only during a 10-bit device read), the original i2c_address was modified in S_MASTER_10BIT_RESTART state. So the check if this is a 10-bit address will fail and a normal 7-bit address is sent with the R/W bit set to read. The flag i2c_10bit_address_restart prevents the address to be re-written. */ if(i2c_10bit_address_restart != 1) { // extract the information for this message i2c_address = p_i2c1_trb_current->address; pi2c_buf_ptr = p_i2c1_trb_current->pbuffer; i2c_bytes_left = p_i2c1_trb_current->length; }
// check for 10-bit address if(!I2C1_7bit && (0x0 != i2c_address)) { if (0 == i2c_10bit_address_restart) { // we have a 10 bit address // send bits<9:8> // mask bit 0 as this is always a write I2C1_TRANSMIT_REG = 0xF0 | ((i2c_address >> 8) & 0x0006); i2c1_state = S_MASTER_SEND_ADDR_10BIT_LSB; } else { // resending address bits<9:8> to trigger read I2C1_TRANSMIT_REG = i2c_address; i2c1_state = S_MASTER_ACK_ADDR; // reset the flag so the next access is ok i2c_10bit_address_restart = 0; } } else { // Transmit the address I2C1_TRANSMIT_REG = i2c_address; if(i2c_address & 0x01) { // Next state is to wait for address to be acked i2c1_state = S_MASTER_ACK_ADDR; } else { // Next state is transmit i2c1_state = S_MASTER_SEND_DATA; } } break;
case S_MASTER_SEND_DATA:
// Make sure the previous byte was acknowledged if(I2C1_ACKNOWLEDGE_STATUS_BIT) { // Transmission was not acknowledged i2c1_object.i2cErrors++;
// Reset the Ack flag I2C1_ACKNOWLEDGE_STATUS_BIT = 0;
// Send a stop flag and go back to idle I2C1_Stop(I2C1_DATA_NO_ACK);
} else { // Did we send them all ? if(i2c_bytes_left-- == 0U) { // yup sent them all!
// update the trb pointer p_i2c1_trb_current++;
// are we done with this string of requests? if(--i2c1_trb_count == 0) { I2C1_Stop(I2C1_MESSAGE_COMPLETE); } else { // no!, there are more TRB to be sent. //I2C1_START_CONDITION_ENABLE_BIT = 1;
// In some cases, the slave may require // a restart instead of a start. So use this one // instead. I2C1_REPEAT_START_CONDITION_ENABLE_BIT = 1;
// start the i2c request i2c1_state = S_MASTER_SEND_ADDR;
} } else { // Grab the next data to transmit I2C1_TRANSMIT_REG = *pi2c_buf_ptr++; } } break;
case S_MASTER_ACK_ADDR:
/* Make sure the previous byte was acknowledged */ if(I2C1_ACKNOWLEDGE_STATUS_BIT) {
// Transmission was not acknowledged i2c1_object.i2cErrors++;
// Send a stop flag and go back to idle I2C1_Stop(I2C1_MESSAGE_ADDRESS_NO_ACK);
// Reset the Ack flag I2C1_ACKNOWLEDGE_STATUS_BIT = 0; } else { I2C1_RECEIVE_ENABLE_BIT = 1; i2c1_state = S_MASTER_ACK_RCV_DATA; } break;
case S_MASTER_RCV_DATA:
/* Acknowledge is completed. Time for more data */
// Next thing is to ack the data i2c1_state = S_MASTER_ACK_RCV_DATA;
// Set up to receive a byte of data I2C1_RECEIVE_ENABLE_BIT = 1;
break;
case S_MASTER_ACK_RCV_DATA:
// Grab the byte of data received and acknowledge it *pi2c_buf_ptr++ = I2C1_RECEIVE_REG;
// Check if we received them all? if(--i2c_bytes_left) {
/* No, there's more to receive */
// No, bit 7 is clear. Data is ok // Set the flag to acknowledge the data I2C1_ACKNOWLEDGE_DATA_BIT = 0;
// Wait for the acknowledge to complete, then get more i2c1_state = S_MASTER_RCV_DATA; } else {
// Yes, it's the last byte. Don't ack it // Flag that we will nak the data I2C1_ACKNOWLEDGE_DATA_BIT = 1;
I2C1_FunctionComplete(); }
// Initiate the acknowledge I2C1_ACKNOWLEDGE_ENABLE_BIT = 1; break;
case S_MASTER_RCV_STOP: case S_MASTER_SEND_STOP:
// Send the stop flag I2C1_Stop(I2C1_MESSAGE_COMPLETE); break;
default:
// This case should not happen, if it does then // terminate the transfer i2c1_object.i2cErrors++; I2C1_Stop(I2C1_LOST_STATE); break;
} }
void I2C1_FunctionComplete(void) {
// update the trb pointer p_i2c1_trb_current++;
// are we done with this string of requests? if(--i2c1_trb_count == 0) { i2c1_state = S_MASTER_SEND_STOP; } else { i2c1_state = S_MASTER_RESTART; }
}
void I2C1_Stop(I2C1_MESSAGE_STATUS completion_code) { // then send a stop I2C1_STOP_CONDITION_ENABLE_BIT = 1;
// make sure the flag pointer is not NULL if (p_i2c1_current->pTrFlag != NULL) { // update the flag with the completion code *(p_i2c1_current->pTrFlag) = completion_code; }
// Done, back to idle i2c1_state = S_MASTER_IDLE; }
void I2C1_MasterWrite( uint8_t *pdata, uint8_t length, uint16_t address, I2C1_MESSAGE_STATUS *pflag) { static I2C1_TRANSACTION_REQUEST_BLOCK trBlock;
// check if there is space in the queue if (i2c1_object.trStatus.s.full != true) { I2C1_MasterWriteTRBBuild(&trBlock, pdata, length, address); I2C1_MasterTRBInsert(1, &trBlock, pflag); } else { *pflag = I2C1_MESSAGE_FAIL; }
}
void I2C1_MasterRead( uint8_t *pdata, uint8_t length, uint16_t address, I2C1_MESSAGE_STATUS *pflag) { static I2C1_TRANSACTION_REQUEST_BLOCK trBlock;
// check if there is space in the queue if (i2c1_object.trStatus.s.full != true) { I2C1_MasterReadTRBBuild(&trBlock, pdata, length, address); I2C1_MasterTRBInsert(1, &trBlock, pflag); } else { *pflag = I2C1_MESSAGE_FAIL; }
}
void I2C1_MasterTRBInsert( uint8_t count, I2C1_TRANSACTION_REQUEST_BLOCK *ptrb_list, I2C1_MESSAGE_STATUS *pflag) {
// check if there is space in the queue if (i2c1_object.trStatus.s.full != true) { *pflag = I2C1_MESSAGE_PENDING;
i2c1_object.pTrTail->ptrb_list = ptrb_list; i2c1_object.pTrTail->count = count; i2c1_object.pTrTail->pTrFlag = pflag; i2c1_object.pTrTail++;
// check if the end of the array is reached if (i2c1_object.pTrTail == (i2c1_tr_queue + I2C1_CONFIG_TR_QUEUE_LENGTH)) { // adjust to restart at the beginning of the array i2c1_object.pTrTail = i2c1_tr_queue; }
// since we added one item to be processed, we know // it is not empty, so set the empty status to false i2c1_object.trStatus.s.empty = false;
// check if full if (i2c1_object.pTrHead == i2c1_object.pTrTail) { // it is full, set the full status to true i2c1_object.trStatus.s.full = true; }
} else { *pflag = I2C1_MESSAGE_FAIL; }
// for interrupt based if (*pflag == I2C1_MESSAGE_PENDING) { while(i2c1_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
}
void I2C1_MasterReadTRBBuild( I2C1_TRANSACTION_REQUEST_BLOCK *ptrb, uint8_t *pdata, uint8_t length, uint16_t address) { ptrb->address = address << 1; // make this a read ptrb->address |= 0x01; ptrb->length = length; ptrb->pbuffer = pdata; }
void I2C1_MasterWriteTRBBuild( I2C1_TRANSACTION_REQUEST_BLOCK *ptrb, uint8_t *pdata, uint8_t length, uint16_t address) { ptrb->address = address << 1; ptrb->length = length; ptrb->pbuffer = pdata; }
bool I2C1_MasterQueueIsEmpty(void) { return(i2c1_object.trStatus.s.empty); }
bool I2C1_MasterQueueIsFull(void) { return(i2c1_object.trStatus.s.full); } void I2C1_BusCollisionISR( void ) { // enter bus collision handling code here } /** End of File */
|  |  |  |  |
Откъде трябва да прочета стойността на X ?
|
| Нед Юли 30, 2017 9:22 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: I2C малко помощ
Трябва да извикаш I2C1_MasterRead, като в параметрите укажеш от кой адресИ2Ц, колко байта и къде в собствения РАМ да се запишат. После следиш флаг ФФФ, като се изпълни заявката - можеш да си прочетеш от своя си РАМ. За 30 малки пикчета - трябва да изъчиш 30 заявки . Ако имаш много памет - можеш да ги излъчиш накуп към опашката, ако не - излъчваш една и чакаш , после втората и т.н. Примерът ти за слейв е простичък , слейвът не пише данни в мастера
"Това означава ли, че slave ще праща към master - а съдържанието на целия EEPROM буфер? Т.е - да запиша следващата променлива в EEPROM_Buffer[1] и т.н. ?" Слейвът НЕ ПРАЩА, той ги дава - ако мастерът ги поиска . И дава толкова , колкото мастерът поиска. В малкия пик можеш да си пишеш EEPROM_Buffer[0]=x; EEPROM_Buffer[1]=y; EEPROM_Buffer[2]=z;
В I2C1_MasterRead задаваш дължина 3 , като се изпълни - ще имаш X,Y,Z.
Не можах да се ориентирам къде стоят флаговете ФФФ, чети и пробвай.
|
| Пон Юли 31, 2017 6:53 am |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: I2C малко помощ
void I2C1_Initialize(void) е в самото начало;
Викаш void I2C1_MasterRead( uint8_t *pdata, //тук даващ адрес от РАМ , където да дойдат данните uint8_t length, // брой байтове uint16_t address, //адрес на малкия пик I2C1_MESSAGE_STATUS *pflag) //тук даваш адрес на флаг, който ще следиш.
Системата се движи от void I2C1_ISR ( void ) . Значи - когато опашката е празна тази функция не би трябвало да се активира, и като издадеш заявка - би трябвало някак да я извикаш - може би със сетване на PIR1bits.SSP1IF = 1; и оттам нататък - следиш флага на заявката pflag ;
|
| Пон Юли 31, 2017 7:15 am |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Много ти благодаря!  PS: И още един страничен и тъп въпрос: Кое налага ползването на EEPROM памет в тия джаджи, вместо само FLASH ?
|
| Пон Юли 31, 2017 10:54 am |
|
 |
|
radolin
Ранг: Форумен бог
Регистриран на: Пон Дек 19, 2005 12:21 pm Мнения: 1037
|
 Re: I2C малко помощ
EEPROM-a има много повече цикли на презапис. Флаш-а също можеш да го триеш само на големи блокове, то и затова се казва така.
|
| Пон Юли 31, 2017 11:50 am |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
|
| Пон Юли 31, 2017 12:12 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Още един въпрос:
Предполагам, че когато се получи заявка за четене от master - а, в slave се генерира прекъсване.
Какво се случва в 12F1840 след обслужване на прекъсването? Основният цикъл ще продължи ли от там докъдето е бил стигнал или ще започне отначало?
|
| Вто Авг 01, 2017 8:05 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: I2C малко помощ
Това е идеята, ама реализацията зависи от тебе. На Ц - най вероятно няма да разбереш , че е е имало прекъсване - когто кодът е правилен Иначе -бой , стригане и глад. Тоз малкия пик - с какво ще го дебъгваш? Май мярнах , че може и без адаптер на ПИКИТ3, дано. От толкоз много въпроси - следва , че ще има много за деБъгване. Съвет - Отвори си тема в "Академия" и почни да си публикуваш програмата на малкия пик. Само забележи - няма кой да разлиства 300 реда код - трудно е, разделяй кода в малки файлове и ги качвай като файлове, не ги копиррай като текст в съобщението. Ако имаш достатъчно коментари в кода - ще получиш и достатъчно мнения. Доколкото разбрах - имаш виждане - какво ще прави малкия пик в основния цикъл - ще смята нещо, което ти е ясно. И си работил вече с тоя пик. Но ти е проблем да пратиш резултата към и2ц мастера. Колкото и да ти изглежда тъпо - започни публикуването от скелета на програмата , не от И2Ц особеностите. Тук няма кой да ти открадне идеите...
|
| Вто Авг 01, 2017 8:27 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: I2C малко помощ
Всеки нормален софтуер трябва да се мисли в перспективата 365/7/24 . Трябва да огледаш ерата-документа, да предвидиш някакъв механизъм за ресет на комуник.канал - ако за някако време не се получи здравословен обмен. Принципно - защитата на комуникацията е 50-80 % от работата и кода - и този код се задейства твърде рядко . Колко рядко....божа работа.
|
| Вто Авг 01, 2017 8:45 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Не става въпрос за някакви притеснения. Не си вадя хляба с този занаят и това ми е само хоби. Просто не искам да занимавам аудиторията с банални неща. Честно казано не ми е и много ясно, как да дебъгвам. Пробвах веднъж и нещо се омаза, като закачих програматора към MPLAB. После трябваше да му преинсталирам фърмуера за да го оправя. Пиша, билдвам и ако ме наплюе, си търся грешките. Ако не, дъмпя, тествам и така. Луда работа  В конкретния случай малкият пик мери 2 аналогови величини и ги интегрира по време. Отвреме навреме трябва да си съобщава сметките на началника 
|
| Вто Авг 01, 2017 9:06 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: I2C малко помощ
Случват се такива работи. Там- дето ще те наплюе компилатора - е лесно.
|
| Вто Авг 01, 2017 9:28 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Притеснавам се за прекъсванията от I2C, защото в цикъла имам няколко паузи от по няколко минути, които съм реализирал с __delay_(ms) и ако цикълът продължи от неправилното място след прекъсването, става неприятно.
|
| Вто Авг 01, 2017 9:35 pm |
|
 |
|
CarBeta
Ранг: Форумен бог
Регистриран на: Пет Май 01, 2009 4:01 pm Мнения: 1438
|
 Re: I2C малко помощ
Цикълът ще продължи от където е прекъснат, но тия милисекунди вече ще са повече, отколкото са предвидени.
|
| Вто Авг 01, 2017 9:41 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Благодаря! Това не е фатално в конкретния случай.
|
| Вто Авг 01, 2017 9:43 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|