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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-07-22T11:45:07+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=21022&amp;mode</id>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2018-07-22T11:45:07+01:00</updated>
<published>2018-07-22T11:45:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21022&amp;p=210044#p210044</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21022&amp;p=210044#p210044"/>
<title type="html"><![CDATA[Re: Dioda RGB i wewnętrzna pamięć EEPROM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21022&amp;p=210044#p210044"><![CDATA[
Dziękuję Ci bardzo <strong>andrews</strong>, wprowadziłem poprawki według Twoich wskazówek i teraz kod działa tak jak sobie założyłem.<br /><br />Funkcją atoi() chciałem zamienić parametr na liczbę i wpisać ją do struktury, widać musze poczytać na temat tej funkcji, widziałem ją w poradniku i też próbowałem z niej skorzystać. Jednak na działaniach liczbowych nie bardzo :p<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 22 lip 2018, o 11:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-07-21T13:40:16+01:00</updated>
<published>2018-07-21T13:40:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21022&amp;p=210021#p210021</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21022&amp;p=210021#p210021"/>
<title type="html"><![CDATA[Re: Dioda RGB i wewnętrzna pamięć EEPROM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21022&amp;p=210021#p210021"><![CDATA[
Zacznijmy od tego:<br /><div class="quotetitle">Tom92 napisał(a):</div><div class="quotecontent"><br />[syntax=c]// funkcja do zapamiętania koloru<br />void RGB( uint8_t r, uint8_t g, uint8_t b) {<br />        char * wsk;<br /> <br />        if(0 == r ) {<br />                ram_cfg.ledr = atoi(wsk);<br />        }<br /> <br />        if(0 == g ) {<br />                ram_cfg.ledg = atoi(wsk);<br />        }<br /> <br />        if(0 == b ) {<br />                ram_cfg.ledb = atoi(wsk);<br />        }<br /> <br />        copy_ram_to_eem();<br />}[/syntax]<br /></div><br /><br />Nie analizowałem dokładnie całego kodu, ale to co zauważyłem &quot;na pierwszy rzut oka&quot;. Masz wewnątrz funkcji niezainicjowany wskaźnik <strong><em>wsk</em></strong> i zapisujesz go do EEPROM? Raczej to nie zadziała tak jak zakładasz. Wskaźnik będzie zawierał przypadkowe dane. Kompilator nie zgłaszał zastrzeżeń?<br /><br />W ogóle nie bardzo rozumiem co chcesz zrobić. Po co używasz funkcji <strong><em>atoi()</em></strong>? Po co te warunki? Co tak naprawdę chcesz wpisać do tej struktury? Jeśli chcesz zapisać do EEPROM aktualną zawartość struktury <strong><em>ram_cfg</em></strong> wywal zupełnie tę funkcję <strong><em>RBG()</em></strong> i w jej miejscu użyj od razu funkcji <strong><em>copy_ram_to_eem()</em></strong>, przykładowo:<br />[syntax=c]//<br />    if (stan==0)    // kolor biały<br />    {<br />        ram_cfg.ledr = DLEDR_ON;<br />        ram_cfg.ledg = DLEDG_ON;<br />        ram_cfg.ledb = DLEDB_ON;<br /> <br />        // zapamiętaj biały<br />        // zamiast RGB(1,1,1);<br />        copy_ram_to_eem();<br />    }[/syntax]<br />...a nawet można jej użyć tylko raz, po zakończeniu tych wszystkich instrukcji <strong><em>if</em></strong>.<br /><br />W pętli głównej, zamiast tego szeregu if'ów lepiej użyć <strong><em>switch</em></strong>. Tak jak jest też będzie działać, ale ze <strong><em>switch</em></strong> będzie czytelniej.<br />[syntax=c]//<br />    switch(stan)<br />    {<br />        case 0:<br />            ram_cfg.ledr = DLEDR_ON;<br />            ram_cfg.ledg = DLEDG_ON;<br />            ram_cfg.ledb = DLEDB_ON;<br />            break;<br />        case 1:<br />            ram_cfg.ledr = DLEDR_ON;<br />            ram_cfg.ledg = DLEDG_OFF;<br />            ram_cfg.ledb = DLEDB_OFF;<br />            break;<br />        case 2:<br />            // itd.<br />    }<br /><br />    // funkcję copy_ram_to_eem() wystarczy użyć raz<br />    // po zakończeniu instrukcji switch<br />    copy_ram_to_eem();[/syntax]<br /><br />EDIT:<br />Jeszcze nie zauważyłem jednej rzeczy. Przykładowo makro <strong>DLEDR_ON</strong> masz zdefiniowane jako <strong>PORTB &amp;= ~LEDR_PIN</strong>.<br />Później używasz zapisu:[syntax=c]ram_cfg.ledr = DLEDR_ON;[/syntax]<br />Co zostanie rozwinięte przez preprocesor (tak w uproszczeniu) do:[syntax=c]ram_cfg.ledr = PORTB &amp;= ~LEDR_PIN;[/syntax]<br />Niewykluczone, że to jakoś zadziała, ale nie sądzisz, że to dość dziwny zapis?<br />Do ustawienia koloru w strukturze używaj raczej wartości liczbowych (0 lub 1, bo zakładam, że nie sterujesz jasnością poszczególnych kolorów) np.:[syntax=c]ram_cfg.ledr = 1;<br />ram_cfg.ledg = 0;<br />ram_cfg.ledb = 1;[/syntax]<br />i dopiero później na podstawie tej wartości zmieniaj stan pinu, tak jak to masz na początku funkcji <strong><em>main()</em></strong>.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 21 lip 2018, o 13:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2018-07-21T12:35:25+01:00</updated>
<published>2018-07-21T12:35:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21022&amp;p=210020#p210020</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21022&amp;p=210020#p210020"/>
<title type="html"><![CDATA[Dioda RGB i wewnętrzna pamięć EEPROM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21022&amp;p=210020#p210020"><![CDATA[
Witam wszystkich,<br /><br />Po oglądnięciu poradników video Pana Mirka na temat pamięci EEPROM staram się wykorzystać tą wiedzę na kolorowej diodzie RGB. Już od dłuższego czasu staram się napisać program na zestawie uruchomieniowym ATB wraz z ATB SHIELD IO. Założenie działania programu jest takie:<br />Przyciskiem zmieniać kolory diody RGB oraz wraz z każdą zmianą koloru procesor powinien zapisać dany kolor do pamięci EEPROM, aby po resecie włączył się zapamiętany kolor diody.<br /><br />Częściowo się to udało. Zmieniam kolory i zapisuje je do pamięci EEPROM, ale podczas resetu nie wszystkie kolory są prawidłowo zapamiętane. Problem jest z kolorem białym, czerwonym i żółtym.<br /><br />Poniżej zamieszczam kod programu (Nie uporządkowany bo w fazie testów). Jakby ktoś mógł sprawdzić na swoim zestawie i może będzie wiedział o co chodzi:<br /><br /><strong>main.c</strong><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br /><br />#include &quot;common.h&quot;<br /><br />/* konfiguracja pinów podłączonej diody LED RGB */<br />#define LEDR_PIN (1&lt;&lt;PB2)// definicja pinu R<br />#define LEDG_PIN (1&lt;&lt;PB0)// definicja pinu G<br />#define LEDB_PIN (1&lt;&lt;PB1)// definicja pinu B<br />#define DLEDR_OFF PORTB |= LEDR_PIN// makrodefinicja - wyłączenie pinu R<br />#define DLEDG_OFF PORTB |= LEDG_PIN// makrodefinicja - wyłączenie pinu G<br />#define DLEDB_OFF PORTB |= LEDB_PIN// makrodefinicja - wyłączenie pinu B<br />#define DLEDR_ON PORTB &amp;= ~LEDR_PIN// makrodefinicja - załączenie pinu R<br />#define DLEDG_ON PORTB &amp;= ~LEDG_PIN// makrodefinicja - załączenie pinu G<br />#define DLEDB_ON PORTB &amp;= ~LEDB_PIN// makrodefinicja - załączenie pinu B<br /><br />/* konfiguracja pinu podłączonego klawisza */<br />#define KEY1_PIN (1&lt;&lt;PD5)<br />#define KEY_DOWN !(PIND &amp; KEY1_PIN)<br /><br />/* zmienna pomocnicza */<br />uint8_t key_lock;<br /><br />// inicjalizacja ustawień fabrycznych w pamięci Flash<br />const TCFG pgm_cfg PROGMEM = {<br />LEDR,<br />LEDG,<br />LEDB,<br />};<br /><br />TCFG eem_cfg EEMEM;// dane w pamięci EEPROM<br />TCFG ram_cfg;// dane w pamięci RAM<br /><br />/*----------------------------- główna funkcja programu  ---------------*/<br />int main(void) {<br /><br />// ****** inicjalizacja *********<br />DDRB |= LEDR_PIN|LEDG_PIN|LEDB_PIN;// kierunek pinów diody RGB – wyjściowy<br />//PORTB |= LEDR_PIN|LEDG_PIN|LEDB_PIN;// wyłączenie diody RGB<br />DDRD &amp;= ~(KEY1_PIN);// kierunek pinu klawisza - wejściowy<br />PORTD |= KEY1_PIN;// podciągnięcie pinu klawisza do VCC<br /><br />check_and_load_defaults();// sprawdzenie wartości i załadowanie ich do pamięci ram<br /><br />// odczyt wartości z pamięci ram<br />if( ram_cfg.ledr ) DLEDR_ON;<br />else DLEDR_OFF;<br />if( ram_cfg.ledg ) DLEDG_ON;<br />else DLEDG_OFF;<br />if( ram_cfg.ledb ) DLEDB_ON;<br />else DLEDB_OFF;<br /><br />char stan=0;// początkowy stan klawisza<br /><br />// ****** pętla główna programu  *********<br /> while(1) {<br /><br /> // ******* OBSŁUGA KLAWISZA ********<br /> if( !key_lock &amp;&amp; !(PIND &amp; KEY1_PIN ) ) key_lock=1;<br /> else if( key_lock &amp;&amp; (PIND &amp; KEY1_PIN ) ) {<br /> if( !++key_lock ) {<br /><br /> // reakcja na PUSH_UP (zwolnienie przycisku)<br /> stan++;<br /> if (stan&gt;6) stan=0;// stan może przyjąc wartości od 0 do 6<br /> // *********************************<br /><br /> if (stan==0)// kolor biały<br /> {<br /> ram_cfg.ledr = DLEDR_ON;<br /> ram_cfg.ledg = DLEDG_ON;<br /> ram_cfg.ledb = DLEDB_ON;<br /><br /> // zapamiętaj biały<br /> RGB(1,1,1);<br /> }<br /> else if (stan==1)// kolor czerwony<br /> {<br /> ram_cfg.ledr = DLEDR_ON;<br /> ram_cfg.ledg = DLEDG_OFF;<br /> ram_cfg.ledb = DLEDB_OFF;<br /><br /> // zapamiętaj czerwony<br /> RGB(1,0,0);<br /> }<br /> else if (stan==2)// kolor zielony<br /> {<br /> ram_cfg.ledr = DLEDR_OFF;<br /> ram_cfg.ledg = DLEDG_ON;<br /> ram_cfg.ledb = DLEDB_OFF;<br /><br /> // zapamiętaj zielony<br /> RGB(0,1,0);<br /> }<br /> else if (stan==3)// kolor niebieski<br /> {<br /> ram_cfg.ledr = DLEDR_OFF;<br /> ram_cfg.ledg = DLEDG_OFF;<br /> ram_cfg.ledb = DLEDB_ON;<br /><br /> // zapamiętaj niebieski<br /> RGB(0,0,1);<br /> }<br /> else if (stan==4)// kolor fioletowy<br /> {<br /> ram_cfg.ledr = DLEDR_ON;<br /> ram_cfg.ledg = DLEDG_OFF;<br /> ram_cfg.ledb = DLEDB_ON;<br /><br /> // zapamiętaj fioletowy<br /> RGB(1,0,1);<br /> }<br /> else if (stan==5)// kolor żółty<br /> {<br /> ram_cfg.ledr = DLEDR_ON;<br /> ram_cfg.ledg = DLEDG_ON;<br /> ram_cfg.ledb = DLEDB_OFF;<br /><br /> // zapamiętaj żółty<br /> RGB(1,1,0);<br /> }<br /> else// kolor błękitny<br /> {<br /> ram_cfg.ledr = DLEDR_OFF;<br /> ram_cfg.ledg = DLEDG_ON;<br /> ram_cfg.ledb = DLEDB_ON;<br /><br /> // zapamiętaj błękitny<br /> RGB(0,1,1);<br /> }<br /> }<br /> }// koniec obsługi klawisza<br /> }// koniec pętli while<br />}// koniec pętli głównej programu main[/syntax]<br /><br /><strong>common.c</strong><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br /><br />#include &quot;common.h&quot;<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_ram_to_eem( void ) {<br />eeprom_write_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 />}<br /><br />void check_and_load_defaults( void ) {<br />uint8_t i, len = sizeof( ram_cfg );<br />uint8_t * ram_wsk = (uint8_t*)&amp;ram_cfg;<br /><br />copy_eem_to_ram();<br />for(i=0; i&lt;len; i++) {<br />if( 0xff == *ram_wsk++ ) continue;<br />break;<br />}<br /><br />if( i == len ) {<br />load_defaults();<br />}<br /><br />}<br /><br />// funkcja do zapamiętania koloru<br />void RGB( uint8_t r, uint8_t g, uint8_t b) {<br />char * wsk;<br /><br />if(0 == r ) {<br />ram_cfg.ledr = atoi(wsk);<br />}<br /><br />if(0 == g ) {<br />ram_cfg.ledg = atoi(wsk);<br />}<br /><br />if(0 == b ) {<br />ram_cfg.ledb = atoi(wsk);<br />}<br /><br />copy_ram_to_eem();<br />}[/syntax]<br /><br /><strong>common.h</strong><br />[syntax=c]#ifndef COMMON_H_<br />#define COMMON_H_<br /><br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />typedef struct {<br />uint8_t ledr;<br />uint8_t ledg;<br />uint8_t ledb;<br />} TCFG;<br /><br />// ustawienia domylne (fabryczne)<br />#define LEDR 1// kod klawisza podwietlenia<br />#define LEDG 1// godziny alarmu nr.1<br />#define LEDB 1// minuty alarmu nr.1<br /><br />const TCFG pgm_cfg PROGMEM;// dane w pamięci FLASH<br />extern TCFG eem_cfg EEMEM;// dane w pamięci EEPROM<br />extern TCFG ram_cfg;// dane w pamięci RAM<br /><br /><br />void check_and_load_defaults( void );<br />void copy_eem_to_ram( void );<br />void copy_ram_to_eem( void );<br />void copy_pgm_to_ram( void );<br />void load_defaults( void );<br /><br />void RGB( uint8_t r, uint8_t g, uint8_t b);<br /><br />#endif /* COMMON_H_ */[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 21 lip 2018, o 12:35</p><hr />
]]></content>
</entry>
</feed>