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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2023-04-02T09:08:07+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=24443&amp;mode</id>
<entry>
<author><name><![CDATA[tonygryps]]></name></author>
<updated>2023-04-02T09:08:07+01:00</updated>
<published>2023-04-02T09:08:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24443&amp;p=236789#p236789</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24443&amp;p=236789#p236789"/>
<title type="html"><![CDATA[Re: Attiny13 EEPROM - dziwne zachowanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24443&amp;p=236789#p236789"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Jednak ten delay musi być, bo jak go wyrzuciłem to znowu co jakiś czas inne kolory wchodziły po restarcie.<br /></div><br />Chodzi o to żeby dać trochę czasu na ustalenie się stenów na pinach procka , możesz jeszcze dać podciąganie rezystorami tych pinów od przycisków tak z zakresu 10kom do 47kom.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12014">tonygryps</a> — 2 kwi 2023, o 09:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2023-03-24T13:35:48+01:00</updated>
<published>2023-03-24T13:35:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24443&amp;p=236746#p236746</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24443&amp;p=236746#p236746"/>
<title type="html"><![CDATA[Re: Attiny13 EEPROM - dziwne zachowanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24443&amp;p=236746#p236746"><![CDATA[
@tonygryps zrobiłem tak jak zaproponowałeś i trochę się poprawiło. Już nie wchodziły mi tak często inne kolory po włączeniu zasilania, ale jednak zjawisko występowało.<br /><br />Zmieniłem ostatecznie funkcję do ustawienia koloru bo bardzo mi się nie podobała, była nieoptymalna i wydawała mi się podejrzanie. Dodatkowo nie wpisywała do zmiennych ram_cfg.ledr, ram_cfg.ledg, ram_cfg.ledb wartości kolorów i moim zdaniem to był ten błąd.<br /><br />Zmiana zaszła z tej funkcji:<br />[syntax=c]/* funkcja do sterowania PWM wybranym kolorem diody RGB w pamięci RAM */<br />void pwm_color(uint8_t red, uint8_t green, uint8_t blue) {<br />                 if ( ram_cfg.ledr &gt; red ) while (ram_cfg.ledr &gt; red) {ram_cfg.ledr--;}<br />        else if ( ram_cfg.ledr &lt; red ) while (ram_cfg.ledr &lt; red) {ram_cfg.ledr++;}<br /> <br />                 if ( ram_cfg.ledg &gt; green ) while (ram_cfg.ledg &gt; green) {ram_cfg.ledg--;}<br />        else if ( ram_cfg.ledg &lt; green ) while (ram_cfg.ledg &lt; green) {ram_cfg.ledg++;}<br /> <br />                 if ( ram_cfg.ledb &gt; blue ) while (ram_cfg.ledb &gt;  blue) {ram_cfg.ledb--;}<br />        else if ( ram_cfg.ledb &lt; blue ) while (ram_cfg.ledb &lt;  blue) {ram_cfg.ledb++;}<br />}[/syntax]<br /><br />na tą funkcję:<br />[syntax=c]/* funkcja do ustawienia wybranego koloru diody RGB w pamięci RAM */<br />void pwm_color(uint8_t red, uint8_t green, uint8_t blue) {<br />ram_cfg.ledr = red;<br />ram_cfg.ledg = green;<br />ram_cfg.ledb = blue;<br />}[/syntax]<br /><br />Jak widać znaczna różnica  <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" />  mocno odchudziło to kod  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" />  Po tej zmianie, dziwnego efektu wyświetlania przypadkowych kolorów już nie ma.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11336">Tom92</a> — 24 mar 2023, o 13:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tonygryps]]></name></author>
<updated>2023-03-23T16:59:38+01:00</updated>
<published>2023-03-23T16:59:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24443&amp;p=236740#p236740</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24443&amp;p=236740#p236740"/>
<title type="html"><![CDATA[Re: Attiny13 EEPROM - dziwne zachowanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24443&amp;p=236740#p236740"><![CDATA[
Spróbuj po funkcji led_and_key_init(); dać niewielkiego delaja tak z 5ms.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12014">tonygryps</a> — 23 mar 2023, o 16:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom92]]></name></author>
<updated>2023-03-23T13:45:03+01:00</updated>
<published>2023-03-23T13:45:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24443&amp;p=236737#p236737</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24443&amp;p=236737#p236737"/>
<title type="html"><![CDATA[Attiny13 EEPROM - dziwne zachowanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24443&amp;p=236737#p236737"><![CDATA[
Hej zwracam się o pomoc ponieważ już nie mogę wyjaśnić zjawiska, które zachodzi z moją attiny13. Pewnie mam błąd w programie, ale nie mogę się go doszukać.<br /><br />Napisałem prosty programik do włączania taśmy ledowej, sterowania PWM oraz jest wykorzystany jeden przycisk.<br />W pętli głównej wymieram przyciskiem 100% świecenia lub 50% świecenia na biało.<br />Jeśli podczas włączania zasilania trzymam przycisk to wchodzę do wyboru innych kolorów.<br />Ustawienia koloru zapisuję w pamięci EEPROM, aby po uruchomieniu odczytać zmienne 8-bitowe ledr, ledg, ledb.<br /><br />Ogólnie wszystko działa według założeń, po włączeniu zasilania mam kolor taki jaki był wybrany poprzednio. <br /><br />ALE...<br /><br />Niestety jak testuję i losowo np. po 5-15 włączeniach zasilania taśma nagle świeci innym kolorem, albo na 50% zamiast na 100%, albo jak mam wybrany biały kolor to zaświeci na błękitny, albo nawet wejdzie ustawienie którego nie mam w prgramie np. czerwony świecący na 10%, itp.<br />Na początku myślałem, że mam problem ze stosem bo program zajmował 88,3%, więc go odchudziłem i obecnie zajmuje 76,6%:<br /><br />----------------------------------------<br /><strong><em>Device: attiny13<br /><br />Program:     784 bytes (76.6% Full)<br />(.text + .data + .bootloader)<br /><br />Data:          7 bytes (10.9% Full)<br />(.data + .bss + .noinit)<br /><br />EEPROM:       3 bytes (4.7% Full)<br />(.eeprom)</em></strong><br />----------------------------------------<br /><br />Czy jest mi ktoś w stanie pomóc? Czy problem jest z moim wsadem czy problem jest gdzieś indziej?<br /><br />MCU: AtTiny13<br />F_CPU: wewnętrzny oscylator 9 600 000 Hz (wyłączony CKDIV)<br /><br /><strong>main.c:<br /></strong>[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 /><br />#include &quot;common.h&quot;<br /><br /><br />/* zmienne pomocnicze */<br />uint8_t key_lock;// zmienna pomocnicza klawisza<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 /><br />/*---------------------- GŁÓWNA FUNKCJA PROGRAMU ----------------------*/<br />int main( void ) {<br /><br />led_and_key_init();// inicjalizacja paska LED i klawisza<br /><br />//check_and_load_defaults();// sprawdzenie wartości w pamięci EEPROM i załadowanie ich do pamięci RAM<br /><br />timer0_init();// inicjalizacja timera0 CTC<br /><br />//ram_cfg.ledr = 0;<br />//ram_cfg.ledg = 0;<br />//ram_cfg.ledb = 0;<br /><br />copy_eem_to_ram();// kopiowanie eeprom do ram<br /><br />pwm_color(ram_cfg.ledr, ram_cfg.ledg, ram_cfg.ledb);<br /><br />sei();// zezwolenie na przerwania<br /><br />key_press( &amp;key_lock, &amp;PINB, KEY_PIN, serwis );// obsługa klawisza na wciśnięcie (tryb ustawiania kolorów)<br /><br />/* ********* PĘTLA GŁÓWNA PROGRAMU  ********* */<br />while(1) {<br /><br />key_push_up( &amp;key_lock, &amp;PINB, KEY_PIN, pasek_RGB_white );// obsługa klawisza po zwolnieniu<br /><br />}<br />}<br /><br /><br /><br />/* ciało procedury obsługi przerwania Compare Match Timera0 */<br />ISR( TIM0_COMPA_vect )<br />{<br />static uint8_t cnt;// definicja zmiennej statycznej licznika PWM<br /><br />// bezpośrednie sterowanie wyjściami kanałów PWM<br />if(cnt&gt;=ram_cfg.ledr) DLEDR_OFF; else DLEDR_ON;<br />if(cnt&gt;=ram_cfg.ledg) DLEDG_OFF; else DLEDG_ON;<br />if(cnt&gt;=ram_cfg.ledb) DLEDB_OFF; else DLEDB_ON;<br /><br />cnt++;// zwiększanie licznika o 1<br />}[/syntax]<br /><br /><strong>common.c:<br /></strong>[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />#include &quot;common.h&quot;<br /><br /><br />// definicje zmiennych pomocniczych<br />uint8_t key_lock;// zmienna pomocnicza klawisza<br />char stan1=0;// początkowy stan klawisza w funkcji 1<br />char stan2=0;// początkowy stan klawisza w funkcji 2<br /><br /><br /><br />/* funkcja do kopiowania wartości z pamięci EEPROM do pamięci RAM */<br />void copy_eem_to_ram( void ) {<br />eeprom_read_block( &amp;ram_cfg, &amp;eem_cfg, sizeof(ram_cfg) );<br />}<br /><br /><br />/* funkcja do kopiowania wartości z pamięci RAM do pamięci EEPROM */<br />void copy_ram_to_eem( void ) {<br />eeprom_write_block( &amp;ram_cfg, &amp;eem_cfg, sizeof(ram_cfg) );<br />}<br /><br /><br />/* funkcja do kopiowania wartości z pamięci Flash do pamięci RAM */<br />void copy_pgm_to_ram( void ) {<br />memcpy_P( &amp;ram_cfg, &amp;pgm_cfg, sizeof(ram_cfg) );<br />}<br /><br /><br />/* funkcja do załadowania wartości fabrycznych z pamięci Flash */<br />//void load_defaults( void ) {<br />//copy_pgm_to_ram();<br />//copy_ram_to_eem();<br />//}<br /><br /><br />/* funkcja do sprawdzenia wartości w pamięci EEPROM i wystawienie ich do pamięci RAM */<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 inicjalizacji diody RGB i klawisza */<br />void led_and_key_init(void) {<br />/* ******** inicjalizacja LED i klawisza ********* */<br />DDRB |= LEDR_PIN|LEDG_PIN|LEDB_PIN;// kierunek pinów diody RGB – wyjściowy<br />PORTB &amp;= ~(LEDR_PIN|LEDG_PIN|LEDB_PIN);// włączenie diody RGB<br />DDRB &amp;= ~(KEY_PIN);// kierunek pinu klawisza - wejściowy<br />PORTB |= KEY_PIN;// podciągnięcie pinu klawisza do VCC<br />}<br /><br /><br />/* funkcja do inicjalizacji timera */<br />void timer0_init(void) {<br />/* ****** konfiguracja Timera0 - AtTiny13 ****** */<br />TCCR0A |= (1&lt;&lt;WGM01);    // tryb  CTC<br />TCCR0B |= (1&lt;&lt;CS00);     // preskaler = 1<br />OCR0A = 239;             // 40kHz - przerwanie co 25us (wewnętrzny oscylator 9,6MHz)<br />TIMSK0 |= (1&lt;&lt;OCIE0A);    // zezwolenie na przerwanie CompareMatch<br />}<br /><br /><br />/* funkcja do obsługi paska LED RGB - białe podświetlenie */<br />void pasek_RGB_white(void) {<br />stan1++;<br />if (stan1&gt;1) stan1=0;// stan może przyjąc wartości od 0 do 1<br /><br />switch(stan1) {<br />case 0:// biały 100%<br />pwm_color( 255, 255, 255 );<br /> break;<br />case 1:// biały 75%<br />pwm_color( 191, 191, 191 );<br /><br />}// koniec funkcji switch<br />//eem_cfg.ledr = 0;<br />//eem_cfg.ledg = 0;<br />//eem_cfg.ledb = 0;<br />copy_ram_to_eem();// zapisanie wartości koloru do pamięci EEPROM<br />}<br /><br /><br />/* funkcja do obsługi kolorów RGB */<br />void pasek_RGB_colors(void) {<br />stan2++;<br />if (stan2&gt;11) stan2=0;// stan może przyjąc wartości od 0 do 11<br /><br />switch(stan2) {<br />case 0:// czerwony 100%<br />pwm_color( 255, 0, 0 );<br />break;<br />case 1:// czerwony 25%<br />pwm_color( 64, 0, 0 );<br />break;<br />case 2:// zielony 100%<br />pwm_color( 0, 255, 0 );<br />break;<br />case 3:// zielony 25%<br />pwm_color( 0, 64, 0 );<br />break;<br />case 4:// niebieski 100%<br />pwm_color( 0, 0, 255 );<br />break;<br />case 5:// niebieski 25%<br />pwm_color( 0, 0, 64 );<br />break;<br />case 6:// fioletowy 100%<br />pwm_color( 255, 0, 255 );<br />break;<br />case 7:// fioletowy 25%<br />pwm_color( 64, 0, 64 );<br />break;<br />case 8:// żółty 100%<br />pwm_color( 255, 255, 0 );<br />break;<br />case 9:// żółty 25%<br />pwm_color( 64, 64, 0 );<br />break;<br />case 10:// błękitny 100%<br />pwm_color( 0, 255, 255 );<br />break;<br />case 11:// błękitny 25%<br />pwm_color( 0, 64, 64 );<br /><br />}// koniec funkcji switch<br />//eem_cfg.ledr = 0;<br />//eem_cfg.ledg = 0;<br />//eem_cfg.ledb = 0;<br />copy_ram_to_eem();// zapisanie wartości koloru do pamięci EEPROM<br />}<br /><br /><br />/* funkcja z pętlą główną programu trybu zmiany kolorów */<br />void serwis(void) {<br />while(1) {<br />key_push_up( &amp;key_lock, &amp;PINB, KEY_PIN, pasek_RGB_colors );// obsługa klawisza po zwolnieniu<br />}<br />}<br /><br /><br />/* funkcja do obsługi przycisku - po wciśnięciu */<br />void key_press(uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) {<br /><br /> register uint8_t key_press = (*KPIN &amp; key_mask);<br /><br /> if( !*klock &amp;&amp; !key_press ) {<br />  *klock=1;<br /><br />  // reakcja na PRESS (wcinięcie przycisku)<br />  if(kfun) kfun();<br /><br /> } else if( *klock &amp;&amp; key_press ) (*klock)++;<br />}<br /><br /><br />/* funkcja do obsługi przycisku - po zwolnieniu */<br />void key_push_up(uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) {<br /><br /> register uint8_t key_press = (*KPIN &amp; key_mask);<br /><br /> if( !*klock &amp;&amp; !key_press ) *klock=1;<br /> else if( *klock &amp;&amp; key_press ) {<br />  if( !++*klock ) {<br /><br />   // reakcja na PUSH_UP (zwolnienie przycisku)<br />   if(kfun) kfun();<br />  }<br /> }<br />}<br /><br /><br />/* funkcja do sterowania PWM wybranym kolorem diody RGB w pamięci RAM */<br />void pwm_color(uint8_t red, uint8_t green, uint8_t blue) {<br /> if ( ram_cfg.ledr &gt; red ) while (ram_cfg.ledr &gt; red) {ram_cfg.ledr--;}<br />else if ( ram_cfg.ledr &lt; red ) while (ram_cfg.ledr &lt; red) {ram_cfg.ledr++;}<br /><br /> if ( ram_cfg.ledg &gt; green ) while (ram_cfg.ledg &gt; green) {ram_cfg.ledg--;}<br />else if ( ram_cfg.ledg &lt; green ) while (ram_cfg.ledg &lt; green) {ram_cfg.ledg++;}<br /><br /> if ( ram_cfg.ledb &gt; blue ) while (ram_cfg.ledb &gt;  blue) {ram_cfg.ledb--;}<br />else if ( ram_cfg.ledb &lt; blue ) while (ram_cfg.ledb &lt;  blue) {ram_cfg.ledb++;}<br />}[/syntax]<br /><br /><strong>common.h:<br /></strong>[syntax=c]#ifndef COMMON_H_<br />#define COMMON_H_<br /><br /><br />/* konfiguracja pinów podłączonej diody LED RGB */<br />#define LEDR_PIN (1&lt;&lt;PB1)// definicja pinu R<br />#define LEDG_PIN (1&lt;&lt;PB0)// definicja pinu G<br />#define LEDB_PIN (1&lt;&lt;PB4)// definicja pinu B<br />#define DLEDR_ON PORTB |= LEDR_PIN// makrodefinicja - wyłączenie pinu R<br />#define DLEDG_ON PORTB |= LEDG_PIN// makrodefinicja - wyłączenie pinu G<br />#define DLEDB_ON PORTB |= LEDB_PIN// makrodefinicja - wyłączenie pinu B<br />#define DLEDR_OFF PORTB &amp;= ~LEDR_PIN// makrodefinicja - załączenie pinu R<br />#define DLEDG_OFF PORTB &amp;= ~LEDG_PIN// makrodefinicja - załączenie pinu G<br />#define DLEDB_OFF PORTB &amp;= ~LEDB_PIN// makrodefinicja - załączenie pinu B<br /><br />/* konfiguracja pinu podłączonego klawisza */<br />#define KEY_PIN (1&lt;&lt;PB2)<br />#define KEY_DOWN !(PINB &amp; KEY_PIN)<br /><br />/* ustawienia domylne (fabryczne) - biały kolor 100% */<br />#define LEDR 255// stan koloru czerwonego diody RGB<br />#define LEDG 255// stan koloru zielonego diody RGB<br />#define LEDB 255// stan koloru niebieskiego diody RGB<br /><br />/* typ strukturalny */<br />typedef struct {<br />uint8_t ledr;<br />uint8_t ledg;<br />uint8_t ledb;<br />} TCFG;<br /><br />extern 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 />/* definicje funkcji dla użytkownika */<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 />//void check_and_load_defaults( void );<br />void led_and_key_init(void);<br />void timer0_init(void);<br />void pasek_RGB_white(void);<br />void pasek_RGB_colors(void);<br />void serwis(void);<br />void key_press( uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) );<br />void key_push_up( uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) );<br />void pwm_color(uint8_t red, uint8_t green, uint8_t blue);<br /><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> — 23 mar 2023, o 13:45</p><hr />
]]></content>
</entry>
</feed>