|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 3:29 pm
| Автор |
Съобщение |
|
CarBeta
Ранг: Форумен бог
Регистриран на: Пет Май 01, 2009 4:01 pm Мнения: 1438
|
 Re: I2C малко помощ
Аз така и не разбрах има ли някакъв проблем с комуникация, модул, процесор или само се предполага, че може да има проблем.
|
| Пон Яну 23, 2017 2:18 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: I2C малко помощ
На мен ми се струва че или не е прочел I2C протокола, или по скоро се опитвада го позлва извън предназначнеие, като поставя лините в състояния които не би трябвло да заемат за да предава някакво конкретно събитие,в случая готовност за предаване на данни, и се чуди как ше реагира мастъра.
|
| Пон Яну 23, 2017 2:56 pm |
|
 |
|
MAX_PG
Ранг: Минаващ
Регистриран на: Вто Май 26, 2009 8:49 pm Мнения: 46
|
 Re: I2C малко помощ
Мисля ,че доста се отклонихме от темата (I2C комуникацията),да обсъждаме контролери,тактови честоти ,времеви интервали и прочие. Дадох ви повече информация за у-вото и вида на алгоритъма за да добиете по-широка представа . Все още главно ме интересува дали комуникационният модул ще работи коректрно или не ,след като знаете че го разрешавам след приключване на другите процеси и го оставям пуснат за време от 520ms и след това го изключвам. Ще предавам данни не повече от 4 байта към мастера.
|
| Пон Яну 23, 2017 4:00 pm |
|
 |
|
Desert Leo
Ранг: Форумен бог
Регистриран на: Чет Фев 10, 2005 3:25 pm Мнения: 5677 Местоположение: София
|
 Re: I2C малко помощ
Ще работи коректно, когато мастъра улучи прозореца за комуникация, иначе не. А какъв ще е % попадения зависи от наслагването във времето на циклите на работа на мастъра и слейва, които само ти си ги знаеш. Затова, ти се написа, че този подход е неправилен.
|
| Пон Яну 23, 2017 4:51 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: I2C малко помощ
Ако толквоа държиш да е така, изпозлвай единият сигнал да казваш на мастера кога си готов, спираш I2C в мастъра както и в слейва, в слейва го праивш изход в мастъра вход. Слейва примерно ти сваля линията, мастъра чака да я вдигнеп, вдигнеш ли я имаш Х време да минеш в режим на комуникация от страна на слейва след кеото мастера почва да си говори с теб. Много дървено решение но поне не разчиташ на случайното съвпадение на двата прозореца, този в слейва и този в мастъра. Има и друг начин, вместо със сигнал протоколно. Мастъра праща команда чети, и знае че ти ще си готов след 100 mS, чака 100 mS и чак тогава инициира комуникация.
|
| Пон Яну 23, 2017 5:47 pm |
|
 |
|
Desert Leo
Ранг: Форумен бог
Регистриран на: Чет Фев 10, 2005 3:25 pm Мнения: 5677 Местоположение: София
|
 Re: I2C малко помощ
Няма нужда чак от такива гимнастики, ToHu. Просто i2c на слейва трябва да работи на прекъсване, което е с по-висок приоритет от това на таймера, който задава периода на меренето. Или, ако по-висок приоритет е невъзможен (не съм чел чаршафа), просто при прекъсване от i2c да нулира таймера. До следващото прекъсване от таймера ще има време да изтъркаля i2c комуникацията. Ако прекъсването по i2c дойде по време на мерене - предават се последно измерените, вместо текущите данни.
|
| Пон Яну 23, 2017 6:07 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: I2C малко помощ
 това е ясно но човека нещо не му харесва идеята, и щом не иска да му е лесно ....
|
| Пон Яну 23, 2017 6:28 pm |
|
 |
|
Desert Leo
Ранг: Форумен бог
Регистриран на: Чет Фев 10, 2005 3:25 pm Мнения: 5677 Местоположение: София
|
 Re: I2C малко помощ
