Skocz do zawartości

[Asm] Jak napisaś w asemblerze funkcje, która bądzie sprawdzała, czy podany rok jest przestępny.


tadeko

Pomocna odpowiedź

Jak już wcześniej pisałem, moje zainteresowanie asemblerem wzięło się stąd, że po prostu chciałem się nauczyć programowania w nim, a w dodatku wypełnić czas (emerytura).

Pierwszy zegar w asemblerze wyświetla jedynie godziny i minuty, a do ustawiania służą 2 przyciski, jeden do godzin, drugi do minut. W sumie najprostszy jaki może być.

Drugi wariant ma możliwość wyświetlania sekund, więc przy ustawianiu najpierw przyciskiem S1 wybieramy co chcemy ustawiać i wówczas świecą się odpowiednie wyświetlacze (godziny lub minuty), wtedy przyciskiem S2 zwiększamy odpowiednio godziny lub minuty. Podczas normalnej pracy (przy wyświetlania czasu) po naciśnięciu S2, gasną godziny, a w miejsce minut wyświetlane są sekundy.

Trzeci wariant ma te same funkcje co wariant drugi, tylko podczas ustawiania, przy długim naciskaniu S2 następuje przyspieszenie - zamiast zmiany co 0,5 s prędkość jest taka, że praktycznie dziesiątki godzin lub minut zmieniają się ci 0,5s.

Zastosowane funkcje w powyższych wariantach są takie jak w ćwiczeniach w książce "Mikrokontrolery dla początkujących" - Piotra Góreckiego. Ta książka, jest chyba najlepszym wprowadzeniem w świat mikrokontrolerów i programowanie w bascomie.

Na prośbę marek1707 załączam poniżej fragment kodu mojego zegara, w którym jest zastosowana automatyczna zmiana czasu z zimowego na letni i na odwrót. Z tego powodu konieczne jest sprawdzanie, czy rok jest przestępny, ale w bascomie to prosta sprawa.

W procedurze korygowania wielkości czasu i daty występuje

....

Gosub Czyprzestepny

' korekta daty z uwzględnieniem roku przestępnego

.......

'---------------------------------------------------------------

'zmiana czasu z zimowego na letni

If Dz_tyg < 6 Then Zmianaczasu = 0 'od poniedziałku do piątku sygnal. zmiany czasu

If Mc = 3 And Dni > 23 Then 'ostatni tydzień marca

If Dz_tyg = 6 Then 'sobota ostatniego pełnego weekendu

If Dni < 31 Then Zmianaczasu = 1 'włączenie sygnalizacji zmiany czasu

End If

If Dz_tyg = 7 And Godziny = 2 And Zmianaczasu = 1 Then 'niedziela, godz. 2

Godziny = Godziny + 1 'zmiana czasu (+1 godz)

Zmianaczasu = 0 'wyłączenie informacji o zmianie czasu

End If

End If

'---------------------------------------------------------------

'zmiana czasu z letniego na zimowy

If Dz_tyg < 6 Then Zmianaczasu = 0 'od poniedziałku do piątku - wyłaczenie sygnal. zmiany czasu

If Mc = 10 And Dni > 23 Then 'ostatni tydzień października

If Dz_tyg = 6 Then 'sobota ostatniego pełnego weekendu

If Dni < 31 Then Zmianaczasu = 1 'włączenie sygnalizacji zmiany czasu

End If

If Dz_tyg = 7 And Godziny = 3 And Zmianaczasu = 1 Then 'niedziela, godz. 3

Godziny = Godziny - 1 'zmiana czasu (-1 godz)

Zmianaczasu = 0 'wyłączenie informacji o zmianie czasu

End If

End If

If Dz_tyg = 7 And Godziny > 2 Then Zmianaczasu = 0 'niedziela, godz.>2 (po zmianie czasu) - konieczne przy ustawianiu

Return 'koniec proc. Koryguj

'---------------------------------------------------------------

Czyprzestepny:

'czy ustawiony rok jest rokiem przestępnym (Rok Mod 4 = 0 And Rok Mod 100 > 0 Or Rok Mod 400 = 0)

Przestepny = 0

Pom1 = Rok Mod 4

Pom2 = Rok Mod 100

If Pom1 = 0 And Pom2 > 0 Then Przestepny = 1 'Rok Mod 4 = 0 And Rok Mod 100 > 0 -> Przestepny=1 (rok przestępny)

