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

Jak uprościć kod C, diody LED, atmega8?

mianiek13 06 Kwi 2011 22:56 4072 22
  • #1 9369772
    mianiek13
    Poziom 12  
    Napisałem kod do sterowania siedmioma diodami LED i mam pytanie jak go uprościć, żeby nie używać tylu delay'ów oraz nazw konkretnej diody. Chodzi mi o zastosowanie jakiejś pętli. Próbowałem użycia pętli for ale trudno jest mi uzyskać za jej pomocą efekt smugi.
    Ale jestem początkujący i może ktoś potrafi mi pomóc.
    Poniżej program oraz film z działaniem.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



  • #2 9370837
    INTEII
    Poziom 14  
    Witam,

    Np. tak:

    
    int main(void)
    { 
    	DDRD=0xff;
    	PORTD=0xff;
     
    	while(1)
    	{
    		
    		for(int i = 0; i < 8; i++)
    		{
    			PORTD = ~(0x01 << i);
    			_delay_ms(time2);
    		}
    
    		for(int i = 0; i < 8; i++)
    		{
    			PORTD = ~(0x80 >> i);
    			_delay_ms(time2);
    		}
    	}
    }
    


    Pozdrawiam,
    Piotr.
  • Pomocny post
    #3 9371007
    tmf
    VIP Zasłużony dla elektroda
    Operacje typu stała<<zmienna to niedobry pomysł, bo są bardzo kosztowne. W tym przypadku mamy zawsze przesunięcie w lewo/prawo o jeden bit, więc można użyć PORTD=PORTD<<1;
  • #4 9371010
    mianiek13
    Poziom 12  
    Właśnie taką pętle tworzyłem, ale to nie do końca jest to bo brak jest tzw. smużenia. Czyli jak zaświeci sie druga dioda to pierwsza jeszcze przez chwile świeci(time2) i kolejne podobnie jak zaświeci sie trzecia to druga nie gaśnie od razu tylko po chwili, wiec jest moment że świecą sie dwie.
  • Pomocny post
    #5 9371045
    dondu
    Moderator na urlopie...
    Ponieważ wszystkie piny masz na porcie D, to zadeklaruj tablicę z maskami pinów portu D (LEDów) oraz czasami, i wywołuj w jednej krótkiej pętli idąc od początku do końca tablicy.
  • #6 9371082
    mianiek13
    Poziom 12  
    Moja przygoda z C trwa od niedawna i nie bardzo wiem jak użyć tych masek, ale rozumiem że chodzi o wskażniki do elementów tablicy którymi będą konkretne porty. Czy może jakoś inaczej?
  • Pomocny post
    #7 9371137
    dondu
    Moderator na urlopie...
    Pisane "z palca" i nie sprawdzane:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Możesz także umieścić tablicę w pamięci programu, chyba tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Czy teraz rozumiesz?
  • #8 9371332
    mianiek13
    Poziom 12  
    czyli dla siedmiu ledów i program powinien wyglądać tak?:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 9371356
    dondu
    Moderator na urlopie...
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    to para danych dla kolejnych kroków podczas wyświetlania.

    Tak jak napisałem w komentarzach, ale wyjaśnię dokładniej:

    X to stan pinów w PortD,
    czyli np. 0 oznacza że wszystkie świecą, a 255 wszystkie są zgaszone
    inaczej aby zapalić tylko 1 led na przykład na pinie PD0 wartość X w danej parze ma być równa 0xfe czyli 0b11111110

    Możesz także podać tak 0b11111100 co będzie oznaczać jednoczesne świecenie ledów PD0 i PD1.
    idąc dalej 0b11111001 oznacza świecenie ledów PD1 i PD2
    itd

    Y oznacza czas opóźnienia w ms
  • Pomocny post
    #10 9371365
    Szumlus
    Poziom 17  
    Witam,

    Używanie funkcji _delay_ms(); ze zmienną nie jest dobrym pomysłem. Taka implementacja zajmuje bardzo dużo pamięci. Lepiej zadeklarować funkcję np. _delay_ms(1); i wykonywać ją w pętli tyle razy ile potrzeba. Liczbę wykonań pobieramy z tablicy.Taki sposób jest zdecydowanie mniej pamięciożerny.

    Pozdrawiam,
    Marcin
  • #11 9371370
    dondu
    Moderator na urlopie...
    Szumlus napisał:
    Używanie funkcji _delay_ms(); ze zmienną nie jest dobrym pomysłem. Taka implementacja zajmuje bardzo dużo pamięci. Lepiej zadeklarować funkcję np. _delay_ms(1); i wykonywać ją w pętli tyle razy ile potrzeba. Liczbę wykonań pobieramy z tablicy.Taki sposób jest zdecydowanie mniej pamięciożerny

    Słuszna uwaga.

    Lub w tablicy na pozycjach opóźnienia podawać 0 dla krótkiego i 1 dla dłuższego (ponieważ autor używa tylko dwóch) a w pętli mała zmiana:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Teraz już dasz radę sam?
  • #12 9371489
    mianiek13
    Poziom 12  
    Więc ustawiłem żeby przemieszczały się dwie diody, tylko z tym oóźnieniem nie bardzo kumam jak zrobić żeby mieć dwa czasy gaszenia dla odpowiedniegao leda

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #13 9371499
    dondu
    Moderator na urlopie...
    A co oznaczają liczby 10 w każdej parze parametrów w tablicy?
    Niedokładnie przeczytałeś mój ostatni post:

    dondu napisał:
    w tablicy na pozycjach opóźnienia podawać 0 dla krótkiego i 1 dla dłuższego (ponieważ autor używa tylko dwóch)
  • #14 9371533
    mianiek13
    Poziom 12  
    A już rozumiem tylko chyba chcą stosować takie opóźnienie bede musiał zrobić tablice na 14 elementów, żeby uzyskać: świeci sie pierwsza- dłuższe opóźnienie- druga sie świeci- krótsze opóźnienie- pierwsza gaśnie -długie opóźnienie- trzecia sie świeci- krótkie opóźnienie- drgua gaśnie ...itd
  • Pomocny post
    #15 9371539
    dondu
    Moderator na urlopie...
    Dobrze rozumiesz - ale to i tak będzie znacznie krótszy kod niż pierwotny, no i łatwo go rozbudować :)

    Używaj formy binarnej 0b11110011 to w czasie programowania łatwiej projektować efekt bo widać rezultat na cyfrach.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Daj znać o rezultatach.
  • #16 9371799
    mianiek13
    Poziom 12  
    Pod spodem ostateczna wersja działająca jak pierwsza prezentowana. Chociaż ostatnia dioda przy nawrocie chyba za długo mi świeci o jeden cykl

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #17 9893154
    margas4542
    Poziom 16  
    Witam.Mam pytanie odnośnie sterowania nie siedmioma diodami ale dziesięcioma diodami podłączonymi np; do portu B i C , jak zdefiniować tablicę oby przy wywołaniu np cyfry 0 zapalał się LED na porcie PB0 a przy wywołaniu cyfry 8 zapalił się LED na porcie PC0..
  • #18 9893379
    michalko12
    Specjalista - Mikrokontrolery
    A nie prościej w ten sposób?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #19 9893670
    Konto nie istnieje
    Konto nie istnieje  
  • #20 9893711
    michalko12
    Specjalista - Mikrokontrolery
    Lepsza będzie tablica 16bitowa. Przesuwanie będzie tylko w C. Kompilator powinien rozłożyć to na pełny dostęp 8 bitowy.
    W tym kodzie co zaproponowałeś jest jeden ból. Trzeba z ręki panować nad takim samym rozmiarem obu tablic.
  • #21 9893762
    margas4542
    Poziom 16  
    Ok sterowanie leadami to tylko analogia bo konkretnie potrzebuje funkcji sterującej portami do których podłączone są cyfry lamp NIXIE ... zrobiłem i zmontowałem płytkę zegarka na tych lampach zamiast najpierw zastanowić się nad programem i teraz mam dylemat jak to ugryźć.
  • #22 9893770
    michalko12
    Specjalista - Mikrokontrolery
    margas4542 napisał:
    Ok sterowanie leadami to tylko analogia bo konkretnie potrzebuje funkcji sterującej portami do których podłączone są cyfry lamp NIXIE ... zrobiłem i zmontowałem płytkę zegarka na tych lampach zamiast najpierw zastanowić się nad programem i teraz mam dylemat jak to ugryźć.

    Załóż nowy wątek, opisz problem, wrzuć schemat...
REKLAMA