Sensowne sterowanie przekaznikami uzywajac 74hc595,

0

Witam.

Mam 8 (a bedzie pewno wiecej) przekaznikow podlaczonych do 74hc595, steruje nimi za pomoca prostej funkcji
shiftOut(dataPin, SH_CP, MSBFIRST, 0b10000001); //0b IN8 to IN1
0b10000001 oznacza wylaczony pierwszy, 6 wlaczonych, i wylaczony ostatni. Dla przykladu mam do tego 8 termometrow i kazdy z nich steruje innym przekaznikiem. Jak najsensowniej zmienic te wartosci. Mogl bym miec tablice[7] i po kazdej zmienia, nadpisywac calosc jakas petla, ale to straszne marnowanie zasobow, petla wykonywana siedem razy dla zmiana tylko jednej wartosci. Jakies sensowny i tanszy sposob wykonanie takiego problemu ?

0

Stany wyjść możesz przechowywać w jednej zmiennej 8-bitowej. Jeżeli zmieniasz stan jednego bitu (wyjścia) to do układu przesyłasz cały bajt. Możesz kombinować z wyszukiwaniem czy może np. pierwsze bity poprzedniej zmiennej pasują do ostatnich bajtów nowej zmiennej, to robisz mniej cykli zegara na wyjściu niż pełne 8, ale IMO nie ma sensu coś takiego.
Generalnie 'framework' Arduinowy nie jest zbyt szybki (kosztem większej elastyczności i prostoty), poczytaj sobie o szybkości operacji na portach wyjściowych względem standardowych operacjach na rejestrach I/O.
Pod kątem sprzętowym możesz przyspieszyć przesyłanie danych do układu przez zastosowanie sprzętowego modułu SPI.

0

Kiedyś takie coś pisałem na atmegę:

void hc595(unsigned char cyfra,unsigned char peryferia){
  int i;
	cli();
    for(i=0;i<16;i++){
        if(peryferia % 2)
                PORTB |= 8;
        else
                PORTB &= ~8;
        PORTB |= 16;
        PORTB &= ~16;
        peryferia /= 2;
        if(i == 7)
                peryferia=cyfra;
    }
	PORTB &= ~32;
	PORTB |= 32;
sei();
} 

Z tym, że tutaj masz:

  1. cli/sei bo miałem więcej przerwań
  2. Układ jak widać jest podłączony do portu B
  3. Magiczne liczby 8(4-bit) - DATA, 16(5-bit) - ZEGAR, 32(6-bit) - Zmień stan na wyjściu [bufor -> wyjście]
  4. Są dwie liczby, Ty potrzebujesz jedej

1 użytkowników online, w tym zalogowanych: 0, gości: 1