'ponieważ zakres lat został ograniczony do zakresu od 2000 do 2100 nie musi się sprawdzać warunków z 2-ch poniższych linii

'Pom1 = Rok Mod 400

'If Pom1 = 0 Then Przestepny = 1 'Rok Mod 400 = 0 -> Przestepny=1 (rok przestępny)

Return 'koniec proc. Czyprzestepny

Na pewni powyższe rozwiązanie można uprościć, lub napisać inaczej, bo jak wiadomo różne drogi prowadzą do celu.

O możliwości wstawiania fragmentów do programu w bascom bloków w asemblerze pamiętam, ale nie daje to takich efektów jak czysty asembler.

Porównałem wielkość kodu programu asemblerowego wstawionego do bascoma z wielkością kodu tego samego programu skompilowanego w AVR Studio.

[ Dodano: 26-05-2016, 13:02 ]

Jeszcze jedno pytanie do Kolegi marek1707.

Jakie funkcje realizują te lampki choinkowe, jaki jest zastosowany mikrokontroler oraz ile jest niezależnych obwodów lampek?

Chętnie zastanowię się, czy jest możliwe zrealizowanie tych funkcji z użyciem tylko Bascoma bez wspomagania Asemblerem. Dobre ćwiczenie z Bascoma.

Link do komentarza
Share on other sites

Twoje zdania:

"..w asemblerze dopiero startuję. Udało mi się napisać program zegara.."

potraktowałem dosłownie i uznałem, że całość napisałeś w asemblerze - to byłoby coś przy tym jaką wiedzą dysponujesz i na jakim poziomie masz problemy. Program w Bascomie nie jest interesujący choć gratuluję zacięcia, chciałem zobaczyć kod asemblerowy.

Pytanie o lampki nie jest do mnie, ale domyślając się rozwiązania mogę powiedzieć Ci, że tam nie ma "niezależnych obwodów lampek", bo każda lampka jest niezależna. Każdą możesz osobno włączyć, wyłączyć, przyciemnić lub zmienić jej kolor w dowolnej chwili mimo, iż taśma z diodami jest tylko jedna. A wzorki jakie pokazujesz na diodkach zależą tylko od Twojej inwencji i stopnia skomplikowania programu. Po prostu kupujesz gotową taśmę z odpowiednimi diodami RGB lub klecisz własny łańcuch z zielonego kabelka (idą 3 przewody) i osobno kupionych takich samych diodek, podłączasz pierwszą diodkę w łańcuchu do jednej nóżki procesora i gotowe. Reszta to odpowiednio silne zasilanie i program 🙂

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Chyba źle zrozumiałem kolegę Marka, chodzi mi o treść zaczynającą się od "To może - skoro już wiemy o Twojej konstrukcji...". W dalszej części jeszcze napisałeś, że może uda i się tak zmodyfikować kod, aby zmieścił się w ATtiny2313. Wszystkie programiki, które napisałem w Asemblerze bez problemu mieszczą się w 2kB i dlatego pomyślałem, że chodzi o program zegara, który automatycznie zmienia czas na zimowy lub letni, a taki napisałem w Bascomie. W wersji Asemblerowej tego zegara pomyślałem, ale trafiłem na przeszkodę w postaci dużej liczby dotyczącej roku i tutaj Twoja pomoc Marku okazała się cenna. Choć doszedłem do wniosku, że przy analizie, czy rok jest przestępny wystarczy sprawdzić, czy jest podzielny przez 4 (bo cóż mnie obchodzi co będzie za 400 lat), to dla samej wprawy analiza podzielności przez 400 jest cenna.

Tak wygląda program mojego pierwszego zegara:

; Przycisk S1 - ustawianie godzin, przycisk S2 - ustawianie minut

; Częstotliwość aktualizacji ustawień - 1 Hz

.include "2313def.inc"

.cseg

.org 0x00

rjmp start

.org 0x05

rjmp timer1

.org 0x06

rjmp timer0

.org 0x0B

Start:

ldi r16, 0b11111111 ; załaduj do r16 liczbę 255 (0xff)

out DDRB, r16 ; wpisanie do DDRB samych jedynek powoduje ustawienie pinów jako wyjście

out PORTB, r16 ; ustaw wszystkie piny portu B w stan wysoki

out PORTD, r16 ; ustaw wszystkie piny portu D w stan wysoki

