Отговори на тема  [ 281 мнения ]  Отиди на страница Предишна  1, 2, 3, 4, 5, 6, 7 ... 19  Следваща
I2C малко помощ 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение Re: I2C малко помощ
Аз така и не разбрах има ли някакъв проблем с комуникация, модул, процесор или само се предполага, че може да има проблем.


Пон Яну 23, 2017 2:18 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

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


Пон Яну 23, 2017 2:56 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Май 26, 2009 8:49 pm
Мнения: 46
Мнение Re: I2C малко помощ
Мисля ,че доста се отклонихме от темата (I2C комуникацията),да обсъждаме контролери,тактови честоти ,времеви
интервали и прочие. Дадох ви повече информация за у-вото и вида на алгоритъма за да добиете по-широка представа .
Все още главно ме интересува дали комуникационният модул ще работи коректрно или не ,след като знаете че го разрешавам след приключване на другите процеси и го оставям пуснат за време от 520ms и след това го изключвам.
Ще предавам данни не повече от 4 байта към мастера.


Пон Яну 23, 2017 4:00 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 10, 2005 3:25 pm
Мнения: 5677
Местоположение: София
Мнение Re: I2C малко помощ
Ще работи коректно, когато мастъра улучи прозореца за комуникация, иначе не. А какъв ще е % попадения зависи от наслагването във времето на циклите на работа на мастъра и слейва, които само ти си ги знаеш.
Затова, ти се написа, че този подход е неправилен.


Пон Яну 23, 2017 4:51 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

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


Пон Яну 23, 2017 5:47 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 10, 2005 3:25 pm
Мнения: 5677
Местоположение: София
Мнение Re: I2C малко помощ
Няма нужда чак от такива гимнастики, ToHu. Просто i2c на слейва трябва да работи на прекъсване, което е с по-висок приоритет от това на таймера, който задава периода на меренето. Или, ако по-висок приоритет е невъзможен (не съм чел чаршафа), просто при прекъсване от i2c да нулира таймера. До следващото прекъсване от таймера ще има време да изтъркаля i2c комуникацията. Ако прекъсването по i2c дойде по време на мерене - предават се последно измерените, вместо текущите данни.


Пон Яну 23, 2017 6:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: I2C малко помощ
:) това е ясно но човека нещо не му харесва идеята, и щом не иска да му е лесно ....


Пон Яну 23, 2017 6:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 10, 2005 3:25 pm
Мнения: 5677
Местоположение: София
Мнение Re: I2C малко помощ
Не ме учудва, след като низвергна високите езици :lol: Ass(embler) forever!


Пон Яну 23, 2017 6:43 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 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
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Сря Фев 08, 2006 3:32 pm
Мнения: 253
Местоположение: Благоевград
Мнение Re: I2C малко помощ
тези 30-тината 1840 на същата платка ли са, където е и 1827?


Съб Юли 29, 2017 11:55 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

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


Нед Юли 30, 2017 12:09 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Дек 19, 2005 12:21 pm
Мнения: 1037
Мнение Re: I2C малко помощ
lcr написа:
Да.

В този случай i2c е подходящо.

А каква е причината да имаш 30 контролера на една платка? Не можеш ли да ги замениш с един по-голям?


Нед Юли 30, 2017 8:00 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

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

В този случай i2c е подходящо.

А каква е причината да имаш 30 контролера на една платка? Не можеш ли да ги замениш с един по-голям?


Би могло, разбира се. Основните ми съображения за да ползвам такъв брой малки са, че въпросните са ми доста по-познати, че в различни модификации броят им може да варира и не на последно място - отказоустойчивостта.

А и I2C трябва да го разцъкам....... все някога :)


Нед Юли 30, 2017 12:22 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

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


Нед Юли 30, 2017 1:49 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 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
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 281 мнения ]  Отиди на страница Предишна  1, 2, 3, 4, 5, 6, 7 ... 19  Следваща

Кой е на линия

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


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

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