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



Teraz jest 13 mar 2026, o 22:47


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 29 ] 
Autor Wiadomość
PostNapisane: 12 mar 2014, o 23:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Zmontowałem sobie mały, testowy wyświetlacz led - podłączenia jak przy matrycy 8x8. U mnie akurat jest inna ilosć wierszy i kolumn, ale to nie wazne. Wyświetlacz sprzętowo działa ok, co wpisze to wyswietla - problem jest tylko z tym, że napis nie przewija sie tak naprawdę. Przewijaja sie poszczególne litery i dopiero gdy jedna litera zejdzie z wyswietlacza na koncu pojawia sie druga i idzie prze wyświetlacz. A mi czodzi o to by przewijał sie od razu cały napis z np. ostepem jedno liniowym miedzy literkami. Jak myslicie co można poprawić by uzyskac taki efekt? taki jak ponizej na przykladowym filmiku:

http://www.youtube.com/watch?v=FX5MoUR1yRM

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



Lista "To Do":
*płynne normalne przesuwanie napisu, (!!!)
*zmienne,
*niezależne wyświetlanie napisów i zmiennych
*grafika,
*animacje,

--------------Aktualizacja 16.08--------------

Witam,
Moja matryca (na razie 8x8) działa, wyświetla się tekst jaki chcę -oczywiście także bez problemu większego mogę zrobić wyświetlanie zmiennych, jednak póki co sobie darowałem. Chodzi cały czas o efekt przesuwu. Jako ze koledzy z Kuźni się pochwalili ja nie będę gorszy ;) tym bardziej ze akurat ten projekcik nie jest spaprany wizualnie wiec można go pokazać.

Niestety ciągle jest taki dziwny efekt ze literki zaczynają się od przed ostatniej kolumny pojawiać, co mnie nie zadowala. Musiałem "kombinować" a to jest niestety dla mnie wkurzające - bo nie można tego w łatwy sposób w takim stanie przenieść na większą matrycę. Chętnie bym kolegów z Kuźni poprosił o jakieś wskazówki odnośnie przewijania - bo na pewno da się to łatwo rozwiązać i to w miarę uniwersalnie, o wszem ja mam mega prosto (dosłownie jedna linijka odpowiada za wyświetlanie znaku) ale nie jestem zadowolony. Uzyskałem efekt jaki chciałem, ale wiem ze ten kod nie jest dobry - bo po mojemu brakuje mu uniwersalności.





Ostatnio edytowano 16 sie 2014, o 16:44 przez Atmegowiec, łącznie edytowano 9 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 mar 2014, o 17:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Nie wiem czy dobrze myślę, ale chciałbym zrobic to tak:

string[] = {"ATNEL"};

1) odczyt pierwszej litery i pobranie wzorca litery z tablicy "znaki"
2) zapisanie wzorca litery (ustawienia diód w kazdym wierszu)jako tablica w pierwszym elemencie tymczasowej tablicy np. str_tmp[0]
3) Przesuniecie pozycji w nowej tablicy str_tmp o jeden
4) Realizacja ptk. 1 -3 aż do ostatniego litery ze stringa.
5) Na końcu teoretycznie mamy tablice str_tmp zawierająca wszytskie litery oddzielone przerwami.
6) taka tablicę trzeba jakoś wyswietlic i przesuwac np. poprzez timerem programowym.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 mar 2014, o 23:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 sty 2014
Posty: 178
Pomógł: 24

Witaj