ldi r16, 0b1111100 ; piny D0 i D1 są ustawione jako wejścia

out DDRD, r16 ; pozostałe jako wyjścia

ldi r16, 127

out SPL, r16 ; ustaw wskaźnik stosu na 127 (7F, 01111111)

;ldi R16, LOW(RAMEND)

;out SPl, R16 ; inicjalizacja wskaźnika stosu (SP=223, DF, 11011111)

ldi r16, 4 ; powinno być 3 -> prescaler=64, dla TCCR0=4 -> prescaler=16

out TCCR0, r16 ; ustaw preskaler Timera0 na 64

ldi r16, 255

out TCNT0, r16 ; wpisz wartość początkową licznika TC0=250 (FA, 11111010)

ldi r16, 3 ;

out TCCR1B, r16 ; ustaw preskaler Timera1 na 64

ldi r16, 130

out TIMSK, r16 ; odblokuj przerwanie od Timera0 i Timera1

sei ; ustaw wskaźnik globalnego zezwolenia na przerwania

; ustawienie początkowej wartości liczników czasu 23:59:56

; dane o czasie są przechowywane w rejestrach roboczych

; w celu uproszczenia programu

ldi r20, 6 ; jednostki sekund

ldi r21, 5 ; dziesiątki sekund

ldi r22, 9 ; jednostki minut

ldi r23, 5 ; dziesiątki minut

ldi r24, 3 ; jednostki godzin

ldi r25, 2 ; dziesiątki godzin

Petla:

rjmp Petla ; pętla nieskończona

; ponieważ cały program oparty jest o przerwania

; program główny jest pustą pętlą nieskończoną

; procedura obsługi przerwania od timera TC0

; w ramach tej procedury realizowana jest obsługa wyświetlaczy

; siedmiosegmentowych sterowanych dynamicznie

Timer0:

ldi r16, 131 ; ustaw wartość początkową licznika TC0=250 (FA, 11111010)

out TCNT0, r16 ; przerwania co 2 ms -> 256-131*16us=125*16us=2ms

ldi ZH, high(znaki << 1) ; załadowanie do rejestru Z adresu

ldi ZL, low(znaki << 1) ; tablicy z kodami znaków

ldi r16, 0xFF ; zgaś wszystkie cyfry wyświetlacza

out PORTD, r16 ; czyli wyłacz tranzystory sterujące T3-6 (PD3-6 = 1)

; obsługa wyświetlaczy - rejestr R17 pokazuje, który wyświetlacz będzie świecił

inc r17 ; zwiększ r17 o 1

cpi r17, 5 ; sprawdź, czy r17 = 5

brne T0 ; jeśli r17 < 5 (C=1), to skocz do T0

ldi r17, 1 ; jeśli nie, to załaduj do r17 1

; dzięki 3 powyższym liniom nie ma pustego przebiegu dla r17=5 (żaden wyświetlacz nie świecił)

; jednostki minut

T0:

cpi r17, 1 ; sprawdź, czy r17 = 1

brne T1 ; jeśli nie, to skocz do T1, w przeciwnym razie

add ZL, r22 ; do adresu początku tablicy dodaj przesunięcie zawarte w rejestrze r22 (jednostki minut)

clr r16 ; ponieważ rejestr Z jest 16-bitowy to dodawanie musi być 16-bitowe, mimo że

; przesunięcie jest 8-bitowe

adc ZH, r16 ; aby uwzględnić przeniesienie z 8 bitu należy dodać z przeniesieniem liczbę 0

lpm ; załaduj z pamięci programu bajt określony adresem zawartym w rejestrze Z

out PORTB, r0 ; prześlij załadowany uprzednio bajt do portu B

cbi PORTD, 3 ; włącz pierwszą cyfrę wyświetlacza

rjmp End1 ; skocz do End1

; dziesiątki minut

T1:

cpi r17, 2 ; sprawdź, czy r17 = 2

brne T2 ; jeśli nie, to skocz do T2, w przeciwnym razie

add ZL, r23 ; do adresu początku tablicy dodaj przesunięcie zawarte w odpowiednim rejestrze

clr r16 ; ponieważ rejestr Z jest 16-bitowy to dodawanie musi być 16-bitowe, mimo że

; przesunięcie jest 8-bitowe

adc ZH, r16 ; aby uwzględnić przeniesienie z 8 bitu należy dodać z przeniesieniem liczbę 0

