Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

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

 

Микроконтролер и I2C свързване

Featured Replies

Постановката е следната:
master (PIC18F45K50) -> slave (PIC18F45K22)
Master предава данни (стандартни, три устройства със съответните адреси ги получават и обработват):


i2c_start();
   i2c_write(0xA4); // адреса на Slave
   i2c_write(0xF0); // запис в регистъра на slave
i2c_repStart();
 i2c_write(0xA5); // четене
  data=i2c_read(0); //стойност, която master трябва да приеме от slave
i2c_stop();


Slave:
PIC18F45k22, OSC = 16MHz, PLLx4 (т.е. 64МХц). Инициализация на SSP1 (два броя са):


   SSP1ADD = 0xA4;//Slave_address; //device address
  SSP1CON1 = 0x36; //SSPEN =1 and set i2c to slave mode with  7 bit address
  SSP1STAT = 0x00;
 SSP1CON2 = 0x00;
 SSP1CON3 = 0x00;


Пробвано е и със SSP1CON2 = 0x01; 0x81; SSP1CON3 = 0x30 и комбинациите от тях.
Прекъсванията са ЗАБРАНЕНИ.


От тъпотия съм написал кода точно да обработва на горната поредица:


while(1)
{
     while (!SSP1STATbits.BF);    // чака първият байт
          temp = SSP1BUF;                // прочитане на първия байт (0хА4)
        SSP1CON1bits.CKP = 1;    // освобождаване на шината
    while (!SSP1STATbits.BF);   // чака вторият байт
        temp = SSP1BUF;                 // прочитане на вторият байт (0хF0)
      SSP1CON1bits.CKP = 1;     // освобождаване на шината
    while (!SSP1STATbits.BF);   // чака третият байт
        temp = SSP1BUF;                 // прочитане на третия байт (0xA5)- команда за четене от slave
      SSP1BUF = 0x44;                   // зареждане исканата стойност от регистъра, за случая 0х44
       SSP1CON1bits.CKP = 1;   // освобождаване на шината
    while (SSP1STATbits.BF);  // чакаме байта да се изпрати
  led2s();                                          // включване за 2 сек светодиод, че операцията е успешна, работи, светва, че всичко е минало успешно
}

С други думи: мастер праща към слейв: 0xA4;0xF0;0xA5 и чака да получи байт - 0х44.
Резултат: НЪЦКИ, NiCHT, NONE, ИЧ, ЙОК.

nucky.jpg.35e9a5bf4b5368cedf849d16939dcafa.jpg

Обаче:
while(1)
{
     while (!SSP1STATbits.BF);    // чака първият байт
          temp = SSP1BUF;                // прочитане на първия байт (0хА4)
        SSP1CON1bits.CKP = 1;    // освобождаване на шината
    while (!SSP1STATbits.BF);   // чака вторият байт
        temp = SSP1BUF;                 // прочитане на вторият байт (0хF0)
      SSP1CON1bits.CKP = 1;     // освобождаване на шината
    while (!SSP1STATbits.BF);   // чака третият байт
        temp = SSP1BUF;                 // прочитане на третия байт (0xA5)- команда за четене от slave

     delay_uS(6);                               // добавяме пауза от поне 6uS

      SSP1BUF = 0x44;                   // зареждане исканата стойност от регистъра, за случая 0х44
       SSP1CON1bits.CKP = 1;   // освобождаване на шината
    while (SSP1STATbits.BF);  // чакаме байта да се изпрати
  led2s();                                          // включване за 2 сек светодиод, че операцията е успешна, работи, светва, че всичко е минало успешно
}

Прави  съвършеният резултат:

voala.jpg.769f3217ec3c2c16c8987a96eb509468.jpg

Тая вмъкната пауза изобщо не ми харесва, особено като обработката се вкара в прекъсване. Тези 6uS за 64MHz процесор са около 100 инструкции.

Пробвал съм и с различни честоти на процесора- няма промяна.

Някакви идеи кой е виновника в случая- аз или процесора?

Питайте, ако ви трябва още информация.

 

 

Без да съм спец по програмиране - IIC Bus си има специикации и е доста по-бавна. Има времена за изчакване и потвърждение, така че да се разбира и с най-бавните устройства по шината. Попринцип повечето стандартни  памети работят на 100KHz, някои по-добри има и на 400KHz. За други чипове отделно. Има процедури за потвърждение и за освобождаване на шината ако някое устройство е увиснало или не е потвърдило.

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.