Powodem przesuwania kolejnej litery dopiero po zniknięciu poprzedniej jest ten warunek w funkcji scroll():
if(z>6){ // jesli zmienna przesunięcia:

czeka on bowiem aż zmienna "z" osiągnie wartość = 5 a to znaczy, że cały znak musi się przesunąć. W tym czasie nie "dochodzi" kolejna litera ze string[] bo nie jest inkrementowana zmienna "b".

Aby zrobić "płynący" napis musisz przyjąć znak spacji składający się tylko z jednego bajtu a nie z pięciu (cała szerokość wyświetlacza). Można to zrobić po prostu dokładając do definicji każdego znaku zero na końcu lub początku. Następnie wszystkie bajty znaków wchodzące w skład string[] można wpisać do bufora wyświetlającego (o długości wszystkich bajtów kształtu znaków z tablicy string[]) i dopiero ten bufor poddawać przesuwaniu i wyświetlaniu. Wadą takiego rozwiązania jest to, że długość string[] musi być stała lub należałoby dynamicznie zwiększać wielkość bufora wyświetlacza w zależności od długości string[]. Jednak nie napisałeś jaki masz cel i nie wiemy czy string[] będzie u Ciebie miało stałą długość czy zmienną.

Daj znać czy udało Ci się wyświetlić napis tak jak chciałeś.

Pozdrawiamy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 mar 2014, o 23:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Kuźnia napisał(a):
Powodem przesuwania kolejnej litery dopiero po zniknięciu poprzedniej jest ten warunek w funkcji scroll():
if(z>6){ // jesli zmienna przesunięcia:

czeka on bowiem aż zmienna "z" osiągnie wartość = 5 a to znaczy, że cały znak musi się przesunąć. W tym czasie nie "dochodzi" kolejna litera ze string[] bo nie jest inkrementowana zmienna "b".


Tak, dokłądnie zdałem sobie z tego sprawę, wczoraj.

Kuźnia napisał(a):
Aby zrobić "płynący" napis musisz przyjąć znak spacji składający się tylko z jednego bajtu a nie z pięciu (cała szerokość wyświetlacza). Można to zrobić po prostu dokładając do definicji każdego znaku zero na końcu lub początku. Następnie wszystkie bajty znaków wchodzące w skład string[] można wpisać do bufora wyświetlającego (o długości wszystkich bajtów kształtu znaków z tablicy string[]) i dopiero ten bufor poddawać przesuwaniu i wyświetlaniu.


I tu jest problem, bo ja tez sobie tak wymyśliłem lecz nie wiem jak to zrealizować, gdy wyświetlam literki to wyświetlają mi sie one z tym samym miejscu. A gdy przesunę literę to następna pojawi sie w miejscu przesunięcia.. wiec koncem konców doszłem ze mam napis przesuwającej sie jednej literki która zmienia się co przesunięcie na kolejna ze stringa - a to nie to o co mi chodizło.

Próbuje rozgryść o co Wam chodizło w tym cytacie. A co do stringa - jego długości, to moze byc poki co stały - na razie chciałbym osiagnac pływanie napisu, a potem pomyśle jak udoskonalić by nie trzeba było ręcznie zmieniać.

Problem głowny: jak rozkleić literki by nie wyświetlały sie w tym samym miejscu a jedna obok drugiej ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 mar 2014, o 19:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Niestety nei udało mi sie jeszcz ewykonac, tego z powodu ww probremu,
zastanawiam sie jeszcze ok.. musze miec bufor wyswietlający o długosci wszytskich znaków, jaką tablice zdeficiowac? uint8_t?
Tak teraz mysle np tablica 32x8 ma 32 kolumny kazda kolumna to jedenbit wiec jak mam zdefiniowac np unit32_t ? bo przeceiz maksymalna warosc dalece przekroczy 8 jak w zwyklej matrycy 8x8

Obrazek

wartość końcowa powinna mieć 4 294 967 296 dla 32 kolumn wiec czy powinienem zdefiniowac bofor jako uint32_t ?

Czy może ja zle myslę?

Czy moze wyswietlanie tekstu inaczej sie przedstawia...eh..



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 mar 2014, o 19:51 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

oczywiście że uint8_t, a jakby wyświetlacz był 7 albo 15 razy dłuższy to co ? ;) zabrakłoby ci pewnie typu ...

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 mar 2014, o 20:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Panie Mirku.. ale jak zmiescic wszystki "kropki" składające sie na cały zapis

Obrazek

wydaje mi sie ze powinno sie zapisac cały zaznaczony fragment wpisując do elemetu tablicy wartosci bitową czyli w tym wypadku musiałbym uzyć duzefoy typu np. uint16 czy uint32 a to przeciez tylko jest 5 liter.
Czy moze ja całkiem zle do tego podchodze?

Musze wpisac do bufor wszytskie litery czyli wszystkie wzory liter [kropki] i dopiero taka tablice przesuwac?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 mar 2014, o 20:28 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Atmegowiec napisał(a):
Czy moze ja całkiem zle do tego podchodze?


źle podchodzisz bo cały czas jakby nie chcesz zrozumieć co to jest bufor ekranu :(

bufor to jest pamięć ekranu - jak w każdym wyświetlaczu .... i co bufor obchodzi jakie tam będą literki, jakiej wielkości i czy w ogóle literki czy może coś innego.

Atmegowiec napisał(a):
Musze wpisac do bufor wszytskie litery czyli wszystkie wzory liter [kropki] i dopiero taka tablice przesuwac?


No na przykład można tak .... jak się ktoś uprze

ale równie dobrze można za każdym razem pod inne współrzędne do tego samego bufora wpisywać te znaki czy co tam ci się tylko przyśni

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 mar 2014, o 07:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 sty 2014
Posty: 178
Pomógł: 24

Atmegowiec

A dlaczego Ty się upierasz na wpisywanie wierszy ???? Przecież przy długim napisie rzeczywiście zabraknie Ci typów zmiennej.
Do bufora wyświetlacza wpisuj kolejne KOLUMNY znaków (czyli bajty) a wtedy długośc napisu bedzie ograniczona tylko dostępną wolną pamięcią w AVR. Potraktuj każdy znak jako twór składający się z 5 kolumn 1-bajtowych + ewentualnie bajt spacji.

Mam nadzieje, że to cię troche naprowadzi

Pozdrawiamy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 mar 2014, o 11:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

dlatego sie uparłem, gdyz łtwiej multipleksowac 5 wierszy zamiast 32 kolumny - wtedy jakie odświeżanie usielibyśmy miec zeby nie widac było smurzenia przy 32.
NIe wiem czy dobrz4 mysle ale jesli bym zmienił na wpisywanie kolumn to caly program bierze w łeb, bo multipleksowanie i SPI jest zrobione na wiersze. No nie wiem, w funkcji SendSpi() wysyłam 5 skladników tabeli, a przy kolumnach ile by tam było ? nieskonczenie wiele (tyle ile napis) ?

Mysle ze jakby wpisywac kolumny to nagle jest ogromne ilości problemów, i wtym momencie nawet nie umiałbym tego rozwiązac, bo jak musiałbym wszytskie wzory liter obracac o 90 stopni ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 mar 2014, o 12:08 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Atmegowiec napisał(a):
dlatego sie uparłem, gdyz łtwiej multipleksowac 5 wierszy zamiast 32 kolumny


No widzisz - a ty wciąż swoje - co ma wspólnego multipleksowanie kolumn czy wierszy z wyświetlaniem znaków ? NIC :(

oczywiście że multipleksuje się wiersze. I jeszcze raz powtórzę - w trakcie multipleksowania wsuwasz cały wiersz z bufora w pamięci do wyświetlacza i tak po kolei każdy wiersz. I TYLKO to robisz podczas multipleksowania. No zajrzyj sobie proszę do Bluebooka i zobacz jak jest zorganizowane multipleksowanie na wyświetlaczach 7-segm. Przecież procedura obsługi przerwania nawet nie wie o tym co wyświetla - ona wyświetla tylko zawartość 4 buforków.

A gdzie napełniasz danymi te buforki ? no np w pętli głównej programu - rozumiesz tą ideę ? .... i to samo trzeba zrobić także w tym wypadku - a jedyna różnica to nieco inna procedura multipleksowania no i jeden i większy bufor.

1. multipleksowanie - wyrzuca bufor (wierszami) na wyświetlacz
2. w pętli głównej innymi funkcjami wrzucasz sobie albo obrazki albo literki do bufora

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 mar 2014, o 12:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

mirekk36 napisał(a):
a jedyna różnica to nieco inna procedura multipleksowania no i jeden i większy bufor.


zmieniłem troche kod, odchudziłem go - bufora jescze nie wymysliłem - ale chodzi mi o procedure przerwania tak to powinno wyglądac?

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


Ładowanie tekstu na wyświetlacz jest w przerwwaniu, tylkod ziwny efekt mi sie zrobił... własnie czesto mam z nim do czynienia ze jeden wiersz ywswietla sie nizej... miałem tak przy roznych projektach, gdy tak rozwiaze wysyłanie. Tak samo jesli do string[] wpisze "ATNEL" to wyswietlanie sie rozpocznie od litery T. Dlatego zawsze musiałem dawac " ATNEL" 9znak spacji" zeby wyswiatlało od poczatku. NMie wiem z czego to wynika i to ze wyswietlanizej o jeden wiersz to jest podobna przyczyna chyba
Gdy daje warunek w przerwaniu "licznik>4" to na pierwszym wierszy wyswietlają sie jakies losowe diody a litery u tak sa jeden niżej.

Obrazek



Ostatnio edytowano 17 mar 2014, o 13:39 przez Atmegowiec, łącznie edytowano 3 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 mar 2014, o 12:53 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

no i widzisz ?

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


co to jest ? zastosowałeś wprost kalkę z multipleksowania wyświetlaczy 7-segmentowych i dlatego kręcisz się w kółko jak bączek :(

bo ty w przerwaniu chcesz wyświetlać pojedyncze jakieś znaki ? czy jak ? - sorki ale nie rozumiem tego

więc jeszcze raz powtórzę

1. zrób bufor który będzie mapą pamięci całego twojego wyświetlacza i nie ważne czy w buforze coś jest czy nie ma - po prostu wymiatasz jego zawartość wierszami w przerwaniu

2. zrób funkcje rysujące znaki czy grafiki (to żadna różnica) w pamięci wyświetlacza czyli w tym buforze - i to co zostanie w nim namalowane - to procedura przerwania z pkt.1 i tak wyświetli na wyświetlaczu.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 mar 2014, o 13:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

mirekk36 napisał(a):
co to jest ? zastosowałeś wprost kalkę z multipleksowania wyświetlaczy 7-segmentowych i dlatego kręcisz się w kółko jak bączek :(


Tak przyznaje powinno być:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
ale myślę ze Panu chyba o coś innego chodziło ;/ tylko nie wiem o co.

mirekk36 napisał(a):
bo ty w przerwaniu chcesz wyświetlać pojedyncze jakieś znaki ? czy jak ? - sorki ale nie rozumiem tego


W przerwaniu chcę wyswietlać zawartosc bufora i wpisywac odpowiedni wiersz gdy akurat jest on wyświetlany
to nie pojedynczy znak bo tam w domysle bedzie tablica z buforem zawierającą cały jeden wiersz mojego wyswietlacza czyli np pojedynczy warunek mógłby wyglądać tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


bufor_ekranu[] zdefiniowałbym jako wskaznik, a wielkosc tablicy wbylaby wielkoscią mojego wyswietlacza czyli np 32x8 ?

Problem dla mnie jest zeby napisac funcje zapisująca do takiego bufora - bo trzeba by było zapisaywac tam znaki robic np. odstęp i nastepny znak kłasc, kurcze...
Pisze Pan ze znaki a tekst to by byla jedna funkcja, przyznam sie z epóki co nei mam pojecia jak to wykonac. Ogolny schemat działania wiem, tylko szczegóły ciężko załapać.

Powyzej wstawiłem animacje przedstawiającą mój problem opisany w poprzednim poscie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 mar 2014, o 14:10 
Offline
Użytkownik

Dołączył(a): 02 lut 2014
Posty: 38
Lokalizacja: Jaworzno
Pomógł: 2

Do stworzenia skrola (przesuwającego się napisu) zrób tak:

stwórz bufor dla wyświetlacza np. taki:

bajt3 bajt2 bajt1 bajt0
76543210 76543210 76543210 76543210 <- bity poszczególnych bajtów dla pierwszego wiersza
bajt7 bajt6 bajt5 bajt4
76543210 76543210 76543210 76543210 <- to samo dla drugiego wiersza
itd ........

Wielkość bufora obliczysz w ten sposób:
ilość wyświetlanych znaków + 1 (na bufor) * ilość wierszy

Na wyświetlacz wrzucasz zawartości kolumn od bajtu 1 (kolumna z bajtem 0 to bufor). Co pewien czas przesuwasz całą zawartość bufora wyświetlacza, łącznie z kolumną 'zerową'. Po przesunięciu całej szerokości znaku, nowy znak wstawiasz do bufora (kolumny zero).

Tak w skrócie :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 mar 2014, o 15:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Międzyczasie ogarniam bufor i funkcje zapisu do bufora. Mam taki kod jak poniżej

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


Proste zjawisko a za nic w świecie nie wiem czemu tak jest. Napisałem w petli głownej program który przesuwa bit w lewo.. no banalny... ale powiedzcie mi czemu na matrycy mam taki efekt ze za pierwszym razem zaczyna dioda przebieg od pierwszej czyli ok.... a za drugiem raz juz idzie od drugiej (jakby ciagle od bitu 2). No nie moge tego ogarnąc... no przeciez w tej petli jest tylko przesuwanie w lewo o jeden...
Powiedzice mi czemu tak jest - bo skoro ja niemoge przyczyny znalesc to jak mi sie chociazby ten bufor uda oprogramowac...

Gdy program jest w takiej postaci jak teraz to jest jeden przebieg i cisza.... koniec świecenia.. a jak przy ifie sprawdzajacym warunek x>64 dam x=1 to wtedy raz przebiegnie od pierwszej diody, a od drugiego razu od drugiej i tak ciagle juz potem - od 2 do konca i tak w kółko.

Ponawiam wczesniejsze pytanie, dlaczego tez pierwszy wiersz wyświetlany jest jako ostatni ?
Przykład poniżej. Powinna byc cała ukosna kreska a w pierwszej linii jest kropka z ostatniej lini.

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 mar 2014, o 18:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

operacje przesuwania zmiennej x zrób przed sprawdzeniem
czy jest większe niż 64.
Teraz jak ustawisz x=1 w warunku x>64 , następnie przesuwasz x (x=2) i dopiero zapisujesz do bufora
tylko za pierwszym razem x jest nie przesunięte.

Możliwe że w warunku po zmianie będziesz musiał porównać z 128 a nie z 64
ale to sprawdzisz na żywym organiźmie :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 mar 2014, o 18:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Zaba napisał(a):
operacje przesuwania zmiennej x zrób przed sprawdzeniem
czy jest większe niż 64.
Teraz jak ustawisz x=1 w warunku x>64 , następnie przesuwasz x (x=2) i dopiero zapisujesz do bufora
tylko za pierwszym razem x jest nie przesunięte.

Tak to pomogło.. tylko nei moge zrozumiec czemu tak...
Jeszcze problem z tym przesunieciem wierszy w dól...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 mar 2014, o 21:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 sty 2014
Posty: 178
Pomógł: 24

a spróbuj do pierwszej wersji kodu wrzucić void Scroll( void ) w takiej postaci:

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


Kody wklejamy przy pomocy syntax=c - Różowo-zielony (czyli sraczkowy) J.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2014, o 16:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

hej, nic sie nie wyswietla, niby nie ma zadnych waringów ale wogole nic nie wyswietla, chyba jakis babol w tym fragmencie jest.

cos jak by sie przewijało ale baardzo słabo widac, chyba cos z odswiezaniem jest

Obrazek

no wyląda jakby cos przewijąło rzeczywiscie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2014, o 17:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Edit:

Troche przeanalizowałem Twój kod, zmieniłem troche niekóre rzeczy (przyznam ze moze nie zawsze świadomie - poprostu z doświadczenie wiem ze takie smuzenie j/w jest czesto objawem ze cos z timerem) - głowne wywaliłem zdarzenie timera w czasie którego ma sie przesuwać napis oraz wartości liczbowe w przesuwie
Funkcja wygląda tak:

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


Efekt jest bliski temu co chce osiagnąc - jest tylko taki dziwny przestój w pewnym momencie - patrz nizej. Przy okazji efekt jaki mozna wykonac dodając dwa znaki do tego kodu. Jeszcze jak widac jest jakis dziwny blad za ostatnim znakiem tzn jakies dziwne niezidyfikowany znak (pełno kropek).

Kluczem był pomysł ze " | " nie wpadłem na to...

Dzięki :) moze wpadniecie co jeszcze zmienic ze by te błedy wyeliminować. Obecnie pracuje etz na drugim projekcie czyli zapakowanie do bufora i opracowanie biblioteki samo rysującej i przesyłającej dowolne znaki: litery rysunek...

Obrazek Obrazek


EDIT

Udało mi sie i to naprawić, kluczem do tego jest if odpowiadający za przesunięcie. C ciebie ten warunek wynosił ++z>8, ja go zamiemiłem na ++z>4.

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


Myślałem ze to dlatego bo ja mam wyświetlacz długi na 7 kropek. Lecz to nie po mogło, dałem 7,6,5 - za każdym razem zmniejszało się to przystopowanie, aż przy 4 ustało. Przyznam się ze nie wiem czemu to pomogło, mam trochę problem z analizą tego co się dzieje w kodzie... Pomożecie?

Obecny efekt:

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2014, o 18:48 
Offline
Użytkownik

Dołączył(a): 02 lut 2014
Posty: 38
Lokalizacja: Jaworzno
Pomógł: 2

Jeśli Ci działa tak jak tego potrzebujesz to OK, ja pozwolę sobie przedstawić swoją wersję skrola (przystosowane do Twojego wyświetlacza czyli 7x5).

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


Na wyświetlacz wysyłasz dane z bufor[0], bufor[2], bufor[4], bufor[6], bufor[8].
Dodatkowo można dopisać obsługę znaków specjalnych, np: wstrzymanie przesuwu o jakiś czas, zmianę prędkości przesuwu, dynamiczne wstawianie danych do wyświetlania itp.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 mar 2014, o 00:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 sty 2014
Posty: 178
Pomógł: 24

ok, przede wszystkim tak jak zauważyłeś "Kluczem był pomysł ze " | "" :). OR'ujemy - (sumujemy) razem bity każdego z pięciu bajtów reprezentujących kształt liter: b("aktualnej") i b+1("następnej"),uprzednio oczywiście najpierw odczytując a następnie przesuwając bity na swoje miejsce ( które ostatecznie jest w bajtach bufora tmp) .To "swoje miejsce" zmieniamy w "takt " timera programowego 1 . Znak b przesuwamy tak jak u ciebie, ale znaku(b+1)nie możemy przesunąć o taką samą wartość bo nadpisalibyśmy go na znak b, więc przesuwamy go o stałą wartość(szerokość znaku +1(bit) na spację (wcześniej mylnie 8 )) :)w prawo, względem aktualnego przesunięcia znaku b - "z" .

"Z" zwiększamy aż nie wypchniemy b poza matrycę (if (++z>4)) [a nie powinno być 5? wydaje mi się, że b za wcześnie znika, spowolnij timer i zaobserwuj] wtedy (b+1) staje sie b a (b+1)następnym znakiem itd. Dochodzimy do końca stringu ATNEL i powinniśmy go ładnie "zawinąć"
i pozbyć się krzaka ktory wyswietla się w miejsce "0"kończącego string.......;). (b+1)..hmm:)...zapakowanie
do większego bufora całego stringa a potem wyświetlanie to lepsze rozwiązanie ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 mar 2014, o 22:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Witam, troche poprawiłem to i owo, zeby lepiej wyglądało. Funkcją realizyjąca wyswietlanie jest funkcja matrix_str() do której wpisujemy tekst do wywietlenia.

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


W petli głównej wywołuje funkcję
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
, dziwi mnie coś, bo na wyswietlaczu, po przesuwniu go stwierdziłem ze jest literka "B" i połowę "A" a "7" to juz wogole... Przesuwając bufor przesuwa mi sie tylko tyle co opisałem. Myslałem ze moze gdzies zły typ zmiennej dałem, czy cos - cos nie gra. Co myslicie?


EDIT: chyba widze błąd... tablica rows wypełnia sie tylko 5 znakami a nie wszystkimi ze stringa... a jesli to tego wina to całkiem inaczej petle trzeba zrobic - i to chyba nie jedną, troche głowkowania bedzie...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 kwi 2014, o 13:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 sty 2014
Posty: 178
Pomógł: 24

Atmegowiec napisał(a):
troche głowkowania bedzie...

powiększyles tablicę rows ? i...?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 kwi 2014, o 18:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Witajcie po przerwie...

troszkę zarzuciłem w/w projekt, bo składałem, już docelowy wyświetlacz diodowy. Pomijając kilka dni lutowania itd... musiałem od nowa stworzyć program. Wróciłem do absolutnego początku - a wyżej zdobyta wiedza przyda się w tym projekcie :).