lpm ; załaduj z pamięci programu bajt określony adresem zawartym w rejestrze Z

out PORTB, r0 ; prześlij załadowany uprzednio bajt do portu B

cbi PORTD, 4 ; włącz drugą cyfrę wyświetlacza

rjmp End1 ; skocz do End1

; jednostki godzin

T2:

cpi r17, 3 ; sprawdź, czy r17 = 3

brne T3 ; jeśli nie, to skocz do T3, w przeciwnym razie

in r16, PORTB ; realizacja funkcji co sekundowego negowania stanu kropki dziesiętnej wyświetlacza

ldi r18, 128 ; załaduj do r18 maskę negacji = 128 = 0b10000000 = 0x80

eor r16, r18 ; BŁĄD - w linii poniżej zerowany jest port PB7,
out PORTB, r16 ; ale 7 linii poniżej znowu PB7 przyjmuje wartość 1

; - patrz rozwiązanie w procedurze T2, plik "7-Prosty_zegar.asm"

add ZL, r24 ; do adresu początku tablicy dodaj przesunięcie zawarte w odpowiednim rejestrze

clr r16 ; ponieważ rejestr Z jest 16-bitowy to dodawanie musi być 16-bitowe, mimo że

; przesunięcie jest 8-bitowe

adc ZH, r16 ; aby uwzględnić przeniesienie z 8 bitu należy dodać z przeniesieniem liczbę 0

lpm ; załaduj z pamięci programu bajt określony adresem zawartym w rejestrze Z

out PORTB, r0 ; prześlij załadowany uprzednio bajt do portu B

cbi PORTD, 5 ; włącz trzecią cyfrę wyświetlacza

rjmp End1 ; skocz do End1

; dziesiątki godzin

T3:

cpi r17, 4 ; sprawdź, czy r17 = 4

brne T4 ; jeśli nie, to skocz do T4, w przeciwnym razie

add ZL, r25 ; do adresu początku tablicy dodaj przesunięcie zawarte w odpowiednim rejestrze

clr r16 ; ponieważ rejestr Z jest 16-bitowy to dodawanie musi być 16-bitowe, mimo że

; przesunięcie jest 8-bitowe

adc ZH, r16 ; aby uwzględnić przeniesienie z 8 bitu należy dodać z przeniesieniem liczbę 0

lpm ; załaduj z pamięci programu bajt określony adresem zawartym w rejestrze Z

out PORTB, r0 ; prześlij załadowany uprzednio bajt do portu B

cbi PORTD, 6 ; włącz czwartą cyfrę wyświetlacza

rjmp End1 ; skocz do End1

T4:

clr r17 ; zeruj r17

End1:

rcall klawiatura ; wywołaj procedurę obsługi klawiatury

reti ; powrót z procedury obsługi przerwania od TC0

; procedura obsługi przerwania od timera TC1

; w ramach tej procedury realizowana jest aktualizacja czasu

Timer1:

ldi r16, 0xDC ; załaduj do młodszego bajtu licznika TC1

out TCNT1L, r16 ; wartość początkową 220 (0xDC, 0b11011100)

ldi r16, 0x0B ; załaduj do starszego bajtu licznika TC1

out TCNT1H, r16 ; wartość początkową 11 (0x0B, 0b00001011)(razem H + L = 3036)

rcall aktualizuj_czas ; wywołaj procedurę aktualizacji czasu

clt ; zeruj flagę T (umożliwi to zmianę nastaw jeśli naciskany jest S1 lub S2)

; UWAGA: flaga T jest ustawiana przez procedurę obsługi klawiatury po pierwszym naciśnięciu przycisku

; zerowana jest co sekundę - najprostsza filtracja drgań styków przycisku

; lepiej gdyby zmiany następowały co 0,5 s -> TCNT1L=238 (0xEE), TCNT1H=133 (0x85)

reti ; powrót z procedury przerwania od TC1

; procedura obsługi klawiatury

; realizuje funkcję ustawiania czasu

Klawiatura:

brts K2 ; jeśli flaga T jest ustawiona, to skocz do K2

; czyli jeśli w bieżącej sekundzie naciśnięto już raz przycisk to nie reaguj na dalsze naciskanie

; przycisku, bądź drgania styków

sbic PIND, 1 ; jeśli PIND.1 = 0, to pomiń następną instrukcję (przycisk "minuty" - S2)

rjmp K1 ; skocz do K1

clr r20 ; wyzeruj licznik sekund

