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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-09-16T22:21:13+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=21290&amp;mode</id>
<entry>
<author><name><![CDATA[faber33]]></name></author>
<updated>2018-09-16T22:21:13+01:00</updated>
<published>2018-09-16T22:21:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21290&amp;p=211740#p211740</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21290&amp;p=211740#p211740"/>
<title type="html"><![CDATA[Re: Multipleksowane wyś. LED - regulacja jasności]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21290&amp;p=211740#p211740"><![CDATA[
Hmm a gdyby to zrobić tak żeby aktualizować OCR2B wtedy gdy TCNT2 =  0 ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=976">faber33</a> — 16 wrz 2018, o 22:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[faber33]]></name></author>
<updated>2018-09-16T14:17:05+01:00</updated>
<published>2018-09-16T14:17:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21290&amp;p=211709#p211709</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21290&amp;p=211709#p211709"/>
<title type="html"><![CDATA[Multipleksowane wyś. LED - regulacja jasności]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21290&amp;p=211709#p211709"><![CDATA[
Witam. Mam taki temat teraz na &quot;tapecie&quot; że potrzebuje zrobić regulację jasności 4x wyświetlacz LED 7 segmentowy. Anody sterowane tak jak w BB przez tranzystory PNP. Atmega168 wew. 8MHz W zasadzie działa mi to z tym że czasem wyświetlacz potrafi mignąć i czasem też widać że na ten ułamek sekundy np. wartość z wyświetlacz 1 pojawia się na wyś. 4.<br /><br />Mam to zrobione w ten sposób jeśli chodzi o obsługę przerwań:<br />[syntax=c]// ****** definicja funkcji inicjalizującej pracę z wyświetlaczem multipleksowanym + LED<br />void d_led_init(void)<br />{<br />//wszystkie piny od katod jako WYJŚCIA<br />SEG_A_DATA_DIR |= SEG_A;<br />SEG_B_DATA_DIR |= SEG_B;<br />SEG_C_DATA_DIR |= SEG_C;<br />SEG_D_DATA_DIR |= SEG_D;<br />SEG_E_DATA_DIR |= SEG_E;<br />SEG_F_DATA_DIR |= SEG_F;<br />SEG_G_DATA_DIR |= SEG_G;<br />SEG_DP_DATA_DIR |= SEG_DP;<br /><br />// wygaszenie wszystkich katod – stan wysoki<br />SEG_A_PORT |= SEG_A;<br />SEG_B_PORT |= SEG_B;<br />SEG_C_PORT |= SEG_C;<br />SEG_D_PORT |= SEG_D;<br />SEG_E_PORT |= SEG_E;<br />SEG_F_PORT |= SEG_F;<br />SEG_G_PORT |= SEG_G;<br />SEG_DP_PORT |= SEG_DP;<br /><br />// 4 piny portu A jako WYJŚCIA (anody wyświetlaczy)<br />CA1_DIR |= CA1;<br />CA2_DIR |= CA2;<br />CA3_DIR |= CA3;<br />CA4_DIR |= CA4;<br /><br />// wygaszenie wszystkich wyświetlaczy - anody<br />CA1_PORT |= CA1;<br />CA2_PORT |= CA2;<br />CA3_PORT |= CA3;<br />CA4_PORT |= CA4;<br /><br /><br />// ustawienie TIMER2<br />TCCR2A |= (1&lt;&lt;WGM21);// tryb CTC<br />TCCR2B |= (1&lt;&lt;CS22)|(1&lt;&lt;CS20);// preskaler = 128<br />OCR2A = 255;// dodatkowy podział przez 255 (rej. przepełnienia)<br />TIMSK2 |= (1&lt;&lt;OCIE2A)|(1&lt;&lt;OCIE2B);// zezwolenie na przerwania CompareMatch<br />}<br /><br /><br />// ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH<br />ISR(TIMER2_COMPA_vect)<br />{<br />static uint8_t licznik=1;// zmienna do przełączania kolejno anod wyrwietlacza<br /><br />if(licznik==1) {<br /><br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;0&#93;&#93;) &amp; 0b10000000)) SEG_A_PORT &amp;= ~SEG_A;<br />else SEG_A_PORT |= SEG_A;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;0&#93;&#93;) &amp; 0b01000000))SEG_B_PORT &amp;= ~SEG_B;<br />else SEG_B_PORT |= SEG_B;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;0&#93;&#93;) &amp; 0b00100000)) SEG_C_PORT &amp;= ~SEG_C;<br />else SEG_C_PORT |=  SEG_C;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;0&#93;&#93;) &amp; 0b00010000)) SEG_D_PORT &amp;= ~SEG_D;<br />else SEG_D_PORT |=  SEG_D;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;0&#93;&#93;) &amp; 0b00001000)) SEG_E_PORT &amp;= ~SEG_E;<br />else SEG_E_PORT |=  SEG_E;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;0&#93;&#93;) &amp; 0b00000100)) SEG_F_PORT &amp;= ~SEG_F;<br />else SEG_F_PORT |=  SEG_F;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;0&#93;&#93;) &amp; 0b00000010)) SEG_G_PORT &amp;= ~SEG_G;<br />else SEG_G_PORT |=  SEG_G;<br /><br />CA1_PORT &amp;= ~CA1;<br />CA2_PORT |= CA2;<br />CA3_PORT |= CA3;<br />CA4_PORT |= CA4;<br /><br />}<br />else if(licznik==2){<br /><br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;1&#93;&#93;) &amp; 0b10000000)) SEG_A_PORT &amp;= ~SEG_A;<br />else SEG_A_PORT |=  SEG_A;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;1&#93;&#93;) &amp; 0b01000000))SEG_B_PORT &amp;= ~SEG_B;<br />else SEG_B_PORT |=  SEG_B;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;1&#93;&#93;) &amp; 0b00100000)) SEG_C_PORT &amp;= ~SEG_C;<br />else SEG_C_PORT |=  SEG_C;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;1&#93;&#93;) &amp; 0b00010000)) SEG_D_PORT &amp;= ~SEG_D;<br />else SEG_D_PORT |=  SEG_D;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;1&#93;&#93;) &amp; 0b00001000)) SEG_E_PORT &amp;= ~SEG_E;<br />else SEG_E_PORT |=  SEG_E;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;1&#93;&#93;) &amp; 0b00000100)) SEG_F_PORT &amp;= ~SEG_F;<br />else SEG_F_PORT |=  SEG_F;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;1&#93;&#93;) &amp; 0b00000010)) SEG_G_PORT &amp;= ~SEG_G;<br />else SEG_G_PORT |=  SEG_G;<br /><br />CA1_PORT |= CA1;<br />CA2_PORT &amp;= ~CA2;<br />CA3_PORT |= CA3;<br />CA4_PORT |= CA4;<br /><br />}<br />else if(licznik==4){<br /><br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;2&#93;&#93;) &amp; 0b10000000)) SEG_A_PORT &amp;= ~SEG_A;<br />else SEG_A_PORT |=  SEG_A;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;2&#93;&#93;) &amp; 0b01000000))SEG_B_PORT &amp;= ~SEG_B;<br />else SEG_B_PORT |=  SEG_B;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;2&#93;&#93;) &amp; 0b00100000)) SEG_C_PORT &amp;= ~SEG_C;<br />else SEG_C_PORT |=  SEG_C;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;2&#93;&#93;) &amp; 0b00010000)) SEG_D_PORT &amp;= ~SEG_D;<br />else SEG_D_PORT |=  SEG_D;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;2&#93;&#93;) &amp; 0b00001000)) SEG_E_PORT &amp;= ~SEG_E;<br />else SEG_E_PORT |=  SEG_E;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;2&#93;&#93;) &amp; 0b00000100)) SEG_F_PORT &amp;= ~SEG_F;<br />else SEG_F_PORT |=  SEG_F;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;2&#93;&#93;) &amp; 0b00000010)) SEG_G_PORT &amp;= ~SEG_G;<br />else SEG_G_PORT |=  SEG_G;<br /><br />CA1_PORT |= CA1;<br />CA2_PORT |= CA2;<br />CA3_PORT &amp;= ~CA3;<br />CA4_PORT |= CA4;<br />}<br />else if(licznik==8){<br /><br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;3&#93;&#93;) &amp; 0b10000000)) SEG_A_PORT &amp;= ~SEG_A;<br />else SEG_A_PORT |=  SEG_A;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;3&#93;&#93;) &amp; 0b01000000))SEG_B_PORT &amp;= ~SEG_B;<br />else SEG_B_PORT |=  SEG_B;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;3&#93;&#93;) &amp; 0b00100000)) SEG_C_PORT &amp;= ~SEG_C;<br />else SEG_C_PORT |=  SEG_C;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;3&#93;&#93;) &amp; 0b00010000)) SEG_D_PORT &amp;= ~SEG_D;<br />else SEG_D_PORT |=  SEG_D;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;3&#93;&#93;) &amp; 0b00001000)) SEG_E_PORT &amp;= ~SEG_E;<br />else SEG_E_PORT |=  SEG_E;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;3&#93;&#93;) &amp; 0b00000100)) SEG_F_PORT &amp;= ~SEG_F;<br />else SEG_F_PORT |=  SEG_F;<br />if(!(pgm_read_byte( &amp;cyfry&#91;cy&#91;3&#93;&#93;) &amp; 0b00000010)) SEG_G_PORT &amp;= ~SEG_G;<br />else SEG_G_PORT |=  SEG_G;<br /><br />CA1_PORT |= CA1;<br />CA2_PORT |= CA2;<br />CA3_PORT |= CA3;<br />CA4_PORT &amp;= ~CA4;<br />}<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;<br />}<br /><br />ISR(TIMER2_COMPB_vect )<br />{<br />// wygaszenie wszystkich wyświetlaczy - anody<br />CA1_PORT |= CA1;<br />CA2_PORT |= CA2;<br />CA3_PORT |= CA3;<br />CA4_PORT |= CA4;<br />}[/syntax]<br /><br />Wartość OCR2B czyli tego który odpowiada za regulację jasności zależy od wartości z ADC i jest aktualizowana co 2s w pętli głównej programu. Z moich obserwacji wynika że efekt opisany wyżej pojawia się gdy wartość OCR2B maleje. Czyżby  to powodowało że przerwania się wykonuje w złym momencie ? W jaki sposób można to poprawić ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=976">faber33</a> — 16 wrz 2018, o 14:17</p><hr />
]]></content>
</entry>
</feed>