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

Konflikt przerwań INT0 i I2C w liczniku kilometrów AVR - jak rozwiązać?

Ryszardp 27 Wrz 2004 09:48 1917 8
REKLAMA
  • #1 877368
    Ryszardp
    Poziom 11  
    Posty: 18
    drodzy panowie, może panie :-)
    Sprawa jest taka, mam układ nad którym już od kilku tygodni ślęczę, coś w rodzaju komputera pokładowego do pojazdu jednoścladowego hehe. Generalnie wszystko jest ok z wyjątkiem...
    Zastopowałem się przy liczniku kilometrów.
    przerwanie INT0 zlicza ilosc obrotów koła (jedna linia programu)
    przerwanie INT1 jest przerwanie zegara ktore co 1 sekundę dokonuje obliczen przejechanej drogi oraz szybkosci pojazdu (4 linie programu i proste operacje)
    przerwanie timera obsluguje klawiature.
    Glowny progra obrazuje predkosc i przebieg na LCD i w zasadzie wszystko jest OK
    Problem lezy w tym ze co sekunde zapisuje aktualny przebieg w pamieci na I2C dla pozniejszego otworzenia jego stanu przy uruchomieniu licznika po wlaczniu zasilania.
    W ogole zauwazylem ze w momencie gdy dochodzi do obslugi magistarli I2C (a zaznaczam dzieje sie to w glownym programie) wskazania szybkosciomierza głupieją) z czego wnioskuje że zaczynają one kolidowac z przerwaniem INT0.
    Poki co nie mam na to pomysłu, no chyba ze daruje sobie magistrale I2C i bede zapisywal biezacy przebieg w jakiejs pamieci o dostepie rownolegly, ale tutaj z kolei moze mi zabraknąc portów procesora. :-)
    Program jest w C.
  • REKLAMA
  • #2 877446
    gmp
    Poziom 19  
    Posty: 434
    Pomógł: 29
    Ocena: 28
    A po co Ci pamiec n i2? Chyba kazdy AVR ma eeprom... Czasmi sie dziwie jak ludzie lubia sobie zycie utrudniac. Pozatym chyba nie trzba zapisywac co 1sek przebiegu kilometrow. Mozna tez zminiac sdresy eeprom zeby ciagle nwi korystac z tych samych komorek..
  • #3 877454
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #4 877475
    Ryszardp
    Poziom 11  
    Posty: 18
    gmp napisał:
    A po co Ci pamiec n i2? Chyba kazdy AVR ma eeprom... Czasmi się dziwie jak ludzie lubia sobie zycie utrudniac. Pozatym chyba nie trzba zapisywac co 1sek przebiegu kilometrow. Mozna tez zminiac sdresy eeprom zeby ciagle nwi korystac z tych samych komorek..

    eeprom po to ze ilosc zapisów jest skończona
    A kto lubi kiedy mu się coś predzej czy póżniej skończy ?
    poszukam zwyklej sram z bateryjką :-)
  • REKLAMA
  • #5 877613
    Robot_
    Poziom 18  
    Posty: 277
    Pomógł: 22
    Witam
    1) I2C jest dosc wolna szyna i może nie zdązyć pomiędzy dwoma przerwaniami.
    2)Po CI duża pamięć do przebiegu kilometrów przecierz i tak liczy się wartośc ostatnia biorąc pod uwage dystans nawet 100000km to można to zapisać w BCD na 10 bajtach z dokładnościa do 0,1 metra co i tak jest za dużą dokładnością, więc po co duża pamięć?? a zapis wykonywać tylko w momencie zaniku zasialania, załatwi to kilka elementów + jeden pin i kilka lini kodu. Pozdrawiam
  • #6 878092
    Jacu$
    Poziom 27  
    Posty: 730
    Pomógł: 119
    Ocena: 26
    A jeśli już się upierasz przy zewnętrznym EEPROM-ie szeregowym to może 93C46 albo jakaś z tej rodziny. Microwire jest szybsze od i2c. No i będziesz mógł ją spokojnie wyrzucić po milionie operacji zapisu (podobnie jak tą dotychczasową i2c).
  • #7 878233
    gmp
    Poziom 19  
    Posty: 434
    Pomógł: 29
    Ocena: 28
    Ryszardp napisał:
    eeprom po to ze ilosc zapisów jest skończona
    A kto lubi kiedy mu się coś predzej czy póżniej skończy ?
    poszukam zwyklej sram z bateryjką :-)

    Masz racjeze jest skonczona, ale to jest1 milion cykli zapisu, i jakbys dobrze napial program to nie doczekasz za swego zycia(zycze jak najdluzszego) tego dnia w ktorym przestanie zapisywac. Chyba ze chcesz zrobic cos dla pra-pra-wnukow....:)
  • REKLAMA
  • #8 878338
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    gmp napisał:
    Ryszardp napisał:
    eeprom po to ze ilosc zapisów jest skończona
    A kto lubi kiedy mu się coś predzej czy póżniej skończy ?
    poszukam zwyklej sram z bateryjką :-)

    Masz racjeze jest skonczona, ale to jest1 milion cykli zapisu, i jakbys dobrze napial program to nie doczekasz za swego zycia(zycze jak najdluzszego) tego dnia w ktorym przestanie zapisywac. Chyba ze chcesz zrobic cos dla pra-pra-wnukow....:)


    A ja się zastanawiam dlaczego w eeprom ?
    Czyżby ci RAM-u zabrakło ?
    Zbudowałem coś na "obraz i podobieństwo" Twojego urządzonka i tylko na życzenie uzytkownika(klawisz) zapisuje wskazania w eepromie.Normalnie wszystkie wskazania "są w RAM-ie".Do tego jeszcze zapisuje datę i godzinę.

    Pzdr.
    Piotrek Sz.
  • #9 878720
    marchewa101
    Poziom 17  
    Posty: 301
    Pomógł: 2
    Ocena: 8
    Ryszardp-->
    na twoje pytanie jest dosc trudno odpoweidziec poniewaz nie wiadomo co jaki czas nadchodzi impuls, i czy proc sie wyrobi...
    wazne jest w jakim jezyku piszesz, bo to tez ma wplyw na szybkosc wykonywania zadania...
    Jezeli obsluge i2c masz w petli glownej. i wtedy nastepuje przerwanie, ze zmiana wartosci zapisywanej przez i2c to moga wystapic pewne bledy.

    a teraz male sugestie:
    .. jak dla mnie to najprostszym rozwiazaniem jest miec do uC dodatkowa bateryjke wykozystywana po zaniku napiecia..
    gdy uC wykryje zanik napiecia to przechodzi w tryb uspienia.. i nie wazne jak malo pojemna byla by ta bateryjka to procek ci jej nie wyladuje... ale jak koniecznie chcesz to mozesz zapisac wtedy do epromu, a baterjke zastapic kondensatorem.

    i jeszcze mniejsza sugestia ;p
    nie lepiej liczyc czas pomiedzy impulsami, a ne ilosc impulsow w jednostce czasu.

Podsumowanie tematu

✨ Dyskusja dotyczy problemu kolizji przerwań INT0 (zliczanie obrotów koła) i operacji zapisu przebiegu pojazdu na magistrali I2C w mikrokontrolerze AVR. Autor stosuje przerwania INT0 do zliczania impulsów, INT1 do obliczeń prędkości i dystansu co sekundę oraz timer do obsługi klawiatury. Problem pojawia się podczas zapisu danych na I2C w głównej pętli programu, co powoduje błędne wskazania prędkościomierza, prawdopodobnie z powodu kolizji przerwań. W odpowiedziach sugerowano rezygnację z zewnętrznej pamięci I2C na rzecz wbudowanego EEPROM AVR, który jest prostszy w obsłudze i wystarczający do zapisu ostatniego stanu przebiegu. Wskazano, że częste zapisy co sekundę mogą nie być konieczne, a lepszym rozwiązaniem jest zapisywanie danych przy zaniku zasilania, co można wykonać za pomocą dodatkowego układu zasilania bateryjnego lub kondensatora. Zwrócono uwagę, że magistrala I2C jest wolna i może nie zdążyć obsłużyć zapisu między przerwaniami, co prowadzi do błędów. Alternatywnie zaproponowano użycie szybszej pamięci Microwire (np. 93C46) zamiast I2C. Poruszono też kwestię optymalizacji pomiaru prędkości przez mierzenie czasu między impulsami zamiast ich liczby w jednostce czasu.
REKLAMA