<?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=3635&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-07-23T14:15:03+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=3635&amp;mode</id>
<entry>
<author><name><![CDATA[PawelGaj]]></name></author>
<updated>2013-07-23T14:15:03+01:00</updated>
<published>2013-07-23T14:15:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3635&amp;p=43024#p43024</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3635&amp;p=43024#p43024"/>
<title type="html"><![CDATA[Matryca LED 40x8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3635&amp;p=43024#p43024"><![CDATA[
Witam. Mam pewien problem z matrycą 40x8. Mianowicie, chciałem zrobić sobie całą matrycę razem z multpleksowaniem wierszy na rejestrach 595. Zrobiłem tak przy matrycy 24x8 i działało, jednak działać nie chce na matrycy 40x8. Tak na prawdę to działa, tylko pojawiają się wszędzie dziwne duszki <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> Zdjęcie przedstawiające duszki :<br /><img src="http://forum.atnel.pl/_obrazki/o/784/d1f62e8af9dbcacc8bfda472bd4aadbb.jpg" alt="Obrazek" /><br />Próbowałem walczyć z nimi na wszystkie możliwe sposoby i poległem. Oto kod, który przedstawia co powinno się wyświetlić :<br />[syntax=c]for(uint8_t a = 0; a &lt; 8; a+=2)<br />{<br />for(uint8_t i = 0; i &lt; 3; i++)<br />{<br />MatrixBuf&#91;a&#93;&#91;i&#93; = 2;<br />}<br />}[/syntax]<br /><br />A tutaj kod razem z przerwaniem odpowiadającym za wysyłanie danych do rejestrów. Pozwoliłem sobie wyciąć funkcje które nie są w ogóle używane w kodzie, aby nie robić nie potrzebnie bałaganu :<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;MatrycaLED.h&quot;<br /><br />volatile uint8_t MatrixBuf&#91;MATRIX_MOD_Y * 8&#93;&#91;MATRIX_MOD_X&#93;;<br />volatile uint8_t RowBuf&#91;MATRIX_MOD_Y&#93;;<br />volatile uint8_t RowBufIdx;<br />volatile uint8_t RowBufCnt;<br /><br />void WriteTo595(uint8_t Data, uint8_t Bits)<br />{<br />PORT(CS_PORT) &amp;= ~(1&lt;&lt;CS_PIN);<br />PORT(SCK_PORT) &amp;= ~(1&lt;&lt;SCK_PIN);<br />PORT(MOSI_PORT) &amp;= ~(1&lt;&lt;MOSI_PIN);<br /><br />for(uint8_t i = 0; i &lt; Bits; i++)<br />{<br />PORT(SCK_PORT) &amp;= ~(1&lt;&lt;SCK_PIN);<br /><br />if(Data &amp; (1&lt;&lt;i)) PORT(MOSI_PORT) |= (1&lt;&lt;MOSI_PIN);<br />elsePORT(MOSI_PORT) &amp;= ~(1&lt;&lt;MOSI_PIN);<br /><br />PORT(SCK_PORT) |= (1&lt;&lt;SCK_PIN);<br />PORT(MOSI_PORT) &amp;= ~(1&lt;&lt;MOSI_PIN);<br />}<br /><br />PORT(CS_PORT) |= (1&lt;&lt;CS_PIN);<br />PORT(SCK_PORT) &amp;= ~(1&lt;&lt;SCK_PIN);<br />PORT(MOSI_PORT) &amp;= ~(1&lt;&lt;MOSI_PIN);<br />}<br /><br />void InitMatrix(void)<br />{<br />// ########## Ustawianie kierunku pinow ##########<br />DDR(CS_PORT)|= (1&lt;&lt;CS_PIN);<br />DDR(MOSI_PORT)|= (1&lt;&lt;MOSI_PIN);<br />DDR(SCK_PORT)|= (1&lt;&lt;SCK_PIN);<br /><br />// ########## Ustawianie timera ##########<br />#if USED_TIMER == 0<br />TCCR0 |= (1&lt;&lt;CS02);// Preskaler = 256<br />TCCR0 |= (1&lt;&lt;WGM01);// Tryb = CTC<br />OCR0  = 86;// Czestotliwosc 5ms/200Hz<br />TIMSK  |= (1&lt;&lt;OCIE0);// Odblokowanie przerwania CTC od Timera 0<br />#endif<br /><br />#if USED_TIMER == 1<br />TCCR1B |= (1&lt;&lt;CS12);// Preskaler = 256<br />TCCR1B |= (1&lt;&lt;WGM12);// Tryb = CTC<br />OCR1A  = 86;// Czestotliwosc 5ms/200Hz<br />TIMSK  |= (1&lt;&lt;OCIE1A);// Odblokowanie przerwania CTC od Timera 1<br />#endif<br /><br />#if USED_TIMER == 2<br />TCCR2 |= (1&lt;&lt;CS21)|(1&lt;&lt;CS22);// Preskaler = 256<br />TCCR2 |= (1&lt;&lt;WGM21);// Tryb = CTC<br />OCR2  = 86;// Czestotliwosc 5ms/200Hz<br />TIMSK  |= (1&lt;&lt;OCIE2);// Odblokowanie przerwania CTC od Timera 2<br />#endif<br />}<br /><br />#if USED_TIMER == 0<br />ISR(TIMER0_COMP_vect)<br />#endif<br /><br />#if USED_TIMER == 1<br />ISR(TIMER1_COMPA_vect)<br />#endif<br /><br />#if USED_TIMER == 2<br />ISR(TIMER2_COMP_vect)<br />#endif<br />{<br /><br /><br />// ############################################<br />// ########## Obsluga tablic matrycy ##########<br />// ############################################<br /><br />RowBufCnt++;// Inkrementowanie zmiennej sledzenia wiersza<br /><br />if(RowBufCnt == 8)// Jesli zmienna sledzenia wiersza jest wieksza niz laczna ilosc wierszy to<br />{<br />RowBufCnt = 0;// Wyzeruj zmienna<br />if(MATRIX_MOD_Y &gt;= 2) RowBufIdx++;// Jesli jest wiecej niz 1 modul to inkrementuj indeks bufora wierszy<br />}<br /><br />if(RowBufIdx == MATRIX_MOD_Y) RowBufIdx  = 0;// Jesli indeks bufora wierszy jest wiekszy niz ilosc wierszy to go zeruj<br /><br />if(RowBufCnt == 0)// Jesli zmienna sledzenia wiersza zostala wyzerowana<br />{<br />if(RowBufIdx)// I jest wiecej niz jeden wiersz modulow<br />{<br />RowBuf&#91;RowBufIdx - 1&#93; &amp;= ~(1&lt;&lt;7);// To wylacz ostatni wiersz na ostatnim module<br />}<br />else// Jesli jest tylko jeden wiersz modulow<br />{<br />RowBuf&#91;0&#93; &amp;= ~(1&lt;&lt;7);// To wyzeruj ostani wiersz w pierwszym module<br />}<br />}<br />else// Jesli indeks nie byl ostatnio zerowany to:<br />{<br />RowBuf&#91;RowBufIdx&#93; &amp;= ~(1&lt;&lt;(RowBufCnt - 1));// Wylacz ostatni wiersz<br />}<br /><br />RowBuf&#91;RowBufIdx&#93; |= (1&lt;&lt;RowBufCnt);// I wlacz aktualny wiersz<br /><br /><br />// #####################################<br />// ########## Obsluga matrycy ##########<br />// #####################################<br /><br />// ########## Usuwanie danych z rejestrow ##########<br />WriteTo595(0, ((MATRIX_MOD_X * 8) + (MATRIX_MOD_Y * 8)));<br /><br />// ########## Wysylanie bufora wlaczania wierszow ##########<br />for(uint8_t i = 0; i &lt; MATRIX_MOD_Y; i++)<br />{<br />WriteTo595(RowBuf&#91;i&#93;, 8);<br />}<br /><br />// ########## Wysylanie calego wiersza ##########<br />for(uint8_t a = 0; a &lt; MATRIX_MOD_X; a++)<br />{<br />WriteTo595(MatrixBuf&#91;RowBufCnt&#93;&#91;a&#93;, 8);<br />}<br />}[/syntax]<br /><br />I plik nagłówkowy :<br />[syntax=c]#ifndef MATRYCALED_H_<br />#define MATRYCALED_H_<br /><br />// ########## REJESTR PRZESUWNY 595 ##########<br />#define CS_PIN0<br />#define CS_PORT B<br /><br />#define MOSI_PIN1<br />#define MOSI_PORTB<br /><br />#define SCK_PIN3<br />#define SCK_PORTB<br /><br />// ########## MATRYCA ##########<br />#define MATRIX_MOD_X 5<br />#define MATRIX_MOD_Y 1<br />#define USED_TIMER 0<br /><br />// ########## DEFINICJE POMOCNICZE ##########<br />#define PORT(x) SPORT(x)<br />#define SPORT(x) (PORT##x)<br /><br />#define DDR(x) SDDR(x)<br />#define SDDR(x) (DDR##x)<br /><br />void WriteTo595(uint8_t Data, uint8_t Bits);<br />void InitMatrix(void);<br /><br />#endif /* MATRYCALED_H_ */[/syntax]<br />Z góry dzięki za pomoc <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=784">PawelGaj</a> — 23 lip 2013, o 14:15</p><hr />
]]></content>
</entry>
</feed>