Не ме учудва, след като низвергна високите езици  Ass(embler) forever!
|
| Пон Яну 23, 2017 6:43 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Ще си позволя да използвам темата на колегата, като първо държа да направя уговорката, че съм напълно незапознат с това чудо I2C и никога до момента не съм го разцъквал. От четенето на дейташита придобих само бегла представа затова, че би ми свършило работа основно заради възможността за адресиране на по-голям брой slave устройства. Постановката ми е следната: 1) 1 master (pic16F1827) управлява някакъв дисплей по SPI. 2) 30 - тина pic 12F1840 в процеса на своя си бизнес, формират по 10 променливи. 3) В даден момент, по желание на master - a трябва стойностите на въпросните променливи (на даден slave) да стигнат до него за визуализация на дисплея. Запознат съм в общи линии с XC8. Моля за насоки или евентуално за пример за който да се захвана. То е ясно, че ще трябва още много да чета, но едно рамо няма да ми е излишно  PS: До момента за решаването на задачата са ми минали през главата следните по-малко или повече дърводелски варианти: 1 - Да ползвам SPI, което ми е доста по-понятно, като добавя един двоично-десетичен дешифратор за да могат да ми стигнат пиновете за адресирането. 2 - Да мултиплексирам slave комуникацията (пак SPI) към master - а и изобщо да не се занимавам с адресиране. Все ми се струва, че I2C би било по-елегантното решение.
|
| Съб Юли 29, 2017 10:49 pm |
|
 |
|
vesko_hard
Ранг: Ориентиран
Регистриран на: Сря Фев 08, 2006 3:32 pm Мнения: 253 Местоположение: Благоевград
|
 Re: I2C малко помощ
тези 30-тината 1840 на същата платка ли са, където е и 1827?
|
| Съб Юли 29, 2017 11:55 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Да.
|
| Нед Юли 30, 2017 12:09 am |
|
 |
|
radolin
Ранг: Форумен бог
Регистриран на: Пон Дек 19, 2005 12:21 pm Мнения: 1037
|
 Re: I2C малко помощ
