Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 20 kwi 2024, o 15:52


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 19 paź 2022, o 17:45 
Offline
Nowy

Dołączył(a): 19 paź 2022
Posty: 13
Pomógł: 0

Witam wszystkich,
jestem bardzo stary(żarcik) i początkujący(nie żarcik)... Bawię się z Atmegą 328p na płycie Arduino, podłączyłem 12 ledów po 6 na port D i B (katoda na GND).
PortB:L1,L2,L3,L4,L5,L6 (PortD:)L7,L8,L9,L10,L11,L12
Próbuję osiągnąć efekt przesuwającej się jednej diody z lewej do prawej strony w pętli. Niestety w momęcie zaświecenia L4(portB) równocześnie zapala się L7(portD) i iteracja na obu portach "idzie"dalej jednocześnie. Zastanawiałem się nad przesunięciem bitowym,tylko pytanie czy można to zrobić prościej ?

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 paź 2022, o 19:05 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 11 lip 2022
Posty: 7
Pomógł: 2

1. Źle dobrałeś typ zmiennej do tablicy. Masz 12 diod więc powinieneś użyć zmiennej 16-bitowej
2. Masz 12 diod a w pętli dałeś 8 kroków. Powinno być 12 kroków.
3. Bez maskowania i przesunięć bitowych się nie obejdzie.

Nie podałeś pod które piny portów B i D masz podpięte diody. PORTB i tak ma tylko 6 pinów więc to oczywiste. Natomiast z twojego opisu działania wnioskuję że pod PD2 do PD7.
W kroku trzecim zapalana jest dioda L3 a po 150 ms zapalana jest L7. Pętla zaczyna kolejna iterację i w mgnieniu oka gaszone jest L3 i zapalane L4.
Dlatego masz wrażenie że L4 i L7 palą się jednocześnie. A one tak naprawdę zapalają się w różnych iteracjach.

Da się to zrobić prościej właśnie na przesunięciach bitowych.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 paź 2022, o 19:55 
Offline
Nowy

Dołączył(a): 19 paź 2022
Posty: 13
Pomógł: 0

Dzięki cdrom za odpowiedź, z tym maskowaniem to już jestem "poskładany" i na pewno nic nie wymyślę choć mnie to interesuje jak byś mógł mi bardziej, tak łopatologicznie wytłumaczyć to będę wdzięczny



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 paź 2022, o 18:39 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 11 lip 2022
Posty: 7
Pomógł: 2

Masz 12 diod led to musisz mieć 12 pozycji w tablicy czyli brakuje ci jeszcze 4: 256, 512,1024,2048.

masz tablice z elementami 16-bitowymi litery to twoje diody

0000 yyyy yyxx xxxx

Potrzebujesz żeby x znalazły się w porcie B a y w porcie D

Robiąc PORTB = tab[i];
wpisujesz na port B yyxx xxxx
ponieważ w PORTB w 328p nie ma fizycznych PB6 i PB7 więc y są nieważne, można je zignorować jednak gdybyś używał procesora z pełnym portem musiałbyś to przepuścić przez maskę 0b0011 1111

Teraz potrzebujesz mieć w PORTD wartości yyyy yy00 bo tak masz podłączone diody

Czyli musisz do PORTD wpisać tab[i] przesunięte w prawo o 4 i przepuscić to przez maskę 0b1111 1100 żeby nie wystawiać na dwóch najstarszych x na piny gdzie mają być zera.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 paź 2022, o 20:13 
Offline
Nowy

Dołączył(a): 19 paź 2022
Posty: 13
Pomógł: 0

Dziękuję bardzo cedrom wyszło mi coś takiego i działa !!!

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 paź 2022, o 06:37 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 11 lip 2022
Posty: 7
Pomógł: 2

Myślę że do końca nie rozumiesz działania swojej pętli, choć już coś zaczyna ci świtać. Dałeś delaya pomiędzy wysyłanie na porty. Taki zapis działa oczywiście, ale nie potrzebnie zaciemnia działanie i wprowadza dodatkowe obliczenia. Jeśli byś wprowadził inny wzór to wyświetlanie się rozjedzie.

spróbuj np. taką tablicę

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.




Nie prościej tak? i nie czytelniej.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



I mały tip. Jeśli zmiennej iteracyjnej nie używasz nigdzie poza pętlą, to możesz ją zdefiniować bezpośrednio w pętli. Nie musisz robić osobnej definicji.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 paź 2022, o 08:47 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 11 lip 2022
Posty: 7
Pomógł: 2

poprawka, powinno byc:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 paź 2022, o 15:00 
Offline
Nowy

Dołączył(a): 19 paź 2022
Posty: 13
Pomógł: 0

Dzięki cdrom masz rację to bardziej czytelne. Twoja tablica na dwa światełka a poniżej jest na trzy światełka jakby ktoś potrzebował: :D

Składnia: [ Pobierz ] [ Ukryj ]
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO