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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-10-17T09:02:48+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=24&amp;t=21439&amp;mode</id>
<entry>
<author><name><![CDATA[AKSELINEK]]></name></author>
<updated>2018-10-17T09:02:48+01:00</updated>
<published>2018-10-17T09:02:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21439&amp;p=212700#p212700</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21439&amp;p=212700#p212700"/>
<title type="html"><![CDATA[Re: Podpowiedzcie jak zyskać trochę pamięci ATTINY 13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21439&amp;p=212700#p212700"><![CDATA[
Bardzo dziękuję koledze Krauser , proszę o to wynik kompilacji:<br /><br />[syntax=c]AVR Memory Usage<br />----------------<br />Device: attiny13<br /><br />Program:     740 bytes (72.3% Full)<br />(.text + .data + .bootloader)<br /><br />Data:         17 bytes (26.6% Full)<br />(.data + .bss + .noinit)<br /><br />EEPROM:        4 bytes (6.2% Full)<br />(.eeprom)<br /><br /><br />'Finished building: sizedummy'<br />' '<br /><br />10:00:57 Build Finished (took 243ms)[/syntax]<br />Problemu ze stosem nie będzie program hula jak tralala, tochę przekombinowałem z tą funkcją rozdziel, bo po co faktycznie rozdzielać jak można zmienne raz określić.<br />A z tymi zmiennymi d jako wrzucanie argumentów do funkcji to pomysł mi chodził po głowie , ale kolega Krauser jest WIELKI DZIĘKI.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18152">AKSELINEK</a> — 17 paź 2018, o 09:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[AKSELINEK]]></name></author>
<updated>2018-10-16T21:01:22+01:00</updated>
<published>2018-10-16T21:01:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21439&amp;p=212692#p212692</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21439&amp;p=212692#p212692"/>
<title type="html"><![CDATA[Re: Podpowiedzcie jak zyskać trochę pamięci ATTINY 13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21439&amp;p=212692#p212692"><![CDATA[
Dzięki za rozjaśnienie wrzucę do programu i poinformuje o wynikach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18152">AKSELINEK</a> — 16 paź 2018, o 21:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2018-10-16T20:55:56+01:00</updated>
<published>2018-10-16T20:55:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21439&amp;p=212691#p212691</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21439&amp;p=212691#p212691"/>
<title type="html"><![CDATA[Re: Podpowiedzcie jak zyskać trochę pamięci ATTINY 13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21439&amp;p=212691#p212691"><![CDATA[
Można też tak uprościć nieco obliczenia i ilość zmiennych globalnych, które wykorzystujesz do przenoszenia informacji pomiędzy funkcjami:<br />[syntax=c]#include &lt;util/delay.h&gt;<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/sleep.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;stdint.h&gt;<br /><br />void przerwa(void);<br />void test(void);<br />void rozdziel(void);<br />void mignij_ziel(uint8_t l);<br /><br />// klawisz K1<br />#define KEY_PIN (1&lt;&lt;PB0)             // wescie testowe   test<br />#define KEY_DOWN !(PINB &amp; KEY_PIN)   // klawisz wciśniety przyjmuje wartośc 1  nie wcisniety 0<br /><br />#define ziel (1&lt;&lt;PB1)   //  zielona dioda na PB1<br />#define zolt (1&lt;&lt;PB2)   //  zółta dioda na PB2<br />#define czer (1&lt;&lt;PB3)   //  czerwona dioda na PB2<br /><br />//static EEMEM uint32_t zmienna_w_eepromie = 40;   // wartosc 40 nie jma znaczenia moze byc jakakolwiek<br />static EEMEM uint32_t liczym_w_eepromie = 40; // wartosc 40 nie jma znaczenia moze byc jakakolwiek<br /><br />volatile uint16_t adc_val;   // zmienna przyjmujaca wartośC ADC<br /><br />uint8_t a = 0;  // zmienne dla petli for<br />uint8_t b = 0;  // zmienne dla petli for<br /><br />uint32_t licznik, w_cyfral;   // miernik<br />uint8_t cy1, cy2, cy3, cy4, cy0;  // te zmienne globalne zajmuja za dużo pamięci<br /><br />int main(void)<br />{<br /><br />//             ********** inicjalizacja ******************<br />// zielona - PB1<br />// zolta   - PB2<br />// czerw   - PB3<br /><br />// konfiguracja pinów z ledami jako wyjścia<br /><br />DDRB = (1 &lt;&lt; PB1) | (1 &lt;&lt; PB2) | (1 &lt;&lt; PB3);<br /><br />PORTB |= KEY_PIN;<br /><br />// **************************************************************<br />// zapis i odczyt ilosci wylaczen procesora z eeproma<br /><br />// ***************************************************************<br /><br />//uint32_t estart = eeprom_read_word(&amp;zmienna_w_eepromie);  // odczytanie zapamietanej wartosci z eeproma<br /><br />// estart=estart+1;                    // zwiekrzenie wartosci o jeden<br /><br />//eeprom_write_word(&amp;zmienna_w_eepromie,estart);             // zapisanie zwiekszonej wartosci do eeproma<br /><br />//licznik=estart;<br /><br />// ***************************************************************<br /><br />// konfiguracja adc<br /><br />if (KEY_DOWN)<br />test(); // jesli nacisniemy klawisz i zalczymy napiecie uklad wejdzie w faze testowa odczytu zmiennej<br /><br />while (1)<br />{<br />// **************************************************************<br />// zapis i odczyt ilosci wylaczen izostatów procesora z eeproma<br /><br />// ***************************************************************<br /><br />//uint32_t w_cyfral;// = eeprom_read_word(&amp;liczym_w_eepromie);  // odczytanie zapamietanej wartosci z eeproma<br /><br />w_cyfral = w_cyfral + 1;                 // zwiekrzenie wartosci o jeden<br /><br />eeprom_write_word(&amp;liczym_w_eepromie, w_cyfral); // zapisanie zwiekszonej wartosci do eeproma<br /><br />// licz_cyfral=w_cyfral;<br /><br />// ***************************************************************<br />_delay_ms(50);<br />}<br />}<br /><br />void test(void)   // test programu<br />{<br />uint32_t licz_cyfral;<br />licz_cyfral = eeprom_read_word(&amp;liczym_w_eepromie);<br />uint8_t d4, d3, d2, d1, d0;<br />d0 = licz_cyfral / 10000;<br />licz_cyfral %= 10000;<br />d1 = licz_cyfral / 1000;<br />licz_cyfral %= 1000;<br />d2 = licz_cyfral / 100;<br />licz_cyfral %= 100;<br />d3 = licz_cyfral / 10;<br />licz_cyfral %= 10;<br />d4 = licz_cyfral;<br /><br />przerwa();<br />mignij_ziel(d0);<br />przerwa();<br />mignij_ziel(d1);<br />przerwa();<br />mignij_ziel(d2);<br />przerwa();<br />mignij_ziel(d3);<br />przerwa();<br />mignij_ziel(d4);<br />przerwa();<br />}<br /><br />// ************************************************************************************<br />void przerwa(void)<br />// przerywamy mignieciem dioda zolta<br />// ************************************************************************************<br />{<br />PORTB = (1 &lt;&lt; PB2);<br />_delay_ms(3000);<br />PORTB = ~(zolt);<br />PORTB = 0;<br />_delay_ms(3000);<br />}<br /><br />void mignij_ziel(uint8_t l)<br />{<br />if (l &gt; 0)<br />{<br /><br />for (b = 0; b &lt; (l * 2); b = b + 1)<br /><br />{<br />PORTB ^= ziel;<br />_delay_ms(750);<br />}<br />}<br /><br />if (l == 0)<br />{<br />PORTB ^= zolt;<br />PORTB = (1 &lt;&lt; PB3);<br />_delay_ms(3000);<br />PORTB = ~(czer);<br />PORTB = 0;<br />_delay_ms(3000);<br />}<br />}[/syntax]<br />PS.<br />static EEMEM uint32_t liczym_w_eepromie jest 4 bajtową zmienną, a odczytujesz słowo 2 bajtowe. Zmieniłbym na uint16_t<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 16 paź 2018, o 20:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[AKSELINEK]]></name></author>
<updated>2018-10-16T19:32:50+01:00</updated>
<published>2018-10-16T19:32:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21439&amp;p=212686#p212686</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21439&amp;p=212686#p212686"/>
<title type="html"><![CDATA[Podpowiedzcie jak zyskać trochę pamięci ATTINY 13]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21439&amp;p=212686#p212686"><![CDATA[
Cześć chciałbym zapytać , bo trochę  mam problem ze stosem dlatego ,że za dużo mam zmiennych globalnych i program zajmuje mi za dużo pamięci .<br />Przedstawię kod programu:<br /><br />[syntax=c]#include &lt;util/delay.h&gt;<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/sleep.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;stdint.h&gt;<br /><br /><br /><br />void przerwa(void);<br />void test(void);<br />void rozdziel (void);<br />void mignij_ziel (void);<br /><br />// klawisz K1<br />#define KEY_PIN (1&lt;&lt;PB0)             // wescie testowe   test<br />#define KEY_DOWN !(PINB &amp; KEY_PIN)   // klawisz wciśniety przyjmuje wartośc 1  nie wcisniety 0<br /><br />#define ziel (1&lt;&lt;PB1)   //  zielona dioda na PB1<br />#define zolt (1&lt;&lt;PB2)   //  zółta dioda na PB2<br />#define czer (1&lt;&lt;PB3)   //  czerwona dioda na PB2<br /><br />//static EEMEM uint32_t zmienna_w_eepromie = 40;   // wartosc 40 nie jma znaczenia moze byc jakakolwiek<br />static EEMEM uint32_t  liczym_w_eepromie = 40;   // wartosc 40 nie jma znaczenia moze byc jakakolwiek<br /><br />volatile uint16_t adc_val;   // zmienna przyjmujaca wartośC ADC<br /><br />uint8_t a=0;  // zmienne dla petli for<br />uint8_t b=0;  // zmienne dla petli for<br /><br />uint8_t l=0;<br />uint32_t licznik,licz_cyfral,w_cyfral;   // miernik<br />uint8_t d4,d3,d2,d1,d0;<br />uint8_t cy1,cy2,cy3,cy4,cy0;  // te zmienne globalne zajmuja za dużo pamięci<br /><br /><br />int main(void)<br />{<br /><br />//             ********** inicjalizacja ******************<br />// zielona - PB1<br />// zolta   - PB2<br />// czerw   - PB3<br /><br />    // konfiguracja pinów z ledami jako wyjścia<br /><br />    DDRB = (1&lt;&lt;PB1)|(1&lt;&lt;PB2)|(1&lt;&lt;PB3);<br /><br />    PORTB |= KEY_PIN ;<br /><br />    // **************************************************************<br />        // zapis i odczyt ilosci wylaczen procesora z eeproma<br /><br />       // ***************************************************************<br /><br />                                               //uint32_t estart = eeprom_read_word(&amp;zmienna_w_eepromie);  // odczytanie zapamietanej wartosci z eeproma<br /><br />                                               // estart=estart+1;                    // zwiekrzenie wartosci o jeden<br /><br />                                               //eeprom_write_word(&amp;zmienna_w_eepromie,estart);             // zapisanie zwiekszonej wartosci do eeproma<br /><br />                                               //licznik=estart;<br /><br />          // ***************************************************************<br /><br />    // konfiguracja adc<br /><br />     if (KEY_DOWN)   test();  // jesli nacisniemy klawisz i zalczymy napiecie uklad wejdzie w faze testowa odczytu zmiennej<br /><br />    <br /><br /><br /><br />    while (1)<br />    {<br />    // **************************************************************<br />        // zapis i odczyt ilosci wylaczen izostatów procesora z eeproma<br /><br />       // ***************************************************************<br /><br />            //uint32_t w_cyfral;// = eeprom_read_word(&amp;liczym_w_eepromie);  // odczytanie zapamietanej wartosci z eeproma<br /><br />            w_cyfral=w_cyfral+1;                                        // zwiekrzenie wartosci o jeden<br /><br />            eeprom_write_word(&amp;liczym_w_eepromie,w_cyfral);             // zapisanie zwiekszonej wartosci do eeproma<br /><br />          // licz_cyfral=w_cyfral;<br /><br /><br />          // ***************************************************************<br />    _delay_ms(50);<br /><br />        <br /><br />       <br /><br /><br />    }<br /><br /><br /><br />void test(void)   // test programu<br /><br />// ****************************************************************<br /><br />{<br />  licz_cyfral = eeprom_read_word(&amp;liczym_w_eepromie);<br />                   rozdziel();<br />                   przerwa();<br />       l=d0;<br />       mignij_ziel();<br />       przerwa();<br />       l=d1;<br />       mignij_ziel();<br />       przerwa();<br />       l=d2;<br />       mignij_ziel();<br />       przerwa();<br />       l=d3;<br />       mignij_ziel();<br />       przerwa();<br />       l=d4;<br />       mignij_ziel();<br />       przerwa();<br /><br /><br />}<br /><br />// ***********************************************************************************<br />void rozdziel (void)<br />// rozdzielamy liczbe wylaczen czyli licznik na cyfry liczba disiatka setka tysieczna dziesiecznotysieczna<br />// ************************************************************************************<br />{<br />       d0=licz_cyfral/10000;<br />      // if(d0) cy0=d0 ; else cy0=(licznik&gt;9999)?0:0;;<br />           d1=(licz_cyfral-(d0*10000))/1000;<br />      // if(d1) cy1=d1; else cy1=(licznik&gt;999) ?0:0;<br />       d2=(licz_cyfral-(d0*10000)-(d1*1000))/100;<br />      // if(d2) cy2=d2; else cy2=(licznik&gt;99) ?0:0;<br />       d3=(licz_cyfral-(d0*10000)-(d1*1000)-(d2*100))/10;<br />       //if(d3) cy3=d3; else cy3=(licznik&gt;9) ?0:0;<br />       d4=(licz_cyfral-(d0*10000)-(d1*1000)-(d2*100)-(d3*10));<br />       // cy4=d4;<br /><br />}<br /><br />// ************************************************************************************<br />void przerwa(void)<br />// przerywamy mignieciem dioda zolta<br />// ************************************************************************************<br />{<br />                PORTB = (1&lt;&lt;PB2);<br />           _delay_ms(3000);<br />             PORTB = ~(zolt);<br />             PORTB=0;<br />              _delay_ms(3000);<br />}<br /><br />void mignij_ziel (void)<br />{<br />      if(l&gt;0)<br />               {<br /><br />        for(b=0;b&lt;(l*2);b=b+1)<br /><br />                {<br />                PORTB^= ziel;<br />                  _delay_ms(750);<br /><br />                }<br /><br />                }<br /><br />        if (l==0)<br /><br />                   {<br /><br />                  PORTB^= zolt;<br />                  PORTB = (1&lt;&lt;PB3);<br />                _delay_ms(3000);<br />            PORTB = ~(czer);<br />             PORTB=0;<br />             _delay_ms(3000);<br /><br />                  }<br /><br /><br />}[/syntax]<br /><br />zmienna licz_cyfral określa odczytaną wartość  z EPROMA następnie w funkcji test() jest rozdzielana przy pomocy zmiennych niestety globalnych uint8_t cy1,cy2,cy3,cy4,cy0;<br />zmienne określają liczbę dziesiątek , setek itd .<br />Odczyt zmiennej wygląda tak w momencie załączenia zasilania z wciśniętym przyciskiem miga raz dioda żółta rozdziela ona odczytywaną liczbę , następnie jeśli jest wartosią 0 miga czerwona , jeśli jest dodatnia to miga zielona tyle razy jaka jest wartość , następnie znowu miga żółta i określa następną cyfę.<br />Chyba napisałem trochę chaotycznie , przedstawię to na przykładzie :<br />liczba   20471  kolejność migania diody:<br />- żółta<br />- zielona dwa razy        &quot;2&quot;<br />- żółta<br />- czerwona bo jest        &quot;0&quot;<br />- żółta<br />- zielona cztery razy     &quot;4&quot;<br />- żółta <br />- zielona siedem razy    &quot;7&quot;<br />- żółta <br />- zielona 1 raz              &quot;1&quot;<br /><br />Pytanie polega na tym jak zmienne  uint8_t cy1,cy2,cy3,cy4,cy0; przerobić na lokalne bo wynik kompilacji jest taki i trochę zajmuje:<br /><br />[syntax=c]AVR Memory Usage<br />----------------<br />Device: attiny13<br /><br />Program:    1018 bytes (99.4% Full)<br />(.text + .data + .bootloader)<br /><br />Data:         27 bytes (42.2% Full)<br />(.data + .bss + .noinit)<br /><br />EEPROM:        4 bytes (6.2% Full)<br />(.eeprom)<br /><br /><br />'Finished building: sizedummy'<br />' '<br /><br />20:54:29 Build Finished (took 240ms)[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18152">AKSELINEK</a> — 16 paź 2018, o 19:32</p><hr />
]]></content>
</entry>
</feed>