clr r21

rcall zwieksz_minuty ; wywołaj procedurę zwiększenia licznika minut

set ; ustaw flagę T - sygnalizuje, że była zmina nastaw zegara

cpi r23, 6 ; sprawdź, czy minuty = 60

brne K1 ; jeśli nie, to skocz do K1

clr r23 ; w przeciwnym wypadku zeruj dziesiątki minut

K1:

sbic PIND, 0 ; jeśli PIND.0 = 0, to pomiń następną instrukcję (przycisk "godziny" - S1)

rjmp k2 ; skocz do k2

rcall zwieksz_godziny ; wywołaj procedurę zwiększenia licznika godzin

set ; ustaw flagę T - sygnalizuje, że była zmina nastaw zegara

K2:

ret ; powrót z procedury

; procedura aktualizacji czasu

Aktualizuj_czas:

rcall zwieksz_sekundy ; wywołaj procedurę zwiększenia licznika sekund

cpi r21, 6 ; sprawdź, czy dziesiątki sekund = 6

brne a1 ; jeśli nie, to skocz do Z1

clr r21 ; w przeciwnym wypadku zeruj dziesiątki sekund

rcall Zwieksz_minuty ; i wywołaj procedurę zwiększania licznika minut

cpi r23, 6 ; sprawdź, czy dziesiątki minut = 6

brne a1 ; jeśli nie, to skocz do Z1

clr r23 ; w przeciwnym wypadku zeruj dziesiątki minut

rcall Zwieksz_godziny ; i wywołaj procedurę zwiększenia licznika godzin

A1:

ret

; procedura zwiększenia licznika sekund

Zwieksz_sekundy:

inc r20 ; zwieksz licznik jednostek sekund

cpi r20, 10 ; sprawdź, czy jednostki sekund = 10

brne z3 ; jeśli nie, to skocz do Z3

clr r20 ; w przeciwnym wypadku zeruj jednostki sekund

inc r21 ; i zwiększ dziesiątki sekund

Z3:

ret ; powrót z procedury

; procedura zwiększenia licznika minut

Zwieksz_minuty:

inc r22 ; zwiększ licznik jednostek minut

cpi r22, 10 ; sprawdź czy licznik jednostek minut = 10

brne z1 ; jeśli nie, to skocz do Z1

clr r22 ; w przeciwnym wypadku zeruj licznik jednostek minut

inc r23 ; i zwiększ licznik dziesiątek minut

Z1:

ret ; powrót z procedury

; procedura zwiększenia licznika godzin

Zwieksz_godziny:

inc r24 ; zwiększ licznik jednostek godzin

cpi r24, 10 ; sprawdź, czy jednostki godzin = 10

brne Z24 ; jeśli nie, to skocz do z24

clr r24 ; w przeciwnym wypadku zeruj jednostki godzin

inc r25 ; i zwiększ dziesiątki godzin

rjmp Z2 ; skocz do Z2

Z24:

cpi r24, 4 ; porównaj czy jednostki godzin = 4

brne Z2 ; jeśli nie, to skocz do Z2

cpi r25, 2 ; porównaj, czy dziesiątki godzin = 2

brne Z2 ; jeśli nie, to skocz do Z2

; jeśli natomiast obydwa poprzednie warunki są spełnione

clr r25 ; są jednocześnie spełnione to wyzeruj

clr r24 ; jednostki i dziesiątki godzin

Z2:

ret ; powrót z procedury

; tablica z kodami znaków

Znaki:

.db 192,249,164,176,153,146,130,248,128,144

__________

Komentarz dodany przez: Treker

Kod programu, dla lepszej czytelności, należy umieszczać w tagach .

Proszę to poprawić.

Link do komentarza
Share on other sites

Jakie funkcje realizują te lampki choinkowe, jaki jest zastosowany mikrokontroler oraz ile jest niezależnych obwodów lampek?

Chętnie zastanowię się, czy jest możliwe zrealizowanie tych funkcji z użyciem tylko Bascoma bez wspomagania Asemblerem. Dobre ćwiczenie z Bascoma.

