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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-07-31T21:18:41+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=15898&amp;mode</id>
<entry>
<author><name><![CDATA[jacky_cy]]></name></author>
<updated>2016-07-31T21:18:41+01:00</updated>
<published>2016-07-31T21:18:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15898&amp;p=165151#p165151</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15898&amp;p=165151#p165151"/>
<title type="html"><![CDATA[Re: [C] [ATtiny13] wyśw. 7 seg. i anody na 74HC759]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15898&amp;p=165151#p165151"><![CDATA[
Dzięki QuadMan! Trochę sobie pokomplikowałem sprawę, a Twoje rozwiązanie tylko ze zmianą stanu zmiennej licznik jest super.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4547">jacky_cy</a> — 31 lip 2016, o 21:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2016-07-31T19:52:30+01:00</updated>
<published>2016-07-31T19:52:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15898&amp;p=165140#p165140</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15898&amp;p=165140#p165140"/>
<title type="html"><![CDATA[Re: [C] [ATtiny13] wyśw. 7 seg. i anody na 74HC759]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15898&amp;p=165140#p165140"><![CDATA[
Witam,<br /><br />Po pierwsze: w linii:[syntax=c]bufor2 = (bufor2 &amp; 0x3F);                       //maska 0011 1111[/syntax] wysterowujesz obie anody wyświetlacza,<br /><br />po drugie, warunek w linii [syntax=c]if(licznik&gt;(0x80)) licznik = (0x40);            // jeśli licznik większy niż 8 to ustaw na 1[/syntax] nigdy nie będzie spełniony. Jeśli masz wyświetlacz tylko z dwoma cyframi, to moim zdaniem nie ma sensu tego tak strasznie komplikować, ja bym to zrobił tak:[syntax=c]ISR (TIM0_COMPA_vect)<br />{<br /> <br />        static uint8_t licznik;<br /> <br />        if(!licznik) {                           //jesli licznik 0100 0000<br />                bufor1 = pgm_read_byte( &amp;cyfry&#91;c1&#93; );   //zapalony wyśw.1 podaj stan zmiennej c1<br />                bufor2 = 0b10111111;<br />                send_to_bufor(bufor1,bufor2);<br />        }<br />        else{                       <br />                bufor1 = pgm_read_byte( &amp;cyfry&#91;c2&#93; );   //zapalony wyśw.2 podaj stan zmiennej c2<br />                bufor2 = 0b01111111;<br />                send_to_bufor(bufor1,bufor2);<br />        }<br /> <br />        licznik ^=1;// Xor licznika;<br />}[/syntax]<br /> No ale ja leniwy jestem. Dla większej ilości cyfr utworzył bym tablicę do załączania anod we flashu, a licznik inkrementował od 0 do liczby anod -1 i do bufora2 podstawiał wartości z tej tablicy.<br /><br />Pozdrawiam, QuadMan.<br /><br />Dopisane: wersja z tablicami - niesprawdzona - coś w ten deseń:[syntax=c]#define LICZBA_ANOD 2<br />const uint8_t an_on_tab&#91;LICZBA_ANOD&#93; PROGMEM = {0b10111111, 0b01111111};// Tablica z maskami zalaczajacymi poszczegolne anody;<br />uint8_t disp_var_tab&#91;LICZBA_ANOD&#93;; // Tu poszczegolne cyfry do wyswietlania <br /><br />ISR (TIM0_COMPA_vect)<br />{<br />static uint8_t licznik;<br /> <br />  send_to_bufor(pgm_read_byte( &amp;cyfry&#91;disp_var_tab&#91;licznik&#93;&#93;), pgm_read_byte( &amp;an_on_tab&#91;licznik&#93;));<br />    if(++licznik &gt; (LICZBA_ANOD - 1)) licznik = 0;<br />    <br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 31 lip 2016, o 19:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacky_cy]]></name></author>
<updated>2016-07-31T19:46:31+01:00</updated>
<published>2016-07-31T19:46:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15898&amp;p=165139#p165139</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15898&amp;p=165139#p165139"/>
<title type="html"><![CDATA[Re: [C] [ATtiny13] wyśw. 7 seg. i anody na 74HC759]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15898&amp;p=165139#p165139"><![CDATA[
bufor2 to zmienna której stan wysyłany jest do rejestru odpowiedzialnego za sterowanie anodami, a bufor 1 katodami<br /><br />czyli jeżeli licznik (0b10111111) to tak ustaw katody, żeby zapalić cyfrę c1<br />jeżeli licznik (0b01111111) to ustaw katody, żeby zapalić c2<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4547">jacky_cy</a> — 31 lip 2016, o 19:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Daro69]]></name></author>
<updated>2016-07-31T19:31:53+01:00</updated>
<published>2016-07-31T19:31:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15898&amp;p=165138#p165138</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15898&amp;p=165138#p165138"/>
<title type="html"><![CDATA[Re: [C] [ATtiny13] wyśw. 7 seg. i anody na 74HC759]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15898&amp;p=165138#p165138"><![CDATA[
czy w linii 59 nie powinno być bufor2 ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11549">Daro69</a> — 31 lip 2016, o 19:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacky_cy]]></name></author>
<updated>2016-07-31T18:19:19+01:00</updated>
<published>2016-07-31T18:19:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15898&amp;p=165132#p165132</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15898&amp;p=165132#p165132"/>
<title type="html"><![CDATA[[C] [ATtiny13] wyśw. 7 seg. i anody na 74HC759]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15898&amp;p=165132#p165132"><![CDATA[
Witam serdecznie,<br /><br />Przerabiałem już nie raz obsługę wyświetlacza używając układu 74HC595 oraz procedury przełączania anod zaczerpniętej z BlueBooka.  Jednakże pierwszy raz z braku pinów chciałem użyć drugiego układu 74HC595 połaczonego w kaskadę do sterowania dwoma anodami jak na poniższym schemacie:<br /><a href="https://obrazkiforum.atnel.pl/4547/9afe1fe8c9bf15aec4e40e5bb3239d22.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/4547/9afe1fe8c9bf15aec4e40e5bb3239d22.png" alt="Obrazek" /></a><br /><br />czyli załączania anod 1 i 2 zmienna 'bufor2' powinna wynosić odpowiednio (0b01111111) oraz (0b10111111). Niestety efekt mam taki że cyfra 2 pokazuje się na raz na obu wyświetlaczach a w momencie kiedy usunę fragment <br />[syntax=c]else if(licznik==(0x80)){//jesli licznik 1000 0000<br />bufor1 = pgm_read_byte( &amp;cyfry&#91;c2&#93; );//zapalony wyśw.2 podaj stan zmiennej c2<br />send_to_bufor(bufor1,bufor2);<br />}[/syntax]<br />to na obu wyświetlaczach pokazuje się cyfra 1. Czyli coś pokiełbasiłem z tym przełączaniem anod, ale niestety już próbowałem &quot;mieszać&quot; i za każdym razem dzieją się podobne rzeczy. Czy moglibyście proszę rzucić &quot;świeżym okiem&quot; i wyłapać co robię nie ta przy przełączaniu anodami? Poniżej kod całego programu:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;regulator.h&quot;<br /><br />volatile uint8_t c1 = 4;<br />volatile uint8_t c2 = 3;<br /><br />volatile uint8_t bufor1;<br />volatile uint8_t bufor2;<br /><br />// definicja tablicy zawierającej definicje bitowe cyfr LED<br />const uint8_t cyfry&#91;15&#93; PROGMEM = {<br />(0x42),// 0<br />(0x7B),// 1<br />(0x26),// 2<br />(0x2A),// 3<br />(0x1B),// 4<br />(0x8A),// 5<br />(0x82),// 6<br />(0x7A),// 7<br />(0x02),// 8<br />(0x0A),// 9<br />(0xFF)// NIC (puste miejsce)<br />};<br /><br />int main()<br />{<br />init_spi();<br />// ustawienie TIMER0<br />TCCR0A |= (1&lt;&lt;WGM01);// tryb CTC<br />TCCR0B |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);// preskaler = 1024<br />OCR0A = 39;// dodatkowy podział przez 39 (rej. przepełnienia)<br />TIMSK0 |= (1&lt;&lt;OCIE0A);// zezwolenie na przerwanie CompareMatch<br /><br />sei();<br /><br />while(1)<br />{<br /><br />}<br />}<br /><br /><br />ISR (TIM0_COMPA_vect)<br />{<br /><br />static uint8_t licznik=(0x40);//licznik ustawiony: 0100 0000<br /><br />//odczytanie zmiennej wysylanej do 74HC595 sterujacego anodami wysw.<br />bufor2 = (bufor2 &amp; 0x3F);//maska 0011 1111<br /><br />if(licznik==(0x40)) {//jesli licznik 0100 0000<br />bufor1 = pgm_read_byte( &amp;cyfry&#91;c1&#93; );//zapalony wyśw.1 podaj stan zmiennej c1<br />send_to_bufor(bufor1,bufor2);<br />}<br />else if(licznik==(0x80)){//jesli licznik 1000 0000<br />bufor1 = pgm_read_byte( &amp;cyfry&#91;c2&#93; );//zapalony wyśw.2 podaj stan zmiennej c2<br />send_to_bufor(bufor1,bufor2);<br />}<br /><br />//cykliczne przełączanie kolejnej anody w każdym przerwaniu<br />bufor2 = (bufor2 &amp; 0x3F) | (~licznik &amp; 0xC0 );// (1001 1010 &amp; 0011 1111) | (0111 1111 &amp; 1100 0000)<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;(0x80)) licznik = (0x40);// jeśli licznik większy niż 8 to ustaw na 1<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4547">jacky_cy</a> — 31 lip 2016, o 18:19</p><hr />
]]></content>
</entry>
</feed>