logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega128A] [C] Problemy z I2C po wybudzeniu z trybu POWER DOWN

z_lak1 21 Mar 2017 11:52 870 7
  • #1 16360947
    z_lak1
    Poziom 8  
    Witam
    Mam problem z transmisją I2C po wybudzeniu uC. Jeśli uśpienie nie było zbyt głębokie (tryb IDLE) transmisja I2C działa bez problemów. Jeśli uśpienie było głębsze (np. POWER DOWN) po wybudzeniu nie działa magistrala I2C. Aby ponownie zaczęła działać konieczny jest RESET uC. Napisałem krótki program ułatwiający analizę problemu.

    plik main.c:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    plik I2cBase.c:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    plik I2cBase.h:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Testowałem powyższy kod w AS7.0.1006 i w AS7.0.1417 z wykorzystaniem debuggera sprzętowego JTAGICE3. W obydwu środowiskach zachowuje się podobnie.
    Już podczas zapisu do EEPROM-u 24C02 zatrzymuje się na linii:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 16361093
    Konto nie istnieje
    Konto nie istnieje  
  • #4 16361269
    z_lak1
    Poziom 8  
    Na wstępie pragnę zaznaczyć, że pliki I2cBase.c i I2cBase.h zaczerpnąłem z książki Tomasza Francuza (tmf) "Język C dla mikrokontrolerów AVR".

    dondu:
    TWI nie jest obsługiwany w przerwaniu. Zauważ, że uC jest budzony przez INT2, a nie przez TWI.

    Piotrus_999:
    nie idzie, ustawiam breakpointy na sąsiednich liniach:
    I2C_SendStartAndSelect(_24C02adr_w);
    I2C_SendByte(0x09); //adres komórki 24C02
    jak we fragmencie poniżej (oj przydałoby się numerowanie linii)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    program dochodzi tylko do pierwszego breakpointa, a do drugiego już nie.
    Po drodze wchodzi w nieskończoną pętlę, co zaobserwowałem w oknie asemblera.
  • #5 16361335
    Konto nie istnieje
    Konto nie istnieje  
  • #6 16361663
    z_lak1
    Poziom 8  
    Jutro to sprawdzę.
  • Pomocny post
    #7 16362162
    excray
    Poziom 41  
    Przed uśpieniem wyłącz TWI, i uruchom je ponownie po wybudzeniu.
  • #8 16362947
    z_lak1
    Poziom 8  
    Piotrus_999:
    Obie linie (SDA i SCL) po wybudzeniu są w stanie wysokim.

    excray:
    Bardzo dziękuję za pomoc.
    Działa :D
    Sprawdziłem dla wszystkich trybów uśpienia (za wyjątkiem SLEEP_MODE_ADC - z oczywistych względów).
    Poniżej zamieszczam poprawiony plik main.c

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Na zakończenie bardzo dziękuję wszystkim za okazaną pomoc.
    Szczególne podziękowania przesyłam excray.
REKLAMA