В този случай i2c е подходящо. А каква е причината да имаш 30 контролера на една платка? Не можеш ли да ги замениш с един по-голям?
|
| Нед Юли 30, 2017 8:00 am |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Би могло, разбира се. Основните ми съображения за да ползвам такъв брой малки са, че въпросните са ми доста по-познати, че в различни модификации броят им може да варира и не на последно място - отказоустойчивостта. А и I2C трябва да го разцъкам....... все някога 
|
| Нед Юли 30, 2017 12:22 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: I2C малко помощ
На една шина - ще трябва да им задаваш адреси някак си, може на етап програмиране в цокъла. После ... колко бройки ще правиш ? Програмиране, на фърмуера, програмиране на адреси.... Трябва добре да обмислиш и тая страна.
|
| Нед Юли 30, 2017 1:49 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Става въпрос за единична бройка. Ето какво сътвори MCC за slave: i2c.c :  |  |  |  | Код: #include "i2c.h"
#define I2C_SLAVE_ADDRESS 0x08 #define I2C_SLAVE_MASK 0x7F
typedef enum { SLAVE_NORMAL_DATA, SLAVE_DATA_ADDRESS, } SLAVE_WRITE_DATA_TYPE;
/** Section: Global Variables */
volatile uint8_t I2C_slaveWriteData = 0x55;
/** Section: Local Functions */ void I2C_StatusCallback(I2C_SLAVE_DRIVER_STATUS i2c_bus_state);
/** Prototype: void I2C_Initialize(void) Input: none Output: none Description: I2C_Initialize is an initialization routine that takes inputs from the GUI. Comment: Usage: I2C_Initialize();
*/ void I2C_Initialize(void) { // initialize the hardware // 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 disabled; SSPM 7 Bit Polling; SSPOV no_overflow; SSP1CON1 = 0x26; // ACKEN disabled; GCEN disabled; PEN disabled; ACKDT acknowledge; RSEN disabled; RCEN disabled; ACKSTAT received; SEN disabled; SSP1CON2 = 0x00; // ACKTIM ackseq; SBCDE disabled; BOEN disabled; SCIE disabled; PCIE disabled; DHEN disabled; SDAHT 100ns; AHEN disabled; SSP1CON3 = 0x00; // SSPMSK 127; SSP1MSK = (I2C_SLAVE_MASK << 1); // adjust UI mask for R/nW bit // SSPADD 8; SSP1ADD = (I2C_SLAVE_ADDRESS << 1); // adjust UI address for R/nW bit
// clear the slave interrupt flag PIR1bits.SSP1IF = 0; // enable the master interrupt PIE1bits.SSP1IE = 1;
}
void I2C_ISR ( void ) { uint8_t i2c_data = 0x55;
// NOTE: The slave driver will always acknowledge // any address match.
PIR1bits.SSP1IF = 0; // clear the slave interrupt flag i2c_data = SSP1BUF; // read SSPBUF to clear BF if(1 == SSP1STATbits.R_nW) { if((1 == SSP1STATbits.D_nA) && (1 == SSP1CON2bits.ACKSTAT)) { // callback routine can perform any post-read processing I2C_StatusCallback(I2C_SLAVE_READ_COMPLETED); } else { // callback routine should write data into SSPBUF I2C_StatusCallback(I2C_SLAVE_READ_REQUEST); } } else if(0 == SSP1STATbits.D_nA) { // this is an I2C address
// callback routine should prepare to receive data from the master I2C_StatusCallback(I2C_SLAVE_WRITE_REQUEST); } else { I2C_slaveWriteData = i2c_data;
// callback routine should process I2C_slaveWriteData from the master I2C_StatusCallback(I2C_SLAVE_WRITE_COMPLETED); }
SSP1CON1bits.CKP = 1; // release SCL
} // end I2C_ISR()
/**
Example implementation of the callback
This slave driver emulates an EEPROM Device. Sequential reads from the EEPROM will return data at the next EEPROM address.
Random access reads can be performed by writing a single byte EEPROM address, followed by 1 or more reads.
Random access writes can be performed by writing a single byte EEPROM address, followed by 1 or more writes.
Every read or write will increment the internal EEPROM address.
When the end of the EEPROM is reached, the EEPROM address will continue from the start of the EEPROM. */
void I2C_StatusCallback(I2C_SLAVE_DRIVER_STATUS i2c_bus_state) {
static uint8_t EEPROM_Buffer[] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f, 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f, 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f, 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f, 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f, };
static uint8_t eepromAddress = 0; static uint8_t slaveWriteType = SLAVE_NORMAL_DATA;
switch (i2c_bus_state) { case I2C_SLAVE_WRITE_REQUEST: // the master will be sending the eeprom address next slaveWriteType = SLAVE_DATA_ADDRESS; break;
case I2C_SLAVE_WRITE_COMPLETED:
switch(slaveWriteType) { case SLAVE_DATA_ADDRESS: eepromAddress = I2C_slaveWriteData; break;
case SLAVE_NORMAL_DATA: default: // the master has written data to store in the eeprom EEPROM_Buffer[eepromAddress++] = I2C_slaveWriteData; if(sizeof(EEPROM_Buffer) <= eepromAddress) { eepromAddress = 0; // wrap to start of eeprom page } break;
} // end switch(slaveWriteType)
slaveWriteType = SLAVE_NORMAL_DATA; break;
case I2C_SLAVE_READ_REQUEST: SSP1BUF = EEPROM_Buffer[eepromAddress++]; if(sizeof(EEPROM_Buffer) <= eepromAddress) { eepromAddress = 0; // wrap to start of eeprom page } break;
case I2C_SLAVE_READ_COMPLETED: default:;
} // end switch(i2c_bus_state)
}
|  |  |  |  |
Въпросът ми е, ако имам стойност на променлива "X", как и къде трябва да я запиша за да може тя да се получи от master устройството?
|
| Нед Юли 30, 2017 4:34 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 5 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|