Wiec tak, zmontowałem wyświetlacz 16x8 (czyli dwie matryce 8x8). Aby to ogarnąć pomyślałem, że użyje 3x 74HC595.
Jeden do sterowania wierszy (w sumie 8 - będą multipleksowane). A pozostałe dwa do obsługi kolumn (16 - czyli równe dwa rejestry).
Wiersze podłączone są katodami ( załączamy "0" ) kolumny anodami (załączamy "1").

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


Nie mogąc się doczekać efektów wrzuciłem najprostszy kod, bez multipleksowania - żeby sprawić czy działa, i tu kicha...
Na podstawie poradnika o rejestrach zmieniłem sobie fukcje wysyłająca dodając jeszcze kolejne polecenia by obsłużyły 3 rejestry. Pierwszym problemem było ogarniecie, z której strony zaczyna sie odczyt....

wpisałem SendSpiW(0xffffff) jesli sterujemy zapalaniem wierszy wpisując "0" to juz sie zdziwiłem gdyz przy takim poleceniu świeci cała matryca.... dlaczego? powinno byc zgaszone ?

0x FF FF FF > pierwsza dwójka miała w zamyśle sterować wierszami, kolejne dwie dwójki sterować kolumnami, a tu przy takim ustawieniu wszystko świeci...

