<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=6342&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-08-16T15:31:03+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=6342&amp;mode</id>
<entry>
<author><name><![CDATA[Atmegowiec]]></name></author>
<updated>2014-08-16T15:31:03+01:00</updated>
<published>2014-08-16T15:31:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=91701#p91701</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=91701#p91701"/>
<title type="html"><![CDATA[Re: Wyswietlcz matrycowy 8x8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=91701#p91701"><![CDATA[
Aktualizacja pierwszego postu<br /><br />Co nowego:<br />*Nowa płytka wyświetlacza<br />*Wyświetlanie pływającego napisu<br />*Wyświetlanie zmiennych<br />*Wyświetlanie danych w trybie mieszanym napis/liczba<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1123">Atmegowiec</a> — 16 sie 2014, o 15:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2014-04-10T21:53:41+01:00</updated>
<published>2014-04-10T21:53:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=77608#p77608</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=77608#p77608"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=77608#p77608"><![CDATA[
Tak na szybciutko tylko jedna rzecz.<br /><br /><div class="quotetitle">Atmegowiec napisał(a):</div><div class="quotecontent"><br />if(licznik&gt;128) licznik = 1;<br /></div><br /><br />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 &quot;poza mapą&quot;.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 14 minutach ]</span></strong><br /><br />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ć <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=944">acid3</a> — 10 kwi 2014, o 21:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atmegowiec]]></name></author>
<updated>2014-04-10T21:43:01+01:00</updated>
<published>2014-04-10T21:43:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=77605#p77605</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=77605#p77605"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=77605#p77605"><![CDATA[
Korzystając z poradnika Pana Mirka o debugowaniu, szybko odkryłem, że w przerwaniu nie wzrasta zmienna &quot;licznik&quot; przez co zwyczajnie nie działa mi multipleksowanie - teraz zastanawiam się dlaczego. Po wykonaniu funkcji SendSpi następuje przesuwanie licznika w lewo licznik&lt;&lt;= 1; co według mnie powinno zmieniać licznik o podwojona wartość za każdym razem gdy wchodzi w przerwanie. Zastosowałem  oczywiście &quot;static&quot; by zmienna się nie resetowała. Co jeszcze może być przyczyną?<br /><br />Z &quot;pułapki&quot; wnioskuję ze &quot;licznik&quot; nie zwiększa się nawet do 2, gdyż dioda nie świeci - gdy zainicjuje zmienną z wartością &quot;2&quot; dioda świeci się, a wyświetlacz wyświetla drugi wiersz - czyli tak jak powinno.<br /><br />[syntax=c]ISR( TIMER2_COMP_vect ){<br /><br />uint8_t x; // podstawa timera<br />static uint8_t licznik = 1;<br /><br /><br />DDRC |= (1&lt;&lt;PC5);<br />PORTC |= (1&lt;&lt;PC5);<br />if(licznik == 2){<br />PORTC &amp;=  ~ (1&lt;&lt;PC5);<br />while(1); //pułapka programowa<br />}<br /><br /><br />SendSpi(b);<br />SendSpi(a);<br />SendSpi(licznik);   // wyswietlenie wiersza<br /><br />LT_ON;<br />LT_OFF;<br /><br />licznik&lt;&lt;=1;<br />if(licznik&gt;128) licznik = 1;<br /><br /><br />x=timer1;//timer programowy<br />if(x) timer1 = --x;//timer programowy<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1123">Atmegowiec</a> — 10 kwi 2014, o 21:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atmegowiec]]></name></author>
<updated>2014-04-05T18:09:30+01:00</updated>
<published>2014-04-05T18:09:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=77041#p77041</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=77041#p77041"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=77041#p77041"><![CDATA[
Witajcie po przerwie...<br /><br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<br /><br />Wiec tak, zmontowałem wyświetlacz 16x8 (czyli dwie matryce  8x8). Aby to ogarnąć pomyślałem, że użyje 3x 74HC595.<br />Jeden do sterowania wierszy (w sumie 8 - będą multipleksowane). A pozostałe dwa do obsługi kolumn (16 - czyli równe dwa rejestry).<br />Wiersze podłączone są katodami ( załączamy &quot;0&quot; ) kolumny anodami (załączamy &quot;1&quot;).<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />#define MOSI (1&lt;&lt;PB3)  //SER_A<br />#define SCK  (1&lt;&lt;PB5)  //ShiftClock<br />#define LT (1&lt;&lt;PB2)  //LT  &lt;-- pin SS na PB2 bo Atmega8<br /><br />#define LT_ON PORTB |= LT<br />#define LT_OFF PORTB &amp;= ~LT<br /><br /><br />void InitSpi( void );<br />void SendSpi( uint8_t bajt );<br />void SendSpiW( uint32_t word );<br /><br />uint8_t cnt;<br /><br />//sei();<br /><br /><br />int main( void ){<br /><br />InitSpi();<br /><br />while(1){<br />SendSpiW(0xfffff0);<br />//_delay_ms(20);<br /><br />}<br />}<br /><br />void InitSpi( void ){<br />DDRB |= MOSI | SCK | LT;<br />SPCR |= (1&lt;&lt;SPE) | (1&lt;&lt;MSTR); //odblokowanie SPI tryb Master<br />SPSR |= (1&lt;&lt;SPI2X);  // fosc/2<br /><br />}<br /><br />void SendSpiW( uint32_t word ){<br /><br /><br />SPDR = word&gt;&gt;16;<br />while( !(SPSR &amp; (1&lt;&lt;SPIF))); //czekamy dopóki flaga nie zmieni sie na 1<br />SPDR = word&gt;&gt;8;<br />while( !(SPSR &amp; (1&lt;&lt;SPIF))); //czekamy dopóki flaga nie zmieni sie na 1<br />SPDR = word;<br />while( !(SPSR &amp; (1&lt;&lt;SPIF))); //czekamy dopóki flaga nie zmieni sie na 1<br /><br />LT_ON;<br />LT_OFF;<br /><br />}<br />void SendSpi( uint8_t bajt ){<br /><br />SPDR = bajt;<br />while( !(SPSR &amp; (1&lt;&lt;SPIF))); //czekamy dopóki flaga nie zmieni sie na 1<br />LT_ON;<br />LT_OFF;<br /><br />}[/syntax]<br /><br />Nie mogąc się doczekać efektów wrzuciłem najprostszy kod, bez multipleksowania - żeby sprawić czy działa, i tu kicha... <br />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.... <br /><br />wpisałem SendSpiW(0xffffff) jesli sterujemy zapalaniem wierszy wpisując &quot;0&quot; to juz sie zdziwiłem gdyz przy takim poleceniu świeci cała matryca.... dlaczego? powinno byc zgaszone ?<br /><br />0x FF FF FF       &gt;  pierwsza dwójka miała w zamyśle sterować wierszami,  kolejne dwie dwójki sterować kolumnami, a tu przy takim ustawieniu wszystko świeci...<br /><br />Rejestry połączone są w sposób następujący<br />1. rejestr od wierszy<br />2. rejestr od kolumn 1 - 8<br />3. rejestr od kolumn 9 -16<br /><br />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?<br /><br />Spójrzcie na kod<br />Może ja czegoś nie rozumiem, a wszystko jest ok ?<br /><br />Animacja z w/w kodu z wpisaną funkcją _delay_ms(20)<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1123/67c50ccaf48ee1e83c730bcd3c9b297d.gif"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1123/67c50ccaf48ee1e83c730bcd3c9b297d.gif" alt="Obrazek" /></a><br /><br /><br /><br />SendSpiW(0xffffff);<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1123/3734436693642d62f161538950436f21.gif"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1123/3734436693642d62f161538950436f21.gif" alt="Obrazek" /></a><br /><br />Teraz mysle jak rozdzielić część bajtów odpowiedzialną za zmianę stanu wierszy - by dac to do przerwania i multipleksować - mysle o maskowaniu hhmmm...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1123">Atmegowiec</a> — 5 kwi 2014, o 18:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Kuźnia]]></name></author>
<updated>2014-04-04T13:20:28+01:00</updated>
<published>2014-04-04T13:20:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=76937#p76937</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=76937#p76937"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=76937#p76937"><![CDATA[
<div class="quotetitle">Atmegowiec napisał(a):</div><div class="quotecontent"><br />troche głowkowania bedzie...<br /></div><br />powiększyles tablicę rows  ? i...?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2537">Kuźnia</a> — 4 kwi 2014, o 13:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atmegowiec]]></name></author>
<updated>2014-03-25T22:56:32+01:00</updated>
<published>2014-03-25T22:56:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75789#p75789</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75789#p75789"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75789#p75789"><![CDATA[
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.<br /><br />[syntax=c]void matrix_str(char * str){      //definicja funkcji wywietlającej string<br /><br />uint16_t tmp&#91;5&#93;;//tymczasowa tablica zawierająca jeden znak rozdzielony na wiersze 0-4<br />uint8_t space=4;   //zmienna tworząca odstep pomiędzy literami<br />uint16_t rows&#91;32&#93;={0};   //tablica przecowująca całe wiersze<br />uint8_t x;  // zmienna przesuwająca cały bufor<br /><br /><br />for(uint16_t c=0;c&lt;5;c++){// deklaracja zmiennej pomocniczej &quot;c&quot; dla pętli for<br />tmp&#91;c&#93; = (znaki&#91;*(str) - 32&#93;&#91;c&#93;);       // przypisanie pierwszego znaku ze stringa<br />rows&#91;c&#93; = (tmp&#91;c&#93;) | ((znaki&#91;*(str+1)-32&#93;&#91;c&#93;) &gt;&gt; (space));  //przypisanie tmp&#91;&#93; do nowej tabeli rows&#91;&#93;<br />}       //i dodanie kolejnego znaku uwzględniając<br />//odstep pomiędzy literami<br /><br />copy(rows,bufor_ekranowy);// kopiowanie tabeli rows do naszego bufora<br /><br /><br />for(x=0;x&lt;5;x++){// przesunięcie całego bufora o dwa miejsca w lewo - realizacja scrollowania<br />bufor_ekranowy&#91;x&#93; = bufor_ekranowy&#91;x&#93; &lt;&lt; 2;<br />}<br />SendChar(bufor_ekranowy); // załadowanie bufora do fukcji wysyłajacej przez SPI do matrycy<br />}[/syntax]<br /><br />W petli głównej wywołuje funkcję[syntax=c]matrix_str(&quot;BA7&quot;)[/syntax], dziwi mnie coś, bo na wyswietlaczu, po przesuwniu go stwierdziłem ze jest literka  &quot;B&quot; i połowę &quot;A&quot; a &quot;7&quot; 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?<br /><br /><br />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...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1123">Atmegowiec</a> — 25 mar 2014, o 22:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Kuźnia]]></name></author>
<updated>2014-03-24T00:10:26+01:00</updated>
<published>2014-03-24T00:10:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75523#p75523</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75523#p75523"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75523#p75523"><![CDATA[
ok, przede wszystkim tak jak zauważyłeś  &quot;Kluczem był pomysł ze &quot; | &quot;&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. OR'ujemy - (sumujemy) razem bity każdego z pięciu bajtów reprezentujących kształt liter: b(&quot;aktualnej&quot;) i b+1(&quot;następnej&quot;),uprzednio oczywiście najpierw odczytując a następnie przesuwając bity na swoje miejsce ( które ostatecznie jest w bajtach bufora tmp) .To  &quot;swoje miejsce&quot;  zmieniamy w &quot;takt &quot; 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 )) <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />w prawo, względem aktualnego przesunięcia znaku b - &quot;z&quot; .<br /><br /> &quot;Z&quot; zwiększamy aż nie wypchniemy b poza matrycę (if (++z&gt;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 &quot;zawinąć&quot;<br />i pozbyć się krzaka ktory wyswietla się w miejsce &quot;0&quot;kończącego string.......<img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. (b+1)..hmm:)...zapakowanie<br />do większego bufora całego stringa a potem wyświetlanie to lepsze rozwiązanie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2537">Kuźnia</a> — 24 mar 2014, o 00:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gordo]]></name></author>
<updated>2014-03-23T18:48:48+01:00</updated>
<published>2014-03-23T18:48:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75445#p75445</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75445#p75445"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75445#p75445"><![CDATA[
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).<br /><br />[syntax=c]// zdefiniowane kształty znaków<br />uint8_t znaki&#91;&#93;&#91;5&#93; = {<br />{0 ,0 ,0 ,0 ,0},<br />// ... itd<br />};<br /><br />uint8_t *napis = (uint8_t *)&quot;&quot;;<br />uint8_t bufor&#91;10&#93;;<br />uint8_t przesuw = 0;<br /><br />void Przesun(void)<br />{<br />uint8_t znak;<br /><br />if (przesuw)<br />{<br />// przesuwamy pierwszą linię w lewo o jeden punkt<br />bufor&#91;0&#93; &lt;&lt;= 1;<br />if (bufor&#91;1&#93; &amp; 0x80)bufor&#91;0&#93; |= 1;<br />bufor&#91;1&#93; &lt;&lt;= 1;<br /><br />// przesuwamy drugą linię w lewo o jeden punkt<br />bufor&#91;2&#93; &lt;&lt;= 1;<br />if (bufor&#91;3&#93; &amp; 0x80)bufor&#91;2&#93; |= 1;<br />bufor&#91;3&#93; &lt;&lt;= 1;<br /><br />// i tak dalej z kolejnymi liniami<br /><br />przesuw--;<br />return;<br />}<br /><br />// przesunięto bufor o całą szerokość litery<br />przesuw = 8;<br /><br />// pobieramy następny znak z napisu<br />if (*napis == 0)napis = (uint8_t *)&quot;Ten tekst będzie się przesuwał&quot;;<br />znak = *napis++;<br /><br />bufor&#91;1&#93; = znaki&#91;znak&#93;&#91;0&#93;;<br />bufor&#91;3&#93; = znaki&#91;znak&#93;&#91;1&#93;;<br />bufor&#91;5&#93; = znaki&#91;znak&#93;&#91;2&#93;;<br />bufor&#91;7&#93; = znaki&#91;znak&#93;&#91;3&#93;;<br />bufor&#91;9&#93; = znaki&#91;znak&#93;&#91;4&#93;;<br />}[/syntax]<br /><br />Na wyświetlacz wysyłasz dane z bufor[0], bufor[2], bufor[4], bufor[6], bufor[8].<br />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.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2592">gordo</a> — 23 mar 2014, o 18:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atmegowiec]]></name></author>
<updated>2014-03-23T17:27:59+01:00</updated>
<published>2014-03-23T17:27:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75440#p75440</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75440#p75440"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75440#p75440"><![CDATA[
Edit:<br /><br />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<br />Funkcja wygląda tak:<br /><br />[syntax=c]void Scroll( void )<br />{<br />        uint8_t tmp&#91;5&#93; = {0};   // tymcasowa tablica wyswietlająca znaki<br />        uint8_t static b= 0;     // zmienna okreslająca kolejne literki w w stringu do wyswietlenia 0 - początek stringu<br />        int8_t static z = 0;   // zmienna przesuwającą<br />       /*static by sie zmienna nie resetowała*/<br /><br />//        if (!timer1)<br />//        {<br />//          timer1 = 50;    // tu ustawiamy predkosc przesuwu = 250 = 1000ms = 1s oczekiwania<br />//          uint8_t c=0;//zmieniona z globalnej na lokalna<br /><br />          for(c=0;c&lt;5;c++){<br />          tmp&#91;c&#93; =(((znaki&#91;string&#91;b&#93;-32&#93;&#91;c&#93;)&lt;&lt;z) | ((znaki&#91;string&#91;b+1&#93;-32&#93;&#91;c&#93;)&gt;&gt;(4+1-z)));<br /><br />         if( !timer1){<br /><br />               if( ++z &gt; 8)<br />                   {<br /><br />                          if(string&#91;++b&#93;=='\0') b=0;<br />                          z=0;<br />                   }<br />               timer1=35;<br />          }<br /><br />      SendChar(tmp);<br />     }<br />}[/syntax]<br /><br />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).<br /><br />Kluczem był pomysł ze  &quot; | &quot; nie wpadłem na to...<br /><br />Dzięki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> 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...<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1123/ada5caa171fd342544a6180f287e65b9.gif"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/1123/ada5caa171fd342544a6180f287e65b9.gif" alt="Obrazek" /></a> <a href="http://forum.atnel.pl/_obrazki/o/1123/202cd303edfd2719fd432194a20493db.gif"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/1123/202cd303edfd2719fd432194a20493db.gif" alt="Obrazek" /></a><br /><br /><br />EDIT<br /><br />Udało mi sie i to naprawić, kluczem do tego jest if odpowiadający za przesunięcie. C ciebie ten warunek wynosił ++z&gt;8, ja go zamiemiłem na ++z&gt;4. <br /><br />[syntax=c]if( ++z &gt; 8)<br />                   {<br /> <br />                          if(string&#91;++b&#93;=='\0') b=0;<br />                          z=0;<br />                   }[/syntax]<br /><br />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?<br /><br />Obecny efekt:<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1123/51a74b91faefb6248b6ede912b51d2ce.gif"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/1123/51a74b91faefb6248b6ede912b51d2ce.gif" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1123">Atmegowiec</a> — 23 mar 2014, o 17:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atmegowiec]]></name></author>
<updated>2014-03-23T16:01:10+01:00</updated>
<published>2014-03-23T16:01:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75425#p75425</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75425#p75425"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75425#p75425"><![CDATA[
hej, nic sie nie wyswietla, niby nie ma zadnych waringów ale wogole nic nie wyswietla, chyba jakis babol w tym  fragmencie jest.<br /><br />cos jak by sie przewijało ale baardzo słabo widac, chyba cos z odswiezaniem jest<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1123/7de9d1d533892d997ce5d01765ce4124.gif"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/1123/7de9d1d533892d997ce5d01765ce4124.gif" alt="Obrazek" /></a><br /><br />no wyląda jakby cos przewijąło rzeczywiscie<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1123">Atmegowiec</a> — 23 mar 2014, o 16:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Kuźnia]]></name></author>
<updated>2014-03-22T21:03:38+01:00</updated>
<published>2014-03-22T21:03:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75347#p75347</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75347#p75347"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=75347#p75347"><![CDATA[
a spróbuj do pierwszej wersji kodu wrzucić  void Scroll( void ) w takiej postaci:<br /><br />[syntax=c]void Scroll( void )<br />{<br />uint8_t tmp&#91;5&#93; = {0};   // tymcasowa tablica wyswietlająca znaki<br />        uint8_t static b= 0;     // zmienna okreslająca kolejne literki w w stringu do wyswietlenia 0 - początek stringu<br />        int8_t static z = 0;   // zmienna przesuwającą<br />       /*static by sie zmienna nie resetowała*/<br /><br />        if (!timer1)<br />        {<br />          timer1 = 50;    // tu ustawiamy predkosc przesuwu = 250 = 1000ms = 1s oczekiwania<br />          uint8_t c=0;//zmieniona z globalnej na lokalna<br /><br />          for(c=0;c&lt;5;c++) tmp&#91;c&#93; =(((znaki&#91;string&#91;b&#93;-32&#93;&#91;c&#93;)&lt;&lt;z) | ((znaki&#91;string&#91;b+1&#93;-32&#93;&#91;c&#93;)&gt;&gt;(8+1-z)));<br /><br />               if( ++z &gt; 8)<br />                   {<br />                   if(string&#91;++b&#93;=='\0') b=0;<br />                   z=0;<br />                   }<br />        }<br />      SendChar(tmp);<br />}[/syntax]<br /><br /><span style="color: #FF0000">Kody wklejamy przy pomocy syntax=c - Różowo-zielony (czyli sraczkowy) J.</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2537">Kuźnia</a> — 22 mar 2014, o 21:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atmegowiec]]></name></author>
<updated>2014-03-19T18:43:37+01:00</updated>
<published>2014-03-19T18:43:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74958#p74958</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74958#p74958"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74958#p74958"><![CDATA[
<div class="quotetitle">Zaba napisał(a):</div><div class="quotecontent"><br />operacje przesuwania zmiennej x zrób przed sprawdzeniem<br />czy jest większe niż 64.<br />Teraz jak ustawisz x=1 w warunku x&gt;64 , następnie przesuwasz x (x=2) i dopiero zapisujesz do bufora<br />tylko za pierwszym razem x jest nie przesunięte.<br /></div><br />Tak to pomogło.. tylko nei moge zrozumiec czemu tak...<br />Jeszcze problem z tym przesunieciem wierszy w dól...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1123">Atmegowiec</a> — 19 mar 2014, o 18:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zaba]]></name></author>
<updated>2014-03-19T18:17:26+01:00</updated>
<published>2014-03-19T18:17:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74956#p74956</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74956#p74956"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74956#p74956"><![CDATA[
operacje przesuwania zmiennej x zrób przed sprawdzeniem<br />czy jest większe niż 64.<br />Teraz jak ustawisz x=1 w warunku x&gt;64 , następnie przesuwasz x (x=2) i dopiero zapisujesz do bufora<br />tylko za pierwszym razem x jest nie przesunięte.<br /><br />Możliwe że w warunku po zmianie będziesz musiał porównać z 128 a nie z 64<br />ale to sprawdzisz na żywym organiźmie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1044">Zaba</a> — 19 mar 2014, o 18:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atmegowiec]]></name></author>
<updated>2014-03-19T15:22:30+01:00</updated>
<published>2014-03-19T15:22:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74945#p74945</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74945#p74945"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74945#p74945"><![CDATA[
Międzyczasie ogarniam bufor i funkcje zapisu do bufora. Mam taki kod jak poniżej<br /><br />[syntax=c](...)<br />void InitA( void );   //inicjacja multipleksowania i SPI<br />void SendSpi( uint8_t bajt );//Wysyłanie do matrycy<br />void matrix_char(uint8_t byte);<br />void matrix_str(char *word);<br /><br />volatile uint8_t bufor&#91;BUFOR_SIZE&#93;;<br />volatile uint8_t licznik, timer1, timer2, timer3;<br />uint8_t x=1;   //musi byc 1 bo 0 nei przesunie sie<br /><br />int main( void ){<br /><br />InitA();<br /><br />sei();<br /><br />while(1){<br />                matrix_char(x);<br />if(x&gt;64) x=1;<br />_delay_ms(150);<br />x &lt;&lt;=1;<br />}<br /><br />}<br /><br /><br />void matrix_char(uint8_t byte){<br /><br />bufor&#91;0&#93;= byte;<br /><br />}<br /><br />void matrix_str(char *word){<br /><br /><br />}<br /><br />void InitA( void ){<br />/* Ustawianie timera dla mulipleksowania tablicy */<br /><br />TCCR2 |= (1&lt;&lt;WGM21);//Tryb CTC<br />TCCR2 |= (1&lt;&lt;CS22) | (1&lt;&lt;CS21) | (1&lt;&lt;CS20);//Preskaler 1024<br />OCR2 = 31;// Wartosc &lt;31 by uzyskac 250 Hz czyli 50 na kazdy wiersz<br />TIMSK |= (1&lt;&lt;OCIE2);//Zezwolenie na Compare Match od Timera2<br /><br />DDRB |= MOSI | SCK | LT;<br /><br />SPCR |= (1&lt;&lt;SPE) | (1&lt;&lt;MSTR); //odblokowanie SPI tryb Master<br />SPSR |= (1&lt;&lt;SPI2X);  // fosc/2<br /><br />DDRC = 255; //kierunek wierszy na wyjsciowy<br />PORTC = 0;  //stany niskie na piny portu C<br />}<br /><br /><br />void SendSpi( uint8_t bajt ){<br /><br />SPDR = bajt;<br />while( !(SPSR &amp; (1&lt;&lt;SPIF))); //czekamy dopóki flaga nie zmieni sie na 1<br />LT_ON;<br />LT_OFF;<br /><br />}<br /><br />ISR(TIMER2_COMP_vect){<br /><br />uint8_t x=1;   //podstawa timera programowego<br /><br />PORTC = 255;//wyłącz wszytskie wiersze<br /> if (licznik==1){<br /> PORTC &amp;= ~(1&lt;&lt;PC5);<br /> SendSpi(bufor&#91;0&#93;);<br /> }else<br /><br /> if (licznik==2){<br />PORTC &amp;= ~(1&lt;&lt;PC4);<br /> SendSpi(bufor&#91;1&#93;);<br />}else<br /><br /> if (licznik==3){<br /> PORTC &amp;= ~(1&lt;&lt;PC3);<br /> SendSpi(bufor&#91;2&#93;);<br /> }else<br /><br /> if (licznik==4){<br /> PORTC &amp;= ~(1&lt;&lt;PC2);<br /> SendSpi(bufor&#91;3&#93;);<br /> }else<br /><br /> if (licznik==5){<br /> PORTC &amp;= ~(1&lt;&lt;PC1);<br /> SendSpi(bufor&#91;4&#93;);<br /> }<br /><br />licznik++;<br /><br />}[/syntax]<br /><br />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...<br />Powiedzice mi czemu tak jest - bo skoro ja niemoge przyczyny znalesc to jak mi sie chociazby ten bufor uda oprogramowac...<br /><br />Gdy program jest w takiej postaci jak teraz to  jest jeden przebieg i cisza.... koniec świecenia.. a jak przy ifie sprawdzajacym warunek x&gt;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.<br /><br />Ponawiam wczesniejsze pytanie, dlaczego tez pierwszy wiersz wyświetlany jest jako ostatni ?<br />Przykład poniżej. Powinna byc cała ukosna kreska a w pierwszej linii jest kropka z ostatniej lini.<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1123/254b10b191479267dfcff9bca9d05144.gif"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/1123/254b10b191479267dfcff9bca9d05144.gif" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1123">Atmegowiec</a> — 19 mar 2014, o 15:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gordo]]></name></author>
<updated>2014-03-17T14:10:54+01:00</updated>
<published>2014-03-17T14:10:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74701#p74701</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74701#p74701"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74701#p74701"><![CDATA[
Do stworzenia skrola (przesuwającego się napisu) zrób tak:<br /><br />stwórz bufor dla wyświetlacza np. taki:<br /><br />    bajt3        bajt2         bajt1        bajt0<br />76543210 76543210 76543210 76543210  &lt;- bity poszczególnych bajtów dla pierwszego wiersza<br />    bajt7         bajt6         bajt5        bajt4<br />76543210 76543210 76543210 76543210  &lt;- to samo dla drugiego wiersza<br />itd ........<br /><br />Wielkość bufora obliczysz w ten sposób:<br />ilość wyświetlanych znaków + 1 (na bufor) * ilość wierszy<br /><br />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).<br /><br />Tak w skrócie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2592">gordo</a> — 17 mar 2014, o 14:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atmegowiec]]></name></author>
<updated>2014-03-17T13:58:04+01:00</updated>
<published>2014-03-17T13:58:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74699#p74699</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74699#p74699"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74699#p74699"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />co to jest ? zastosowałeś wprost kalkę z multipleksowania wyświetlaczy 7-segmentowych i dlatego kręcisz się w kółko jak bączek <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /></div><br /><br />Tak przyznaje powinno być: [syntax=c]volatile uint8_t wart&#91;4&#93;;[/syntax] ale myślę ze Panu chyba o coś innego chodziło ;/ tylko nie wiem o co.<br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />bo ty w przerwaniu chcesz wyświetlać pojedyncze jakieś znaki ? czy jak ? - sorki ale nie rozumiem tego<br /></div><br /><br />W przerwaniu chcę wyswietlać zawartosc bufora i wpisywac odpowiedni wiersz gdy akurat jest on wyświetlany<br />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:<br />[syntax=c]if (licznik==0){<br /> PORTC &amp;= ~(1&lt;&lt;PC5);<br /> SendSpi(bufor_ekranu&#91;0&#93;);[/syntax]<br /><br />bufor_ekranu[] zdefiniowałbym jako wskaznik, a wielkosc tablicy wbylaby wielkoscią mojego wyswietlacza czyli np 32x8 ?<br /><br />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...<br />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ć.<br /><br />Powyzej wstawiłem animacje przedstawiającą mój problem opisany w poprzednim poscie<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1123">Atmegowiec</a> — 17 mar 2014, o 13:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-03-17T12:53:07+01:00</updated>
<published>2014-03-17T12:53:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74694#p74694</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74694#p74694"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74694#p74694"><![CDATA[
no i widzisz ?<br /><br />[syntax=c]volatile uint8_t wart&#91;5&#93;;[/syntax]<br /><br />co to jest ? zastosowałeś wprost kalkę z multipleksowania wyświetlaczy 7-segmentowych i dlatego kręcisz się w kółko jak bączek <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />bo ty w przerwaniu chcesz wyświetlać pojedyncze jakieś znaki ? czy jak ? - sorki ale nie rozumiem tego<br /><br />więc jeszcze raz powtórzę<br /><br />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<br /><br />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.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 17 mar 2014, o 12:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atmegowiec]]></name></author>
<updated>2014-03-17T13:39:17+01:00</updated>
<published>2014-03-17T12:46:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74692#p74692</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74692#p74692"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74692#p74692"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />a jedyna różnica to nieco inna procedura multipleksowania no i jeden i większy bufor.<br /></div><br /><br />zmieniłem troche kod, odchudziłem go - bufora jescze nie wymysliłem  - ale chodzi mi o procedure przerwania tak to powinno wyglądac?<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />#include &quot;litery.h&quot;<br /><br />#define MOSI (1&lt;&lt;PB3)  //SER_A<br />#define SCK  (1&lt;&lt;PB5)  //ShiftClock<br />#define LT (1&lt;&lt;PB2)  //LT  &lt;-- pin SS na PB2 bo Atmega8<br /><br />#define LT_ON PORTB |= LT<br />#define LT_OFF PORTB &amp;= ~LT<br /><br /><br />void InitSpi( void );<br />void InitA( void );<br />void SendSpi( uint8_t bajt );<br />void SendChar(uint8_t wart&#91;&#93;);<br />void Scroll( void );<br />void copy(uint8_t zrodlo&#91;&#93;, uint8_t przeznaczenie&#91;&#93;);<br /><br />volatile uint8_t licznik=0;<br />volatile uint8_t timer1, timer2, timer3;<br /><br />uint8_t i;//licznik<br />uint8_t c;<br /><br />uint8_t string&#91;&#93; = &quot;1234567890&quot;;<br />uint8_t litera;<br />//uint8_t str&#91;&#93;;<br />volatile uint8_t wart&#91;5&#93;;<br /><br />int main( void ){<br /><br />DDRC = 255; //kierunek wierszy na wyjsciowy<br />PORTC = 0;  //stany niskie na piny portu C<br /><br />InitA();//inicjacja przerwania<br />InitSpi();  //inicjacja SPI<br /><br />sei();<br /><br />while(1){<br /><br />//SendChar(znaki&#91;string&#91;i&#93;-32&#93;,500);// wyswietlaa odpowiednitablice znaków z odstepem 500ms<br /><br />Scroll();<br />}<br />}<br /><br />void InitA( void ){<br />/* Ustawianie timera dla mulipleksowania tablicy */<br /><br />TCCR2 |= (1&lt;&lt;WGM21);//Tryb CTC<br />TCCR2 |= (1&lt;&lt;CS22) | (1&lt;&lt;CS21) | (1&lt;&lt;CS20);//Preskaler 1024<br />OCR2 = 31;// Wartosc &lt;31 by uzyskac 250 Hz czyli 50 na kazdy wiersz<br />TIMSK |= (1&lt;&lt;OCIE2);//Zezwolenie na Compare Match od Timera2<br />}<br /><br />void InitSpi( void ){<br />DDRB |= MOSI | SCK | LT;<br /><br />SPCR |= (1&lt;&lt;SPE) | (1&lt;&lt;MSTR); //odblokowanie SPI tryb Master<br />SPSR |= (1&lt;&lt;SPI2X);  // fosc/2<br /><br />}<br /><br />void SendSpi( uint8_t bajt ){<br /><br />SPDR = bajt;<br />while( !(SPSR &amp; (1&lt;&lt;SPIF))); //czekamy dopóki flaga nie zmieni sie na 1<br />LT_ON;<br />LT_OFF;<br /><br />}<br /><br />void Scroll( void ){<br /><br />//uint8_t wart&#91;5&#93; = {0};// tymcasowa tablica wyswietlająca znaki<br />uint8_t static b= 0; // zmienna okreslająca kolejne literki w w stringu do wyswietlenia 0 - początek stringu<br />int8_t static z=0;   // zmienna przesuwającą<br /><br />/*static by sie zmienna nie resetowała*/<br /><br /><br />for(c=0;c&lt;5;c++){ //przesuwanie kojeno poszczegolnych wierszy &#91;1-5&#93;<br />wart&#91;c&#93; = znaki&#91;string&#91;b&#93;-32&#93;&#91;c&#93;; //przepisywanie tablicy do tablicy tymczasowej uwzgledniając przesunięcie<br />}<br /><br />if(!timer2){<br />  timer2=150;<br />    b++;<br />    z++;<br />}<br /><br />if(string&#91;b&#93;== '\0') b=0;  // gdy ostatnia litera powroc na poczatek i<br /><br />}<br /><br /><br />void copy(uint8_t zrodlo&#91;&#93;, uint8_t przeznaczenie&#91;&#93;){<br />uint8_t i=0;//licznik do kopiowania<br />do<br />{<br />przeznaczenie&#91;i&#93; = zrodlo&#91;i&#93;;<br /><br />}while(zrodlo&#91;i++&#93;);<br />}<br />ISR(TIMER2_COMP_vect){<br /><br />uint8_t x;   //podstawa timera programowego<br /><br />PORTC = 255;//wyłącz wszytskie wiersze<br /> if (licznik==0){<br /> PORTC &amp;= ~(1&lt;&lt;PC5);<br /> SendSpi(wart&#91;0&#93;);<br /> }else<br /> if (licznik==1){<br />PORTC &amp;= ~(1&lt;&lt;PC4);<br />SendSpi(wart&#91;1&#93;);<br />}else<br /> if (licznik==2){<br /> PORTC &amp;= ~(1&lt;&lt;PC3);<br /> SendSpi(wart&#91;2&#93;);<br /> }else<br /> if (licznik==3){<br /> PORTC &amp;= ~(1&lt;&lt;PC2);<br /> SendSpi(wart&#91;3&#93;);<br /> }else<br /> if (licznik==4){<br /> PORTC &amp;= ~(1&lt;&lt;PC1);<br /> SendSpi(wart&#91;4&#93;);<br /> }<br /><br />licznik++;<br /><br />if(licznik&gt;3) licznik=0;<br /><br />x=timer1;//timer programowy<br />if(x) timer1 = --x;//timer programowy<br /><br />x=timer2;//timer programowy<br />if(x) timer2 = --x;//timer programowy<br /><br />x=timer3;//timer programowy<br />if(x) timer3 = --x;//timer programowy<br />}[/syntax]<br /><br />Ł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 &quot;ATNEL&quot; to wyswietlanie sie rozpocznie od litery T. Dlatego zawsze musiałem dawac &quot; ATNEL&quot;  9znak spacji&quot; zeby wyswiatlało od poczatku. NMie wiem z czego to wynika i to ze wyswietlanizej o jeden wiersz to jest podobna przyczyna chyba<br />Gdy daje warunek w przerwaniu &quot;licznik&gt;4&quot; to na pierwszym wierszy wyswietlają sie jakies losowe diody a litery u tak sa jeden niżej.<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1123/4c0b14a04a7293348578233336a80fc6.gif"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/1123/4c0b14a04a7293348578233336a80fc6.gif" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1123">Atmegowiec</a> — 17 mar 2014, o 12:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-03-17T12:08:26+01:00</updated>
<published>2014-03-17T12:08:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74689#p74689</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74689#p74689"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74689#p74689"><![CDATA[
<div class="quotetitle">Atmegowiec napisał(a):</div><div class="quotecontent"><br />dlatego sie uparłem, gdyz łtwiej multipleksowac 5 wierszy zamiast 32 kolumny<br /></div><br /><br />No widzisz - a ty wciąż swoje - co ma wspólnego multipleksowanie kolumn czy wierszy z wyświetlaniem znaków ? NIC <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />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. <br /><br />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.<br /><br />1. multipleksowanie - wyrzuca bufor (wierszami) na wyświetlacz<br />2. w pętli głównej innymi funkcjami wrzucasz sobie albo obrazki albo literki do bufora<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 17 mar 2014, o 12:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atmegowiec]]></name></author>
<updated>2014-03-17T11:03:45+01:00</updated>
<published>2014-03-17T11:03:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74682#p74682</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74682#p74682"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74682#p74682"><![CDATA[
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.<br />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) ?<br /><br />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 ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1123">Atmegowiec</a> — 17 mar 2014, o 11:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Kuźnia]]></name></author>
<updated>2014-03-17T07:39:09+01:00</updated>
<published>2014-03-17T07:39:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74676#p74676</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74676#p74676"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74676#p74676"><![CDATA[
Atmegowiec<br /><br />A dlaczego Ty się upierasz na wpisywanie wierszy ???? Przecież przy długim napisie rzeczywiście zabraknie Ci typów zmiennej.<br />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.<br /><br />Mam nadzieje, że to cię troche naprowadzi<br /><br />Pozdrawiamy<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2537">Kuźnia</a> — 17 mar 2014, o 07:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-03-16T20:28:01+01:00</updated>
<published>2014-03-16T20:28:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74630#p74630</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74630#p74630"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74630#p74630"><![CDATA[
<div class="quotetitle">Atmegowiec napisał(a):</div><div class="quotecontent"><br />Czy moze ja całkiem zle do tego podchodze?<br /></div><br /><br />źle podchodzisz bo cały czas jakby nie chcesz zrozumieć co to jest bufor ekranu <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />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. <br /><br /><div class="quotetitle">Atmegowiec napisał(a):</div><div class="quotecontent"><br />Musze wpisac do bufor wszytskie litery czyli wszystkie wzory liter [kropki] i dopiero taka tablice przesuwac?<br /></div><br /><br />No na przykład można tak .... jak się ktoś uprze<br /><br />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<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 16 mar 2014, o 20:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atmegowiec]]></name></author>
<updated>2014-03-16T20:20:25+01:00</updated>
<published>2014-03-16T20:20:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74625#p74625</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74625#p74625"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74625#p74625"><![CDATA[
Panie Mirku.. ale jak zmiescic wszystki &quot;kropki&quot; składające sie na cały zapis<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1123/f989dcd643d80d58f9f50e4884a0b8d9.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1123/f989dcd643d80d58f9f50e4884a0b8d9.jpg" alt="Obrazek" /></a><br /><br />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.<br />Czy moze ja całkiem zle do tego podchodze?<br /><br />Musze wpisac do bufor wszytskie litery czyli wszystkie wzory liter [kropki] i dopiero taka tablice przesuwac?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1123">Atmegowiec</a> — 16 mar 2014, o 20:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-03-16T19:51:46+01:00</updated>
<published>2014-03-16T19:51:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74618#p74618</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74618#p74618"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74618#p74618"><![CDATA[
oczywiście że uint8_t, a jakby wyświetlacz był 7 albo 15 razy dłuższy to co ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> zabrakłoby ci pewnie typu ...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 16 mar 2014, o 19:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atmegowiec]]></name></author>
<updated>2014-03-16T19:01:49+01:00</updated>
<published>2014-03-16T19:01:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74608#p74608</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74608#p74608"/>
<title type="html"><![CDATA[Re: Obsługa wyswietlacza diodowego - przesuwanie napisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6342&amp;p=74608#p74608"><![CDATA[
Niestety nei udało mi sie jeszcz ewykonac, tego z powodu ww probremu,<br />zastanawiam sie jeszcze ok.. musze miec bufor wyswietlający o długosci wszytskich znaków, jaką tablice zdeficiowac? uint8_t?<br />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<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1123/123d8712e3c5520dcc2a5e2b077eb5cc.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1123/123d8712e3c5520dcc2a5e2b077eb5cc.jpg" alt="Obrazek" /></a><br /><br />wartość końcowa powinna mieć 4 294 967 296  dla 32 kolumn wiec czy powinienem zdefiniowac bofor jako uint32_t   ?<br /><br />Czy może ja zle myslę?<br /><br />Czy moze wyswietlanie tekstu inaczej sie przedstawia...eh..<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1123">Atmegowiec</a> — 16 mar 2014, o 19:01</p><hr />
]]></content>
</entry>
</feed>