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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-10-01T22:41:02+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=8509&amp;mode</id>
<entry>
<author><name><![CDATA[doman89]]></name></author>
<updated>2014-10-01T22:41:02+01:00</updated>
<published>2014-10-01T22:41:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=97297#p97297</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=97297#p97297"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=97297#p97297"><![CDATA[
Witam,<br /><br /><div class="quotetitle">moscow18-1990 napisał(a):</div><div class="quotecontent"><br />po pierwsze nie rozumiem trochę takiej linijki:<br /><br />[syntax=c]ANODY_PORT = (ANODY_PORT &amp; 0xF0);// wygaszenie wszystkich wyœwietlaczy[/syntax]<br /></div><br /><br />Kolega tu masz iloczyn bitowy, czyli takie coś np:<br />   xxxx0010 (x - jakis stan, ktorego nie ruszasz np. DS18B20, z Anod masz Px1 aktywny)<br />&amp; 11110000 (binarnie 0xF0 - jedynki są aby nie zmienić stanu, mnożenie cokolwiek przez jeden daje to cokolwiek <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />)<br />------------<br />   xxxx0000 (Taki wynik)<br /><br />Czyli wygaszasz wszystkie wyświetlacze. Po co to robić? A no po to, żeby nie było tzw. &quot;duszków&quot;, czyli lekko jasnych cyfr (np. poprzedniej). Daje to nie fajny efekt wizualny.<br /><br /><div class="quotetitle">moscow18-1990 napisał(a):</div><div class="quotecontent"><br />i zamieniłem ją na taką:<br /><br />[syntax=c]ANODY_PORT = ~licznik;[/syntax]<br /><br />I w moim odczuciu odpowiada ona za pojawienie sie stanu niskiego na wyświetlaczu a nie za wygaszenie wszystkich jaka jest różnica pomiedzy tymi zapisami ten drugi jest całkowicie zrozumiały chyba. Mam np. licznik=1 to bedzie binarnie 0b0000 0001 a skoro mam tranzystor pnp i wspólną anodą to musi &quot;wędrować&quot; stan niski więc negujemy i mamy 0b1111 1110, dobrze rozumuję?<br /></div><br /><br />No i tu kolega jak rozbuduje projekt o jakieś dodatkowe peryferia to odczuje dlaczego to jest błąd <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Ale już postaram się wytłumaczyć. To co kolega zamienił robi dokładnie to samo (choć w uboższej wersji) co linijka z maskowaniem. Wcześniej wygaszone zostały wyświetlacze, przypisujemy odpowiednie stany na kolejny wyświetlacz i dopiero wtedy go zapalamy. Po to właśnie aby zapobiec tym tzw. &quot;duszkom&quot;. Linijka w/w przy okazji przerwie każdą możliwą transmisję, lub zakłóci pracę innych peryferii układu. Bo np. DS18B20 będzie musiał mieć przez np. 60 us stan niski, a kolega w połowie mu zarzuci stan wysoki. I kiszka <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Czyli podsumowując kolega dał linijkę która wykonuje zupełnie coś innego, niż to było zaplanowane.<br /><br /><div class="quotetitle">moscow18-1990 napisał(a):</div><div class="quotecontent"><br />no i w ogóle chodzi mi o operację na bitach w przerwaniu bo w sumie jest to w niebieskiej książce ale mam pewne problemiki o to kod<br /><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 = ~licznik;  // wygaszenie wszystkich wyświetlaczy???<br /><br /><br />if(licznik==1) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy1&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />else if(licznik==2) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy2&#93; );// gdy zapalony wyśw.2 podaj stan zmiennej c2<br />else if(licznik==4) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy3&#93; );// gdy zapalony wyśw.3 podaj stan zmiennej c3<br />else if(licznik==8) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy4&#93; );// gdy zapalony wyśw.4 podaj stan zmiennej c4<br /><br />ANODY_PORT = (ANODY_PORT &amp; 0xF0) | (~licznik &amp; 0x0F);// 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;8) licznik = 1;// jeśli licznik większy niż 8 to ustaw na 1<br />}[/syntax]<br /><br />a w szczególności ta szalona linijka kodu jest intrygująca:<br /><br />[syntax=c]ANODY_PORT = (ANODY_PORT &amp; 0xF0) | (~licznik &amp; 0x0F);[/syntax]<br /><br />a więc powiedzmy że punktem wyjścia jest wartość zanegowanego licznika czyli 0b1111 1110. Jak dalej będą wyglądały te operacje na bitach? Przydałoby się żeby jakiś specjalista to rozpisał i objaśnił. Wiem tylko tyle że jest tu maska bitowa mająca na celu &quot;uchronienie przed manipulowaniem&quot; na bitach do których nie są podpięte anody. Przepraszam że tak męczę ten temat ale muszę gruntownie zrozumieć ten temat<br /></div><br /><br />Kolega tu nie trzeba żadnego specjalisty <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, parę przykładów zrobisz i sam zobaczysz, że to proste.<br />Tak więc jak zwykle tu kolega ma konsekwencję zabezpieczenia pinów które nie służą do sterowania anodami, a nie chce zmienić ich stanu co by nie zakłócać.<br /><br />Więc przykład z kosmosu:) :<br />Na porcie mamy takie dane 0101 0010 (pierwsza czwórka to np. linia SPI, druga to anody Px1 aktywne), licznik nam się zwiększył więc musimy przeskoczyć na Px2, ale stan SPI w danej chwili musi być identyczny więc jedziemy z obliczeniami:<br /><br />1. (ANODY_PORT &amp; 0xF0)<br /><br /> 0101 0010 - ANODY_PORT<br />&amp;1111 0000 - 0xF0<br />-----------<br /> 0101 0000 - Wynik 1<br /><br />Tu mamy maskę, aby nie zakłócić SPI, co widać, że pierwsza czwórka bitów jest nie ruszona.<br /><br />2. (~licznik &amp; 0x0F)<br /><br /> 0000 0100 - ~licznik<br />&amp;0000 1111 - 0x0F<br />------------<br /> 0000 0100 - Wynik 2<br /><br />Od razu wspomnę bo we wcześniejszych postach jakiś kolega wypomniał, że nie mam tego obliczenia. Jak widać, który z czterech wyświetlaczy by nie był opisany w liczniku to ten iloczyn nic nie wnosi <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />3. (ANODY_PORT &amp; 0xF0) | (~licznik &amp; 0x0F)<br /><br /> 0101 0000 - Wynik 1<br />|0000 0100 - Wynik 2<br />------------<br /> 0101 0100 - Wynik zapisywany do ANODY_PORT<br /><br />Tak więc kolega widzi, że nastąpiło przesunięcie wyświetlacza, a dane na SPI nie ruszone <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Taki to ma cel.<br /><br /><span style="color: #0000FF">z Niebieskim pozdRowieniem,<br />Doman89</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3271">doman89</a> — 1 paź 2014, o 22:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[moscow18-1990]]></name></author>
<updated>2014-10-01T21:32:32+01:00</updated>
<published>2014-10-01T21:32:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=97290#p97290</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=97290#p97290"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=97290#p97290"><![CDATA[
Dobra zadziałało wyświetla mi różne znaki na wyświetlaczach, timer jest dobrze skonfigurowany, próbowałem zmieniać ten rejestr przepełnienia i zmieniała się częstotliwość wyświetlania w sumie fajnie ale sa rzeczy o które muszę zapytać  a mianowicie(na razie pierwsze pytanko jak uzyskam odp to jeszcze ze dwa zadam) :<br />chodzi o operacje na bitach:<br /><br />po pierwsze nie rozumiem trochę takiej linijki:<br /><br />[syntax=c]ANODY_PORT = (ANODY_PORT &amp; 0xF0);// wygaszenie wszystkich wyœwietlaczy[/syntax]<br /><br />i zamieniłem ją na taką:<br /><br />[syntax=c]ANODY_PORT = ~licznik;[/syntax]<br /><br />I w moim odczuciu odpowiada ona za pojawienie sie stanu niskiego na wyświetlaczu a nie za wygaszenie wszystkich jaka jest różnica pomiedzy tymi zapisami ten drugi jest całkowicie zrozumiały chyba. Mam np. licznik=1 to bedzie binarnie 0b0000 0001 a skoro mam tranzystor pnp i wspólną anodą to musi &quot;wędrować&quot; stan niski więc negujemy i mamy 0b1111 1110, dobrze rozumuję?<br /><br />no i w ogóle chodzi mi o operację na bitach w przerwaniu bo w sumie jest to w niebieskiej książce ale mam pewne problemiki o to kod<br /><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 = ~licznik;  // wygaszenie wszystkich wyświetlaczy???<br /><br /><br />if(licznik==1) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy1&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />else if(licznik==2) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy2&#93; );// gdy zapalony wyśw.2 podaj stan zmiennej c2<br />else if(licznik==4) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy3&#93; );// gdy zapalony wyśw.3 podaj stan zmiennej c3<br />else if(licznik==8) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy4&#93; );// gdy zapalony wyśw.4 podaj stan zmiennej c4<br /><br />ANODY_PORT = (ANODY_PORT &amp; 0xF0) | (~licznik &amp; 0x0F);// 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;8) licznik = 1;// jeśli licznik większy niż 8 to ustaw na 1<br />}[/syntax]<br /><br />a w szczególności ta szalona linijka kodu jest intrygująca:<br /><br />[syntax=c]ANODY_PORT = (ANODY_PORT &amp; 0xF0) | (~licznik &amp; 0x0F);[/syntax]<br /><br />a więc powiedzmy że punktem wyjścia jest wartość zanegowanego licznika czyli 0b1111 1110. Jak dalej będą wyglądały te operacje na bitach? Przydałoby się żeby jakiś specjalista to rozpisał i objaśnił. Wiem tylko tyle że jest tu maska bitowa mająca na celu &quot;uchronienie przed manipulowaniem&quot; na bitach do których nie są podpięte anody. Przepraszam że tak męczę ten temat ale muszę gruntownie zrozumieć ten temat<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5472">moscow18-1990</a> — 1 paź 2014, o 21:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[doman89]]></name></author>
<updated>2014-09-27T20:50:04+01:00</updated>
<published>2014-09-27T20:50:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96891#p96891</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96891#p96891"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96891#p96891"><![CDATA[
Witam,<br /><br /><div class="quotetitle">moscow18-1990 napisał(a):</div><div class="quotecontent"><br />okejjj czyli ta pętla po prostu &quot;losuje&quot; element tablicy tak i przypisuje do zmiennej np. cy1? Czyli na dobrą sprawę nie muszę robić takiej pętli tylko mogę się odwołać do poszczególnego elementu tablicy? W sumie zajarzyłem ale ciężkie to... ten licznik-- zmniejsza tą wartość 6000 tak? A moj kolejny dylemat to jak działa ten licznik w przerwaniu(odwołuję się do kodu z płyty, mój program ewoluuje wraz z waszymi wskazówkami):<br /><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 &amp; 0x0F);  // wygaszenie wszystkich wyświetlaczy<br /><br /><br />if(licznik==1) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy1&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />else if(licznik==2) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy2&#93; );// gdy zapalony wyśw.2 podaj stan zmiennej c2<br />else if(licznik==4) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy3&#93; );// gdy zapalony wyśw.3 podaj stan zmiennej c3<br />else if(licznik==8) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy4&#93; );// gdy zapalony wyśw.4 podaj stan zmiennej c4<br /><br />ANODY_PORT = (ANODY_PORT &amp; 0xF0) | (~licznik &amp; 0x0F);// 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;8) licznik = 1;// jeśli licznik większy niż 8 to ustaw na 1<br />}[/syntax]<br />'<br />Nie za bardzo jażę jak zmienia się ten licznik w przerwaniu przecież nie ma tu żadnej pętli... No i czy w ogóle ten licznik jest jakoś &quot;powiązany&quot; z tą petlą while i tym licznikiem równym 6000? Dlaczego przybiera on wartość 1 później 2 itd jak to się dzieje? Każde kolejne przerwanie to powoduje? Ciężki temat...<br /></div><br /><br />Kolega kolejny trywialny przykład <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Więc jedziemy zmienna licznik = 1 to jest dla uC:<br />00000001 - to już wiesz, czyli zapalamy anodę wyświetlacza pod np. PA0<br /><br />Później masz<br />licznik &lt;&lt;= 1; - czyli przesunięcie bitowe w lewo (co to jest odsyłam do poradnika p. Mirka),<br />więc licznik = 2, czyli:<br />00000010,<br /><br />następnie znów masz przesunięcie i wychodzi:<br />00000100 czyli licznik = 4 to już zapalasz anodę na pinie PA2.<br /><br />Oczywiście funkcja którą wykonuje przerwanie jest ściśle powiązana z Twoim programem. Przerwanie co określony czas (dla wyświetlaczy 7-seg przeciętnie 50Hz*liczba_wyswietlaczy) wyrzuca na wyświetlacze Twoje zmienne cy1, cy2, cy3, cy4. Ty zmieniasz je sobie w programie, a przerwanie dekoduje i wyświetla dane na wyświetlaczu.<br /><br /><span style="color: #0000FF">z Niebieskim pozdRowieniem,<br />Doman89</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3271">doman89</a> — 27 wrz 2014, o 20:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[moscow18-1990]]></name></author>
<updated>2014-09-27T11:14:49+01:00</updated>
<published>2014-09-27T11:14:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96812#p96812</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96812#p96812"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96812#p96812"><![CDATA[
okejjj czyli ta pętla po prostu &quot;losuje&quot; element tablicy tak i przypisuje do zmiennej np. cy1? Czyli na dobrą sprawę nie muszę robić takiej pętli tylko mogę się odwołać do poszczególnego elementu tablicy? W sumie zajarzyłem ale ciężkie to... ten licznik-- zmniejsza tą wartość 6000 tak? A moj kolejny dylemat to jak działa ten licznik w przerwaniu(odwołuję się do kodu z płyty, mój program ewoluuje wraz z waszymi wskazówkami):<br /><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 &amp; 0x0F);  // wygaszenie wszystkich wyświetlaczy<br /><br /><br />if(licznik==1) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy1&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />else if(licznik==2) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy2&#93; );// gdy zapalony wyśw.2 podaj stan zmiennej c2<br />else if(licznik==4) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy3&#93; );// gdy zapalony wyśw.3 podaj stan zmiennej c3<br />else if(licznik==8) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy4&#93; );// gdy zapalony wyśw.4 podaj stan zmiennej c4<br /><br />ANODY_PORT = (ANODY_PORT &amp; 0xF0) | (~licznik &amp; 0x0F);// 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;8) licznik = 1;// jeśli licznik większy niż 8 to ustaw na 1<br />}[/syntax]<br />'<br />Nie za bardzo jażę jak zmienia się ten licznik w przerwaniu przecież nie ma tu żadnej pętli... No i czy w ogóle ten licznik jest jakoś &quot;powiązany&quot; z tą petlą while i tym licznikiem równym 6000? Dlaczego przybiera on wartość 1 później 2 itd jak to się dzieje? Każde kolejne przerwanie to powoduje? Ciężki temat...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5472">moscow18-1990</a> — 27 wrz 2014, o 11:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[doman89]]></name></author>
<updated>2014-09-25T16:14:17+01:00</updated>
<published>2014-09-25T16:14:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96670#p96670</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96670#p96670"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96670#p96670"><![CDATA[
Witam,<br /><br />Kolega to ja spróbuję w ten deseń:<br /><br />Chcesz do zmiennej np. cyfra1 zapisać liczbę 4.<br /><br />To to dajesz:<br /><br /><strong>cyfra1</strong> = 4;<br /><br />Ale co to jest liczba 4 dla mikrokontrolera? Mianowice:<br />00000100 - to jest dla mikrokontorlera liczba 4 (czyli binarnie - jak wiemy każdy komputer działa w oparciu o informację jest sygnał lub go nie ma <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ).<br /><br />Tak więc jeżeli do portu np. A przypiszesz liczbę 4, to będziesz miał takie sygnały:<br />PA0 - 0<br />PA1 - 0<br />PA2 - 1<br />PA3 - 0<br />PA4 - 0<br />PA5 - 0<br />PA6 - 0<br />PA7 - 0<br /><br />Tak więc na wyświetlaczu będziesz miał podświetlony jeden segment, który będzie podpięty pod PA2. Więc co Ci będzie mówić taka informacja? Tyle co zegarek od predatora <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Dlatego masz tablicę ze zdefiniowanymi znakami, które określają jak mają być piny ustawione, abyś na wyświetlaczu uzyskał 4. Więc do tablicy podajesz zmienną <strong>cyfra1</strong> i wtedy pobierasz z tablicy elementów czwarty wzór (bo <strong>cyfra1</strong> = 4) i uzyskujesz czwóreczkę <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Ważne tu aby elementy tablicy były kolejno ułożone tj.<br />cyfry[0] - prezentacja bitów aby uzyskać liczbę zero - zapalonych odpowiednich 6 segmentów.<br />cyfry[1] - prezentacja bitów aby uzyskać liczbę jeden - zapalonych odpowiednio 2 segmentów.<br /><br />Ty sobie do zmiennej przypisujesz po prostu liczbę, a przerwanie automatycznie sobie ją nijako &quot;dekoduje&quot;, czyli przepisuje Twoją zmienną jako konkretny element tablicy.<br /><br />Mam nadzieję, że nieco rozjaśniłem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><span style="color: #0000FF">z Niebieskim pozdRowieniem,<br />Doman89</span><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 9 minutach ]</span></strong><br /><br /><div class="quotetitle">moscow18-1990 napisał(a):</div><div class="quotecontent"><br />Czy tutaj się &quot;wyliczją&quot; te elementy tablicy i w ogóle co się tutaj dzieje bo nie ogarniam za bardzo:<br /><br />        [syntax=c]uint16_t licznik=6000;<br />uint8_t d1,d2,d3,d4;<br /><br />//**********************  pętla główna<br />while(1)<br />{<br />licznik--;<br /><br />d1=licznik/1000;<br />if(d1) cy1=d1; else cy1=NIC;<br />d2=(licznik-(d1*1000))/100;<br />if(d2) cy2=d2; else cy2=(licznik&gt;999)?0:NIC;<br />d3=(licznik-(d1*1000)-(d2*100))/10;<br />if(d3) cy3=d3; else cy3=(licznik&gt;99)?0:NIC;<br />d4=(licznik-(d1*1000)-(d2*100)-(d3*10));<br />cy4=d4;<br />_delay_ms(10);<br />//if(licznik&gt;9999) licznik=0;<br />if(!licznik) licznik=6000;<br />}[/syntax]<br /></div><br /><br />Kolega tu masz trywialny przykład.<br /><br />Nie wyświetlisz liczby np 2345 na jednym wyświetlaczu, więc masz po kolei:<br />2345 / 1000 - daje Ci liczbę tysięczną - 2, bo reszta po przecinku jest odcinana.<br />(2345 - (2*1000))/100 - daje Ci liczbę setną - 3, jak zwykle reszta odcięta.<br />(2345 - (2*1000) - (3*100))/10 - daje Ci liczbę dziesiętną - 4.<br />2345 - (2*1000) - (3 *100) - (4*10) - daje Ci liczbę jednostek - 5.<br /><br />Skąd liczby 2,3,4 w obliczeniach? <br />Masz w kodzie właśnie zmienną:<br />d1, d2, d3, które są obliczane w danym kroku, zmienna licznik to przykładowe 2345.<br /><br /><span style="color: #0000FF">z Niebieskim pozdRowieniem,<br />Doman89</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3271">doman89</a> — 25 wrz 2014, o 16:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[moscow18-1990]]></name></author>
<updated>2014-09-25T15:48:10+01:00</updated>
<published>2014-09-25T15:48:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96663#p96663</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96663#p96663"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96663#p96663"><![CDATA[
okejj wylicza się ale gdzie? Podam kolejny fragment kodu z płyty dołączonej do niebieskiej książki:<br /><br />cały main:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;// dołączenie głównego systemowego  pliku nagłówkowego<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />#include &quot;d_led.h&quot;// dołączenie naszego pliku nagłówkowego (obsługa LED)<br /><br />int main(void)<br />{<br />// ****** inicjalizacja *********<br />d_led_init();   // inicjalizacja wyświetlacza multipleksowanego<br /><br />// testowa inicjalizacja zmiennych oraz liczb mających się wyświetlać na wyrw. LED<br />cy1=NIC;<br />cy2=4;<br />cy3=1;<br />cy4=NIC;<br /><br />sei();// włączenie globalnego zezwolenia na przerwania<br /><br /><br /><br />//DDRA |= (1&lt;&lt;PA5);<br />//while(1)<br />//{<br />//PORTA ^= (1&lt;&lt;PA5);<br />//_delay_ms(1000);<br />//}<br /><br />uint16_t licznik=6000;<br />uint8_t d1,d2,d3,d4;<br /><br />//**********************  pętla główna<br />while(1)<br />{<br />licznik--;<br /><br />d1=licznik/1000;<br />if(d1) cy1=d1; else cy1=NIC;<br />d2=(licznik-(d1*1000))/100;<br />if(d2) cy2=d2; else cy2=(licznik&gt;999)?0:NIC;<br />d3=(licznik-(d1*1000)-(d2*100))/10;<br />if(d3) cy3=d3; else cy3=(licznik&gt;99)?0:NIC;<br />d4=(licznik-(d1*1000)-(d2*100)-(d3*10));<br />cy4=d4;<br />_delay_ms(10);<br />//if(licznik&gt;9999) licznik=0;<br />if(!licznik) licznik=6000;<br />}<br />}[/syntax]<br /><br />Czy tutaj się &quot;wyliczją&quot; te elementy tablicy i w ogóle co się tutaj dzieje bo nie ogarniam za bardzo:<br /><br />        [syntax=c]uint16_t licznik=6000;<br />uint8_t d1,d2,d3,d4;<br /><br />//**********************  pętla główna<br />while(1)<br />{<br />licznik--;<br /><br />d1=licznik/1000;<br />if(d1) cy1=d1; else cy1=NIC;<br />d2=(licznik-(d1*1000))/100;<br />if(d2) cy2=d2; else cy2=(licznik&gt;999)?0:NIC;<br />d3=(licznik-(d1*1000)-(d2*100))/10;<br />if(d3) cy3=d3; else cy3=(licznik&gt;99)?0:NIC;<br />d4=(licznik-(d1*1000)-(d2*100)-(d3*10));<br />cy4=d4;<br />_delay_ms(10);<br />//if(licznik&gt;9999) licznik=0;<br />if(!licznik) licznik=6000;<br />}[/syntax]<br /><br />Jeżeli ktoś mi tego gruntownie nie objaśni to nie ukrywam że ciężko mi będzie to zrozumiec. Nie rozumiem trochę tego &quot;wyliczania&quot;.<br />Mam przecież zdefiniowaną tablicę ze wzorami znaków które mają być wyświetlane dlatego to całe zamieszanie jest ciężkie do zrozumienia dla początkującego jak ja...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5472">moscow18-1990</a> — 25 wrz 2014, o 15:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kicajek]]></name></author>
<updated>2014-09-25T14:24:15+01:00</updated>
<published>2014-09-25T14:24:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96653#p96653</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96653#p96653"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96653#p96653"><![CDATA[
Witam<br />Nie wiem czy dobrze wytłumaczę ale:<br />w przypadku<br />[syntax=c]LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy1&#93; );[/syntax]<br />z tablicy cyfry wyświetlasz ten zestaw segmentów który &quot;wyliczyłeś&quot; jako cy1.<br />Jeśli cy1 byłoby np.: 8 to wyświetli Ci się cyfra 8; mało tego w każdej chwili możesz to zmienić na np.:5 czy każdą inną wartość w obrębie tablicy. Za każdym razem na wyświetlaczu pojawi się inny znak, a Ty masz dostęp do tej zmiennej cy1<br />Natomiast dla<br />[syntax=c]LED_DATA = pgm_read_byte( &amp;cyfry&#91;1&#93; );[/syntax]<br />Na wyświetlaczu pojawi Ci się liczba 1  i za Chiny nic z tym już nie zrobisz; no możesz patrzeć i podziwiać  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> .<br />Po prostu pisząc, kompilując i wgrywając program z <br />[syntax=c]if(licznik==1)          LED_DATA = pgm_read_byte( &amp;cyfry&#91;1&#93; );  // gdy zapalony wyśw.1 podaj stan zmiennej c1<br /><br />        else if(licznik==2) LED_DATA = pgm_read_byte( &amp;cyfry&#91;2&#93; );      // gdy zapalony wyśw.2 podaj stan zmiennej c2<br /><br />        else if(licznik==4) LED_DATA = pgm_read_byte( &amp;cyfry&#91;3&#93; );      // gdy zapalony wyśw.3 podaj stan zmiennej c3<br /><br />        else if(licznik==8) LED_DATA = pgm_read_byte( &amp;cyfry&#91;4&#93; );      // gdy zapalony wyśw.4 podaj stan zmiennej c4[/syntax]<br />na stałe każesz uC wyświetlać cyfry 1,2,3,4<br /><br />Pozdr.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=826">kicajek</a> — 25 wrz 2014, o 14:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[moscow18-1990]]></name></author>
<updated>2014-09-25T12:34:45+01:00</updated>
<published>2014-09-25T12:34:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96645#p96645</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96645#p96645"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96645#p96645"><![CDATA[
Piszę procedurę obsługi przerwania i tu ma mam pytanko tym razem do kodu z płyty dołączonej do niebieskiej książki bo czegoś tu nie rozumiem a mianowicie:<br /><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 &amp; 0x0F);  // wygaszenie wszystkich wyświetlaczy<br /><br /><br />if(licznik==1) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy1&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />else if(licznik==2) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy2&#93; );// gdy zapalony wyśw.2 podaj stan zmiennej c2<br />else if(licznik==4) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy3&#93; );// gdy zapalony wyśw.3 podaj stan zmiennej c3<br />else if(licznik==8) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy4&#93; );// gdy zapalony wyśw.4 podaj stan zmiennej c4<br /><br />ANODY_PORT = (ANODY_PORT &amp; 0xF0) | (~licznik &amp; 0x0F);// 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;8) licznik = 1;// jeśli licznik większy niż 8 to ustaw na 1<br />}[/syntax]<br /><br />Chodzi mi dokładnie o cy1 , cy2, cy3, cy4. Sa to zmienne które podobno odwołują się do elementu tablicy i moje pytanko brzmi<br />W JAKI SPOSÓB TO SIĘ ODBYWA? Nie mógłbym po prostu napisać:<br /><br />       [syntax=c]if(licznik==1) LED_DATA = pgm_read_byte( &amp;cyfry&#91;1&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />else if(licznik==2) LED_DATA = pgm_read_byte( &amp;cyfry&#91;2&#93; );// gdy zapalony wyśw.2 podaj stan zmiennej c2<br />else if(licznik==4) LED_DATA = pgm_read_byte( &amp;cyfry&#91;3&#93; );// gdy zapalony wyśw.3 podaj stan zmiennej c3<br />else if(licznik==8) LED_DATA = pgm_read_byte( &amp;cyfry&#91;4&#93; );// gdy zapalony wyśw.4 podaj stan zmiennej c4[/syntax]<br /><br />A mianowicie odwołać się do poszczególnego elementu tablicy poprzez zwykłe cyfry? Nie rozumiem na jakiej zasadzie te zmienne cy1, cy2, cy3, cy4 odwołują się do elementów tej tablicy... Dlatego pytam bo chciałbym to zrozumieć a nie przyjmować że po prostu ma tak być...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5472">moscow18-1990</a> — 25 wrz 2014, o 12:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[moscow18-1990]]></name></author>
<updated>2014-09-24T14:28:40+01:00</updated>
<published>2014-09-24T14:28:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96573#p96573</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96573#p96573"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96573#p96573"><![CDATA[
okejjjj teraz gra błedy zniknęły...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5472">moscow18-1990</a> — 24 wrz 2014, o 14:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[doman89]]></name></author>
<updated>2014-09-24T14:09:07+01:00</updated>
<published>2014-09-24T14:09:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96570#p96570</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96570#p96570"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96570#p96570"><![CDATA[
Witam,<br /><br />Poprawne rejestry:<br />TIMSK0 ( kolega ma w błedzie literkę &quot;O&quot;, niech kolega wpisze zero &quot;0&quot;).<br />OCR0B (kolega ma OCCR0B).<br /><br /><span style="color: #0000FF">z Niebieskim pozdRowieniem,<br />Doman89</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3271">doman89</a> — 24 wrz 2014, o 14:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-09-24T12:21:26+01:00</updated>
<published>2014-09-24T12:21:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96557#p96557</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96557#p96557"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96557#p96557"><![CDATA[
Sprawdź dokładnie czy Atmega88 zawiera rejestr OCCR0B i czy w nazwie TIMSK0 nie masz literki &quot;O&quot; zamiast cyfry &quot;0&quot;.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 24 wrz 2014, o 12:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[moscow18-1990]]></name></author>
<updated>2014-09-24T10:36:09+01:00</updated>
<published>2014-09-24T10:36:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96546#p96546</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96546#p96546"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96546#p96546"><![CDATA[
Chłopcy mam kolejny raz ten sam problem tym razem z ustawieniem timera0 mam atmegę88 i już krew mnie zalewa bo nie wiem czy to moja wina <br />czy coś z tym eclipsem jest nie tak dam fragment kodu. Jeżeli ktoś mógłby mnie zweryfikować z datasheet i sprawdzić czy zrobiłem to dobrze... :<br /><br />[syntax=c]//timer:<br />TCCR0A |= (1&lt;&lt;WGM01); // tryb ctc a oznacz to że  licznik timera0 będzie w trakcie zliczania porównywany z OCRO<br /> // 8 bitów mam i więc licznik z przedziału od 0 - 255<br />TCCR0B |= (1&lt;&lt;CS02 | 1&lt;&lt;CS00); // preskaler 1024<br />OCCR0B = 39; // 8000000/1024/200hz = 39 w przybliżeniu jest to jaki rejestr porownania<br />// compare match zezwolenie na przerwanie<br />TIMSKO |= (1&lt;&lt;OCIE0B);[/syntax]<br /><br />i błędy:<br />make all <br />Building file: ../main.c<br />Invoking: AVR Compiler<br />avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega88 -DF_CPU=8000000UL -MMD -MP -MF&quot;main.d&quot; -MT&quot;main.d&quot; -c -o &quot;main.o&quot; &quot;../main.c&quot;<br />../main.c: In function 'inicjalizacja':<br />../main.c:69: error: 'OCCR0B' undeclared (first use in this function)<br />../main.c:69: error: (Each undeclared identifier is reported only once<br />../main.c:69: error: for each function it appears in.)<br />../main.c:71: error: 'TIMSKO' undeclared (first use in this function)<br />make: *** [main.o] Error 1<br /><br />**** Build Finished ****<br /> <br /><br />a do tego jakieś insekty na pasku wyskakują... Proszę o pomoc bo krew zalewa mnie.... Zaznaczam też że próbowałem tych patentów z rebuild i zmianą workspace i coś to nie skutkuje niczym dobrym....<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 4 minutach ]</span></strong><br /><br />No po index -&gt; rebuild insekty to jeszcze znikną ale są te błędy które wkleiłem. Jeżeli ktoś będzie w stanie zweryfikować czy dobrze wyklikałem z datasheet to będę niezmiernie wdzięczny....<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5472">moscow18-1990</a> — 24 wrz 2014, o 10:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[doman89]]></name></author>
<updated>2014-09-20T22:42:46+01:00</updated>
<published>2014-09-20T22:42:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96199#p96199</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96199#p96199"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96199#p96199"><![CDATA[
Witam,<br /><br /><div class="quotetitle">jacekk232 napisał(a):</div><div class="quotecontent"><br />Zmienna zahl6 i pewnie też zmienne zahl1-zahl5 to te same zmienne co cy1-cy4 z kodu z BB. Kolega <strong>doman89</strong> pewnie miał sześć wyświetlaczy i zmienne przechowujące cyfry do wyświetlenia nazwał sobie zahl zamiast cy.<br /></div><br /><br />No &quot;znaki_wyswietlacza&quot; przedłożyłem na polski, o &quot;zahl&quot; zapomniałem, a to po prostu liczba po niemiecku <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Jedni piszą biblioteki po angielsku, inni co nie znają tego języka piszą np. po niemiecku <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Sorki za zamieszanie, postaram się następnym razem bardziej poprawić <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Bierzesz sobie dwie zmienne, które przechowują Twoje dwie liczby np. liczba1, liczba2. I teraz w programie jeżeli chcesz wyświetlać na każdym wyświetlaczu inną liczbę to podajesz np. takie coś:<br /><br />[syntax=c]ANODY_WY_1 = pgm_read_byte( &amp;znaki_wyswietlacza&#91;liczba1&#93;);<br />ANODY_WY_2 = pgm_read_byte( &amp;znaki_wyswietlacza&#91;liczba2&#93;);[/syntax]<br /><br />Oczywiście ANODY_WY_x musisz odpowiednio zdefiniować - bez multipleksacji jeden port mikrokontrolera na jeden wyświetlacz. Tak więc kolega szybko pobaw się tymi dwoma cyferkami i opanowuj multipleksację <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, a jak będzie jakiś problem to wal śmiało do nas.<br /><br /><br /><br /><span style="color: #0000FF">z Niebieskim pozdRowieniem,<br />Doman89</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3271">doman89</a> — 20 wrz 2014, o 22:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-09-20T21:11:02+01:00</updated>
<published>2014-09-20T21:11:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96187#p96187</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96187#p96187"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96187#p96187"><![CDATA[
Zmienna zahl6 i pewnie też zmienne zahl1-zahl5 to te same zmienne co cy1-cy4 z kodu z BB. Kolega <strong>doman89</strong> pewnie miał sześć wyświetlaczy i zmienne przechowujące cyfry do wyświetlenia nazwał sobie zahl zamiast cy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 20 wrz 2014, o 21:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[moscow18-1990]]></name></author>
<updated>2014-09-20T14:51:42+01:00</updated>
<published>2014-09-20T14:51:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96143#p96143</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96143#p96143"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96143#p96143"><![CDATA[
Mam pytanie do jednej linijki kodu którą podał kolega wyżej a mianowicie:<br /><br />[syntax=c]LED_DATA = pgm_read_byte( &amp;znaki_wyswietlacza&#91;zahl6&#93;);[/syntax]<br /><br />a jeszcze bardziej mianowicie o co chodzi w tym indeksie tablicy:<br /><br />[syntax=c]&#91;zahl6&#93;[/syntax]<br /><br />Ja sobie zrobiłem taką tablicę mam cztery wyświetlacze już podłączone i wpisuje normalnie  w indeksie 0,1,2 i w związku z tym wyświetla się jakaś cyfra na czterech wyświetlaczach. Coś to się chyba z tymi przerwaniami i typem volatile wiąże aczkolwiek ja tym tematem będę się zajmował jutro i chciałbym wypytać co ten indeks oznacza i dlaczego taki jakiś dziwny on?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5472">moscow18-1990</a> — 20 wrz 2014, o 14:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[yaiba83]]></name></author>
<updated>2014-09-20T14:18:36+01:00</updated>
<published>2014-09-20T14:18:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96140#p96140</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96140#p96140"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96140#p96140"><![CDATA[
Plus jeszcze jedna nóżka jak chce się z kropki skorzystać <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Ciekawym wg mnie rozwiązaniem jest wykorzystać ekspander wyjść na I2C wtedy wystarczą 2 piny plus piny dla kolejnych tranzystorków, ale to już dywagacje na inny wątek.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2332">yaiba83</a> — 20 wrz 2014, o 14:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2014-09-20T10:02:43+01:00</updated>
<published>2014-09-20T10:02:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96123#p96123</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96123#p96123"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96123#p96123"><![CDATA[
Nie musisz, pod warunkiem, że w uC znajdziesz wolnych 14 pinów (dla dwóch wyświetlaczy, dla trzech to już będzie 21 itd) <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /> Przy multipleksowaniu wystarczy pinów 9 dla dwóch wyświetlaczy, a dla każdego kolejnego tylko jeden pin więcej<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 20 wrz 2014, o 10:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[moscow18-1990]]></name></author>
<updated>2014-09-20T09:18:47+01:00</updated>
<published>2014-09-20T09:18:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96120#p96120</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96120#p96120"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96120#p96120"><![CDATA[
Czyli muszę użyć multipleksowania nie mogę jednocześnie na pierwszym wyświetlaczu wyświetlić np.1 a na drugim np. 4?  Użyłem tej tablicy wszystko działa ale są dwie jedynki na pierwszym i drugim wyświetlaczu. I tak w ogole co to jest to pgm_read_byte?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5472">moscow18-1990</a> — 20 wrz 2014, o 09:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[doman89]]></name></author>
<updated>2014-09-19T23:28:52+01:00</updated>
<published>2014-09-19T23:28:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96102#p96102</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96102#p96102"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96102#p96102"><![CDATA[
Witam,<br /><br /><div class="quotetitle">moscow18-1990 napisał(a):</div><div class="quotecontent"><br />Moje pytanie pytanie brzmi: Czy muszę zdefiniować jakąś tablicę żeby wyświetlać RÓŻNE cyfry na poszczególnych wyświetlaczach załączam program jest skromny ale wyświetla dwie czwórki a to już coś. Chcę go powoli rozbudowywać. Proszę o wskazówki...<br /></div><br /><br />Kolega tablica znaków musi być jak najbardziej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Jak prześlesz na port liczbę, to otrzymasz głupoty. Na port podajesz element tablicy, który ma zakodowane jakie piny mają się zapalić dla danej liczby. Tu masz przykładowo-poglądowy kod z mojego zegarka:<br /><br />[syntax=c]uint16_t znaki_wyswietlacza&#91;13&#93; PROGMEM = { // z negacja same wys.// bez negacji - uln2003<br /><br />(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F), //0<br />(SEG_B|SEG_C), //1<br />(SEG_A|SEG_B|SEG_G|SEG_E|SEG_D), //2<br />(SEG_A|SEG_B|SEG_G|SEG_C|SEG_D), //3<br />(SEG_F|SEG_B|SEG_G|SEG_C), //4<br />(SEG_A|SEG_F|SEG_G|SEG_C|SEG_D),//5<br />(SEG_A|SEG_F|SEG_G|SEG_C|SEG_D|SEG_E),//6<br />(SEG_A|SEG_B|SEG_C),//7<br />(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),//8<br />(SEG_A|SEG_B|SEG_G|SEG_C|SEG_D|SEG_F),//9<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),//pusty<br />(SEG_G), //- <br />(SEG_A|SEG_B|SEG_G|SEG_F), //st<br /><br /><br />};[/syntax]<br /><br />Wyświetlenie już cyfry to np.:<br /><br />[syntax=c]LED_DATA = pgm_read_byte( &amp;znaki_wyswietlacza&#91;zahl6&#93;);[/syntax]<br /><br />Do testów to wystarczy, że jeden segment opanujesz, kolejne to już przy multipleksacji wymęczysz.<br /><br />Jak coś dalej nie jasne to pytaj <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><span style="color: #0000FF">z Niebieskim pozdRowieniem,<br />Doman89</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3271">doman89</a> — 19 wrz 2014, o 23:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[moscow18-1990]]></name></author>
<updated>2014-09-19T22:49:18+01:00</updated>
<published>2014-09-19T22:49:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96100#p96100</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96100#p96100"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=96100#p96100"><![CDATA[
Dobra mam inny pomysł muszę zacząć chyba od całkowitych podstaw. Chciałbym wyświetlić dwie cyfry na wyświetlaczu. Nie chcę używać żadnych przerwań, timerów tylko po prostu wyświetlić cyfrę na dwóch wyświetlaczach. Cyfry mają być różne bo w tej chwili wyświetlają mi się dwie czwórki. Używam dwóch anod mimo że korzystam z poczwórnego wyświetlacza. Do tych przerwań i timerów dojdę ale powoli... Moje pytanie pytanie brzmi: Czy muszę zdefiniować jakąś tablicę żeby wyświetlać RÓŻNE cyfry na poszczególnych wyświetlaczach załączam program jest skromny ale wyświetla dwie czwórki a to już coś. Chcę go powoli rozbudowywać. Proszę o wskazówki... Oto program:<br /><br />main:<br /><br />[syntax=c]#include&lt;avr/io.h&gt;<br />//pgmspace - znaki tablicy w pamieci FLASH będą tylko do odczytu, nie będą nigdy zmieniane, oszczędzi to pamieć<br />//deklaracje tablicy wzbogacę o słówko PROGMEM żeby kompilator umiescił ją w pamieci FLASH<br />#include&lt;avr/pgmspace.h&gt;<br />#include&quot;led_proba.h&quot;<br /><br /><br /><br />// zdefiniuję znak ale zanim to zrobię to stworzę sobie swoją bibliotekę<br /><br />// inny pomysł wkoncu wyswietlam sam znak<br /><br />int main()<br />{<br />SEGMENTY_LED = 0xFF;<br />SEGMENTY_LED_STANY = 0b10011001; // czworka<br /><br />ANODA |= (1&lt;&lt;PC2); // wyjscie<br />ANODA_STAN &amp;= ~(1&lt;&lt;PC2); // stan niski - przewodzi<br /><br />ANODA2 |= (1&lt;&lt;PC3);<br />ANODA2_STAN &amp;= ~(1&lt;&lt;PC3);<br /><br /><br />}[/syntax]<br /><br />i led_proba.h:<br /><br />[syntax=c]#ifndef LED_PROBA_H_<br />#define LED_PROBA_H_<br /><br />// segmenty zdefiniuje sobie<br /><br />#define SEG_A (1&lt;&lt;0)<br />#define SEG_B (1&lt;&lt;1)<br />#define SEG_C (1&lt;&lt;2)<br />#define SEG_D (1&lt;&lt;3)<br />#define SEG_E (1&lt;&lt;4)<br />#define SEG_F (1&lt;&lt;5)<br />#define SEG_G (1&lt;&lt;6)<br />#define SEG_DP (1&lt;&lt;7)<br /><br />//dalej...<br /><br />#define SEGMENTY_LED DDRD<br />#define SEGMENTY_LED_STANY PORTD<br /><br />#define ANODA DDRC<br />#define ANODA_STAN PORTC<br />#define ANODA2 DDRC<br />#define ANODA2_STAN PORTC<br /><br /><br />#endif /* LED_PROBA_H_ */[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5472">moscow18-1990</a> — 19 wrz 2014, o 22:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[doman89]]></name></author>
<updated>2014-09-14T21:51:02+01:00</updated>
<published>2014-09-14T21:51:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=95491#p95491</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=95491#p95491"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=95491#p95491"><![CDATA[
Witam,<br /><br />Odniosę się do poniższego:<br /><br /><div class="quotetitle">jacekk232 napisał(a):</div><div class="quotecontent"><br />A ten zapis, który zaproponował kol. <strong>doman89</strong>[syntax=c]ANODY_PORT = (ANODY_PORT | 0x0F) &amp; ~licznik;[/syntax]<br />oprócz tego, że włączy dany wyświetlacz i wyłączy pozostałe to niechcący ustawi starsze bity portu do którego podpięte są anody.<br />Dlatego w tym zapisie[syntax=c]ANODY_PORT = (ANODY_PORT &amp; 0xF0) | (~licznik &amp; 0x0F);[/syntax] <br />jest zastosowane dodatkowe maskowanie, które powoduje nie naruszanie wartości starszych bitów portu.<br /></div><br /><br />Oto mój kod z zegarka który popełniłem i śmiga pełną parą <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Wszystko na porcie B - Anody od PB0-PB5, PB6 - dioda, PB7 - DS18B20:<br /><br />[syntax=c]ISR(TIMER2_COMP_vect)<br />{<br />uint16_t x;<br />//timer co 1 ms<br />x = Timer0;<br />if(x) Timer0 = --x;<br />x = Timer1;<br />if(x) Timer1 = --x;<br /><br />static uint8_t licznik = 1; // zmienna do przelaczania wyswietlaczy<br /><br />if ( flaga_led )<br />{<br />ANODY_PORT = (ANODY_PORT &amp; ~MASKA_ANODY) | licznik;//licznik z negacja pnp,bez negacji npn<br />if(licznik == 1) LED_DATA = ( LED_DATA &amp; Impuls1HZ ) | pgm_read_byte( &amp;znaki_wyswietlacza&#91;zahl1&#93;);<br />else if(licznik == 2) LED_DATA = ( LED_DATA &amp; Impuls1HZ )  | pgm_read_byte( &amp;znaki_wyswietlacza&#91;zahl2&#93;);<br />else if(licznik == 4) LED_DATA = ( LED_DATA &amp; Impuls1HZ )  | pgm_read_byte( &amp;znaki_wyswietlacza&#91;zahl3&#93;);<br />else if(licznik == 8) LED_DATA = ( LED_DATA &amp; Impuls1HZ )  | pgm_read_byte( &amp;znaki_wyswietlacza&#91;zahl4&#93;);<br />else if(licznik == 16) LED_DATA = ( LED_DATA &amp; Impuls1HZ )  | pgm_read_byte( &amp;znaki_wyswietlacza&#91;zahl5&#93;);<br />else if(licznik == 32) LED_DATA = ( LED_DATA &amp; Impuls1HZ )  | pgm_read_byte( &amp;znaki_wyswietlacza&#91;zahl6&#93;);<br />}<br />else if ( !flaga_led )<br />{<br />LED_DATA = ( LED_DATA &amp; Impuls1HZ ) | 0x00;<br />}<br /><br />licznik &lt;&lt;= 1;<br /><br />if(licznik&gt;32) licznik=1;<br /><br />}[/syntax]<br /><br />Wszystko śmiga bez zająknięcia <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Sprawdzone i wykorzystywane w praktyce - nie ma mowy o najmniejszym zakłóceniu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Co do autora tematu, to prosimy o schemat, i ewentualnie krótki filmik co tam się dzieje. Ja akurat oddałem mojemu koledze 4 wyświetlacze 7 segmentowe, więc nie mogę za bardzo zasymulować Twojego układu, więc trzeba krok po kroku analizować kod. Tak więc schemat by się przydał.<br /><br /><span style="color: #0000FF">z Niebieskim pozdRowieniem,<br />Doman89</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3271">doman89</a> — 14 wrz 2014, o 21:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-09-14T20:07:51+01:00</updated>
<published>2014-09-14T20:07:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=95471#p95471</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=95471#p95471"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=95471#p95471"><![CDATA[
<div class="quotetitle">moscow18-1990 napisał(a):</div><div class="quotecontent"><br />Mają być na nim widoczne cyfry 1,4,5,9 a w praktyce jest zupełnie inaczej. <br /><br />Dalej coś nie gra, rady kolegi nic nie dały nie wiem co dalej...<br /></div><br />A co to oznacza? Nic się nie wyświetla? A może wyświetla się nie to co powinno.<br /><br />Kod wygląda na dobry poza tą linią[syntax=c]ANODY_PORT = (ANODY_PORT &amp; 0xF0);       // wygaszenie wszystkich wyświetlaczy[/syntax]<br />Dla wspólnej anody i tranzystorów PNP powinno być[syntax=c]ANODY_PORT = (ANODY_PORT | 0x0F);       // wygaszenie wszystkich wyświetlaczy[/syntax]<br /><br />A ten zapis, który zaproponował kol. <strong>doman89</strong>[syntax=c]ANODY_PORT = (ANODY_PORT | 0x0F) &amp; ~licznik;[/syntax]<br />oprócz tego, że włączy dany wyświetlacz i wyłączy pozostałe to niechcący ustawi starsze bity portu do którego podpięte są anody.<br />Dlatego w tym zapisie[syntax=c]ANODY_PORT = (ANODY_PORT &amp; 0xF0) | (~licznik &amp; 0x0F);[/syntax] <br />jest zastosowane dodatkowe maskowanie, które powoduje nie naruszanie wartości starszych bitów portu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 14 wrz 2014, o 20:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[moscow18-1990]]></name></author>
<updated>2014-09-14T17:22:09+01:00</updated>
<published>2014-09-14T17:22:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=95456#p95456</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=95456#p95456"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=95456#p95456"><![CDATA[
Wspólna anoda<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 50 minutach ]</span></strong><br /><br />Dalej coś nie gra, rady kolegi nic nie dały nie wiem co dalej...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5472">moscow18-1990</a> — 14 wrz 2014, o 17:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kicajek]]></name></author>
<updated>2014-09-14T17:12:31+01:00</updated>
<published>2014-09-14T17:12:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=95453#p95453</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=95453#p95453"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=95453#p95453"><![CDATA[
Witam<br /><div class="quotetitle">moscow18-1990 napisał(a):</div><div class="quotecontent"><br />Myślałem o zmianie na NPN<br /></div><br />...a jaki masz wyświetlacz - wsp. KATODA czy ANODA ?<br /><br />Pozdr.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=826">kicajek</a> — 14 wrz 2014, o 17:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[moscow18-1990]]></name></author>
<updated>2014-09-13T23:16:17+01:00</updated>
<published>2014-09-13T23:16:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=95375#p95375</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=95375#p95375"/>
<title type="html"><![CDATA[Re: Multipleksowanie LED problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8509&amp;p=95375#p95375"><![CDATA[
Myślałem o zmianie na NPN w każdym bądź razie dzięki za rady sprawdzę je w praktyce zobaczymy co z tego wyniknie...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5472">moscow18-1990</a> — 13 wrz 2014, o 23:16</p><hr />
]]></content>
</entry>
</feed>