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



Teraz jest 15 lis 2024, o 06:30


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 21 ] 
Autor Wiadomość
PostNapisane: 6 sty 2013, o 16:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sty 2013
Posty: 328
Lokalizacja: Rzgów k. Łodzi
Pomógł: 11

Witam, mam problem z kodem Sun Rivera do obsługi matryc, tz wszystko działa jak należy, ale na Delayach które jak wiadomo blokują całego AVRka. Próbowałem podpiąć to jakoś pod Mirkowe programowe timery, ale niestety bez powodzenia. Więc zwracam się do was, czy jakaś dobra dusza naprowadzi mnie na odpowiednią drogę ? :) A tu zamieszczam kody.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Timery skopowiane z książki, jeżeli p. Mirek się zgodzi to mogę wkleić przerwanie je obsługujące.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sty 2013, o 19:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 cze 2012
Posty: 171
Pomógł: 5

Witam,
chyba trochę nie do końca kolega zrozumiał działanie timerów programowych. Funkcja którą kolega przedstawił, zakładam, że jest w main w pętli while. W związku z tym niech kolega przeanalizuje co się dzieje. Funkcja jest wywoływana, dochodzi do pętli for (od j) tam sprawdza czy jest spełniony warunek !timer jeśli tak to wykunuje przesunięcie jeśli nie to idzie dalej i inkrementuje swój licznik j. Nie zatrzyma się jak to ma miejsce przy delay. Powinno się funkcję scroll_Znak napisać jako nieblokującą tak aby jeden jej "obieg" wykonał przesunięcie o jedno pole i dopiero w głównej pętli użyć timera i ją wywołać co zadany czas.
Mam nadzieje, że dobrze to wytłumaczyłem i kolega zrozumie o co mi chodzi.

Pozdrawiam
R.L.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sty 2013, o 19:46 
Offline
Moderator
Avatar użytkownika

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

Dobrze kolega Lemosek naprowadza... tzn podpowiada, że nie tędy droga jeśli chodzi o timery programowe.

_________________
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: 6 sty 2013, o 20:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sty 2013
Posty: 328
Lokalizacja: Rzgów k. Łodzi
Pomógł: 11

Bardzo dziękuje, już biorę się do pisania, a dobrze działający kod wkleję żeby inni ludzie nie musieli czekać na odpowiedzi :)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2013, o 17:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sty 2013
Posty: 328
Lokalizacja: Rzgów k. Łodzi
Pomógł: 11

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

Zastąpiłem delaye timerami programowymi, ale znowu pętla while blokuje funkcje i nici z "wielowątkowości". Nie mam pomysłu jakim cosiem można zastąpić tą pętlę. Dodaje resztę kodu:
Przesun_Lewo:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2013, o 19:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 cze 2012
Posty: 171
Pomógł: 5

Witam,
może tak ci pomogę opisując jak kiedyś ja to zrobiłem.

W funkcji main tworzysz główna pętlę while(1) i w niej Show_Event. Show_Event zawiera funkcję wyświetlania, wywoływaną co zadany czas za pomocą timerów programowych.

Kod:
void Show_Event(void){

if(!Timer_sh){
show_matrix();
Timer_sh=2;
    }
}


Następnie tworzysz Effect_Event w którym analogicznie jak wyżej tworzysz wywołanie funkcji scroll za pomocą timera np. Timer_scroll, z czasem oczywiście dłuższym np 100ms.
Funkcję scroll musisz napisać inaczej z innym podejściem nie liniowym.

Z kodu domyślam się, że chcesz przewinąć napis. Ja to zrobiłem następująco najpierw załadowałem stringa do bufora. Funkcja wyświetlająca działała w ten sposób, że z bura display[] pobierała 8 wartości kolumn i do każdej zapalała odpowiedni wiersz. Czyli ustawiam osiem bitów (kolumnę) i zapalam wiersz i tak co 2ms w kółko. Jak chciałem skrolować to przy wyświetlaniu miałem coś takiego write_outputs(display_buffer[(i+scr)]) i jak będziesz inkrementował scr to napis pięknie ci się przesunie.
Takie rozwiązanie zużywa dużo Ramu ale ja miałem krótkie napisy i dużo wolnych zasobów. Na początek możesz coś pokombinować.
Powyższy kod pisałem z pamięci i z palca więc sorki za błędy.

