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

[ATmega8][C/WinAVR]Pogodzenie obsugi przycisków i odczytu da

f1emodel 15 Lip 2010 12:04 1373 5
REKLAMA
  • #1 8294460
    f1emodel
    Poziom 11  
    Witam,

    Chciałbym się poradzić Szanownych Kolegów, jak pogodzić odczytywanie informacji z jakiegoś urządzenia (zajmuje troszkę czasu ... ok 0,4s z powodu delayów w bibliotece obsługi) z obsługą przycisków...np. menu.

    Do tej pory miałem wszystko w jednym przerwaniu Timera0, ale, kiedy następował czas odczytu blokowało mi przyciski na moment.

    Jakie rozwiązania w takim przypadku ogólnie się przyjmuje (jak godzi się operacje, które powinny działać niezależnie od siebie, a jedna z nich zawiera funkcje opóźniające)?

    Czy możliwe jest napisanie funkcji opóźniającej, która korzysta w jakiś sposób z przerwania Timera, żeby nie blokować uC?
  • REKLAMA
  • #2 8294501
    tadzik85
    Poziom 38  
    Zamiast delay wykorzystaj inny timer.
  • REKLAMA
  • REKLAMA
  • #4 8294579
    tmf
    VIP Zasłużony dla elektroda
    Wywalić delay z procedur obsługi przerwania i zamienić je na flagi interpretowane w pętli głównej programu? Rozbić komunikację z urządzeniem na mniejsze fragmenty?
  • REKLAMA
  • #5 8295049
    f1emodel
    Poziom 11  
    Dzięki za odpowiedzi :)

    Femto Os jest baaardzo ciekawym rozwiązaniem, z którego na pewno kiedyś skorzystam :) Niestety troszkę musiał bym się go nauczyć i przede wszystkim zrozumieć, a to co teraz majstruję chciałbym skończyć jak najszybciej.

    Chciałbym skorzystać z podpowiedzi tmf (wydaje się dla mnie najlepsza), ale nie bardzo rozumiem.

    Urządzenie z którym chcę się komunikować jest SHT11, a pierwsze delaye pojawiają się już najbardziej podstawowych funkcjach jak zainicjowanie transmisji, czy wysłanie sekwencji startowej (czasy delayów dosyć małe...około kilku us między impulsami). Jedynie makra ustawiające bity w rejestrach i przeliczanie temperatury i wilgotności nie potrzebuje opóźnień

    Kod zainicjowania transmisji danych:
    
    void transstart(void)
    {
    	enable_data();
    	data_high();
    	clock_low();
    	_delay_us(SHT_DELAY);
    	_delay_us(SHT_DELAY);
    	clock_high(); 
            _delay_us(SHT_DELAY);
    	data_low();	
            _delay_us(SHT_DELAY);
    	clock_low();	
            _delay_us(SHT_DELAY); 
            _delay_us(SHT_DELAY);
    	clock_high();	
            _delay_us(SHT_DELAY);
    	data_high();	
            _delay_us(SHT_DELAY);
    	clock_low();
    }
    


    Czyli musiałbym w pętli głównej rozbić program do najbardziej podstawowych operacji które nie zawierałyby opóźnień (czyli komenda po komendzie)?

    Można prosić o jakiś prosty przykład jak się sprawa ma między przerwaniem, pętlą główną programu, a biblioteką?
  • #6 8295168
    tmf
    VIP Zasłużony dla elektroda
    Nie. Przecież opóźnienia rzędu mikrosekund ci nie przeszkadzają. Nic więc nie stoi na przeszkodzie, żeby wysłać całe polecenie na raz. Opóźnienie potrzebujesz do odczytu skonwertowanych wartości ciśnienia/temperatury. Tu zamiast czekać ustaw flagę w przerwaniu timera, w pętli głównej ją sprawdzaj, jak minął wskazany czas to odczytaj SHT i po problemie.
    BTW, pomyśl czy do obsługi SHT nie wykorzystać jakiegoś sprzętowego interfejstu - SPI lub TWI wydaje się być podobne. Wtedy całą transmisję odwali procesor.
REKLAMA