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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2021-07-03T13:13:32+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=23835&amp;mode</id>
<entry>
<author><name><![CDATA[marian253]]></name></author>
<updated>2021-07-03T13:13:32+01:00</updated>
<published>2021-07-03T13:13:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232925#p232925</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232925#p232925"/>
<title type="html"><![CDATA[Re: Zapis PWM w EEPROM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232925#p232925"><![CDATA[
Panowie, dziękuję za pomoc, działa rewelacyjnie!  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> <br /><br /><strong>Andrews</strong><br />Wszystko co piszesz ma logiczny sens. Niestety ja nie jestem programistą z wykształcenia, bazuję głównie na książkach i poradnikach Mirka, i jeszcze dużo muszę się nauczyć. <br />W międzyczasie przeniosłem projekt na ATmege32, poniżej zamieszczam kod, który działa właśnie na ATmedze32, jest krótki i pozwala zrozumieć cały ten mechanizm. Myślę, że wielu osobom pomoże. Jeszcze raz dziękuję i pozdrawiam.<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br /><br />#define LED1(1&lt;&lt;PC7)// dioda podłączona do pinu PC7<br /><br />#define LED1_ON PORTC |= LED1;<br />#define LED1_OFF PORTC &amp;= ~LED1;<br />#define LED1_TOG PORTC ^= LED1;<br /><br />#define K_PIN PINB<br />#define KEY1 (1&lt;&lt;PB0)  //definicja klawisza 1<br />#define KEY2 (1&lt;&lt;PB1)//definicja klawisza 2<br />#define KEY3 (1&lt;&lt;PB2)//definicja klawisza 3<br /><br />uint16_t pwm1;<br />uint16_t pwm2;<br /><br />typedef struct {<br />uint16_t pwm1;<br />uint16_t pwm2;<br />} TCFG;<br /><br />TCFG ram_cfg;// dane w pamieci ram<br />TCFG eem_cfg EEMEM;// dane w pamieci eeprom<br />const TCFG pgm_cfg PROGMEM = {// dane w pamieci flash<br />256, 512<br />};<br /><br />void copy_ram_to_eem (void);<br />void copy_eem_to_ram (void);<br />void copy_pgm_to_ram (void);<br />void load_defaults (void);<br />//void check_and_load_defaults (void);<br /><br />uint8_t przycisk(uint8_t klawisz);<br /><br /><br />    int main(void) {<br /><br />    _delay_ms(20);<br /><br />// ustawienie klawiszy<br />DDRB &amp;= ~(KEY1 | KEY2 | KEY3);   //ustawia wejscia<br />PORTB |=(KEY1 | KEY2 | KEY3);   //podciaganie do VCC<br /><br />DDRC |=LED1;// PC7 - jako wyjście<br />LED1_OFF;// wylaczmy diode<br /><br />DDRD   |= (1 &lt;&lt; PD5);// PWM output on PA6 (OC1A)<br />DDRD   |= (1 &lt;&lt; PD4);// PWM output on PA5 (OC1B)<br /><br />// Timer Counter1 10-bit fast PWM mode<br />TCCR1A =(1&lt;&lt;COM1A1) | (1&lt;&lt;COM1B1) | (1&lt;&lt;WGM11) | (1&lt;&lt;WGM10);// fast PWM enable<br />TCCR1B =(1&lt;&lt;WGM12);// Waveform Generation Mode<br />TCCR1B =(1&lt;&lt;CS10);// prescaler clk / 1<br /><br />copy_eem_to_ram();// kopiowanie eeprom do ram<br />pwm1 = ram_cfg.pwm1;// przypisujemy do zmiennej pwm1 odczytana wartosc z EEPROM-a<br /><br />    while(1) {<br /><br /><br />    OCR1A = pwm1;<br /><br />if (!(K_PIN &amp; KEY1) &amp;&amp; pwm1&lt;1023) {  //pwm up<br />pwm1++;<br /><br />_delay_ms(20);<br />}<br />if(!(K_PIN &amp; KEY2) &amp;&amp; pwm1&gt;0) {   //pwm down<br />pwm1--;<br /><br />_delay_ms(20);<br />}<br /><br />    if (!(K_PIN &amp; KEY3)) {<br />    ram_cfg.pwm1 = pwm1;// przypisujemy wartosc zmiennej pwm1 do struktury w RAM<br />    copy_ram_to_eem();// kopiowanie ram do eeprom<br />    LED1_ON;<br />    _delay_ms(250);<br />    LED1_OFF;<br />    }<br /><br />}<br />}<br />    uint8_t przycisk(uint8_t klawisz) {<br />    if (!(K_PIN &amp; klawisz)) {<br />    _delay_ms(25);<br />    if (!(K_PIN &amp; klawisz)) return 1;<br />    }<br />    return 0;<br />    }<br /><br />    void copy_ram_to_eem (void) {<br />    eeprom_write_block (&amp;ram_cfg, &amp;eem_cfg, sizeof(ram_cfg));<br />    }<br /><br />    void copy_eem_to_ram (void) {<br />    eeprom_read_block (&amp;ram_cfg, &amp;eem_cfg, sizeof(ram_cfg));<br />    }<br /><br />    void copy_pgm_to_ram (void) {<br />    memcpy_P (&amp;ram_cfg, &amp;pgm_cfg, sizeof(ram_cfg));<br />    }<br /><br />    void load_defaults (void) {<br />    copy_pgm_to_ram();<br />    copy_ram_to_eem();<br />    }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20640">marian253</a> — 3 lip 2021, o 13:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2021-07-03T11:16:49+01:00</updated>
<published>2021-07-03T11:16:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232924#p232924</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232924#p232924"/>
<title type="html"><![CDATA[Re: Zapis PWM w EEPROM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232924#p232924"><![CDATA[
<div class="quotetitle">marian253 napisał(a):</div><div class="quotecontent"><br />Może jeszcze brakuje czegoś przed pętlą while(1) żeby dane wczytały się ramu.<br /></div><br />Znasz przyczynę, tyko nie potrafisz znaleźć rozwiązania?<br /><br />Do rejestru OCR1A wpisujesz wartość zmiennej <em>pwm1</em> (linijka 66).<br /><br />Zmienna <em>pwm1</em> jest zadeklarowana globalnie i nie jest zainicjowana żadną wartością, więc podczas startu programu zostanie wyzerowana. Jeśli więc wpiszesz jej wartość do OCR1A (linijka 66), to PWM wystartuje od zera.<br /><br />Zapisaną w EEPROM wartość zmiennej <em>eem_cfg.pwm1</em> wczytujesz przed pętlą while do zmiennej w RAM <em>ram_cfg.pwm1</em> (linijka 60), a do rejestru OCR1A wpisujesz (wyzerowaną) zmienną <em>pwm1</em>. Nie masz za to nigdzie przypisania do zmiennej <em>pwm1</em> odczytanej z EEPROM wartości <em>ram_cfg.pwm1</em> i dlatego Ci to nie działa. Powinieneś po linijce 60 (<em>copy_eem_to_ram();</em>) dodać linijkę<br /><strong><em>pwm1 = ram_cfg.pwm1;</em></strong><br /><br /><div class="quotetitle">marian253 napisał(a):</div><div class="quotecontent"><br />Zrobiłem tak jak Mirek sugerował, czyli pod klawiszem dorzuciłem: ram_cfg.pwm1 = pwm1;<br /></div><br />Skoro zrobiłeś tak, jak Mirek zalecił to jeszcze usuń tę linijkę 64 (<em><strong>eem_cfg.pwm1 = pwm1;</strong></em>)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 3 lip 2021, o 11:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marian253]]></name></author>
<updated>2021-07-02T22:31:49+01:00</updated>
<published>2021-07-02T22:31:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232923#p232923</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232923#p232923"/>
<title type="html"><![CDATA[Re: Zapis PWM w EEPROM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232923#p232923"><![CDATA[
Dziękuję za szybką odpowiedź.<br /><br /><div class="quotetitle">andrews napisał(a):</div><div class="quotecontent"><br />Gdybyś więc w linijce 64 zamiast eem_cfg.pwm1 = pwm1; napisał ram_cfg.pwm1 = pwm1;, to zapis do EEPROM miałby szansę zadziałać prawidłowo, czyli zgodnie z Twoimi oczekiwaniami<br /></div><br />Zmieniłem zapis w linii 64 ale nic to nie dało.<br /><br />Zrobiłem tak jak Mirek sugerował, czyli pod klawiszem dorzuciłem: ram_cfg.pwm1 = pwm1; ale dalej nie działa, pwm cały czas startuje od zera.<br />[syntax=c]if (!(K_PIN &amp; KEY3)) {<br />    ram_cfg.pwm1 = pwm1;<br />    copy_ram_to_eem();// kopiowanie ram do eeprom<br />    LED1_ON;<br />    _delay_ms(250);<br />    LED1_OFF;<br />    }[/syntax]<br />Może jeszcze brakuje czegoś przed pętlą while(1) żeby dane wczytały się ramu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20640">marian253</a> — 2 lip 2021, o 22:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2021-07-02T14:32:48+01:00</updated>
<published>2021-07-02T14:32:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232922#p232922</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232922#p232922"/>
<title type="html"><![CDATA[Re: Zapis PWM w EEPROM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232922#p232922"><![CDATA[
<div class="quotetitle">marian253 napisał(a):</div><div class="quotecontent"><br />    while(1) {<br /> <br />        eem_cfg.pwm1 = pwm1;<br /></div><br /><br />Dobrze, że nie udał ci się ten zapis - bo próbowałeś go robić (zastanowiłeś się ile razy? .... no cały pierdyliard razy na sekundę - więc szybko zajechałbyś na śmierć biednego eeproma ! <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />Panie pisałeś że pod klawiszem niby zapisujesz ? a gdzie to widać w kodzie ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />No właśnie tu musisz :<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />if (!(K_PIN &amp; KEY3)) {<br />                <span style="color: #FF0000">ram_cfg.pwm1 = pwm1;</span>  <span style="color: #008000">- toż zapis parametru do struktury w RAM .. a później zapis tej struktury do EEPROM <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /></span><br />                copy_ram_to_eem();                              // kopiowanie ram do eeprom<br /></div><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 2 lip 2021, o 14:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2021-07-02T12:51:52+01:00</updated>
<published>2021-07-02T12:51:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232921#p232921</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232921#p232921"/>
<title type="html"><![CDATA[Re: Zapis PWM w EEPROM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232921#p232921"><![CDATA[
<div class="quotetitle">marian253 napisał(a):</div><div class="quotecontent"><br />[syntax=c]eem_cfg.pwm1 = pwm1;[/syntax]<br /></div><br />W linijce 64 napisałeś jak powyżej.<br />Po pierwsze nie możesz w ten sposób przypisać wartości do zmiennej w EEPROM, powinieneś użyć do tego funkcji (np. <em>eeprom_write_word ()</em>).<br />Po drugie, podejrzewam, że chciałeś w tym miejscu skopiować wartość zmiennej <em>pwm1</em> do zmiennej <em>ram_cfg.pwm1</em>, bo tak faktycznie nigdzie indziej tego nie robisz, więc jak zapisujesz <em>ram_cfg</em> do <em>eem_cfg</em>, to tam nie ma aktualnej wartości. Gdybyś więc w linijce 64 zamiast <em><strong>eem_cfg.pwm1 = pwm1;</strong></em> napisał <em><strong>ram_cfg.pwm1 = pwm1;</strong></em>, to zapis do EEPROM miałby  szansę zadziałać prawidłowo, czyli zgodnie z Twoimi oczekiwaniami.<br />Nie sprawdzałem dokładnie, czy nie masz innych błędów, na razie zacznij od tego, co napisałem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 2 lip 2021, o 12:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marian253]]></name></author>
<updated>2021-07-02T11:39:28+01:00</updated>
<published>2021-07-02T11:39:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232920#p232920</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232920#p232920"/>
<title type="html"><![CDATA[Zapis PWM w EEPROM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23835&amp;p=232920#p232920"><![CDATA[
Witam, od kilku dni borykam się z problemem zapisu aktualnej wartości pwm do pamięci EEPROM. Przeszukałem forum, obejrzałem poradniki i napisałem w końcu swój program, wydaje mi się że dobrze, ale on nie działa i nie wiem dlaczego. Program jest prosty, mam 3 klawisze, jednym rozjaśniam diodę, drugim ściemniam a trzecim chcę zapisać aktualną wartość OCR1A do eeproma tak, żeby po ponownym załączeniu pwm miał wypełnienie takie, jak w momencie zapisu. Niestety po każdym restarcie pwm startuje od zera. Procek ATtiny44, poniżej kod. Jeśli ktoś mógłby mi coś podpowiedzieć będę wdzięczny.<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br /><br />#define LED1(1&lt;&lt;PA0)<br /><br />#define LED1_ON PORTA |= LED1;<br />#define LED1_OFF PORTA &amp;= ~LED1;<br />#define LED1_TOG PORTA ^= LED1;<br /><br />#define K_PIN PINB<br />#define KEY1 (1&lt;&lt;PB0)  //definicja klawisza 1<br />#define KEY2 (1&lt;&lt;PB1)//definicja klawisza 2<br />#define KEY3 (1&lt;&lt;PB2)//definicja klawisza 3<br /><br />uint16_t pwm1;<br />uint16_t pwm2;<br /><br />typedef struct {<br />uint16_t pwm1;<br />uint16_t pwm2;<br />} TCFG;<br /><br />TCFG ram_cfg;// dane w pamieci ram<br />TCFG eem_cfg EEMEM;// dane w pamieci eeprom<br />const TCFG pgm_cfg PROGMEM = {// dane w pamieci flash<br />256, 512<br />};<br /><br />void copy_ram_to_eem (void);<br />void copy_eem_to_ram (void);<br />void copy_pgm_to_ram (void);<br />void load_defaults (void);<br />//void check_and_load_defaults (void);<br /><br />uint8_t przycisk(uint8_t klawisz);<br /><br /><br />    int main(void) {<br /><br />    _delay_ms(20);<br /><br />// ustawienie klawiszy<br />DDRB &amp;= ~(KEY1 | KEY2 | KEY3);   //ustawia wejscia<br />PORTB |=(KEY1 | KEY2 | KEY3);   //podciaganie do VCC<br /><br />DDRA |=LED1;// PB1 - jako wyjście<br />LED1_OFF;// PB1 OFF<br /><br />DDRA   |= (1 &lt;&lt; PA6);// PWM output on PA6 (OC1A)<br />DDRA   |= (1 &lt;&lt; PA5);// PWM output on PA5 (OC1B)<br /><br />// Timer Counter1 10-bit fast PWM mode<br />TCCR1A =(1&lt;&lt;COM1A1) | (1&lt;&lt;COM1B1) | (1&lt;&lt;WGM11) | (1&lt;&lt;WGM10);// fast PWM enable<br />TCCR1B =(1&lt;&lt;WGM12);// Waveform Generation Mode<br />TCCR1B =(1&lt;&lt;CS10);// prescaler clk / 1<br /><br />copy_eem_to_ram();// kopiowanie eeprom do ram<br /><br />    while(1) {<br /><br />    eem_cfg.pwm1 = pwm1;<br /><br />    OCR1A = pwm1;<br /><br />if (!(K_PIN &amp; KEY1) &amp;&amp; pwm1&lt;1023) {  //pwm up<br />pwm1++;<br /><br />_delay_ms(50);<br />}<br />if(!(K_PIN &amp; KEY2) &amp;&amp; pwm1&gt;0) {   //pwm down<br />pwm1--;<br /><br />_delay_ms(50);<br />}<br /><br />    if (!(K_PIN &amp; KEY3)) {<br />    copy_ram_to_eem();// kopiowanie ram do eeprom<br />    LED1_ON;<br />    _delay_ms(250);<br />    LED1_OFF;<br />    }<br /><br />}<br />}<br />    uint8_t przycisk(uint8_t klawisz) {<br />    if (!(K_PIN &amp; klawisz)) {<br />    _delay_ms(25);<br />    if (!(K_PIN &amp; klawisz)) return 1;<br />    }<br />    return 0;<br />    }<br /><br />    void copy_ram_to_eem (void) {<br />    eeprom_write_block (&amp;ram_cfg, &amp;eem_cfg, sizeof(ram_cfg));<br />    }<br /><br />    void copy_eem_to_ram (void) {<br />    eeprom_read_block (&amp;ram_cfg, &amp;eem_cfg, sizeof(ram_cfg));<br />    }<br /><br />    void copy_pgm_to_ram (void) {<br />    memcpy_P (&amp;ram_cfg, &amp;pgm_cfg, sizeof(ram_cfg));<br />    }<br /><br />    void load_defaults (void) {<br />    copy_pgm_to_ram();<br />    copy_ram_to_eem();<br />    }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20640">marian253</a> — 2 lip 2021, o 11:39</p><hr />
]]></content>
</entry>
</feed>