Pozdrawiam
R.L.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2013, o 20:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sty 2013
Posty: 328
Lokalizacja: Rzgów k. Łodzi
Pomógł: 11

Tutaj piszesz coś o multipleksowaniu. Ja całe multipleksowanie mam załatwione w przerwaniu i ono ładuje tablicę bufor_wier[8] do rejestrów co 1ms, mi to wszystko działa i ja chcę operować na tej właśnie tablicy, zapisywać tam odpowiednie bity. To multipleksowanie działa i że tak powiem mnie to nie interesuje :) Co do tego twojego opisu to średnio go rozumiem bo jest trochę zamotany, albo ja jestem zamotany ;P

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2013, o 20:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 cze 2012
Posty: 171
Pomógł: 5

Witam,
chodziło mi o to, że jak masz buffor_wier[8] i z niego wyświetlasz znaki. Jeśli więc weźmiesz drugi buffor i do niego załadujesz całego stringa. Następnie w funkcji scroll będziesz co jakiś czas dajmy na to 100ms będziesz uaktualniał buffor_wier wartościami z drugiego buffora nazwijmy go buffor_temp inkrementując indeks startowy tablicy. Czyli łopatologicznie
krok pierwszy: przepisz elementy tablicy buffor_temp od 0 do 7 do tablicy buffor_wier
krok drugi: przepisz elemnty tablicy buffor_temp od 1 do 8 do tablicy buffor_wier
itd.
Kod:
for(i=0;i<8;i++){
buffor_wier[i]=buffor_temp[i+scroll];
}
scr++;


Oczywiście musisz wprowadzić zabezpieczenia.

Mam nadzieje, że teraz jaśniej.

Pozdrawiam
R.L.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2013, o 21:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sty 2013
Posty: 328
Lokalizacja: Rzgów k. Łodzi
Pomógł: 11

No tak ,ale jeśli przepiszę stringa z buffora 2 to tam zamiast odpowiednich bitów(do wyświetlania znaków na matrycy) będą znaki ascii, a to chyba dobrze nie wróży.
A tu kod obsługujący multipleksowanie :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
sig off ;(



Ostatnio edytowano 7 sty 2013, o 21:59 przez PawelGaj, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2013, o 21:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 cze 2012
Posty: 171
Pomógł: 5

Witam,
nie masz ładować stringa dosłownie jako "abcd" tylko def. znaków (przykładowo) a - {123,23,45,66,78,255,255,123} itd.
Rozumiesz już teraz ???

Pozdrawiam
R.L.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2013, o 22:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sty 2013
Posty: 328
Lokalizacja: Rzgów k. Łodzi
Pomógł: 11

No jeszcze nie do końca, bo zmęczony jestem. Jutro jak wrócę do domu to przy tym usiądę i będę kombinował. Dzięki za porady ;)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2013, o 22:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 cze 2012
Posty: 171
Pomógł: 5

Witam,
No pomyśl w ogóle jak działa takie wyświetlanie np:
123 to binarnie 01111011 wię jeśli to wyślesz na wiersz i zapalisz pierwszą kolumnę to zaświecą ci się te diody gdzie będą jedynki.

Tu masz taki programik, który kiedyś znalazłem, powinien pomóc ci zrozumieć co mam na myśli.
http://files.msdl.pl/Ecek2Converter.exe

Pozdrawiam
R.L.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2013, o 23:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sty 2013
Posty: 328
Lokalizacja: Rzgów k. Łodzi
Pomógł: 11

Całe działanie tej matrycy rozumiem, bo wszystko sobie rozpisywałem na kartce i zachowywałem się jak mikrokontroler :D Tylko muszę sobie rozpracować to co ty pisałeś bo mam mętlik w głowie. Jak położę się spać to będę to sobie spokojnie analizował :P

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2013, o 07:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 cze 2012
Posty: 171
Pomógł: 5

Witam,
Przeanalizuj to jakby twój buffor_wier był takim okienkiem o szer 8. Buffor_temp to jakby taka długa linijka z napisem. Teraz jak chcesz przewijać, to przesuwasz okienko nad linijką.

