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



Teraz jest 30 maja 2026, o 01:19


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 7 gru 2015, o 12:29 
Offline
Nowy

Dołączył(a): 21 lis 2015
Posty: 16
Pomógł: 0

Witam! złożyłem już układzik z tematu: topic13648.html

schemat: (jedynie przyciski podłączone do portu B a nie D), IC2 to 8 tranzystorów ULN2803

Obrazek

Otóż założyłem, że w przerwaniu będzie zgodnie z niebieską książka przesuwana jedynka na Porcie C, który steruje kolumnami. Dzięki czemu będzie możliwość normalnego wyświetlania.

Wierszami steruje już normalnie, a tutaj problem. Chce sterować sobie 2 przyciskami 'paletką' która składa się z 3 diód i jest tylko w pierwszej kolumnie. Sprawdzam, czy pierwsza kolumna jest 'aktywna'(czy jest jedynka) i jeżeli tak, to wchodzi w obsługe przycisku.

Skleiłem taki kod, który działa, ale jednak w drugiej kolumnie mam jakby poświate, a nie pełne zgaszenie...

dodatkowo nie zawsze wchodzi mi w pierwszego ifa, tzn nie przy kazdym nacisnieciu 'paletka' zmienia pozycje(to jest mniejszy problem). Pytanie, gdzie zrobiłem błąd w rozumowaniu lub kodzie...

Zegar 1MHz

Kod:


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: 7 gru 2015, o 18:01 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

United napisał(a):
Skleiłem taki kod, który działa, ale jednak w drugiej kolumnie mam jakby poświate, a nie pełne zgaszenie...

Poświata wynika ze złej kolejności operacji przy zmianie kolumny, ale tego tutaj wcale nie widać. Zmieniasz PORTA wierszy w pętli głównej co jest kiepskim pomysłem. Polecam operowanie na buforze dla całego wyświetlacza. Tworzysz tablicę 8 kolumn i na niej wykonujesz wszelkie operacje. W funkcji obsługi przerwania ISR(TIMER0_COMP_vect) tylko kopiujesz jej zawartość na PORTA w odpowiednim czasie i kolejności. To znacznie ułatwi ci pracę.

Użycie COLUMN_PORT==0b00000001 to też takie mieszanie sobie sprzętu z algorytem. W funkcji obsługi przerwania ustawiaj po prostu dodatkową flagę i sprawdź co ile ją ustawiasz. Błędne działanie przycisków może wynikać ze źle dobranej prędkości. Zobacz:
http://mirekk36.blogspot.com/2012/10/dr ... ak-to.html

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2015, o 19:23 
Offline
Nowy

Dołączył(a): 21 lis 2015
Posty: 16
Pomógł: 0

Dzięki za odpowiedz! mam jednak mnóstwo pytąń :D

Krauser napisał(a):
Tworzysz tablicę 8 kolumn i na niej wykonujesz wszelkie operacje. W funkcji obsługi przerwania ISR(TIMER0_COMP_vect) tylko kopiujesz jej zawartość na PORTA w odpowiednim czasie i kolejności. To znacznie ułatwi ci pracę.



Czyli tworze sobie buffor, 8 elementowej tablicy char, ale jak na takim suchym czymś moge operować?
W obsłudze przerwania przypisuje ten bufor dajmy na to PORTA |= BUFFOR[0]? a w bufforze co miałbym? Troche tego nie rozumiem.

Druga sprawa, co ze sterowaniem wierszami? To miałby robić ten buffor? Czy on miałby być od kolumn? Przecież to w zależności od przycisniętego klawisza, pozycja 'paletki' na WIERSZACH się może zmieniac, kolumny w moim zamyśle miały tylko się 'uaktywniać' w odpowiednim momencie(multipleksować )

Krauser napisał(a):
Użycie COLUMN_PORT==0b00000001 to też takie mieszanie sobie sprzętu z algorytem. W funkcji obsługi przerwania ustawiaj po prostu dodatkową flagę i sprawdź co ile ją ustawiasz.


Tutaj chciałem sprawdzić która kolumna się świeci. Przez flagę by to inaczej jakoś działało?
Czyli dodam sobie flage która sprawdza kiedy licznik == 1(czyli przy przekroczeniu 255)? To nie było by to samo?



[/quote]

Krauser napisał(a):
Błędne działanie przycisków może wynikać ze źle dobranej prędkości. Zobacz:
http://mirekk36.blogspot.com/2012/10/dr ... ak-to.html


hmm prędkości czyli zegara? czy złego doboru prędkości multipleksowania?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2015, o 20:01 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

United napisał(a):
Czyli tworze sobie buffor, 8 elementowej tablicy char, ale jak na takim suchym czymś moge operować?

Masz tablicę która reprezentuje widok kolumn na wyświetlaczu i np. przesuwanie lewej paletki to BUFFOR[0] <<= 1; i warunek ograniczający.
United napisał(a):
PORTA |= BUFFOR[0]?

Tak gdy licznik jest równy 1 i PORTA |= BUFFOR[1] gdy licznik jest równy 2 itd.
United napisał(a):
Tutaj chciałem sprawdzić która kolumna się świeci. Przez flagę by to inaczej jakoś działało?

A jakie to ma znaczenie dla działania przycisków? Dlaczego tak? Przyciski należy sprawdzać w założonych odstępach czasowych.
United napisał(a):
hmm prędkości czyli zegara? czy złego doboru prędkości multipleksowania?

