Mam w projekcie Atmegę128 + PCF8583 + kilka układów I2C (3xADS1110, AT24c1024), dodatkowo dołaczam dwa moduły z Atmega64 każdy. Chcę, aby każdy z mikrokontrolerów odczytywał czas bezpośrednio z PCF8583. Teoretycznie arbitraż jest możliwy, ale u mnie to nie chce prawidłowo działać - zawiesza się komunikacja i programy "stoją".
Do testów zostawiłem w układzie tylko m128, m64 i PCF, napisałem typowo testowe programy:
dla m128:
dla m64:
Działa to tak, że m128 wystawia sygnał zezwolenia odczytu PCF'a dla m64 i czeka 20ms , ten w przerwaniu odczytuje czas. Nastepnie m128 wychodzi z przerwania i teraz on odczytuje czas. Teoretycznie to działa, obydwa mikroprocesory odczytują czasy prawidlowo, ale raz na jakiś czas 'milknie" transmisja na TWI i programy zatrzymują się.
Sprawdzałem oscyloskopem, na przebiegach widać, że nie ma kolizji na szynie, procesory nie próbują odczytywać czasu jednocześnie.
Zauważyłem natomiast jedną rzecz, przed zawieszeniem się komunikacji szyna SDA nie wraca do stanu wysokiego (dzieje się to podczas odczytu przez m64).
Próbowałem po każdym odczycie ustawiać piny PD.0 i PD.1 jako wejścia, a przed odczytem ustawiać jako SDA/SCL poleceniem I2CINIT, bez skutku. Częstotliwość TWI jest na 100% ustawiona na 100kHz, sprawdzałem rejestr TWBR, a preskaler jest ustawiony na 1.
Nie mam już pomysłów
Do testów zostawiłem w układzie tylko m128, m64 i PCF, napisałem typowo testowe programy:
dla m128:
Kod: text
dla m64:
Kod: text
Działa to tak, że m128 wystawia sygnał zezwolenia odczytu PCF'a dla m64 i czeka 20ms , ten w przerwaniu odczytuje czas. Nastepnie m128 wychodzi z przerwania i teraz on odczytuje czas. Teoretycznie to działa, obydwa mikroprocesory odczytują czasy prawidlowo, ale raz na jakiś czas 'milknie" transmisja na TWI i programy zatrzymują się.
Sprawdzałem oscyloskopem, na przebiegach widać, że nie ma kolizji na szynie, procesory nie próbują odczytywać czasu jednocześnie.
Zauważyłem natomiast jedną rzecz, przed zawieszeniem się komunikacji szyna SDA nie wraca do stanu wysokiego (dzieje się to podczas odczytu przez m64).
Próbowałem po każdym odczycie ustawiać piny PD.0 i PD.1 jako wejścia, a przed odczytem ustawiać jako SDA/SCL poleceniem I2CINIT, bez skutku. Częstotliwość TWI jest na 100% ustawiona na 100kHz, sprawdzałem rejestr TWBR, a preskaler jest ustawiony na 1.
Nie mam już pomysłów