Pozdrawiam
R.L.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2013, o 16:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sty 2013
Posty: 328
Lokalizacja: Rzgów k. Łodzi
Pomógł: 11

No i wreszcie zrozumiałem o co ci chodzi. Mam sobie tablicę buffor temp, w niej jest cały string gotowy do wyświetlenia bez żadnych przeróbek. Potem mam sobie pętlę for która się wykona 8 razy i sczytuje odpowiednie kolumny do rejestrów. BARDZO dziękuję za tą trafną poradę :P

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2013, o 22:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sty 2013
Posty: 328
Lokalizacja: Rzgów k. Łodzi
Pomógł: 11

Zrozumiałem to twoje tłumaczenie, napisałem kawałek kodu do testów, no i jak zwykle nie działa :D Nie wiem dlaczego, może robię jakiś głupi błąd. Nie wiem w której linijce się schował. Zamieszczam efekt mojego pisania :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2013, o 22:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 cze 2012
Posty: 171
Pomógł: 5

Witam,
hmm trochę klega zamieszał ale:
1. po co w pętli ciągle wywoływać funkcję zaladujStringa skoro cały czas wykonuje to samo wystarczy raz załadować przed pętlą. Tak niepotrzebnie zwalniasz
2. domniemam, że wyświetlanie wywoływane jest za pomocą przerwania a funkcja matryca jest wywołana z main i się zapętla do testu. Przepisywanie jest, ale gdzie inkrementacja zmiennej scr ??

Jaki jest efekt działania programu?? Podejrzewam, że ciągle wyświetla pierwszy znak ze stringa, zgadza się ??

Pozdrawiam
R.L.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2013, o 22:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sty 2013
Posty: 328
Lokalizacja: Rzgów k. Łodzi
Pomógł: 11

No inkrementacji nie ma, ale nawet jeśli to by się wyświetlało na matrycy "L" i kawałek "a". Matryca jest głucha. Co do załadowania, to jest tylko do testów, na razie chce to w ogóle ruszyć.

------------------------ [ Dodano po: kilkunastu sekundach ]

Przepraszam, błąd hardware`owy. Poprzepinałem rejestry i ULN2803 bez myślenia i wychodzą kwiatki. Cała matryca się ładnie świeci, tylko że krzaki jakieś są.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2013, o 23:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 cze 2012
Posty: 171
Pomógł: 5

Witam,
widze, że kolega korzysta z tablicy zdefiniowanych znaków pod nazwą font5x8. Dla próby proponuję manualnie załadować do buffora_temp wartości danych znaków, pomijając pozostałe funkcje ładujące dane do buffora (za komentować funkcję zaladujStringa). Jeśli wtedy będzie ok to znaczy się, że wiesz gdzie szukać :D.
Z tym manualnym wpisaniem chodzi mi, że przy deklaracji buffora_temp zdefiniujesz jego zawartość:
uint_8t buffor_tmp={
{"definicja L"},
{"definicja a"},
{itd},
};

Pozdrawiam
R.L.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2013, o 23:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sty 2013
Posty: 328
Lokalizacja: Rzgów k. Łodzi
Pomógł: 11

Zrobiłem jak mówisz i krzaki dalej. Jutro się tym zajmę bo dziś już nie mam siły. Dzięki wielkie za pomoc, dobranoc. Jak będzie chodziło to wrzucę kod, żeby inni się nie musieli czekać na odpowiedzi :)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2013, o 23:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 cze 2012
Posty: 171
Pomógł: 5

Witam,
jeśli prawidłowo wpisałeś dane do bufora i zapętlisz proce w takiej pętli to musi działać.

Kod:
       
uint_8t a;
while(1)        // Pętla while dla testów
        {       
                        for(a=0;a<8;a++){
                        bufor_wier[a] = bufor_temp[a];
                }
               
                PORTC ^= (1<<3);        // Sprawdzenie czy działa funkcja
                _delay_ms(1000);        // Narazie bez "multitaskingu"
        }


Jeśli nie działa to coś innego bruździ.

Pozdrawiam
R.L.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 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