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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-03-21T07:40:55+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=10366&amp;mode</id>
<entry>
<author><name><![CDATA[artur85]]></name></author>
<updated>2015-03-21T07:40:55+01:00</updated>
<published>2015-03-21T07:40:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=124076#p124076</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=124076#p124076"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=124076#p124076"><![CDATA[
<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 />No, w końcu udało mi się zebrać elementy i znaleźć trochę czasu na złożenie kostki do kupy. Wielkie dzięki dla kolegi Mokrowskiego za bardzo przyjazny kodzik, z którego udało mi się wybebeszyć biblioteki do obsługi membrany piezo i usypiania procka. Kodem i płytką chyba nie ma się co chwalić, zresztą za jakiś czas powinny się pojawić na moim blogu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1212">artur85</a> — 21 mar 2015, o 07:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2015-03-03T19:34:08+01:00</updated>
<published>2015-03-03T19:34:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121777#p121777</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121777#p121777"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121777#p121777"><![CDATA[
Znalazłem  <img src="https://forum.atnel.pl/images/smilies/icon_mrgreen.gif" alt=":mrgreen:" title="Pan Zielony" /> <br />Oczywiście pierdoła. Rozwiązania dwa. Generalnie cały szkopuł polegał na tym, że projekt (z tego co rozumiem) korzystał nie z tych ustawień indeksera co bym sobie życzył...<br /><br />1: Window -&gt; Preference -&gt; C/C++ -&gt; Indexer -&gt; &quot;Build configuration for the indexer&quot; zmienić z &quot;Use the build configuration specified in the project's indexer settings&quot; na &quot;Use active build configuration&quot;<br /><br />2: Opcje projektu -&gt; C/C++ General -&gt; Indexer -&gt; jako &quot;Build configuration for the indexer&quot; wybrać &quot;Release&quot; (u mnie było Debug) <br /><br />Jednego nie rozumiem: dlaczego zmiana z Debug na Release (opcja 2) cokolwiek zmienia, skoro w tym samym okienku &quot;Enable project specific settings&quot; nie jest zaptaszone? Jeśli nie zezwalam na odrębne ustawienia dla projektu to zmiana ustawień projektu nie powinna chyba być brana pod uwagę?<p>Statystyki: Napisane przez Gość — 3 mar 2015, o 19:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2015-03-03T18:32:59+01:00</updated>
<published>2015-03-03T18:32:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121768#p121768</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121768#p121768"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121768#p121768"><![CDATA[
<div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />Prawy myszy na projekcie -&gt; Properties -&gt; C/C++ General -&gt; Preprocessor Include Path -&gt; Languages: GNU C -&gt; CDT User Setting Entries -&gt; Add -&gt; Preprocessor Macro w okienku #-&gt; Name = __flash -&gt; Value = /**/, zaznaczone Treat as built-in.<br /></div><br /><br />U mnie działa. GNU/Linux, Eclipse Kepler/AVR plugin 2.4.1/avr-gcc 4.7.2 (atmel toolchain 3.4.2.939)<br />Jesteś wielki! <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 3 mar 2015, o 18:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2015-03-03T18:18:49+01:00</updated>
<published>2015-03-03T18:18:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121766#p121766</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121766#p121766"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121766#p121766"><![CDATA[
Heh, a jakiś patent na przeciążanie funkcji w wersji &quot;bieda-c&quot; też jest ;d?<br /><br />Co do errora:<br />Lubuntu 14.04; Eclipse Luna; plugin AVR, openocd, embsysregview i jakiś wtyczek &quot;wrapujący&quot; długie linijki. Clean'y i Rebuild'y przerabiałem - nic nie pomaga. Swoją drogą ten &quot;syntax error&quot; jest jakiś dziwny - nie powinno być informacji w zakładce &quot;Problems&quot;? Jak w dymku od błędu kliknę w opcję ustawień adnotacji to przenosi mnie do ustawień &quot;C/C++ Indexer Markers&quot;... Żeby było śmieszniej po przeniesieniu &quot;const&quot; na początek linijki, głupieje totalnie i nazwa zmiennej &quot;could not be resolved&quot; w main. <br />Pogrzebałem trochę w goolach i &quot;wszystkim&quot; działa przedstawiony sposób... czyli tym razem to ja musiałem coś skopać <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1186/c990ef9f1185cf550aeeda00b3126bb1.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1186/c990ef9f1185cf550aeeda00b3126bb1.png" alt="Obrazek" /></a><br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1186/c9060c11a38b5cca3755b2e30751d7c5.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1186/c9060c11a38b5cca3755b2e30751d7c5.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez Gość — 3 mar 2015, o 18:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2015-03-03T15:50:52+01:00</updated>
<published>2015-03-03T15:34:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121748#p121748</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121748#p121748"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121748#p121748"><![CDATA[
<div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />Mam nieodparte wrażenie że charlieplexing jest trochę takim ,,tabu&quot; którego wszyscy się boją<br /></div>Z punktu widzenia głównie-czytającego-hobbysty stwierdzam, że przypadki, w których spotkałem się z charlieplexing'iem mogę policzyć na palcach jednej ręki (mam na myśli wszelkie publikowane projekty, artykuły, poradniki, porady na forum). <br /><br />Po co są <em>static'i</em> to ja wiem. Tylko, nie wiem czy słusznie, ale w tych działaniach (funkcje i zmienne statyczne, gettery i settery) widzę taką... protezę enkapsulacji*. Aż korci aby to zaklamrować w klasę <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br />* - nie wiem czy to aktualnie poprawna nazwa, zostało mi z dawnych wieczorów spędzonych z Gręboszem<br /><br />----<br /><div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />No to będziesz wpadał, bo wiesz gdzie... ale rozwiązanie jest nieeleganckie<br /></div><br />i nie działa <img src="https://forum.atnel.pl/images/smilies/icon_cry.gif" alt=":cry:" title="Płacze" /> <br />dalej jest syntax error ;/<p>Statystyki: Napisane przez Gość — 3 mar 2015, o 15:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2015-03-03T14:38:27+01:00</updated>
<published>2015-03-03T14:38:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121741#p121741</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121741#p121741"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121741#p121741"><![CDATA[
@<strong>xor</strong> - faktycznie, jak &quot;dorzuciłem&quot; trochę matematyki do main, żeby kompilator pomaglował rejestrami, to jest różnica. Szkoda, że taka subtelna <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />&quot;rcall .+0&quot; - może coś w tym guście: <a href="http://www.avrfreaks.net/forum/would-someone-help-me-understand-how-compiles?name=PNphpBB2&amp;file=viewtopic&amp;t=116812"  class="postlink">avrfreaks</a>?<br /><br />O! Tego o watchdog'u nie wiedziałem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />  <br /><br />@<strong>mokrowski</strong> - ... w różnych miejscach w Eclipse szukałem jak dodać __flash'e i __memx'y do &quot;extensions/builtins/keywords&quot; albo czegoś podobnego, ale na to żeby szukać w &quot;Preprocessor Include Path&quot; bym nie wpadł <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br />Co do Twojego kodu... muszę się przyznać - trochę się zaciąłem na wyświetlaniu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Pogubiłem się co jest co w <em>led.c</em> - muszę usiąść na spokojnie. <br />Ale dwie wątpliwości zdążyły się urodzić:<br />1. Warunek z &quot;<em> 7 == ... </em>&quot; w funkcji <em>get_dice_random_value()</em> -&gt; to jest to o czym pisał <strong>WoodPaker</strong> (że kostka nie przeskoczy na przeciwległy bok)?<br />2. Po co wyłączać TIM0? <br /><br />W ogóle buszując w tym kodzie, napotykając gęsto i często:<br />&quot;funkcje prywatne&quot;<br />&quot;static, static, static...&quot;<br />&quot;get_...()&quot;<br />&quot;set_...()&quot;<br />nasunęło mi się jedno pytanie: czemu nie *.cpp <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ?<p>Statystyki: Napisane przez Gość — 3 mar 2015, o 14:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2015-03-02T23:02:24+01:00</updated>
<published>2015-03-02T23:02:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121690#p121690</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121690#p121690"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121690#p121690"><![CDATA[
<div class="quotetitle">wwojtek napisał(a):</div><div class="quotecontent"><br />1. Zauważyłeś jakąś różnicę po dodaniu atrybutu &quot;OS_main&quot; do main? W kilku projektach sprawdzałem co daje OS_main (ewentualnie noreturn) dodane do main i nigdy nie było różnicy w generowanym kodzie ;/<br /></div><br />Owszem jest różnica. Z tym atrybutem w prologu main nie są zapisywane rejestry &quot;call-saved&quot;, czyli r2-r17, r28, r29. Pewnie jak w main wstawisz same wywołania funkcji i program nie ruszy tych rejestrów to nie zauważysz różnicy (kompilator ich nie zachowa, bo po co). <br />Mam tu jakiś programik pod ręką - różnica w progmem po skompilowaniu: 4 bajty (bez atrybutu jest więcej). Co gorsze na zachowanie tych rejestrów niepotrzebnie zużywany jest RAM. Początek funkcji main bez OS_main:<br /><br />[syntax=asm]000000c8 &lt;main&gt;:<br />  c8:cf 93       pushr28<br />  ca:df 93       pushr29<br />  cc:00 d0       rcall.+0      ; 0xce &lt;main+0x6&gt;<br />  ce:00 d0       rcall.+0      ; 0xd0 &lt;main+0x8&gt;<br />  d0:00 d0       rcall.+0      ; 0xd2 &lt;main+0xa&gt;<br />  d2:cd b7       inr28, 0x3d; 61<br />  d4:de b7       inr29, 0x3e; 62<br />...[/syntax]<br /><br />Nie wiem po co instrukcje rcall .+0, które nic nie robią choć zużywają 6 bajtów RAMu.<br />Z OS_main:<br /><br />[syntax=asm]000000c8 &lt;main&gt;:<br />  c8:cd b7       inr28, 0x3d; 61<br />  ca:de b7       inr29, 0x3e; 62<br />...[/syntax]<br /><br /><div class="quotetitle">wwojtek napisał(a):</div><div class="quotecontent"><br />2. rjmp .+0 vs nop - jest jakaś praktyczna różnica?<br />I jak to się ma np. w ARM? Z tego co pamiętam to, w Cortex'ach nop może zaginąć gdzieś w pipeline'ie i nie można na nim polegać w 100% jeśli chodzi o opóźnienia. Jakoś nigdy nie pomyślałem, aby zamienić nop'a na coś inszego acz równie nie-produktywnego<br /></div><br /><br />Zarówno rjmp jak i nop zajmują we flash jedno słowo, jednak rjmp trwa 2 takty, a nop jeden. A więc mamy 200% normy z jednej instrukcji <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /> Z innych ciekawych instrukcji opóźniających, które niedawno stosowałem: para rcall/ret. Trochę kłopotliwa na co dzień, ale w stawce asemblerowej można wykorzystać. Dwa słowa i 7 (lub 9 w prockach z większą pamięcią) taktów - 350% normy. A zważywszy, że w podprogramach instrukcję ret już i tak mamy to i 700% normy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br />Czy można polegać? Jeśli tylko kompilator instrukcji nie usunie (a po to dajemy volatile, żeby nie usunął) to na 100% można. To nie ARM. Nie, żebym sie jakoś szczególnie znał na ARMach (czy choćby tylko odrobinę <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />), ale słyszałem że AVR są &quot;real time&quot; a ARM nie.<br /><br /><br /><div class="quotetitle">wwojtek napisał(a):</div><div class="quotecontent"><br />3. W ramach optymalizacji można by chyba zrezygnować z rand_flag i przy starcie programu wpisywać do rand_value niemożliwą wartość (&gt;5) co byłoby wyznacznikiem że jeszcze nie było losowania<br /></div><br /><br />Można. Po to nawet utworzyłem stałą NOT_YET ale nie lubię takich zlepków, więc dodałem flagę (stała pozostała, choć trochę nie wiadomo po co <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />).<br /><br /><div class="quotetitle">wwojtek napisał(a):</div><div class="quotecontent"><br />4. &quot;MCUSR = 0; //Niewyzerowana flaga WDRF nie pozwoli na wyłączenie resetu&quot; - chyba coś zgubiłem ;/ jakiego resetu?<br /></div><br /><br />Trybu reset watchdoga. Jeżeli nastąpił reset zainicjowany przez watchdoga, to procek wstaje z ustawioną flagą WDRF i <strong>aktywnym</strong> watchdogiem. Trzeba go wyłączyć, żeby nie bruździł. Ale wykonanie sekwencji wyłączającej (ustaw WDCE i WDE i w ciągu 4 taktów wyzeruj  WDTCSR) z wciąż ustawioną flagą WDRF, nie odniesie skutku. Uprzednio trzeba go wyzerować.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 2 mar 2015, o 23:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2015-03-02T10:00:36+01:00</updated>
<published>2015-03-02T10:00:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121602#p121602</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121602#p121602"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121602#p121602"><![CDATA[
Wow była kostka ascetyczna, a teraz zaczyna obrastać w wyszukane ficzery - projekt wchodzi w fazę barokową  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> <br /><br />@<strong>mokrowski</strong> - syntax error wyrzuca statyczny analizator kodu w eclipse (czy jak to się tam nazywa), nie kompilator - więc pragma niestety nie pomoże ;/ Jak dotąd nie udało mi się znaleźć sposobu żeby się pozbyć tego podkreślania... ale szczerze powiedziawszy specjalnie mi to nie przeszkadza <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1186/21ee16b25be781ce7a1d026459caea2f.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1186/21ee16b25be781ce7a1d026459caea2f.jpg" alt="Obrazek" /></a><br /><br />@<strong>xor</strong> - nie przyszłoby mi do głowy, że da się tak... elastycznie wykorzystać <em>watchdog'a</em> <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Ale mam kilka ogólnych pytań, które nasunęły się po analizie Twojego kodu:<br />1. Zauważyłeś jakąś różnicę po dodaniu atrybutu &quot;OS_main&quot; do main? W kilku projektach sprawdzałem co daje OS_main (ewentualnie noreturn) dodane do main i nigdy nie było różnicy w generowanym kodzie ;/<br />2. <em>rjmp .+0</em> vs <em>nop</em> - jest jakaś praktyczna różnica? <br />I jak to się ma np. w ARM? Z tego co pamiętam to, w Cortex'ach <em>nop</em> może zaginąć gdzieś w pipeline'ie i nie można na nim polegać w 100% jeśli chodzi o opóźnienia. Jakoś nigdy nie pomyślałem, aby zamienić nop'a na coś inszego acz równie nie-produktywnego <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />3. W ramach optymalizacji można by chyba zrezygnować z <em>rand_flag</em> i przy starcie programu wpisywać do <em>rand_value</em> niemożliwą wartość (&gt;5) co byłoby wyznacznikiem że jeszcze nie było losowania <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />4. &quot;MCUSR = 0;      //Niewyzerowana flaga WDRF nie pozwoli na wyłączenie resetu&quot; - chyba coś zgubiłem ;/ jakiego resetu?<p>Statystyki: Napisane przez Gość — 2 mar 2015, o 10:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2015-03-01T19:05:51+01:00</updated>
<published>2015-03-01T19:05:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121486#p121486</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121486#p121486"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121486#p121486"><![CDATA[
<div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />szczególnie przy ARM<br /></div><br />Chyba mówimy o czymś innym. Wg tego: <a href="https://gcc.gnu.org/onlinedocs/gcc/Named-Address-Spaces.html"  class="postlink">https://gcc.gnu.org/onlinedocs/gcc/Named-Address-Spaces.html</a> kwalifikator __flash działa tylko na AVR.<br />...chodzi o M32C (to jest ARM?) i kwalifikator __far? No dobra, i tak nie wiem co mam wstawić w [syntax=c]#pragma GCC diagnostic ignored &quot;-Wtwój_rodzaj_warninga&quot;[/syntax]<br />skoro Eclipse nic nie pokazuje oprócz lakonicznego &quot;Syntax error&quot;.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 1 mar 2015, o 19:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2015-03-01T16:59:00+01:00</updated>
<published>2015-03-01T16:59:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121478#p121478</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121478#p121478"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121478#p121478"><![CDATA[
A ja wpadłem na pomysł jak do układu wg pierwotnego schematu i &quot;mojego&quot; programu wcisnąć buzzer. Prawie się udało: generalnie działa ale pojawiają się zacięcia. Może uda się to zwalczyć. <br />Co do problemów z __flash: #pragma chyba nie zadziała (przyznam, że nie próbowałem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />) bo to nie gcc wywala błąd tylko Eclipse. Próbowałem wyłączać jakieś przełączniki analizy składniowej w ustawieniach Eclipsa ale nic to nie dało.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 1 mar 2015, o 16:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[majster]]></name></author>
<updated>2015-02-28T22:45:44+01:00</updated>
<published>2015-02-28T22:45:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121406#p121406</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121406#p121406"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=121406#p121406"><![CDATA[
ja zrobię wycieczkę <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> wee ołówkiem i na stykówce <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />a tak na poważnie to też zaczynam się zastanawiać nad taką kostką <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />gram często z córką w gry planszowe <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> i było by to miłym urozmaiceniem gry <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: kilkunastu sekundach ]</span></strong><br /><br />ps film masz zablokowany i nie pokazuje się na innych stronach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1628">majster</a> — 28 lut 2015, o 22:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2015-02-22T15:54:55+01:00</updated>
<published>2015-02-22T15:54:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=120369#p120369</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=120369#p120369"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=120369#p120369"><![CDATA[
Znów odgrzewam temat, niedługo obejmę funkcję archeologa forum <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br />Przerobiłem ostatni kod dodając trochę animacji na diodkach. Może sobie zmajstruję taką kostkę,a dzieciakom na pewno bardziej się będzie podobać taka bardziej migająca. Przy okazji zmieniłem sposób wykrywania nieprawidłowych wciśnięć. Kod jest na m168p, ale z założeniem, że ma się dać dostosować na attiny, więc nie może używać ficzerów i zasobów, których nie ma na attiny. Stąd intensywne wykorzystanie WDT jako timera. Kod zajmuje 646+2B.<br />Przy okazji: ktoś wie jak w eclipsie wyłączyć sygnalizowanie errora dla stałych typu <em>__flash</em>?<br /><br />[syntax=c]/*<br /> * main_4.c<br /> *<br /> *  Created on: 22 lut 2015<br /> *      Author: slawek<br /> */<br /><br />/*<br /> * Fusebity m168p: low 0x42, high 0xdf, ext 0x01<br /> * BODLEVEL: off<br /> * SUT_CKSEL: Int RC OSC 6/14 + 0ms<br /> * CKDIV8: on<br /> * WDTON: off<br /> */<br /><br />//TODO: zrobić porządek z ustawianiem nieużywanch pinów przy wyświetlaniu<br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/power.h&gt;<br />#include &lt;avr/sleep.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/wdt.h&gt;<br />#include &lt;util/atomic.h&gt;<br /><br />#define OUT_PORTPORTD<br />#define OUT_PINPIND<br />#define OUT_DDRDDRD<br /><br />#define BUTTON_MASK(_BV(PD2))<br />#define DOT(_BV(PD0))//1, 3, 5<br />#define BACKSLASH(_BV(PD1))//2, 3, 4, 5, 6<br />#define SLASH(_BV(PD3))//4, 5, 6<br />#define DASH(_BV(PD4))//6<br />#define LED_MASK( DOT | BACKSLASH | SLASH | DASH )<br /><br />#define BLINKS1//ile mrugnięć diody po włączeniu zasilania<br />#define BLINKS_RST5//ile mrugnięć diody po zbyt długim trzymaniu batona<br /><br />#define NOT_YET0//wartość zmiennej wskazująca, że losowanie jeszcze trwa<br /><br />#define ARR_SIZE(ARR) (sizeof(ARR)/sizeof(ARR&#91;0&#93;))<br /><br />const uint8_t __flash port_val&#91;&#93; = {<br />  ((~DOT) &amp; LED_MASK) | BUTTON_MASK,<br />  ((~BACKSLASH)&amp; LED_MASK) | BUTTON_MASK,<br />  ((~(DOT | BACKSLASH)) &amp; LED_MASK) | BUTTON_MASK,<br />  ((~(BACKSLASH | SLASH)) &amp; LED_MASK) | BUTTON_MASK,<br />  ((~(DOT | BACKSLASH | SLASH))&amp; LED_MASK) | BUTTON_MASK,<br />  ((~(BACKSLASH | SLASH | DASH)) &amp; LED_MASK) | BUTTON_MASK<br />} ;<br /><br />//wylosowana liczba<br />volatile uint8_t rand_value;<br />//przypisanie wylosowanej liczby przy pierwszej zmianie stanu klawisz<br />volatile uint8_t rand_flag= NOT_YET;<br /><br />inline void powersave_init(void);<br />inline void io_init(void);<br />inline void timer_init(void);<br />inline void blink(void);<br />inline void spin();<br />void set_wdt_interrupt(uint8_t);<br /><br />int main(void) __attribute__((OS_main));<br />int main(void)<br />{<br />//wyłączenie nieużywanych podzespołów<br />powersave_init();<br />//init używanych wejść<br />io_init();<br />//ustawienie timera losującego<br />timer_init();<br />//za wyjątkiem czasu losowania µC będzie w stanie Power Down<br />    set_sleep_mode(SLEEP_MODE_PWR_DOWN);<br /><br />    sei();<br /><br />    //pokaż że działasz albo że nastąpił reset<br />    blink();<br /><br />    while(1)<br />    {<br />        //włącz button by można było wybudzić procka<br />        PCMSK2 = _BV(PCINT18);<br />    //śpij aż do wciśnięcia przycisku<br />    sleep_mode();<br />    //Start zegara to 6+14 cykli, wywołanie przerwania to 4 cykle plus 5 cykli<br />    //na wybudzenie (czy można doliczyć?) plus 3 cykle na powrót, razem 27-32 cykle<br />    //Przy F_CPU 1MHz daje to 27-32µs<br />    //Wliczając kolejne instrukcje (oraz ewentualne wywołania przerwań w wyniku drgania<br />    //styków-wyłączyć?) powinno to załatwić problem bouncignu (drgania muszą być wygaszone<br />    //przed następnym uśpieniem. W razie czego przed kolejnym sleep_mode można dodać<br />    //kilka nopów czy rjmp +0 (albo w ISR ;-))<br />    asm volatile(&quot;rjmp .+0&quot;);asm volatile(&quot;rjmp .+0&quot;);<br />    asm volatile(&quot;rjmp .+0&quot;);asm volatile(&quot;rjmp .+0&quot;);<br />    asm volatile(&quot;rjmp .+0&quot;);asm volatile(&quot;rjmp .+0&quot;);<br />    asm volatile(&quot;rjmp .+0&quot;);asm volatile(&quot;rjmp .+0&quot;);<br />    asm volatile(&quot;rjmp .+0&quot;);asm volatile(&quot;rjmp .+0&quot;);<br /><br />    //rozpocznij losowanie aż do puszczenia przycisku<br />    TCNT0 = 0;<br />    set_sleep_mode(SLEEP_MODE_IDLE);<br />    rand_flag = NOT_YET;<br />    //do tego momentu drgania stykow powinny wygasnąć, a więc jeżeli na pinie przycisku<br />    //jest stan wysoki to znaczy, że guzik jest niewciśnięty co jest nieprawidłowe<br />    //zapodajemy reset dla uzdrowienia sytuacji<br />    if( OUT_PIN &amp; BUTTON_MASK )<br />    {<br />       wdt_enable(WDTO_15MS);<br />       while(1);<br />    }<br />    //guzik jest wduszony - pokaż kręciołka, że losujesz<br />    spin();<br />//    sleep_mode();<br />    //mamy wylosowaną liczbę<br />    //wyświetl liczbę<br />    OUT_PORT = port_val&#91;rand_value&#93;;<br />    //button chwilowo wyłączamy aby zapwenić niezakłócone wyświetlanie<br />    PCMSK2 &amp;= ~_BV(PCINT18);<br />        //przerwanie watchdoga zakończy wyświetlanie<br />    set_wdt_interrupt(WDTO_2S);<br />        set_sleep_mode(SLEEP_MODE_PWR_DOWN);<br />       sleep_mode();<br />       //koniec wyświetlania, przygotuj się do snu<br />        //wyłącz Watchdoga<br />        wdt_disable();<br />    //wyłącz diody<br />        OUT_PORT |= LED_MASK;<br />    }<br /><br />}<br /><br />inline void powersave_init(void)<br />{<br />//*************** OSZCZĘDZANIE ENERGII **********************<br />//BOD, Watchdog wyłączone fusbitami. ADC jest domyślnie wyłączony<br />//Wyłączamy pozostałe podzespoły...<br />power_all_disable();<br />//...jednak Timer0 będzie nam potrzebny<br />power_timer0_enable();<br /><br />//Wyłączenie komparatora analogowego. Aref też się wyłącza.<br />ACSR |= _BV(ACD);<br /><br />//wyłączenie wejść cyfrowych ADC<br />DIDR0 = _BV(ADC0D) | _BV(ADC1D) | _BV(ADC2D) | _BV(ADC3D) | _BV(ADC4D) | _BV(ADC5D);<br /><br />//spowolnienie zegara (do 1MHz)<br />//clock_prescale_set(clock_div_8); //ustawione przez CKDIV8<br /><br />//ustawianie nieużywanych portów jako wejścia z pullupem<br />//todo: w czasie pracy włączać pullup<br />//przed wejśćiem w powerdown wyłączać pullup<br />//PORTB = 0xff;<br />//PORTD |= _BV(PD5) | _BV(PD6) | _BV(PD7);<br />}<br /><br />inline void io_init(void)<br />{<br />//Wyjścia<br />//PD0 - środkowa kropka, PD1 - przekątna lewo/góra-prawo/dół,<br />//PD3 - przekątna lewo/dół-prawo/góra, PD4 - poziomo<br />//Wejścia<br />//PD2 (PCINT18)- button<br />    OUT_DDR = LED_MASK; // ustawienie wyjść<br />    OUT_PORT |= LED_MASK;// wyłączenie diod (wysterowane stanem niskim)<br />    OUT_PORT |= BUTTON_MASK; //pullup na button<br /><br />//Ustawienie Pin Change Interrupt na przycisku<br />    PCICR = _BV(PCIE2);<br />//    PCMSK2 = _BV(PCINT18);<br />}<br /><br />inline void timer_init(void)<br />{<br />TCCR0A = _BV(WGM01);//tryb CTC<br />TCCR0B = _BV(CS00);//szybkość &quot;mieszania&quot; liczb (preskaler 1, może raczej 8 lub nawet 64??)<br />OCR0A = 5;<br />}<br /><br />inline void blink(void)<br />{<br />uint8_t i = MCUSR &amp; _BV(WDRF) ? BLINKS_RST : BLINKS; //dla inicjacji od resetu WD więcej mignięc<br /><br />MCUSR = 0;//Niewyzerowana flaga WDRF nie pozwoli na wyłączenie resetu<br />set_wdt_interrupt(WDTO_500MS);<br />sleep_mode();<br />set_wdt_interrupt(WDTO_60MS);<br />for(i+=i; i; i--)<br />{<br />OUT_PORT ^= LED_MASK;<br />sleep_mode();<br />}<br />wdt_disable();<br />//OUT_PORT = LED_MASK;<br />}<br /><br />inline void spin()<br />{<br />static const uint8_t __flash spin_val&#91;&#93; = {<br />  ((~(DOT | DASH)) &amp; LED_MASK) | BUTTON_MASK,<br />  ((~(DASH)) &amp; LED_MASK) | BUTTON_MASK,<br />  ((~(DOT | SLASH)) &amp; LED_MASK) | BUTTON_MASK,<br />  ((~(SLASH)) &amp; LED_MASK) | BUTTON_MASK,<br />  ((~(DOT | BACKSLASH)) &amp; LED_MASK) | BUTTON_MASK,<br />  ((~(BACKSLASH)) &amp; LED_MASK) | BUTTON_MASK<br />};<br />uint8_t i;<br /><br />//poczekaj z wyświetlaniem kręcioła żeby uniknąć migania przy szybkim zwolnieniu przycisku<br />set_wdt_interrupt(WDTO_60MS);<br />sleep_mode();<br />set_wdt_interrupt(WDTO_30MS);<br />//wyświetlaj kręcioła aż do otrzymania wartośći rand (czyli puszczenia przycisku)<br />while(rand_flag == NOT_YET)<br />{<br />if(i&gt;=ARR_SIZE(spin_val))<br />i=0;<br />OUT_PORT = spin_val&#91;i++&#93;;<br />sleep_mode();<br />}<br />OUT_PORT = LED_MASK;<br />wdt_disable();<br />}<br /><br />void set_wdt_interrupt(uint8_t timeout)<br />{<br />uint8_t tmp = _BV(WDIE) | (timeout &amp; 0x07) | (timeout&amp;0x08 ? _BV(WDP3) : 0);<br /><br />ATOMIC_BLOCK(ATOMIC_FORCEON)<br />{<br />wdt_reset();<br />WDTCSR = (1 &lt;&lt; WDCE) | (1 &lt;&lt; WDE);<br />WDTCSR = tmp;<br />}<br />}<br /><br />//EMPTY_INTERRUPT(PCINT2_vect)<br />ISR(PCINT2_vect)<br />{<br />uint8_t tmp = rand_flag;<br /><br />if(tmp == NOT_YET)<br />{<br />rand_value = TCNT0;<br />rand_flag = !NOT_YET;<br />}<br />}<br /><br />EMPTY_INTERRUPT(WDT_vect)<br />//ISR(WDT_vect)<br />//{<br />//OUTPORT ^= DOT;<br />//}[/syntax]<br /><br />Działa to tak:<br /><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><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 22 lut 2015, o 15:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2015-02-18T20:16:23+01:00</updated>
<published>2015-02-18T20:16:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=119740#p119740</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=119740#p119740"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=119740#p119740"><![CDATA[
I znów odkopię temat <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /> Nie bardzo mogłem wymyślić eleganckiego sposobu zapobiegania zawieszeniom kostki w trybie idle (see <a href="http://forum.atnel.pl/topic10366-30.html#p117887"  class="postlink">http://forum.atnel.pl/topic10366-30.html#p117887</a>) więc zastosowałem rozwiązanie typu &quot;weź większy młotek&quot;. Ten młotek to wymuszony reset realizowany przez watchdoga. Jeszcze nie wszystko działa tak jakbym chciał, ale w działającym układzie już bym to zastosował.<br /><br />[syntax=c]/*<br /> * main_3.c<br /> *<br /> *  Created on: 14 lut 2015<br /> *      Author: slawek<br /> */<br /><br />/*<br /> * Fusebity m168p: low 0x42, high 0xdf, ext 0x01<br /> * BODLEVEL: off<br /> * SUT_CKSEL: Int RC OSC 6/14 + 0ms<br /> * CKDIV8: on<br /> * WDTON: off<br /> */<br /><br />//TODO: zrobić porządek z ustawianiem nieużywanch pinów przy wyświetlaniu<br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/power.h&gt;<br />#include &lt;avr/sleep.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/wdt.h&gt;<br />#include &lt;util/atomic.h&gt;<br /><br />#define OUT_PORTPORTD<br />#define OUT_DDRDDRD<br />#define BUTTON_MASK(_BV(PD2))<br />#define DOT(_BV(PD0))//1, 3, 5<br />#define BACKSLASH(_BV(PD1))//2, 3, 4, 5, 6<br />#define SLASH(_BV(PD3))//4, 5, 6<br />#define DASH(_BV(PD4))//6<br />#define LED_MASK( DOT | BACKSLASH | SLASH | DASH )<br />#define BLINKS1//ile mrugnięć diody po włączeniu zasilania<br />#define BLINKS_RST5//ile mrugnięć diody po zbyt długim trzymaniu batona<br /><br /><br />const uint8_t __flash port_val&#91;&#93; = {<br />  ((~DOT) &amp; LED_MASK) | BUTTON_MASK,<br />  ((~BACKSLASH)&amp; LED_MASK) | BUTTON_MASK,<br />  ((~(DOT | BACKSLASH)) &amp; LED_MASK) | BUTTON_MASK,<br />  ((~(BACKSLASH | SLASH)) &amp; LED_MASK) | BUTTON_MASK,<br />  ((~(DOT | BACKSLASH | SLASH))&amp; LED_MASK) | BUTTON_MASK,<br />  ((~(BACKSLASH | SLASH | DASH)) &amp; LED_MASK) | BUTTON_MASK<br />} ;<br /><br />void inline powersave_init(void);<br />void inline io_init(void);<br />void inline timer_init(void);<br />void inline blink(void);<br />void set_wdt_interrupt(uint8_t);<br /><br />int main(void) __attribute__((OS_main));<br />int main(void)<br />{<br />//wyłączenie nieużywanych podzespołów<br />powersave_init();<br />//init używanych wejść<br />io_init();<br />//ustawienie timera losującego<br />timer_init();<br />//za wyjątkiem czasu losowania µC będzie w stanie Power Down<br />    set_sleep_mode(SLEEP_MODE_PWR_DOWN);<br /><br />    sei();<br /><br />    //pokaż że działasz albo że nastąpił reset<br />    blink();<br /><br />    while(1)<br />    {<br />        //włącz button by można było wybudzić procka<br />        PCMSK2 = _BV(PCINT18);<br />    //śpij aż do wciśnięcia przycisku<br />    sleep_mode();<br />    //Start zegara to 6+14 cykli, wywołanie przerwania to 4 cykle plus 5 cykli<br />    //na wybudzenie (czy można doliczyć?) plus 3 cykle na powrót, razem 27-32 cykle<br />    //Przy F_CPU 1MHz daje to 27-32µs<br />    //Wliczając kolejne instrukcje (oraz ewentualne wywołania przerwań w wyniku drgania<br />    //styków-wyłączyć?) powinno to załatwić problem bouncignu (drgania muszą być wygaszone<br />    //przed następnym uśpieniem. W razie czego przed kolejnym sleep_mode można dodać<br />    //kilka nopów czy rjmp +0 (albo w ISR ;-))<br /><br />    //rozpocznij losowanie aż do puszczenia przycisku<br />    TCNT0 = 0;<br />    set_sleep_mode(SLEEP_MODE_IDLE);<br />    //ogranicz czas losowania na maksimum 4s, potem resetuj µC<br />    //jednocześnie jest to zabezpieczenie przed sytuacją gdy wejście w power down<br />    //nastąpiło z wciśniętym przyciskiem<br />    wdt_enable(WDTO_4S);<br />    sleep_mode();<br />    //mamy wylosowaną liczbę<br />    wdt_reset();<br />    //wyświetl liczbę<br />    OUT_PORT = port_val&#91;TCNT0&#93;;<br />    //button chwilowo wyłączamy aby zapwenić niezakłócone wyświetlanie<br />    PCMSK2 &amp;= ~_BV(PCINT18);<br />        //przerwanie watchdoga zakończy wyświetlanie<br />    set_wdt_interrupt(WDTO_2S);<br />        set_sleep_mode(SLEEP_MODE_PWR_DOWN);<br />       sleep_mode();<br />       //koniec wyświetlania, przygotuj się do snu<br />        //wyłącz Watchdoga<br />        wdt_disable();<br />    //wyłącz diody<br />        OUT_PORT |= LED_MASK;<br />    }<br /><br />}<br /><br />inline void powersave_init(void)<br />{<br />//*************** OSZCZĘDZANIE ENERGII **********************<br />//BOD, Watchdog wyłączone fusbitami. ADC jest domyślnie wyłączony<br />//Wyłączamy pozostałe podzespoły...<br />power_all_disable();<br />//...jednak Timer0 będzie nam potrzebny<br />power_timer0_enable();<br /><br />//Wyłączenie komparatora analogowego. Aref też się wyłącza.<br />ACSR |= _BV(ACD);<br /><br />//wyłączenie wejść cyfrowych ADC<br />DIDR0 = _BV(ADC0D) | _BV(ADC1D) | _BV(ADC2D) | _BV(ADC3D) | _BV(ADC4D) | _BV(ADC5D);<br /><br />//spowolnienie zegara (do 1MHz)<br />//clock_prescale_set(clock_div_8); //ustawione przez CKDIV8<br /><br />//ustawianie nieużywanych portów jako wejścia z pullupem<br />//todo: w czasie pracy włączać pullup<br />//przed wejśćiem w powerdown wyłączać pullup<br />//PORTB = 0xff;<br />//PORTD |= _BV(PD5) | _BV(PD6) | _BV(PD7);<br />}<br /><br />inline void io_init(void)<br />{<br />//Wyjścia<br />//PD0 - środkowa kropka, PD1 - przekątna lewo/góra-prawo/dół,<br />//PD3 - przekątna lewo/dół-prawo/góra, PD4 - poziomo<br />//Wejścia<br />//PD2 (PCINT18)- button<br />    OUT_DDR = LED_MASK; // ustawienie wyjść<br />    OUT_PORT |= LED_MASK;// wyłączenie diod (wysterowane stanem niskim)<br />    OUT_PORT |= BUTTON_MASK; //pullup na button<br /><br />//Ustawienie Pin Change Interrupt na przycisku<br />    PCICR = _BV(PCIE2);<br />//    PCMSK2 = _BV(PCINT18);<br />}<br /><br />inline void timer_init(void)<br />{<br />TCCR0A = _BV(WGM01);//tryb CTC<br />TCCR0B = _BV(CS00);//szybkość &quot;mieszania&quot; liczb (preskaler 1, może raczej 8 lub nawet 64??)<br />OCR0A = 5;<br />}<br /><br />inline void blink(void)<br />{<br />uint8_t i = MCUSR &amp; _BV(WDRF) ? BLINKS_RST : BLINKS; //dla inicjacji od resetu WD więcej mignięc<br /><br />MCUSR = 0;//Niewyzerowana flaga WDRF nie pozwoli na wyłączenie resetu<br />set_wdt_interrupt(WDTO_500MS);<br />sleep_mode();<br />set_wdt_interrupt(WDTO_60MS);<br />for(i+=i; i; i--)<br />{<br />OUT_PORT ^= LED_MASK;<br />sleep_mode();<br />}<br />wdt_disable();<br />//OUT_PORT = LED_MASK;<br />}<br /><br />void set_wdt_interrupt(uint8_t timeout)<br />{<br />uint8_t tmp = _BV(WDIE) | (timeout &amp; 0x07) | (timeout&amp;0x08 ? _BV(WDP3) : 0);<br /><br />ATOMIC_BLOCK(ATOMIC_FORCEON)<br />{<br />wdt_reset();<br />WDTCSR = (1 &lt;&lt; WDCE) | (1 &lt;&lt; WDE);<br />WDTCSR = tmp;<br />}<br />}<br /><br />EMPTY_INTERRUPT(PCINT2_vect)<br /><br />EMPTY_INTERRUPT(WDT_vect)<br />//ISR(WDT_vect)<br />//{<br />//OUTPORT ^= DOT;<br />//}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 18 lut 2015, o 20:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[WoodPaker]]></name></author>
<updated>2015-02-09T11:55:22+01:00</updated>
<published>2015-02-09T11:55:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=117975#p117975</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=117975#p117975"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=117975#p117975"><![CDATA[
<div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />Ale ja już nie będę celował w ilość bajtów kodu tylko w ,,fiuczery&quot; kostki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /></div><br /><br />No to jak idziemy w &quot;fiuczery&quot; kostki to proponuję ją urealnić i jeśli mamy projekt jak powyżej to np. dodać zabezpieczenie, że w czasie losowania nie może być po szóstce jedynki albo po trójce czwórki bo jak wiadomo naprzeciwległe pola dają w sumie siedem. Nie ma więc możliwości żeby kostka przekręciła się z 6 na 1 z pominięciem innej liczby <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1425">WoodPaker</a> — 9 lut 2015, o 11:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[artur85]]></name></author>
<updated>2015-02-09T11:16:34+01:00</updated>
<published>2015-02-09T11:16:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=117964#p117964</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=117964#p117964"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=117964#p117964"><![CDATA[
No to może i ja się pochwalę swoim pomysłem. Na początek małe demko<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 />Zamiast diod postanowiłem wykorzystać wyświetlacz 7-segmentowy (z małą pomocą rejestru przesuwnego 74hc595 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />). Na razie losowanie liczby odbywa się po zwarciu jednego z pinów do masy, docelowo chcę użyć przerwania INT0, który wybudzi procek i przeprowadzi losowanie. Również chciałbym uruchamiać kostkę poprzez jej potrząśnięcie. Jest też zwalnianie losowania i płynne wygaszanie wyświetlacza. Kodem się pochwalę jak już będzie poprawiony i gotowy, na razie wstyd się z nim pokazywać.<br />Teraz czekam tylko na paczkę z elementami i zabieram się do projektowania płytki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1212">artur85</a> — 9 lut 2015, o 11:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2015-02-08T23:36:42+01:00</updated>
<published>2015-02-08T23:36:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=117926#p117926</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=117926#p117926"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=117926#p117926"><![CDATA[
Aż nie mogę się doczekać! Ja jeszcze za &quot;cienki&quot; jestem, ale bardzo chętnie to zobaczę! No i do tego, ile znowu się nauczę!  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 8 lut 2015, o 23:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2015-02-09T08:00:22+01:00</updated>
<published>2015-02-08T20:28:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=117887#p117887</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=117887#p117887"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=117887#p117887"><![CDATA[
Pobawiłem się trochę trybami oszczędzania energii i zmodziłem kostkę oszczędną energetycznie. Nie mam dobrego miernika więc pomiary są raczej orientacyjne ale wyszło, że w stanie bezczynności układ pobiera ok 0,1µA (co się zgadza z dataszitem), w czasie losowania prąd waha się między 3 a 1,5mA, podczas wyświetlania wyniku 6,5µA+prąd diod. A więc spokojnie można się pozbyć włącznika; nawet na bateryjce pastylkowej, która ma pojemność ok 100mAh, układ mógłby sobie leżeć gotowy do pracy przez 100 tys. godzin.<br />Program testowany na atmega168p, ale powinien się dać łatwo przenieść na attiny13 bo nie korzystałem z żadnych ficzerów, które ma atmega a nie ma attiny. Zajętość flasha na m168: 368 bajtów. Schemat niemal identyczny z oryginalnym, jedynie zamiast portu B jest użyty port D i baton został przesunięty z 4 pinu na drugi (PD2) a diodki przesunięte na 3 i 4 pin. To dlatego, że początkowo wybudzanie było przerwaniem INT0. Ostatecznie okazało się, że nie było to potrzebne ale układ już został <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /> Program nie jest całkowicie idiotoodporny, jak się wydaje w pewnych warunkach może nie wejść w stan Power Down, a to oznacza znacznie większe zużycie energii <em>(Edit: Już po napisaniu postu przyszedł mi do głowy sposób jak pozbyć się tej wady bez większej przebudowy programu, ale o tym może kiedy indziej)</em>. &quot;Produkcyjnie&quot; bym go nie zastosował. Ale pobawić się można <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /><br />[syntax=c]/*<br /> * main_2.c<br /> *<br /> *  Created on: 8 lut 2015<br /> *      Author: slawek<br /> */<br /><br />/*<br /> * Fusebity m168p: low 0x42, high 0xdf, ext 0x01<br /> * BODLEVEL: off<br /> * SUT_CKSEL: Int RC OSC 6/14 + 0ms<br /> * CKDIV8: on<br /> * WDTON: off<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/power.h&gt;<br />#include &lt;avr/sleep.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/wdt.h&gt;<br />#include &lt;util/atomic.h&gt;<br /><br /><br />enum wdt_sets {WDT_25 = _BV(WDP2),<br />WDT_2S = _BV(WDP0)|_BV(WDP1)|_BV(WDP2),<br />WDT_4S = _BV(WDP3)<br />};<br /><br />const uint8_t __flash port_val&#91;&#93; = {<br />  ((~_BV(PD0)) &amp; (_BV(PD0) | _BV(PD1) | _BV(PD3) |_BV(PD4))) | _BV(PD2),<br />  ((~_BV(PD1)) &amp; (_BV(PD0) | _BV(PD1) | _BV(PD3) |_BV(PD4))) | _BV(PD2),<br />  ((~(_BV(PD0) | _BV(PD1))) &amp; (_BV(PD0) | _BV(PD1) | _BV(PD3) |_BV(PD4))) | _BV(PD2),<br />  ((~(_BV(PD1) | _BV(PD3))) &amp; (_BV(PD0) | _BV(PD1) | _BV(PD3) |_BV(PD4))) | _BV(PD2),<br />  ((~(_BV(PD0) | _BV(PD1) |_BV(PD3))) &amp; (_BV(PD0) | _BV(PD1) | _BV(PD3) |_BV(PD4))) | _BV(PD2),<br />  ((~(_BV(PD1) | _BV(PD3) |_BV(PD4))) &amp; (_BV(PD0) | _BV(PD1) | _BV(PD3) |_BV(PD4))) | _BV(PD2)<br />} ;<br /><br />void powersave_init(void);<br />void io_init(void);<br />void timer_init(void);<br />void set_wdt(enum wdt_sets);<br /><br />int main(void) __attribute__((OS_main));<br />int main(void)<br />{<br />powersave_init();<br />io_init();<br />timer_init();<br /><br />    //Ustaw początkowy tryb oszczędzania energii<br />    set_sleep_mode(SLEEP_MODE_PWR_DOWN);<br /><br />    sei();<br />    while(1)<br />    {<br />    //śpij aż do wciśnięcia przycisku<br />    //todo: zapewnić, że µC nie zaśnie z wciśniętym przyciskiem<br />    sleep_mode();<br />    //Start zegara to 6+14 cykli, wywołanie przerwania to 4 cykle plus 5 cykli<br />    //na wybudzenie (czy można doliczyć?) plus 3 cykle na powrót, razem 27-32 cykle<br />    //Przy F_CPU 1MHz daje to 27-32µs<br />    //Wliczając kolejne (oraz ewentualne wywołania przerwań w wyniku drgania<br />    //styków-wyłączyć?) powinno to załatwić problem bouncignu (drgania muszą być wygaszone<br />    //przed następnym uśpieniem<br /><br />    //zresetuj timer oraz wprowadź µC w tryb idle<br />    TCNT0 = 0;<br />    set_sleep_mode(SLEEP_MODE_IDLE);<br />    //śpij aż do puszczenia przycisku<br />    sleep_mode();<br />    //mamy wylosowaną liczbę<br />    //wyświetl liczbę<br />    PORTD = port_val&#91;TCNT0&#93;;<br />    //wyłącz button żeby przypadkiem nie wyłączyć wyświetlania<br />    PCMSK2 &amp;= ~_BV(PCINT18);<br />        //włącz watchdog interrupt 2 s<br />    set_wdt(WDT_2S);<br />        set_sleep_mode(SLEEP_MODE_PWR_DOWN);<br />       //Wyświetla aż do wybudzenia przez Watchdog<br />        sleep_mode();<br />    //wyłącz diody<br />        PORTD |= _BV(PD0) | _BV(PD1) | _BV(PD3) | _BV(PD4);<br />        //wyłącz Watchdoga<br />        wdt_disable();<br />        //włącz button by można było wybudzić procka<br />        PCMSK2 = _BV(PCINT18);<br />    }<br /><br />}<br /><br />inline void powersave_init(void)<br />{<br />//*************** OSZCZĘDZANIE ENERGII **********************<br />//BOD, Watchdog wyłączone fusbitami. ADC jest domyślnie wyłączony<br />//Wyłączamy pozostałe podzespoły...<br />power_all_disable();<br />//...jednak Timer0 będzie nam potrzebny<br />power_timer0_enable();<br /><br />//Wyłączenie komparatora analogowego. Aref też się wyłącza.<br />ACSR |= _BV(ACD);<br /><br />//wyłączenie wejść cyfrowych ADC<br />DIDR0 = _BV(ADC0D) | _BV(ADC1D) | _BV(ADC2D) | _BV(ADC3D) | _BV(ADC4D) | _BV(ADC5D);<br /><br />//spowolnienie zegara (do 1MHz)<br />//clock_prescale_set(clock_div_8); //ustawione przez CKDIV8<br /><br />//ustawianie nieużywanych portów jako wejścia z pullupem<br />//PORTB = 0xff;<br />//PORTD |= _BV(PD5) | _BV(PD6) | _BV(PD7);<br />}<br /><br />inline void io_init(void)<br />{<br />//Wyjścia<br />//PD0 - środkowa kropka, PD1 - przekątna lewo/góra-prawo/dół,<br />//PD3 - przekątna lewo/dół-prawo/góra, PD4 - poziomo<br />//Wejścia<br />//PD2 (PCINT18)- button<br />    DDRD = _BV(PD0) | _BV(PD1) | _BV(PD3) | _BV(PD4); // ustawienie wyjść<br />    PORTD |= _BV(PD0) | _BV(PD1) | _BV(PD3) | _BV(PD4);// wyłączenie diod (wysterowane stanem niskim)<br />    PORTD |= _BV(PD2); //pullup na button<br /><br />//Ustawienie Pin Change Interrupt na przycisku<br />    PCICR = _BV(PCIE2);<br />    PCMSK2 = _BV(PCINT18);<br />}<br /><br />inline void timer_init(void)<br />{<br />TCCR0A = _BV(WGM01);//tryb CTC<br />TCCR0B = _BV(CS00);//preskaler 1 (może raczej 8 lub nawet 64??)<br />OCR0A = 5;<br />}<br /><br />void set_wdt(enum wdt_sets prescaler)<br />{<br />uint8_t tmp = _BV(WDIE) | prescaler;<br /><br />ATOMIC_BLOCK(ATOMIC_FORCEON)<br />{<br />wdt_reset();<br />WDTCSR = (1 &lt;&lt; WDCE) | (1 &lt;&lt; WDE);<br />WDTCSR = tmp;<br />}<br />}<br /><br />EMPTY_INTERRUPT(PCINT2_vect)<br /><br />EMPTY_INTERRUPT(WDT_vect)[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 8 lut 2015, o 20:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2015-01-28T19:58:15+01:00</updated>
<published>2015-01-28T19:58:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116313#p116313</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116313#p116313"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116313#p116313"><![CDATA[
<img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> Nie kuś <img src="https://forum.atnel.pl/images/smilies/icon_mrgreen.gif" alt=":mrgreen:" title="Pan Zielony" /> w interpreter dla b-f mogę się bawić... tylko kto napisze &quot;programy&quot; testowe w tym paskudztwie?<br /><br />Przy okazji, cytując kolegę <strong>mokrowskiego</strong> &quot;to było bardzo pouczające&quot;. Nie przypuszczałem, że <em>kostka-challenge</em> zajdzie tak daleko. Wydawało mi się, że 100B to będzie max... znaczy min <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Również dziękuję.<p>Statystyki: Napisane przez Gość — 28 sty 2015, o 19:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2015-01-28T17:53:28+01:00</updated>
<published>2015-01-28T17:53:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116296#p116296</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116296#p116296"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116296#p116296"><![CDATA[
Wow! Ale kolega wypatrzył bug'a <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Dopisałem ostrzeżenie przy ostatniej wersji programu. <br /><br />Faktycznie - musi być <em>__attribute__((section (&quot;.vectors&quot;) ))</em> żeby main lądował na początku pamięci. Swoją drogą, ciekawe co za rozkazy kryją się &quot;w tablicy&quot;, trzeba będzie sprawdzić ;d<br /><br />Przy okazji - w 84r. kod wykorzystujący analogiczny mechanizm wygrał konkurs <a href="http://pl.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest"  class="postlink">IOCCC</a> (link do programu <a href="http://www.ioccc.org/1984/mullender.c"  class="postlink">mullender.c</a>)<br /><br />(dodano po chwili) Jakby kogoś interesowało to tablica <em>port_val</em> zinterpretowano jako kod programu, przedstawia się następująco:<br />[syntax=asm]cp r17, r17<br />sub r17, r8<br />adc r1, r26[/syntax]<p>Statystyki: Napisane przez Gość — 28 sty 2015, o 17:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2015-01-28T15:57:13+01:00</updated>
<published>2015-01-28T15:57:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116282#p116282</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116282#p116282"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116282#p116282"><![CDATA[
Działa (gcc 4.7.2) <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /> <br />...chociaż wywala syntax error <br />...i nie mogę go wyłączyć :-/<br /><br />Jeszcze mała uwaga do programu na zakończenie: funkcja main bez atrybutów jest w hexie wstawiana za tablicą. To chyba może być problem  <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=1774">xor</a> — 28 sty 2015, o 15:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2015-01-28T14:22:15+01:00</updated>
<published>2015-01-28T14:22:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116267#p116267</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116267#p116267"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116267#p116267"><![CDATA[
No tak masz rację, analizator kodu w Eclipsie!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 28 sty 2015, o 14:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2015-01-28T14:04:08+01:00</updated>
<published>2015-01-28T14:04:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116264#p116264</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116264#p116264"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116264#p116264"><![CDATA[
Warninga pokazuje kompilator czy analizator kodu w Eclipse ;&gt; ?<br /><br />U mnie eclipse warczy, że __flash to syntax error, a stała zadeklarowana w ten sposób &quot;could not be roselved&quot;. Bidulek nie wie jak to ugryźć <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Na szczęście kompilator nie ma oporów (gcc 4.8.2).<br /><br />Ficzer pojawił się w gcc od wersji 4.7, wcześniej był do tego jakiś patch z tego co się orientuję. Nie wiem na której wersji jest oparty oficjalny atmelowy toolchain. Mam zainstalowanego linuksa i w sumie nie wiem skąd ubunciak pobrał avr-gcc. Póki wszystko działa to mi to zwisa <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Najłatwiej (i najfajniej) - potestować sobie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez Gość — 28 sty 2015, o 14:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2015-01-28T11:44:25+01:00</updated>
<published>2015-01-28T11:44:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116248#p116248</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116248#p116248"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116248#p116248"><![CDATA[
Wyglada na to, ze dziala chociaz pokazuje warninga.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 28 sty 2015, o 11:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2015-01-28T11:29:13+01:00</updated>
<published>2015-01-28T11:29:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116245#p116245</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116245#p116245"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116245#p116245"><![CDATA[
Czyli teraz ze stałymi we FLASH można stosować normalne operatory? To wspaniała wiadomość! Szkoda, że nic o tym nie ma w dokumentacji avr-libc (no dobra, rozumiem, że to jest ficzer gcc nie mający nic wspólnego z gcc). To oczywiście działa w toolchainie atmelowskim?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 28 sty 2015, o 11:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2015-01-28T11:01:11+01:00</updated>
<published>2015-01-28T11:01:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116243#p116243</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116243#p116243"/>
<title type="html"><![CDATA[Re: Kostka do gry na Attiny13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10366&amp;p=116243#p116243"><![CDATA[
Gdyby <em>port_val[]</em> było zdefiniowane z PROGMEM to owszem - konieczne byłoby użycie <em>pgm_read_byte</em>. Na szczęście (?) developerzy avr-gcc zakasali rękawy i wzięli się za te nieszczęsne przestrzenie adresowe. Użycie <em>__flash</em> zamiast <em>PROGMEM</em> załatwia sprawę makr <em>pgm_read_xxx</em>.<br /><br />Do poczytania: <a href="https://gcc.gnu.org/onlinedocs/gcc/Named-Address-Spaces.html"  class="postlink">klik</a><p>Statystyki: Napisane przez Gość — 28 sty 2015, o 11:01</p><hr />
]]></content>
</entry>
</feed>