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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2021-06-14T14:44:40+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=23817&amp;mode</id>
<entry>
<author><name><![CDATA[marian253]]></name></author>
<updated>2021-06-14T14:44:40+01:00</updated>
<published>2021-06-14T14:44:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23817&amp;p=232720#p232720</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23817&amp;p=232720#p232720"/>
<title type="html"><![CDATA[Re: Wyświetlacz LED sterowany z dwóch rejestrów 74HC595]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23817&amp;p=232720#p232720"><![CDATA[
Oczywiście, że kod napiszę inaczej. Mam taką zasadę, że jak coś uruchamiam po raz pierwszy, to piszę kod w najprostszej postaci, żeby sprawdzić czy ruszy, jak ruszy to potem dopiero optymalizuję. Często prototypuję na stykówkach, tam nie trudno o pomyłkę, jak coś przestaje działać to zawsze mogę wrócić do swojego prymitywnego kodu i przynajmniej wykluczyć czy to hardware czy software.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20640">marian253</a> — 14 cze 2021, o 14:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[LukMeks]]></name></author>
<updated>2021-06-12T07:55:05+01:00</updated>
<published>2021-06-12T07:55:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23817&amp;p=232698#p232698</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23817&amp;p=232698#p232698"/>
<title type="html"><![CDATA[Re: Wyświetlacz LED sterowany z dwóch rejestrów 74HC595]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23817&amp;p=232698#p232698"><![CDATA[
Czy sprzętowe Spi czy programowe to w sumie mało ważne. Zależy jakie możliwości, czy masz &quot;gdzie robić&quot; czyli czy masz wolne piny, czy chcesz zrobić coś nowego lub czy wykorzystać gotowe, kiedyś zrobione funkcje. W sumie to chyba najważniejsze jest żeby dobrze opisać kod i  załapać się na tzw &quot;dobre praktyki programistyczne&quot; zwłaszcza jak robisz coś na zlecenie.<br />Swoją funkcję zrobiłem pół roku temu. Teraz napisałbym ją inaczej np. mam dwie tablice do cyfr bo mam różnie podpięte segmenty do rejestrów, gdyby zrobić to tak samo, zaoszczędziło by się kilka bajtów, program byłby prostszy i czytelniejszy. <br /><br />Nie wiem, czy nie dało by się napisać Twojej wyliczanki przy pomocy funkcji for po to by się tyle nie powtarzać. <br /><br />Hej<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21755">LukMeks</a> — 12 cze 2021, o 07:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marian253]]></name></author>
<updated>2021-06-10T20:27:50+01:00</updated>
<published>2021-06-10T20:27:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23817&amp;p=232687#p232687</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23817&amp;p=232687#p232687"/>
<title type="html"><![CDATA[Re: Wyświetlacz LED sterowany z dwóch rejestrów 74HC595]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23817&amp;p=232687#p232687"><![CDATA[
Hej, dzięki za zainteresowanie moim problemem. <br />Z tego co widzę to masz sprzętowe SPI, ja działam na soft SPI a to nie do końca to samo. <br />Dzisiaj zrobiłem coś takiego; stworzyłem drugi interface softSpi i z niego steruję drugi rejestr przesuwny, dopiero jak wyśle oba bajty uruchamiam zatrzask, który steruje obydwoma rejestrami. W sumie osiągnąłem swój cel, bo zwolniły mi się cztery piny mikrokontrolera. Wszystko działa idealnie. <br />Twój kod wygląda dość ciekawie, będę miał trochę czasu w weekend to go przeanalizuję. <br />Poniżej wrzucam kawałek swojego kodu, może trochę prymitywny, ale robi swoją robote.<br />[syntax=c]ISR(TIMER0_COMPA_vect) {<br /><br />static uint8_t licznik=1;// zmienna do przełączania kolejno anod wyrwietlacza<br /><br />ANODY_PORT = (ANODY_PORT | MASKA_ANODY);// wygaszenie wszystkich wyświetlaczy<br /><br /><br />if (licznik==1){<br />SendSoftSpi (pgm_read_byte( &amp;cyfry_DP&#91;cy1&#93; ));<br />SendSoftSpi2 (0xFE);<br />}<br />if (licznik==2){<br />SendSoftSpi (pgm_read_byte( &amp;cyfry&#91;cy2&#93; ));<br />SendSoftSpi2 (0xFD);<br />}<br />if (licznik==4) {<br />SendSoftSpi (pgm_read_byte( &amp;cyfry&#91;cy3&#93; ));<br />SendSoftSpi2 (0xFB);<br />}<br />if (licznik==8) {<br />SendSoftSpi (pgm_read_byte( &amp;cyfry_I&#91;cy4&#93; ));<br />SendSoftSpi2 (0xF7);<br />}<br />if (licznik==16) {<br />SendSoftSpi (pgm_read_byte( &amp;cyfry_I&#91;cy5&#93; ));<br />SendSoftSpi2 (0xEF);<br />}<br />if (licznik==32) {<br />SendSoftSpi (pgm_read_byte( &amp;cyfry_I&#91;cy6&#93; ));<br />SendSoftSpi2 (0xDf);<br />}<br /><br />ANODY_PORT = (ANODY_PORT &amp; ~MASKA_ANODY) | (~licznik &amp; MASKA_ANODY); // cykliczne przełączanie kolejnej anody w każdym przerwaniu<br /><br />// operacje cyklicznego przesuwania bitu zapalającego anody w zmiennej licznik<br /><br />licznik &lt;&lt;= 1;// przesunięcie zawartości bitów licznika o 1 w lewo<br />if(licznik&gt;32) licznik = 1;// jeśli licznik większy niż 32 to ustaw na 1<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20640">marian253</a> — 10 cze 2021, o 20:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[LukMeks]]></name></author>
<updated>2021-06-09T20:59:36+01:00</updated>
<published>2021-06-09T20:59:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23817&amp;p=232668#p232668</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23817&amp;p=232668#p232668"/>
<title type="html"><![CDATA[Re: Wyświetlacz LED sterowany z dwóch rejestrów 74HC595]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23817&amp;p=232668#p232668"><![CDATA[
Ja to ogarnąłem tak, że podłączyłem dwa rejestry do dwóch wyświetlaczy jednocyfrowych tak jak mi było wygodnej. Oczywiście anody do anod a katodę do minusa. Trzeba dac oczywiście oporniki pomiędzy zależne od rodzaju led. <br />Programowo wygląda to tak , że dzięki uprzejmości pana Mirka mam zrobioną funkcję, która ogarnia wysyłanie czyli odpowiednio :<br /><br />[syntax=c]void wyslijSPI2bajt(uint16_t y)<br />{<br />SPDR = y&gt;&gt;8;<br />while (!(SPSR &amp; (1&lt;&lt;SPIF)) );       <br />SPDR = y;<br />while (!(SPSR &amp; (1&lt;&lt;SPIF)) );<br />    LT_ON;<br />    LT_OFF;<br />}[/syntax]<br /><br />W tej funkcji pięknie dzieli się zmienną na dwa bajty. Jak by trzeba było wysłać trzy bajty dla trzech cyfr (wyświetlaczy) to wystarczy dopisać:<br />[syntax=c]SPDR = y&gt;&gt;16;<br />while (!(SPSR &amp; (1&lt;&lt;SPIF)) );[/syntax]<br /><br />Do tego mam zrobione dwie tablice z wartościami bitowymi dla cyfr od 0 do 9 dla każdego z wyświetlaczy.<br /><br />Na koniec mam funkcję, która korzysta z tych tablic i odpowiednio w zależności od wartości przekazywanej do niej wyświetla odpowiednią wartość. <br />Jak widać i co oczywiste mogę wyświetlać wynik od 0 do 99. <br />Hej.<br /><br />[syntax=c]uint16_t pc,dc;<br />void dwie_cyfry(int8_t cyfra)<br />{<br />if(cyfra&gt;99)<br />{<br />cyfra = 99;<br />}<br />if(cyfra&lt;0) <br />{<br />cyfra = 0;<br />}<br />if (cyfra&lt;10) <br />{<br />pc=0;dc = (druga_cyfra&#91;cyfra&#93;);<br />}<br />else<br />{<br />pc = druga_cyfra&#91;cyfra%10&#93;; <br />dc = pierwsza_cyfra&#91;cyfra / 10&#93;;<br />}<br />wyslijSPI2bajt (dc | pc);  //suma bitowa<br />}[/syntax]<br /><br />Czyli chodzi tylko o to, żeby zrobić sobie gotowe liczby, które potem się tylko łączy, wyrzuca na rejestry, włącza i wyłącza zatrzask i już. <br />PS. Też jestem początkujący. <br />hej<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21755">LukMeks</a> — 9 cze 2021, o 20:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marian253]]></name></author>
<updated>2021-06-08T19:00:09+01:00</updated>
<published>2021-06-08T19:00:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23817&amp;p=232660#p232660</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23817&amp;p=232660#p232660"/>
<title type="html"><![CDATA[Wyświetlacz LED sterowany z dwóch rejestrów 74HC595]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23817&amp;p=232660#p232660"><![CDATA[
Witam wszystkich. <br />Postanowiłem założyć nowy wątek, bo temat przewija się przez forum od jakiegoś czasu, ale nie znalazłem konkretnej odpowiedzi. <br />Chodzi o kompleksowe sterowanie wyświetlaczy LED poprzez dwa rejestry przesuwne 74HC595, czyli katody i anody. <br />W oparciu o BB i poradniki Pana Mirka napisałem program z użyciem jednego rejestru (sterowanie katod przez SoftSpi), anody steruję z mikrokontrolera i wszystko działa prawidłowo. Problem pojawia się jak podłączę drugi rejestr kaskadowo, żeby sterować nim anody. Nie wiem jak to ogarnąć programowo, żeby wysłać dwa bajty za jednym razem poprzez SoftSpi. Mam podłączone dwa wyświetlacze 3-cyfrowe, docelowo chcę mierzyć napięcie na dwóch pinach mikrokontrolera i wyświetlać wartości na tych dwóch wyświetlaczach. <br />Jak wspominałem wcześniej, to wszystko działa jeśli anody steruję z mikrokontrolera.<br />Poniżej kawałek kodu z piku d_led.c. <br />Zakomentowałem wszystkie if-y żeby pokazać co działa. Jeśli do zmiennej „data” przypiszę na siłę np. 0xFFFF (starszy bajt anody, młodszy katody) to mam na wyjściu obu rejestrów stany wysokie, dla 0xFF00 na pinach rejestru od anod mam stany wysokie, na tym od katod - niskie, jakakolwiek inna kombinacja daje odpowiednie stany logiczne na poszczególnych pinach rejestrów. Mogę zapalać dowoli poszczególne cyfry i pojedyncze segmenty, więc hardware jest ok., komunikacja SoftSpi też działa. <br />Nie wiem co wpisać do kolejnych przerwań timera, żeby oprócz kodu cyfry, wysłać również odpowiednią komendę do rejestru sterującego anodami, czyli do starszego bajtu w słowie. Próbowałem różnych kombinacji i nic nie działa, prosiłbym o jakąś podpowiedź.<br />[syntax=c]//***********Soft SPI*********************<br />// definicja funkcji inicjalizacji SoftSpi<br /><br />void InitSoftSpi (void) {<br />DDRA |= (1&lt;&lt;SMOSI) | (1&lt;&lt;SSCK) | (1&lt;&lt;SCS);<br />}<br /><br />// definicja funkcji wysylajacej bajt<br />void SendSoftSpi (uint16_t word) {<br />uint16_t cnt = 0x8000;<br /><br />SCK_0;<br />// wysylamy bajt do oukladu Slave<br />while (cnt) {<br />if (word &amp; cnt) MOSI_1;<br />else MOSI_0;<br />SCK_1;<br />SCK_0;<br /><br />cnt&gt;&gt;=1;<br />}<br />// czekamy az zostanie wyslany ostatni bit<br /><br />PORTA |= (1&lt;&lt;SCS);// zbocze narastajace sygnalu Latch Clock przerzuca wartosci do wyjsc Qa-Qh<br />PORTA &amp;= ~(1&lt;&lt;SCS);<br />}<br /><br /><br />// ****** definicja funkcji inicjalizującej pracę z wyświetlaczem multipleksowanym<br />void d_led_init(void)<br />{<br />ANODY_DIR |= CA1 | CA2 | CA3 | CA4 | CA5 | CA6;// 4 piny portu A jako WYJŚCIA (anody wyświetlaczy)<br />ANODY_PORT |= CA1 | CA2 | CA3 | CA4 | CA5 | CA6; // wygaszenie wszystkich wyświetlaczy - anody<br /><br />// ustawienie TIMER0<br />TCCR0A |= (1&lt;&lt;CTC0);// tryb CTC<br />TCCR0B |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);// preskaler = 1024<br />OCR0A = 12;// dodatkowy podział przez 12 (rej. przepełnienia), przy FCPU 8MHz f=100Hz na segment<br />TIMSK |= (1&lt;&lt;OCIE0A);// zezwolenie na przerwanie CompareMatch<br /><br />InitSoftSpi ();<br />}<br /><br />// ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH<br />ISR(TIMER0_COMPA_vect)<br />{<br />uint16_t data=0xC0FE;// starszy bajt drugi rejestr (anody), najstarszy bit-ostatnie wyjscie QH<br />// mlodszy bajt pierwszy rejestr (katody), najstarszy bit ostatnie wyjscie QH<br /><br />static uint8_t licznik=1;// zmienna do przełączania kolejno anod wyrwietlacza<br /><br />ANODY_PORT = (ANODY_PORT | MASKA_ANODY);// wygaszenie wszystkich wyświetlaczy<br />/*<br />if(licznik==1) data = pgm_read_byte( &amp;cyfry&#91;cy1&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej cy1<br />else if(licznik==2) data = pgm_read_byte( &amp;cyfry&#91;cy2&#93; );// gdy zapalony wyśw.2 podaj stan zmiennej cy2<br />else if(licznik==4) data = pgm_read_byte( &amp;cyfry&#91;cy3&#93; );// gdy zapalony wyśw.3 podaj stan zmiennej cy3<br />else if(licznik==8) data = pgm_read_byte( &amp;cyfry_I&#91;cy4&#93; );// gdy zapalony wyśw.4 podaj stan zmiennej cy4<br />else if(licznik==16) data = pgm_read_byte( &amp;cyfry_I&#91;cy5&#93; );// gdy zapalony wyśw.5 podaj stan zmiennej cy5<br />else if(licznik==32) data = pgm_read_byte( &amp;cyfry_I&#91;cy6&#93; );// gdy zapalony wyśw.6 podaj stan zmiennej cy6<br />*/<br />// Wartosci &quot;licznik&quot; sa to wagi klejnych bitow.<br />// Nalezy je ustawic zgodnie z tym jak sa zdefiniowane piny anod, CA1,CA2,CA3 w pliku d_led.h<br /><br />SendSoftSpi (data);<br /><br />ANODY_PORT = (ANODY_PORT &amp; ~MASKA_ANODY) | (~licznik &amp; MASKA_ANODY); // cykliczne przełączanie kolejnej anody w każdym przerwaniu<br /><br />// operacje cyklicznego przesuwania bitu zapalającego anody w zmiennej licznik<br />licznik &lt;&lt;= 1;// przesunięcie zawartości bitów licznika o 1 w lewo<br />if(licznik&gt;32) licznik = 1;// jeśli licznik większy niż 4 to ustaw na 1 (zmiana z 8 na 4 dla trzech segmentow)<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20640">marian253</a> — 8 cze 2021, o 19:00</p><hr />
]]></content>
</entry>
</feed>