(22-02-2012 10:13)SP4EJT napisał(a): Proszę o wyjaśnienie - na chłopski rozum, sprzętowe, np. I2C powinno chodzić szybciej.
Nie chodzi tutaj o samą komunikację I2C, bo jej prędkość określa standard i wynosić maksymalnie 100kbps czyli sygnal zegara SCL powinien maksymalnie mieć 100kHZ. Później dodany tryb pracy Fast Mode gdzie szybkość zegara poniesiono do 400 kbps, a jeszcze później 3,4Mbps.
Mam tutaj tą samą różnicę co miedzy sprzętowym i programowym UART-em.
Napisanie programowej komunikacji wymaga od nas trzymania się norm czasowych dotyczące czasów trwania sygnałów. Najczęściej procesor stoi i czeka na odliczenie pewnego opóźnienia, (przykładowo dla 10MHz zegara procesora i 100kbps jest to 50 cyklów zegarowych) w czasie którego nic nie robi.
Jeśli program jest mały i obsługuje tylko jeden układ nie jest to problem, ale w przypadku bardziej złożonych ten czas jest cenny i wykorzystuje się na przykład przerwanie od timera, aby co odpowiedni czas zmieniać stan lini SDA i SCL.
W przypadku programowego, sprawa jest prosta i wymaga od nas kontroli czterech rejestrów, aby sprawdzić czy dane sekwencja transmisji się zakończyła, czy odbiorca potwierdził poprawność i przygotować do kolejnej sekwencji. Samą transmisją zajmuje się układ sprzętowy, a my możemy w tym czasie zająć procesor czymś innym. Musimy tylko co pewien czas sprawdzać czy dane sekwencja transmisja się skończyła.
Sekwencje to: Zainicjowanie transmisji i wysłanie sygnału start, wysłanie adresu, wysłanie (odebranie danej), sygnał stop.
Przy okazji słów Adama, tak dla przykładu chciałbym pokazać pewien problem, który niedawno miałem przy pisaniu programu w C na AVR-a, i chciałbym również aby koledzy zaproponowali jak by to rozwiązali, na końcu porównam i pokaże jak ja to rozwiązałem.
Problem jest prostu, w danym bajcie zamienić kolejność bitów, dla ścisłości chodzi tylko o 4 pierwsze bity, czyli zamienić miejscami 1<-->4, 2<-->3. Rozwiązanie tego problemu w Asemblerze jest banalnie proste, bo są odpowiednie rozkazy do operacji na bitach, ale C który nie ma takich operacji już stwarza pewne problemy. Chodzi oczywiście o zastosowanie takiego kodu, który po kompilacji da nam najmniejszy kod wynikowy.