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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-08-29T15:40:40+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=4002&amp;mode</id>
<entry>
<author><name><![CDATA[perlon]]></name></author>
<updated>2013-08-28T14:34:28+01:00</updated>
<published>2013-08-28T14:34:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4002&amp;p=47312#p47312</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4002&amp;p=47312#p47312"/>
<title type="html"><![CDATA[Re: Wyświetlacz LED7 - sterowanie z dowolnych pinów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4002&amp;p=47312#p47312"><![CDATA[
No i oświeciło mnie w temacie przygaszania wyświetlacza. Wypełnienie ustalam za pomocą stałej dosłownej LED7_PWM_TIMER. W przypadku wpisania wartości przekraczającej LED7_MULTIPLEX_TIMER dyrektywy kompilacji usuną niepotrzebny kod. Można to sobie oczywiście zrobić na zmiennej wyrzucając przy okazji dyrektywy kompilacji warunkowej jeżeli będzie potrzebna interaktywna zmiana PWM.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=382">perlon</a> — 28 sie 2013, o 14:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-08-28T12:23:34+01:00</updated>
<published>2013-08-28T12:23:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4002&amp;p=47290#p47290</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4002&amp;p=47290#p47290"/>
<title type="html"><![CDATA[Re: Wyświetlacz LED7 - sterowanie z dowolnych pinów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4002&amp;p=47290#p47290"><![CDATA[
<div class="quotetitle">perlon napisał(a):</div><div class="quotecontent"><br />Mamy demokrację i jest wybór<br /></div><br /><br />Oczywiście, że tak <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> i to się wpisuje w główną zasadę, którą ja zawsze wyznaję, że nie ma NAJLEPSZEGO rozwiązania. Rozwiązań jest tyle ilu programistów jest na świecie <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=54">mirekk36</a> — 28 sie 2013, o 12:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[perlon]]></name></author>
<updated>2013-08-28T12:17:01+01:00</updated>
<published>2013-08-28T12:17:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4002&amp;p=47287#p47287</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4002&amp;p=47287#p47287"/>
<title type="html"><![CDATA[Re: Wyświetlacz LED7 - sterowanie z dowolnych pinów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4002&amp;p=47287#p47287"><![CDATA[
W przypadku multipleksu w pętli głównej (LED7_MULTIPLEX_EVENT = 1) skok jest tylko jeden, ustawienie flagi i powrót. Można to oczywiście przenieść bezpośrednio do obsługi przerwania. W przypadku multipleksowania w przerwaniu faktycznie skoki są trzy i dodatkowo pętle do zapalania/gaszenia poszczególnych segmentów. Mamy demokrację i jest wybór <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />. Poprawiłem jeszcze kod bo zabrakło w przerwaniu ustawienia flagi do multipleksu. Faktycznie przedstawione rozwiązanie jest zasobożerne i to jest koszt swobody pinologicznej. Być może w projektach bez krytycznych zależności czasowych pozwoli na uproszczenie płytki PCB, ale głównie służyło celom edukacyjnym (tablicowanie wskaźników etc). Chciałbym do tego kodu dołożyć jeszcze &quot;ściemniacz&quot; - czyli możliwość wprowadzenia wcześniejszego zgaszenia wyświetlacza jeszcze przed przeskokiem na kolejny wynikający z multipleksu ( taki programowy PWM ). Może ktoś podrzuci jakiś pomysł.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=382">perlon</a> — 28 sie 2013, o 12:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-08-28T11:47:11+01:00</updated>
<published>2013-08-28T11:47:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4002&amp;p=47284#p47284</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4002&amp;p=47284#p47284"/>
<title type="html"><![CDATA[Re: Wyświetlacz LED7 - sterowanie z dowolnych pinów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4002&amp;p=47284#p47284"><![CDATA[
<div class="quotetitle">Antystatyczny napisał(a):</div><div class="quotecontent"><br />tak na szybko podpowiedzieć, by raczej nie stosować skoku do funkcji wprost z przerwania. Unikamy w ten sposób niepotrzebnych rozkazow push i pop,<br /></div><br /><br />A tu są aż trzy skoki z przerwania do funkcji, z tej funkcji jeszcze do funkcji i chyba jeszcze raz. Niestety kod jest MEGA zagmatwany ... oczywiście jak działa to dobrze <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />ale tak raczej nie należy podchodzić do pisania kodu. Tzn tak też na prawdę to warto się zastanowić w ogóle czy jest sens obsługi Wyświetlacza LED na różnych pinach ... ??? Tak sobie myślę tylko - że jak już ktoś niby usilnie potrzebuje rozbić to na różne piny - to zwykle chyba ma do czynienia z jakimś małym prockiem np ATtiny. No ok ... uda się ... ale z kolei KOSZT związany z <br /><br />1. stratą pamięci FLASH<br />2. stratą szybkości<br /><br />może być a dla mnie byłby wręcz nie do przyjęcia <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> to już bym wolał dać ciut większy procek ... ALBO ....<br /><br />albo zrobić to tak jak się należy czyli np na REJESTRACH przesuwnych. Wtedy wystarczą (uwaga!) ramptem TRZY PINY a do tego na prawdę banalny i bardzo szybko działający kod do wsuwania w te rejestry danych i po zawodach.<br /><br />To co tutaj piszę nie ma na celu &quot;skrytykowania&quot; tego projektu - raczej tylko zwrócenie uwagi jak się poruszać przy tworzeniu takich projektów na przyszłość.... Ale też to co piszę to moje subiektywne zdanie i oczywiście każdy może zrobić i robi po swojemu.<br /><br />WAŻNE! że autorowi działa <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> i to się liczy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 28 sie 2013, o 11:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[perlon]]></name></author>
<updated>2013-08-29T15:40:40+01:00</updated>
<published>2013-08-27T23:41:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4002&amp;p=47273#p47273</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4002&amp;p=47273#p47273"/>
<title type="html"><![CDATA[Wyświetlacz LED7 - sterowanie z dowolnych pinów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4002&amp;p=47273#p47273"><![CDATA[
Swego czasu popełniłem kod pozwalający podłączyć wyświetlacz siedmio segmentowy do dowolnych pinów procesora. Ostatnio na forum pojawiło się pytanie o taką możliwość. Postanowiłem zaproponować swoje rozwiązanie w postaci biblioteczki, a może raczej półki z książkami.<br />Klu tematu do zmienne tablicowe przechowujące przypisania segmentów do portów. Konfiguracja odbywa się przez odpowiednie wpisy w pliku nagłówkowym. Multipleksowanie odbywa się poprzez cykliczne wywołanie funkcji LED7_TIMER0_OVF_vect() wstrzykniętej w procedurę obsługi przerwania. Nazwa mówi sama za siebie. Być może nie najszczęśliwiej dobrana, bo może ktoś użyć innego timera do obsługi multipleksu. Miałem wersję multipleksowania na zasadzie flagi podnoszonej w przerwaniu i eventu wołanego w pętli głównej, ale doszedłem do wniosku, że wołanie bezpośrednio z przerwania pozwoli  wyczyścić pętlę główną z kodu który de facto ukryłem w biblioteczce. Należy zaznaczyć, że kod zabiera sporo zasobów ale pozwala dowolnie żonglować podpięciem segmentów. Czas na kod.<br />Plik nagłówkowy .h:<br />[syntax=c]/*<br /> * led7.h<br /> *<br /> *  Created on: 03-11-2012<br /> *      Author: perlon<br /> */<br /><br />#ifndef LED7_H_<br />#define LED7_H_<br /><br />//------------  ustawienia konfiguracyjne ---------------<br /><br />#define COUNT_DISPLAY4                       // ilosc wyswietlaczy do multipleksu max 4<br />// jeżeli więcej to trzeba poprawic w &quot;led7.c&quot; deklaracje zmiennych aLED7TablicaCommon...<br />#define LIGHT_SEG_HISTATE0                       // wysterowanie wspolną anodą/katodą stanem portu 1-wysokim  0-niskim<br />#define LIGHT_COMMON_HISTATE0                       // wysterowanie segmentow stanem portu                    1-wysokim  0-niskim<br />#define LED7_MULTIPLEX_TIMER50                      // dzielnik przerwania TimerX do flagi zmiany wyswietlacza<br />#define LED7_PWM_TIMER1                       // wypelnienie czasu swiecenia wyswietlacza od 0 do LED7_MULTIPLEX_TIMER<br />#define LED7_MULTIPLEX_EVENT1// obsluga multipleksu 0-w przerwaniu, 1-w pętli głównej<br /><br />// zestaw flag ktore nalezy obsluzyc w przerwaniu multipleksera ( zmienna nLED7Flagi )<br />#define LED7_CHANGE_FLAG                0x01            // flaga wskazujaca na zmiane wyswietlacza w multipleksie<br />#define LED7_PWM_FLAG         0x02            // flaga wskazujaca na zgaszenie wyswietlacza przed multipleksem<br /><br />// tu konfigurujemy port i piny do jakich podłączymy wspolne anody/katody wyswietlaczy LED<br />// dane te zostaną stablicowane ale w programie zostaną użyte w kolejnoci wg liczby COUNT_SEGMENTS<br />// wyswietlacz nr 1<br />#define LED7COMMON0_PORT                D<br />#define LED7COMMON0                     0<br />#define LED7COMMON1_PORT                C<br />#define LED7COMMON1                     5<br />#define LED7COMMON2_PORT                C<br />#define LED7COMMON2                     4<br />#define LED7COMMON3_PORT                C<br />#define LED7COMMON3                     3<br /><br />// tu konfigurujemy port i piny do jakich podłączymy segmenty wyswietlacza LED<br />#define LED7A_PORT                      B<br />#define LED7A                           6<br />#define LED7B_PORT                      B<br />#define LED7B                           7<br />#define LED7C_PORT                      C<br />#define LED7C                           0<br />#define LED7D_PORT                      C<br />#define LED7D                           1<br />#define LED7E_PORT                      C<br />#define LED7E                           2<br />#define LED7F_PORT                      D<br />#define LED7F                           3<br />#define LED7G_PORT                      D<br />#define LED7G                           7<br />#define LED7DP_PORT                     B<br />#define LED7DP                          1<br /><br />// Definicje znakow w kolejnosci uzycia w tabeli nZnaki z pliku led7.c<br />#define CHAR_SPACE0x00            // znak pusty<br />#define CHAR_00x3F<br />#define CHAR_10x06<br />#define CHAR_20x5B<br />#define CHAR_30x4F<br />#define CHAR_40x66<br />#define CHAR_50x6D<br />#define CHAR_60x7D<br />#define CHAR_70x07<br />#define CHAR_80x7F<br />#define CHAR_90x6F<br />#define CHAR_b0x7C<br />#define CHAR_o0x5C<br />#define CHAR_t0x78<br /><br />// Definicja kropki jest poza tabela<br />#define CHAR_DP                         0x80<br /><br /><br />//------------  koniec ustawień konfiguracyjnych ---------------<br /><br />// Makra do obslugi flag<br />#define FLAGA_CHANGE_LED7              (nLED7Flagi &amp; LED7_CHANGE_FLAG)<br />#define FLAGA_CHANGE_LED7_SET   nLED7Flagi |= LED7_CHANGE_FLAG<br />#define FLAGA_CHANGE_LED7_CLR   nLED7Flagi &amp;= ~LED7_CHANGE_FLAG<br /><br />#define FLAGA_PWM_LED7              (nLED7Flagi &amp; LED7_PWM_FLAG)<br />#define FLAGA_PWM_LED7_SET   nLED7Flagi |= LED7_PWM_FLAG<br />#define FLAGA_PWM_LED7_CLR   nLED7Flagi &amp;= ~LED7_PWM_FLAG<br /><br />// Makro stan common<br />#if LIGHT_COMMON_HISTATE==0<br />        #define LED7COM_ISL(x)    (~(*aLED7TablicaCommonPORT&#91;x&#93;) &amp;   BIT_MASK(aLED7TablicaCommonPIN&#91;x&#93;))<br />        #define LED7COM_SET(x)           *aLED7TablicaCommonPORT&#91;x&#93; &amp;= ~BIT_MASK(aLED7TablicaCommonPIN&#91;x&#93;)<br />        #define LED7COM_CLR(x)           *aLED7TablicaCommonPORT&#91;x&#93; |=  BIT_MASK(aLED7TablicaCommonPIN&#91;x&#93;)<br />        #define LED7COM_FLP(x)           *aLED7TablicaCommonPORT&#91;x&#93; ^=  BIT_MASK(aLED7TablicaCommonPIN&#91;x&#93;)<br />#else<br />        #define LED7COM_ISL(x)      (*aLED7TablicaCommonPORT&#91;x&#93; &amp;   BIT_MASK(aLED7TablicaCommonPIN&#91;x&#93;))<br />        #define LED7COM_SET(x)           *aLED7TablicaCommonPORT&#91;x&#93; |=  BIT_MASK(aLED7TablicaCommonPIN&#91;x&#93;)<br />        #define LED7COM_CLR(x)           *aLED7TablicaCommonPORT&#91;x&#93; &amp;= ~BIT_MASK(aLED7TablicaCommonPIN&#91;x&#93;)<br />        #define LED7COM_FLP(x)           *aLED7TablicaCommonPORT&#91;x&#93; ^=  BIT_MASK(aLED7TablicaCommonPIN&#91;x&#93;)<br />#endif<br />// Makro stan segmentu<br />#if LIGHT_SEG_HISTATE==0<br />        #define LED7SEG_ISL(x)    (~(*aLED7TablicaSegmentPORT&#91;x&#93;) &amp;   BIT_MASK(aLED7TablicaSegmentPIN&#91;x&#93;))<br />        #define LED7SEG_SET(x)          *aLED7TablicaSegmentPORT&#91;x&#93; &amp;= ~BIT_MASK(aLED7TablicaSegmentPIN&#91;x&#93;)<br />        #define LED7SEG_CLR(x)          *aLED7TablicaSegmentPORT&#91;x&#93; |=  BIT_MASK(aLED7TablicaSegmentPIN&#91;x&#93;)<br />        #define LED7SEG_FLP(x)          *aLED7TablicaSegmentPORT&#91;x&#93; ^=  BIT_MASK(aLED7TablicaSegmentPIN&#91;x&#93;)<br />#else<br />        #define LED7SEG_ISL(x)         (*aLED7TablicaSegmentPORT&#91;x&#93; &amp;   BIT_MASK(aLED7TablicaSegmentPIN&#91;x&#93;))<br />        #define LED7SEG_SET(x)          *aLED7TablicaSegmentPORT&#91;x&#93; |=  BIT_MASK(aLED7TablicaSegmentPIN&#91;x&#93;)<br />        #define LED7SEG_CLR(x)          *aLED7TablicaSegmentPORT&#91;x&#93; &amp;= ~BIT_MASK(aLED7TablicaSegmentPIN&#91;x&#93;)<br />        #define LED7SEG_FLP(x)          *aLED7TablicaSegmentPORT&#91;x&#93; ^=  BIT_MASK(aLED7TablicaSegmentPIN&#91;x&#93;)<br />#endif<br /><br />extern volatile uint8_t aLED7TablicaCyfr&#91;COUNT_DISPLAY&#93;;// tablica z indeksami do znaków zdefiniowanych w tablicy aZnaki&#91;&#93; do wyswietlenia na poszczegolnych wyswietlaczach<br />extern volatile uint8_t nLED7TablicaKropek;                 // zmienna bitowa wyswietlania kropek<br /><br />extern void LED7_INIT(void);<br />extern void LED7_TIMER_INTERRUPT(void);<br />#if LED7_MULTIPLEX_EVENT == 1<br />extern void LED7_EVENT(void);<br />#endif<br /><br />#endif /* LED7_H_ */[/syntax]<br />plik .c<br />[syntax=c]/*<br /> * led7.c<br /> *<br /> *  Created on: 03-11-2012<br /> *      Author: perlon<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />const uint8_t __bit_mask&#91;&#93; PROGMEM = {1,2,4,8,16,32,64,128};  // tablica maskowania bitow<br />#define BIT_MASK(x)     pgm_read_byte(&amp;__bit_mask&#91;x&#93;)// makro do maskowania bitu<br /><br />// Makra dostepu do portów<br />#define PORT(x)                 SPORT(x)<br />#define SPORT(x)                (PORT##x)<br /><br />// Makra dostępu do pinów<br />#define PIN(x)                  SPIN(x)<br />#define SPIN(x)                 (PIN##x)<br /><br />// Makra dostępu do typu portu<br />#define DDR(x)                  SDDR(x)<br />#define SDDR(x)                 (DDR##x)<br /><br />#include &quot;led7.h&quot;<br /><br />// deklaracje zmiennych<br />volatile uint8_t *aLED7TablicaCommonDDR&#91;&#93;   = {&amp;DDR(LED7COMMON0_PORT),&amp;DDR(LED7COMMON1_PORT),&amp;DDR(LED7COMMON2_PORT),&amp;DDR(LED7COMMON3_PORT)};<br />volatile uint8_t *aLED7TablicaCommonPORT&#91;&#93;  = {&amp;PORT(LED7COMMON0_PORT),&amp;PORT(LED7COMMON1_PORT),&amp;PORT(LED7COMMON2_PORT),&amp;PORT(LED7COMMON3_PORT)};<br />volatile uint8_t  aLED7TablicaCommonPIN&#91;&#93;   = {LED7COMMON0,LED7COMMON1,LED7COMMON2,LED7COMMON3};<br />volatile uint8_t *aLED7TablicaSegmentDDR&#91;&#93;  = {&amp;DDR(LED7A_PORT),&amp;DDR(LED7B_PORT),&amp;DDR(LED7C_PORT),&amp;DDR(LED7D_PORT),&amp;DDR(LED7E_PORT),&amp;DDR(LED7F_PORT),&amp;DDR(LED7G_PORT),&amp;DDR(LED7DP_PORT)};<br />volatile uint8_t *aLED7TablicaSegmentPORT&#91;&#93; = {&amp;PORT(LED7A_PORT),&amp;PORT(LED7B_PORT),&amp;PORT(LED7C_PORT),&amp;PORT(LED7D_PORT),&amp;PORT(LED7E_PORT),&amp;PORT(LED7F_PORT),&amp;PORT(LED7G_PORT),&amp;PORT(LED7DP_PORT)};<br />volatile uint8_t  aLED7TablicaSegmentPIN&#91;&#93;  = {LED7A,LED7B,LED7C,LED7D,LED7E,LED7F,LED7G,LED7DP};<br />volatile uint8_t aLED7TablicaCyfr&#91;COUNT_DISPLAY&#93;;// tablica z indeksami do znaków zdefiniowanych w tablicy aZnaki&#91;&#93;<br />                                                                        //do wyswietlenia na poszczegolnych wyswietlaczach<br />volatile uint8_t nLED7TablicaKropek;// zmienna bitowa wyswietlania kropek<br />volatile uint8_t nBiezacyWyswietlacz = 0;// biezacy wyswietlacz<br />volatile uint8_t nLED7Flagi = 0;// flagi obslugi wyswietlacza<br />// bit 0 - zmiana wyswietlacza w multipleksie<br />// bit 1 - dla sterowania PWM flaga swiecenia wyświetlacza<br /><br />const uint8_t aLED7Znaki&#91;&#93; PROGMEM = { CHAR_SPACE,<br />         CHAR_0,<br />         CHAR_1,<br />         CHAR_2,<br />         CHAR_3,<br />         CHAR_4,<br />         CHAR_5,<br />         CHAR_6,<br />         CHAR_7,<br />         CHAR_8,<br />         CHAR_9,<br />         CHAR_b,<br />         CHAR_o,<br />         CHAR_t<br />       };<br /><br />// definicje funkcji<br />void LED7_multiplex(void)<br />{<br />uint8_t i;<br /><br />// przeskok na nastepny wyswietlacz<br />LED7COM_CLR(nBiezacyWyswietlacz);// zgas biezacy wyswietlacz<br />if(nBiezacyWyswietlacz)<br />nBiezacyWyswietlacz--;// przeskok wyswietlacza<br />else<br />nBiezacyWyswietlacz = COUNT_DISPLAY - 1;<br />for(i=0;i&lt;7;i++)// zaladowanie nowego znaku do wyswietlacza<br />{<br />if(BIT_MASK(i) &amp; pgm_read_byte(&amp;aLED7Znaki&#91;aLED7TablicaCyfr&#91;nBiezacyWyswietlacz&#93;&#93;))<br />LED7SEG_SET(i);<br />else<br />LED7SEG_CLR(i);<br />}<br />if(nLED7TablicaKropek &amp; BIT_MASK(nBiezacyWyswietlacz)) // obsluga kropki<br />LED7SEG_SET(7);<br />else<br />LED7SEG_CLR(7);<br />LED7COM_SET(nBiezacyWyswietlacz);// zapal biezacy wyswietlacz<br />#if LED7_PWM_TIMER &lt; LED7_MULTIPLEX_TIMER<br />FLAGA_PWM_LED7_SET;// dla PWM ustawiamy stan zapalony<br />#endif<br />}<br /><br />// procedura do umieszczenia w petli glownej<br />#if LED7_MULTIPLEX_EVENT == 1<br />void LED7_EVENT( void ){<br />if(FLAGA_CHANGE_LED7){<br />FLAGA_CHANGE_LED7_CLR;<br />LED7_multiplex();<br />}<br />#if LED7_PWM_TIMER &lt; LED7_MULTIPLEX_TIMER<br />else if(FLAGA_PWM_LED7==0){<br />LED7COM_CLR(nBiezacyWyswietlacz);<br />}<br />#endif<br />}<br />#endif<br /><br />// procedura do wstrzykniecia w procedure przerwania obslugujacego multipleksowanie np. do TIMER0_OVF_vect<br />// lub zastosowac inny sposob wywolania funkcji LED7_multiplex()<br />void LED7_TIMER_INTERRUPT(void)<br />{<br />static uint8_t nLED7Licznik=LED7_MULTIPLEX_TIMER;// licznik multiplexu LED7<br /><br />// obsluga flag wyswietlacza LED7<br />if(nLED7Licznik){<br />nLED7Licznik--;<br />#if LED7_PWM_TIMER &lt; LED7_MULTIPLEX_TIMER<br />if(nLED7Licznik &lt; (LED7_MULTIPLEX_TIMER - LED7_PWM_TIMER)){<br />#if LED7_MULTIPLEX_EVENT == 0<br />LED7COM_CLR(nBiezacyWyswietlacz);<br />#elif LED7_MULTIPLEX_EVENT == 1<br />FLAGA_PWM_LED7_CLR;<br />#endif<br />}<br />#endif<br />}<br />else<br />{<br />nLED7Licznik = LED7_MULTIPLEX_TIMER;<br />#if LED7_MULTIPLEX_EVENT == 0<br />LED7_multiplex();<br />#elif LED7_MULTIPLEX_EVENT == 1<br />FLAGA_CHANGE_LED7_SET;<br />#endif<br />}<br /><br />}<br /><br />void LED7_INIT(void)<br />{<br />uint8_t i;<br /><br />// ustawienie portow jako wyjscia dla wspolnych anod/katod cos w stylu<br />// DDR(LED7COMMON1_PORT) |= (1&lt;&lt;LED7COMMON1);<br />for(i=0;i&lt;COUNT_DISPLAY;i++) *aLED7TablicaCommonDDR&#91;i&#93; |= BIT_MASK(aLED7TablicaCommonPIN&#91;i&#93;);<br />// i zgaszenie wszystkich wyswietlaczy<br />for(i=0;i&lt;COUNT_DISPLAY;i++) LED7COM_CLR(i);<br />// ustawienie portow jako wyjscia dla segmentow cos w stylu<br />// DDR(LED7A_PORT)|= (1&lt;&lt;LED7A);<br />for(i=0;i&lt;8;i++) *aLED7TablicaSegmentDDR&#91;i&#93; |= BIT_MASK(aLED7TablicaSegmentPIN&#91;i&#93;);<br />// Zgaszenie wszystkich segmentow wyswietlacza<br />for(i=0;i&lt;8;i++) LED7SEG_CLR(i);<br />// i wszystkich kropek<br />nLED7TablicaKropek = 0;<br />}[/syntax]<br />przykład zastosowania:<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 16-11-2012<br /> *      Author: perlon<br /> */<br /><br />#include &lt;avr/io.h&gt;// podciągnięcie plików nagłówkowych<br />#include &lt;avr/interrupt.h&gt;<br /><br />#include &quot;LED7/led7.h&quot;<br /><br />volatile uint8_t tick_flag;<br /><br />int main(void)<br />{<br />uint8_t licznik = 0;// zmienna do nastawy wyswietlanych danych<br /><br />// inicjalizacja przerwania TIMER0 - obsluguje zdarzenie KBD_EVENT<br />    TCCR0 |= (0&lt;&lt;CS02) | (1&lt;&lt;CS01)| (0&lt;&lt;CS00);// preskaler 8<br />    TCNT0 = 156;// TIMER0 będzie liczył od 156 do 255 dla preskalera 8 i F_CPU=8MHz przerwanie będzie generowane co ok.100us<br />    TIMSK = (1&lt;&lt;TOIE0);// odblokowanie przerwania OVERFLOW<br /><br />    LED7_INIT();<br /><br />    // ustawmy napis &quot;boot&quot;<br />    aLED7TablicaCyfr&#91;0&#93; = 13;// indeks znaku z tablicy aLED7Znaki wpisany na pierwszy LED7<br />    aLED7TablicaCyfr&#91;1&#93; = 12;// indeks znaku z tablicy aLED7Znaki wpisany na drugi LED7<br />    aLED7TablicaCyfr&#91;2&#93; = 12;// indeks znaku z tablicy aLED7Znaki wpisany na trzeci LED7<br />    aLED7TablicaCyfr&#91;3&#93; = 11;// indeks znaku z tablicy aLED7Znaki wpisany na czwarty LED7<br />    nLED7TablicaKropek = 0;// na razie bez kropek<br /><br />    sei();// globalne odblokowanie przerwań<br /><br />    uint8_t i = 2;<br />    while(i){<br />#if LED7_MULTIPLEX_EVENT==1<br />    LED7_EVENT();<br />#endif<br />    if(tick_flag){<br />    tick_flag = 0;<br />    i--;<br />    }<br />    }<br /><br />    // a teraz wyswietlamy kolejne znaki na wyswietlaczu LED7<br />    tick_flag = 1;<br />    licznik = 1;<br />    while(1)<br />    {<br />    if(tick_flag){<br />    tick_flag = 0;<br />    if(nLED7TablicaKropek)<br />    nLED7TablicaKropek = (nLED7TablicaKropek &gt;&gt; 1);<br />    else<br />    nLED7TablicaKropek = 8;<br />    if(licznik)<br />    licznik--;<br />    else<br />    licznik = 13;<br />    switch(licznik){<br />    case 13:<br />        aLED7TablicaCyfr&#91;0&#93; = licznik;<br />        aLED7TablicaCyfr&#91;1&#93; = 0;<br />        aLED7TablicaCyfr&#91;2&#93; = 1;<br />        aLED7TablicaCyfr&#91;3&#93; = 2;<br />    break;<br />    case 12:<br />        aLED7TablicaCyfr&#91;0&#93; = licznik;<br />        aLED7TablicaCyfr&#91;1&#93; = licznik+1;<br />        aLED7TablicaCyfr&#91;2&#93; = 0;<br />        aLED7TablicaCyfr&#91;3&#93; = 1;<br />    break;<br />    case 11:<br />        aLED7TablicaCyfr&#91;0&#93; = licznik;<br />        aLED7TablicaCyfr&#91;1&#93; = licznik+1;<br />        aLED7TablicaCyfr&#91;2&#93; = licznik+2;<br />        aLED7TablicaCyfr&#91;3&#93; = 0;<br />    break;<br />    default:<br />        aLED7TablicaCyfr&#91;0&#93; = licznik;<br />        aLED7TablicaCyfr&#91;1&#93; = licznik+1;<br />        aLED7TablicaCyfr&#91;2&#93; = licznik+2;<br />        aLED7TablicaCyfr&#91;3&#93; = licznik+3;<br />    break;<br />    }<br />    }<br />#if LED7_MULTIPLEX_EVENT==1<br />    LED7_EVENT();<br />#endif<br />    }<br />}<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />static uint16_t nLicznik = 10000;<br /><br />if(nLicznik)<br />nLicznik--;<br />else<br />{<br />nLicznik = 10000;<br />tick_flag = 1;<br />}<br />TCNT0 = 156;<br />LED7_TIMER_INTERRUPT();<br />}[/syntax]<br /><br />Wszelkie krytyczne uwagi mile widziane jak również pomoc w optymalizacji kodu.<br /><br />Jeszcze filmik. Sory za jakość ale nagrywałem kamerką laptopa. Do ATB włożona ATMega8 w przejściówce. Jak widać kabelki podłączone do różnych portów jak popadło.<br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br /><br />Poprawka kodu.<br />Dla poprawności politycznej wprowadziłem możliwość obsługi multipleksowania w pętli głównej. Konfiguracja trybu oczywiście w pliku nagłówkowym. Zmieniłem również nazwę procedury do wstrzyknięcia w przerwanie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=382">perlon</a> — 27 sie 2013, o 23:41</p><hr />
]]></content>
</entry>
</feed>