Rejestry połączone są w sposób następujący
1. rejestr od wierszy
2. rejestr od kolumn 1 - 8
3. rejestr od kolumn 9 -16

kolejna sprawa to słabe świecenie matrycy... dodałem do kodu funkcje _delay_ms(20); i sie zdziwiłem... obraz miga a diod świeca się jaśniej (tak jak powinny) czy to nie powinno stac w miejscu nawet mimo delaya?

Spójrzcie na kod
Może ja czegoś nie rozumiem, a wszystko jest ok ?

Animacja z w/w kodu z wpisaną funkcją _delay_ms(20)

Obrazek



SendSpiW(0xffffff);

Obrazek

Teraz mysle jak rozdzielić część bajtów odpowiedzialną za zmianę stanu wierszy - by dac to do przerwania i multipleksować - mysle o maskowaniu hhmmm...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 kwi 2014, o 21:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Korzystając z poradnika Pana Mirka o debugowaniu, szybko odkryłem, że w przerwaniu nie wzrasta zmienna "licznik" przez co zwyczajnie nie działa mi multipleksowanie - teraz zastanawiam się dlaczego. Po wykonaniu funkcji SendSpi następuje przesuwanie licznika w lewo licznik<<= 1; co według mnie powinno zmieniać licznik o podwojona wartość za każdym razem gdy wchodzi w przerwanie. Zastosowałem oczywiście "static" by zmienna się nie resetowała. Co jeszcze może być przyczyną?

Z "pułapki" wnioskuję ze "licznik" nie zwiększa się nawet do 2, gdyż dioda nie świeci - gdy zainicjuje zmienną z wartością "2" dioda świeci się, a wyświetlacz wyświetla drugi wiersz - czyli tak jak powinno.

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: 10 kwi 2014, o 21:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

Tak na szybciutko tylko jedna rzecz.

Atmegowiec napisał(a):
if(licznik>128) licznik = 1;


Przesuwając bit w lewo (od młodszego do starszego) nie możesz sprawdzić czy zmienna jest większa od 128 ... bo bit juz będzie "poza mapą".

------------------------ [ Dodano po: 14 minutach ]

Jeśli inicjujesz zmienna licznik na początku przerwania jako 1 , robisz pułapkę i tam sprawdzasz czy jest 2, później dopiero przesuwasz bit w lewo to to nie ma prawa zadziałać :)

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sie 2014, o 15:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Aktualizacja pierwszego postu

Co nowego:
*Nowa płytka wyświetlacza
*Wyświetlanie pływającego napisu
*Wyświetlanie zmiennych
*Wyświetlanie danych w trybie mieszanym napis/liczba



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO