Dariusz Zolna
Guest
Fri Jan 30, 2009 8:46 pm
Tak jak w temacie - czy protokół I2C dopuszcza możliwość
zasygnalizowania masterowi, że slave ma dla niego informację do
odebrania? A jeśli tak, czy Atmega załatwo to sprzętowo?
Teraz robię to przez cykliczny polling, ale w przypadku np przycisku czy
innego urządzenia typu "trigger" trochę to nieefektywne, bo nie dość że
zabiera cenny czas procka, to odebrana informacja jest mało precyzyjna w
czasie (co ma spore znaczenie w przypadku np stopera).
Dariusz Żołna
Sylwester Łazar
Guest
Fri Jan 30, 2009 9:03 pm
Niech zgłosi to przez osobną linię.
Można przez tą samą wyłączyć I2C, jeśli nic tam nie jest nadawane w danym
czasie.
Wtedy SLAVE sobie ustawi "0" jeśli chciałby coś nadać.
MASTER wysłucha prośby i włączy I2C.
--
--
pozdrawiam
Sylwester Łazar
http://www.alpro.pl
http://www.rimu.pl -oprogramowanie do edycji schematów
i projektowania PCB
Dariusz Zolna
Guest
Fri Jan 30, 2009 11:00 pm
Sylwester Łazar pisze:
Quote:
Niech zgłosi to przez osobną linię.
Można przez tą samą wyłączyć I2C, jeśli nic tam nie jest nadawane w danym
czasie.
Wtedy SLAVE sobie ustawi "0" jeśli chciałby coś nadać.
MASTER wysłucha prośby i włączy I2C.
Mogę zrobić tylko upgrade firmware, dodatkowa linia nie wchodzi w grę.
Dariusz Żołna
Sylwester Łazar
Guest
Fri Jan 30, 2009 11:27 pm
Quote:
Mogę zrobić tylko upgrade firmware, dodatkowa linia nie wchodzi w grę.
Pisałem, że można po tej samej np. SDA.
Problem w tym czy z obu stron są ukontrolery, czy SLAVE jest sprzętowy.
Np. jeśli sprzętowy, to należy dodać jeden przewód od wyłącznika do SDA.
Przycisk - zwiera sygnał do masy -> Master włącza port I2C.
Jest jeszcze problem, bo MASTER musi poczekać na zwolnienie przycisku.
Trudno tak dyskutować, jak nie widać układu.
--
--
pozdrawiam
Sylwester Łazar
http://www.alpro.pl
http://www.rimu.pl -oprogramowanie do edycji schematów
i projektowania PCB
Dariusz Zolna
Guest
Sat Jan 31, 2009 12:07 am
Sylwester Łazar pisze:
Quote:
Problem w tym czy z obu stron są ukontrolery, czy SLAVE jest sprzętowy.
Np. jeśli sprzętowy, to należy dodać jeden przewód od wyłącznika do SDA.
Przycisk - zwiera sygnał do masy -> Master włącza port I2C.
Jest jeszcze problem, bo MASTER musi poczekać na zwolnienie przycisku.
Trudno tak dyskutować, jak nie widać układu.
Po obu stronach są uC, przycisk także przechodzi przez uC.
Master - Atmega128, slave - w większości Atmega8.
Dariusz Żołna
Sylwester Łazar
Guest
Sat Jan 31, 2009 9:24 am
Quote:
Po obu stronach są uC, przycisk także przechodzi przez uC.
Master - Atmega128, slave - w większości Atmega8.
To w takim razie:
1) Normalna praca i2c wyłaczony. MASTER czeka na SDA na sygnał -impuls "0".
Zakładam, że linia podwieszona jest do VCC przez rezystor.
2) Jeśli "0" - MASTER włącza I2C.
Nie miałem tego ATMEGA nigdy w ręce, ale widzę, że na pinie 26 (SDA) jest
też przerwanie INT1.
W takim razie nie trzeba pollingu, a przerwanie zostanie obsłużone
sprzętowo.
--
--
pozdrawiam
Sylwester Łazar
http://www.alpro.pl
http://www.rimu.pl -oprogramowanie do edycji schematów
i projektowania PCB
T.M.F.
Guest
Sat Jan 31, 2009 10:38 am
Dariusz Zolna pisze:
Quote:
Sylwester Łazar pisze:
Problem w tym czy z obu stron są ukontrolery, czy SLAVE jest sprzętowy.
Np. jeśli sprzętowy, to należy dodać jeden przewód od wyłącznika do SDA.
Przycisk - zwiera sygnał do masy -> Master włącza port I2C.
Jest jeszcze problem, bo MASTER musi poczekać na zwolnienie przycisku.
Trudno tak dyskutować, jak nie widać układu.
Po obu stronach są uC, przycisk także przechodzi przez uC.
Master - Atmega128, slave - w większości Atmega8.
No to sprawe masz prosta. Jak master nic nie nadaje to przelacza sie w
slave i masterem staje sie to twoje urzadzenie. Jesli oba beda chcialy
nadawac to tez nic wielkiego bo I2C obsluguje kolizje.
Dariusz Zolna
Guest
Sat Jan 31, 2009 10:59 am
T.M.F. pisze:
Quote:
No to sprawe masz prosta. Jak master nic nie nadaje to przelacza sie w
slave i masterem staje sie to twoje urzadzenie. Jesli oba beda chcialy
nadawac to tez nic wielkiego bo I2C obsluguje kolizje.
Tyle że ja tych urządzeń mam kilkanaście, z którymi w większości jest
transmisja ciągła, a tylko 2 dostarczają danych sporadycznie.
Chyba zostanę przy pollingu, bo widzę że tylko skomplikuję sprawę i
zmniejszę niezawodność.
Dariusz Żołna
Adam Dybkowski
Guest
Sat Jan 31, 2009 3:40 pm
Sylwester Łazar pisze:
Quote:
Po obu stronach są uC, przycisk także przechodzi przez uC.
Master - Atmega128, slave - w większości Atmega8.
To w takim razie:
1) Normalna praca i2c wyłaczony. MASTER czeka na SDA na sygnał -impuls "0".
Zakładam, że linia podwieszona jest do VCC przez rezystor.
2) Jeśli "0" - MASTER włącza I2C.
Można też przy interfejsie 2-liniowym zrezygnować z protokołu I2C i
zrobić zwykły RS232 z wykrywaniem kolizji. Na jednej linii Master gada
do pozostałych procesorów, na drugiej (z pull-up'em do zasilania) gadają
inne procki sterując linią w trybie open drain (wystawiając tylko masę
lub Hi-Z). Jeżeli dwa Slave'y jednocześnie będą chciały coś nadać,
wystarczy najpierw posłuchać czy coś już nie leci na linii a do tego
wykryć kolizję np. sprawdzając CRC ramki. Maksymalna prędkość takiego
współdzielonego RS232 zależy od długości linii i liczby Slave'ów.
--
Adam Dybkowski
http://dybkowski.net/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
entroper
Guest
Mon Feb 02, 2009 10:54 pm
Użytkownik "Dariusz Zolna" <answer@usenet.com> napisał w wiadomości
news:gm17ds$km9$1@inews.gazeta.pl...
Quote:
Chyba zostanę przy pollingu, bo widzę że tylko skomplikuję sprawę i
zmniejszę niezawodność.
Nie wiem czy Atmega w ogóle to obsługuje i czy robi to poprawnie, ale możesz
zrobić taki eksperyment: niech slave przetrzyma chwilę SCL w stanie niskim w
momencie, gdy master wystawił SCL=0. Jeśli master to wykryje (jako dostęp
innego mastera lub nawet jako błąd) i nie wywali się na tym (tzn, nie będzie
chciał na siłę wystawiać danych tylko poczeka na SCL=1), będziesz mógł bez
przeszkód dokończyć bieżącą transmisję do aktualnie adresowanego urządzenia
i zaraz potem wywołać odczyty z interesujących Cię slav'ów (oczywiście nie
rozróżnisz, który chciał dostępu, ale masz ich mało zdaje się).
e.
Sylwester Łazar
Guest
Mon Feb 02, 2009 11:18 pm
Quote:
Nie wiem czy Atmega w ogóle to obsługuje i czy robi to poprawnie, ale
możesz
zrobić taki eksperyment: niech slave przetrzyma chwilę SCL w stanie niskim
w
momencie, gdy master wystawił SCL=0. Jeśli master to wykryje (jako dostęp
innego mastera lub nawet jako błąd) i nie wywali się na tym (tzn, nie
będzie
chciał na siłę wystawiać danych tylko poczeka na SCL=1), będziesz mógł bez
przeszkód dokończyć bieżącą transmisję do aktualnie adresowanego
urządzenia
Dobry pomysł. I w tym kierunku trzeba by pójść.
Może spróbować się podczepić (dokleić) i przesłać dodatkowy bajt danych do
aktualnie odczytywanego SLAVEA - jeśli naciśnięto przycisk.
--
--
pozdrawiam
Sylwester Łazar
http://www.alpro.pl
http://www.rimu.pl -oprogramowanie do edycji schematów
i projektowania PCB