To było pytanie do mnie, więc odpowiadam. Lampki składają się z 99 sztuk (jedna mi się spaliła) diod sterowanych identycznie (no prawie) jak WS2812B, diody to są APA106. Diody są połączone w jeden łańcuch ale z racji ich inteligencji każdą można zapalić z osobna na dowolny kolor. Nie da się tego zrobić w czystym Bascomie bo to sterowanie wymaga dość precyzyjnego sterowania z czasami na poziomie 50ns z tego co pamiętam. Procedura wysyłania danych do diod jest prawie identyczne co WS2812B, musiałem troszkę skorygować czasy poziomu wysokiego i niskiego bo z takimi jak dla WS2812B nie działały mi prawie w ogóle i na chybił trafił zmieniałem aż trafiłem. Przestawione są też bajty kolorów, WS2812 ma RGB a te mają GBR bodajże. Samo tworzenie efektów i animacje są w Bascomie, ale procedura wysyłania danych do diod jest w asemblerze. Mikrokontroler to Atmega328P pracująca na 16MHz.

Link do komentarza
Share on other sites

Pytanie do Sabre.

Poszukałem w Internecie informacji na temat diod APA106 zastosowanych w obwodzie lampek. Przyznam, że nie spotkałem się jeszcze takimi diodami, więc proszę o trochę informacji, np jak w najprostszy sposób pobudza się taką diodę do świecenie poszczególnymi kolorami. O ile dobrze rozumiem, to wszystkie diody połączone są równolegle (wyprowadzenia o tym samym oznaczeniu połączone są razem). Jeśli chcemy, aby jedna dioda świeciła inaczej niż pozostałe, to jak w takim przypadku adresuje się dla niej rozkaz. Na stronie znalazłem taką tabelkę:

T0H - 0 code, high level time - 0,35us

T1H - 1 code, high level time - 1,36us

T0L - 0 code, low level time - 1,36us

T1H - 1 code, low level time - 0,35us

Co z niej wynika?

O ile dobrze rozumiem, to zastosowany typ mikrokontrolera był ze względu na wymaganą ilość pamięci, a nie ilość koniecznych rejestrów we-wy.

Link do komentarza
Share on other sites

tadeko, diody mają równolegle połączone zasilanie tylko. Sygnał przesyłany jest szeregowo od diody do diody, po to dioda ma wejście i wyjście danych. Wyjście pierwszej diody łączy się z wejściem drugiej. Nie pamiętam szczegółów sterowania na poziomie ilości bitów, ale chodzi o to, że wysyłasz serie po 3 bajty, tyle razy ile masz diod, jak przestaniesz wysyłać dane to te diody zatrzaskują informacje, którą dostały jako ostatnią i zamieniają ją na jasność diod RGB. Po 1 bajcie na każdy kolor. Problem z diodami polega na tym, że dioda interpretuje 1 i 0 dla siebie z ciągu bardzo szybkich impulsów trwających określony czas. Tak więc 1 logiczna dla diody składa się ze stanu wysokiego i niskiego o określonej długości trwania, 0 logiczne to samo. Czasy te mają niby jakąś tolerancję, ale jest ona dość wąska przy sterowaniu dłuższych łańcuchów. Szukaj informacji o WS2812B czy innych diod tego typu bo APA106 to jakiś klon w mlecznej bańce, który idealnie nadaje się do lampek choinkowych. Wybór mikrokontrolera był trochę przypadkowy a trochę wynikający z wymagań sterowania tymi diodami. Mega8 też dałaby radę, steruję tymi diodami korzystając ze sprzętowego interfejsu SPI na pinie MISO.

Link do komentarza
Share on other sites

Sabre , dziękuję za informacje. Bardzo pomógł mi podany symbol diody WS2812B. Znalazłem stronę http://mikrokontrolery.blogspot.com/2011/03/Diody-WS2812B-sterowanie-XMega.html, na której jest czytelny opis sterowania takimi diodami. Teraz wiem, że diody te są wyposażone w rejestry przesuwne, do których wchodzi kod sterujący i jeśli po 24 bitach nie nastąpi przerwa min 50ns, to te pierwsze bity przesuwane są do następnej diody, a do pierwszej wsuwane są następne.

Bardzo sprytnie jest to wymyślone, a jedyny problem, to bardzo restrykcyjne czasy dla 1 i 0.

Podaną wyżej stronę polecam każdemu, kto chce poznać i zrozumieć zasady sterowania diodami programowalnymi WS2812B. Dla diod programowalnych innego typu, zasada sterowania będzie pewnie podobna, wystarczy sprawdzić w danych katalogowych czasy dla 1 i 0 oraz kolejność sygnałów dla poszczególnych kolorów.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.