Wszytko jest ze sobą powiązane. Wykorzystując przerwanie timera i dodatkowe zmienne-liczniki możesz wykonywać fragmenty kodu w dowolnych odstępach (oczywiście dobranych do zadania)

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2015, o 21:06 
Offline
Nowy

Dołączył(a): 21 lis 2015
Posty: 16
Pomógł: 0

Krauser napisał(a):
Masz tablicę która reprezentuje widok kolumn na wyświetlaczu i np. przesuwanie lewej paletki to BUFFOR[0] <<= 1; i warunek ograniczający.


Tak gdy licznik jest równy 1 i PORTA |= BUFFOR[1] gdy licznik jest równy 2 itd.



Czyli jesli dobrze zrozumiałem to przesuwamy sobie jedynke na pierwzej kolumnie, potem gdy licznik = 1 (gdy świeci się pierwsza kolumna) to przypisujemy te przesunięte bity do wierszy poprzez PORTA |= BUFFOR[0] ? A jeśli paletka to 3 diody? i co jeśli chciałbym ową'paletke' przy starcie ustawić na środku pierwszej kolumny( czyli 3,4,5 wiersz)


Krauser napisał(a):
A jakie to ma znaczenie dla działania przycisków? Dlaczego tak? Przyciski należy sprawdzać w założonych odstępach czasowych.

No własnie nie ma żadnego, tylko źle przemyślałem to wszystko. Poprostu myslałem że moge przesuwać paletką tylko wtedy, gdy aktywna jest pierwsza kolumna. Nie wiedziałem jak to obejść. Jeśli dobrze rozumuje to co wyżej to spróbuje inaczej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2015, o 21:24 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

United napisał(a):
PORTA |= BUFFOR[0]

W zasadzie to wprost PORTA = BUFFOR[0]
Jak chcesz coś mieć na początku to inicjujesz tablicę danymi:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zacznij od tego, że wpiszesz jakieś dane do tablicy BUFFOR i wyświetlisz ten obraz na wyświetlaczu. Do wyświetlenia ma służyć funkcja obsługi przerwania timera.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2015, o 21:40 
Offline
Nowy

Dołączył(a): 21 lis 2015
Posty: 16
Pomógł: 0

Zrobiłem takie coś, usunąłem totalnie obsługe przycisków z pętli głównej.

Poświata jest nadal w drugiej kolumnie, lecz bardzo słaba, ale jednak widoczna. Da się jakoś całkowicie ją wyeliminować?

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



Ostatnio edytowano 7 gru 2015, o 22:05 przez United, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2015, o 22:04 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

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

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


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2015, o 22:14 
Offline
Nowy

Dołączył(a): 21 lis 2015
Posty: 16
Pomógł: 0

hm, dzięki wielkie!

przed Twoim zapostowaniem, sam doszedłem do tego, że coś jest nie tak z tym ustawianiem COLUMN_PORT

i wyszło mi że za każdym razem musze je ustawiać w ifie wraz z tym buforem.

ale Twój drugi kod jest jednak nie dość że krótszy, to jeszcze działa równie dobrze.

Teraz mógłbyś mi jeszcze podpowiedzieć, kiedy obsługiwać te przyciski? W założonym odstępie czasowym, czyli w pętli głównej to słaby pomysł ze względu na te przerwania?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2015, o 22:26 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

United napisał(a):
Teraz mógłbyś mi jeszcze podpowiedzieć, kiedy obsługiwać te przyciski? W założonym odstępie czasowym, czyli w pętli głównej to słaby pomysł ze względu na te przerwania?

W pętli głównej. A link podałem wcześniej.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2015, o 23:28 
Offline
Nowy

Dołączył(a): 21 lis 2015
Posty: 16
Pomógł: 0

Dzięki wielkie za pomoc, działa cud malina :)

Mam jeszcze pytanie, bo nie zabardzo rozumiem jak działa COLUMN_PORT = 1 << licznik, a działa bardzo dobrze :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 gru 2015, o 20:17 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Liczba 0b00000001 zostaje przesunięta w lewo (od prawej strony jest uzupełniana 0)
Dla licznik = 0: COLUMN_PORT = 1<<0 = 0b00000001
Dla licznik = 1: COLUMN_PORT = 1<<1 = 0b00000010
Dla licznik = 2: COLUMN_PORT = 1<<2 = 0b00000100
...
Dla licznik = 7: COLUMN_PORT = 1<<7 = 0b10000000

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2015, o 23:02 
Offline
Nowy

Dołączył(a): 21 lis 2015
Posty: 16
Pomógł: 0

Mam kolejne pytanko. Jak mógłbym teraz sprawdzać pozycje paletki względem piłeczki? kierunek piłeczki wiadomo że znam.

Zakładam że w COLUMN_PORT[0] ustawienie paletki dajmy na to jest 0b11100000, piłeczki w COLUMN_PORT[1] jest nieznane, bo może to być dowlony z 8 bitów, wiadomo, zależy od rozgrywki, czyli 0bxxxxxxxx. Teraz moge przewidzieć gdzie będzie piłeczka bo znam kierunek, a odbicie nastąpi w kolejnym ruchu.

Czyli, jak mam porównać zawartość COLUMN_PORT[1], gdzie jest piłeczka, tak by stykała lub nakładała się w następnym ruchu z paletką? Jak porównać te poszczególne bity?


EDIT::

wystarczy sprawdzic (BUFFOR_COL[0] & BUFOR_COL[1] == BUFFOR_COL[1]) && BUFFOR_COL[1] !=0

dla drugiej paletki tak samo.



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: 13 ] 

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