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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-09-24T21:27:17+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=3871&amp;mode</id>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2013-09-24T21:27:17+01:00</updated>
<published>2013-09-24T21:27:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=50724#p50724</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=50724#p50724"/>
<title type="html"><![CDATA[Re: Dziwne zachowanie IF i timerów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=50724#p50724"><![CDATA[
Z tego co wiem, nie musi... Przynjajmniej jeśli jest tylko jeden.  Ale może niech się ktoś bardziej obczajony w C wypowie <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 24 wrz 2013, o 21:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kidcowboy]]></name></author>
<updated>2013-09-24T21:02:46+01:00</updated>
<published>2013-09-24T21:02:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=50722#p50722</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=50722#p50722"/>
<title type="html"><![CDATA[Re: Dziwne zachowanie IF i timerów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=50722#p50722"><![CDATA[
Czy tryb wyliczeniowy nie powinien mieć nazwy ??<br />[syntax=c]enum {idle, debounce, go_rep, wait_rep, rep};[/syntax]<br />np takiej :<br />[syntax=c]enum nazwa {idle, debounce, go_rep, wait_rep, rep};[/syntax]<br />??<br />Może dziwne pytanie bo wiem że kod działa ....<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=313">kidcowboy</a> — 24 wrz 2013, o 21:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2013-08-17T01:17:24+01:00</updated>
<published>2013-08-17T01:17:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45971#p45971</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45971#p45971"/>
<title type="html"><![CDATA[Re: Dziwne zachowanie IF i timerów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45971#p45971"><![CDATA[
Już wyszło szydło z wora. Chodziło o to, że przy spełnieniu warunku wykonywała się funkcja która zerowała timer. <br />Gdy warunek nie był spełniony timer się nie zerował tylko liczył dalej, jako że był 16 bitowy musiał doliczyć do 65535 aby się wyzerować samoczynnie.<br />Gdybym poczekał 655 sekund to by z powrotem ruszyło <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br />Dodałem zerowanie timerów do funkcji przełączającej tryby.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 17 sie 2013, o 01:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2013-08-15T20:44:14+01:00</updated>
<published>2013-08-15T20:44:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45843#p45843</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45843#p45843"/>
<title type="html"><![CDATA[Re: Dziwne zachowanie IF i timerów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45843#p45843"><![CDATA[
Po wielu próbach zmian, niejednokrotnie uważam, że bezsensownych bo funkcje są banalne i nie bardzo mają mieć gdzie jakiś &quot;haczyk&quot;, nadal nie mam pojęcia o co może chodzić. <br />Pozwoliłem więc sobie napisać króciutki programik wypisujący po kolei zawartość komórek pamięci RAM. Oczywiście przed uruchomieniem odcinam na jakiś czas zasilanie to MCU (pamieć RAM to static). I żeby było ciekawie w całej pamięci rezydują jakieś wartości. Spodziewałem się, że powyżej powiedzmy 0x200 będzie stało 0 albo ff a tu niespodzianka.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br /><br />char znak;<br />uint8_t *cell;<br />uint16_t i;<br /><br />int main(void) {<br /><br />lcd_init();<br />lcd_cls();<br />lcd_locate(1,0);<br />lcd_str(&quot;addr     value&quot;);<br /><br />for (i=0; i&lt;1024; i++){<br />lcd_locate(0,0);<br />lcd_str(&quot;0x&quot;);<br />lcd_hex((uint16_t) cell);<br />lcd_str(&quot;     &quot;);<br />lcd_hex(*cell);<br />lcd_str(&quot;     &quot;);<br /><br />cell++;<br />_delay_ms(20);<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 15 sie 2013, o 20:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2013-08-15T13:13:53+01:00</updated>
<published>2013-08-15T13:13:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45813#p45813</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45813#p45813"/>
<title type="html"><![CDATA[Re: Dziwne zachowanie IF i timerów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45813#p45813"><![CDATA[
Ilość wartości zmiennej mode to sprawa w sumie nieistotna. Zmienna wraca ostatecznie do wartości 0. Warunek pierwszy w pętli while zostaje spełniony, na LCD pokazuje się wartość zmiennej mode czyli 0, jednak diody już nie migają. Tak jakby zawieszają się na jednym stanie i tak pozostaje aż do resetu proca.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 3 minutach ]</span></strong><br /><br />Same funkcje do diod, zmiennej mode czy sprawdzania warunków są banalne, wkleję cały kod:<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 14-08-2013<br /> *      Author: mike<br /> */<br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br /><br /><br />// markra do diod LED (diody zaswiecane stanem niskim)<br />#define LED DDRD |= (1&lt;&lt;PD7)<br />#define LED_ON PORTD |= (1&lt;&lt;PD7)<br />#define LED_OFF PORTD &amp;= ~(1&lt;&lt;PD7)<br />#define LED_TOG PORTD ^= (1&lt;&lt;PD7)<br /><br />#define LED_GREEN DDRC |= (1&lt;&lt;PC0)<br />#define LED_GREEN_OFF PORTC |= (1&lt;&lt;PC0)<br />#define LED_GREEN_ON PORTC &amp;= ~(1&lt;&lt;PC0)<br />#define LED_GREEN_TOG PORTC ^= (1&lt;&lt;PC0)<br /><br />#define LED_RED DDRC |= (1&lt;&lt;PC1)<br />#define LED_RED_OFF PORTC |= (1&lt;&lt;PC1)<br />#define LED_RED_ON PORTC &amp;= ~(1&lt;&lt;PC1)<br />#define LED_RED_TOG PORTC ^= (1&lt;&lt;PC1)<br /><br />#define LED_BLUE DDRC |= (1&lt;&lt;PC2)<br />#define LED_BLUE_OFF PORTC |= (1&lt;&lt;PC2)<br />#define LED_BLUE_ON PORTC &amp;= ~(1&lt;&lt;PC2)<br />#define LED_BLUE_TOG PORTC ^= (1&lt;&lt;PC2)<br /><br /><br />// makra klawiszy<br />#define KL1 (1&lt;&lt;PB0)<br />#define KL2 (1&lt;&lt;PB1)<br />#define KL3 (1&lt;&lt;PB2)<br />#define KL4 (1&lt;&lt;PB3)<br /><br /><br />//#define NULL 0<br /><br /><br /><br />// zmienne globalne<br />volatile uint16_t Timer1, Timer2, Timer3, Timer4;<br />uint8_t mode;<br /><br /><br /><br />// Deflaracje funkji programu<br />void led1_blink(uint8_t value);<br />void led2_blink(uint8_t value);<br />void led3_blink(uint8_t value);<br />void mode_set (void);<br />void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN,<br />uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait,<br />void (*push_proc)(void), void (*rep_proc)(void));<br /><br />// Konied deklaracji funkcji programu<br /><br /><br /><br />int main(void) {<br /><br />// Włączenie timera w trybie CTC<br />TCCR0 |= (1&lt;&lt;WGM01); // tryb CTC<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);// preskaler 1024<br />OCR0 = 155;// podział aby uzyskać przerwanie co 10ms<br />TIMSK |= (1&lt;&lt;OCIE0);// zezwolenie na przerwanie Compare<br /><br /><br />// Ustawienie podciągania wejsć przycisków<br />PORTB |= KL1|KL2|KL3|KL4;<br /><br />// Włączenie wyjsć dla diod LED<br />LED;<br />LED_BLUE;<br />LED_GREEN;<br />LED_RED;<br />LED_OFF;<br /><br />// inicjalizacja wyswietlacza LCD<br />lcd_init();<br />lcd_cls();<br />lcd_str(&quot;LED2     LED3     LED4 liczba&quot;);<br />sei();<br /><br />while(1) {<br /><br />uint8_t k1,k2,k3,k4;<br /><br />if (mode==0) {<br />led1_blink(5);<br />led2_blink(20);<br />led3_blink(40);<br />lcd_locate(1,0);<br />lcd_int(mode);<br /><br />}<br /><br />if (mode==1) {<br />led1_blink(50);<br />led2_blink(70);<br />led3_blink(100);<br />lcd_locate(1,0);<br />lcd_int(mode);<br /><br />}<br /><br /><br /><br />SuperDebounce(&amp;k1, &amp;PINB, KL1, 20, 500, mode_set, NULL);<br /><br />} // koniec while<br />} // koniec main<br /><br /><br />// Definicje funkcje programu<br />void led1_blink(uint8_t value) {<br /><br />if (Timer2==value) {<br />LED_BLUE_TOG;<br />Timer2=0;<br />}<br />}<br /><br />void led2_blink(uint8_t value) {<br /><br />if (Timer3==value) {<br />LED_RED_TOG;<br />Timer3=0;<br />}<br />}<br /><br />void led3_blink(uint8_t value) {<br /><br />if (Timer4==value) {<br />LED_GREEN_TOG;<br />Timer4=0;<br />}<br />}<br /><br />void mode_set (void) {<br /><br />if(++mode &gt; 3) mode = 0;<br />}<br /><br />void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN,<br />uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait,<br />void (*push_proc)(void), void (*rep_proc)(void)) {<br /><br />enum {idle, debounce, go_rep, wait_rep, rep};<br /><br />if(!rep_time) rep_time=20;<br />if(!rep_wait) rep_wait=150;<br /><br />uint8_t key_press = !(*KPIN &amp; key_mask);<br /><br />if( key_press &amp;&amp; !*key_state ) {<br />*key_state = debounce;<br />Timer1 = 15;<br />} else<br />if( *key_state  ) {<br /><br />if( key_press &amp;&amp; debounce==*key_state &amp;&amp; !Timer1 ) {<br />*key_state = 2;<br />Timer1=5;<br />} else<br />if( !key_press &amp;&amp; *key_state&gt;1 &amp;&amp; *key_state&lt;4 ) {<br />if(push_proc) push_proc();/* KEY_UP */<br />*key_state=idle;<br />} else<br />if( key_press &amp;&amp; go_rep==*key_state &amp;&amp; !Timer1 ) {<br />*key_state = wait_rep;<br />Timer1=rep_wait;<br />} else<br />if( key_press &amp;&amp; wait_rep==*key_state &amp;&amp; !Timer1 ) {<br />*key_state = rep;<br />} else<br />if( key_press &amp;&amp; rep==*key_state &amp;&amp; !Timer1 ) {<br />Timer1 = rep_time;<br />if(rep_proc) rep_proc();/* KEY_REP */<br />}<br />}<br />if( *key_state&gt;=3 &amp;&amp; !key_press ) *key_state = idle;<br />}<br /><br />// Koniec definicji funkcji programu<br /><br /><br />// Obsługa przerwania COMPARE<br />ISR(TIMER0_COMP_vect) {<br /><br />++Timer2;<br />++Timer3;<br />++Timer4;<br /><br />uint16_t n;<br /><br />n = Timer1;<br />if (n) Timer1 = --n;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 15 sie 2013, o 13:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PJS]]></name></author>
<updated>2013-08-15T13:08:51+01:00</updated>
<published>2013-08-15T13:08:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45811#p45811</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45811#p45811"/>
<title type="html"><![CDATA[Re: Dziwne zachowanie IF i timerów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45811#p45811"><![CDATA[
Antystatyczny w warunku ma &gt;2 a nie &gt;3.<br /><br />Poza tym:<br />Piszesz, że mode może mieć 3 wartości, a twoja funkcja mode_set() pozwala na przyjmowanie wartości od 0 do 3 (czyli czterech wartości), gdyż jeśli mode==2 wykonywane jest to co po else, czyli mode wyniesie 3. Zmień w niej warunek mode==3 na mode==2; uzyskasz wtedy efekt jaki daje też propozycja Antystatycznego.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1614">PJS</a> — 15 sie 2013, o 13:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2013-08-15T12:53:31+01:00</updated>
<published>2013-08-15T12:53:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45809#p45809</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45809#p45809"/>
<title type="html"><![CDATA[Re: Dziwne zachowanie IF i timerów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45809#p45809"><![CDATA[
<div class="quotetitle">Antystatyczny napisał(a):</div><div class="quotecontent"><br />if(++mode &gt; 3) mode = 0;<br /></div><br /><br />To samo...<br />Dodam jeszcze, że zaraz po wywołaniach funkcji migania diodami, wywołane są funkcje obsługi lcd.<br />I te funkcje działają, tzn widać, że zmienna mode wraca do wartości 0.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 15 sie 2013, o 12:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2013-08-15T12:42:34+01:00</updated>
<published>2013-08-15T12:42:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45807#p45807</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45807#p45807"/>
<title type="html"><![CDATA[Dziwne zachowanie IF i timerów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3871&amp;p=45807#p45807"><![CDATA[
witam<br /><br />Piszę sobie taki program, generalnie jest pozbawiony jakiejś użyteczności, ale stanowi próbę połączenia działania kilku wątków w sposób nie blokujący, oraz wprowadzania ustawień i zapisu ich do eeprom.<br />Oczywiście używa timerów programowych sterowanych przez przerwanie COMPARE dla OCR0 w trybie CTC.<br />Piszę go metodą &quot;po kawałku&quot; czyli uruchomiłem na razie same procesy &quot;nieblokujące&quot; którymi jest miganie diodami led z różną częstotliwością.<br />Następnie wprowdziałem zmienną &quot;mode&quot; która może przyjmować 3 wartości (odczyt, ustawienia1, ustawienia2). Wartość zmiennej mode jest zmieniana przyciskiem od 0 do 3, po osiągnięciu 3 jest zmieniana z powrotem na 0. <br />W pętli while jest sprawdzana wartość mode i wykonywane są odpowiednie czynności. Część tego widać w załączonym kodzie. Nie wklejam na razie całego kodu, żeby nie śmiecić <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> Ale oczywiście mogę wkleić. <br /><br />Problem polega na tym, że gdy zmienna mode z powrotem zmieni się na wartość domyślna (taką jak po resecie) czyli 0 to efekt jest taki jakby timery programowe się zatrzymywały. Pierwsza sekwencja zmiany wartości  mode działa dobrze, ale powrót do początku już nie.<br /><br />Poniżej kod pętli głównej while:<br />[syntax=c]while(1) {<br /><br />uint8_t k1,k2,k3,k4;<br /><br />if (mode==0) {<br />led1_blink(5);<br />led2_blink(20);<br />led3_blink(40);<br />lcd_locate(1,0);<br />lcd_int(mode);<br /><br />}<br /><br />if (mode==1) {<br />led1_blink(50);<br />led2_blink(70);<br />led3_blink(100);<br />lcd_locate(1,0);<br />lcd_int(mode);<br /><br />}<br /><br /><br /><br />SuperDebounce(&amp;k1, &amp;PINB, KL1, 20, 500, mode_set, NULL);<br /><br />} // koniec while[/syntax]<br /><br />Wartości podawane do funkcji ledX_blink są to wartości porównania dla timerów programowych.<br /><br />poniżej kod funkcji inkrementującej zmienną mode:<br />[syntax=c]void mode_set (void) {<br /><br />if (mode==3) mode=0;<br />else mode++;<br /><br />}[/syntax]<br /><br />W czym może być tu problem??<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 15 sie 2013, o 12:42</p><hr />
]]></content>
</entry>
</feed>