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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-12-13T12:37:49+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=17003&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-12-13T12:37:49+01:00</updated>
<published>2016-12-13T12:37:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177365#p177365</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177365#p177365"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177365#p177365"><![CDATA[
toż pisałem tobie wyżej żebyś włączył sprawdzanie wartości timerH do atomic block<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 13 gru 2016, o 12:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dejmos]]></name></author>
<updated>2016-12-13T12:24:35+01:00</updated>
<published>2016-12-13T12:24:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177363#p177363</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177363#p177363"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177363#p177363"><![CDATA[
No właśnie o to chodzi, że generalnie wiem co robi ATOMIC_BLOCK. A to co opisałem to nie jest żadna wiedza powzięta z internetu czy książek. Procesor + oscyloskop i wychodzi, że funkcja w postaci:<br />[syntax=c]void opoznienie_1ms(uint16_t czas_opoznienia_1ms)  //<br />{<br />        ATOMIC_BLOCK(ATOMIC_FORCEON)<br />        {<br />                TCNT2=0;<br />                timerH=0;<br />                pomocnicza=0;<br />        }<br />        while(timerH &lt;= czas_opoznienia_1ms);<br />}[/syntax]<br />generuje poprawne opóźnienia dla zmiennej &quot;czas_opoznienia_1ms&quot; z zakresu od 1 do 255 powyżej tej wartości zmienna &quot;czas_opoznienia_1ms&quot; przyjmuje wartość 255.<br />A funkcja w postaci:<br />[syntax=c]void opoznienie_1ms(uint16_t czas_opoznienia_1ms)<br />    {<br />            uint8_t flaga=0;<br />            TCNT2=0;<br />            timerH=0;<br />            pomocnicza=0;<br />            while(flaga==0)<br />            {<br />                   ATOMIC_BLOCK(ATOMIC_FORCEON)<br />                   {<br />                          if(timerH &gt;= czas_opoznienia_1ms) flaga=1;<br />                   }<br />           }<br />    }[/syntax]<br />działa poprawnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8587">dejmos</a> — 13 gru 2016, o 12:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-12-13T12:01:18+01:00</updated>
<published>2016-12-13T12:01:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177361#p177361</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177361#p177361"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177361#p177361"><![CDATA[
<div class="quotetitle">dejmos napisał(a):</div><div class="quotecontent"><br />Co takiego dziwnego wprowadza ATOMIC_BLOCK, że zmianna deklarowana jako 16 bitowa jest traktowana jako 8 bitowa?<br /></div><br />A skąd powziąłeś taką wiedzę ? .... Atomic block zatrzymuje przerwania żeby operacje sprawdzenia zmiennych więcej niż 8-biowe które wykonywane są w wielu rozkazach asm nie mogły być przypadkowo przerwane przez przerwanie .....<br /><br />Gdy zmienna jest 8-bitowa to większość porównań z uwagi na strukturę AVR może być wykonywana atomowo w jednym cyklu a więc nie może zostać taka operacja atomowa jak to się mówi, być przerwana w trakcie, przez przerwanie<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 13 gru 2016, o 12:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dejmos]]></name></author>
<updated>2016-12-13T11:56:34+01:00</updated>
<published>2016-12-13T11:56:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177360#p177360</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177360#p177360"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177360#p177360"><![CDATA[
Chodzi o to, że jeżeli robię coś takiego:<br />[syntax=c]void opoznienie_1ms(uint16_t czas_opoznienia_1ms)<br />{<br />ATOMIC_BLOCK(ATOMIC_FORCEON)<br />{<br />TCNT2=0;<br />timerH=0;<br />pomocnicza=0;<br />        while(timerH &lt;= czas_opoznienia_1ms); <br />        }<br />}[/syntax]<br />Funkcja nie działa i to by było logiczne bo program zatrzymuje się na pętli while przy wyłączonych przerwaniach i warunek [syntax=c]timerH &lt;= czas_opoznienia_1ms[/syntax]<br />zawsze będzie spełniony bo timerH nie będzie inkrementowany.<br />W poprzedniej wersji gdy w ATOMIC_BLOCK znajdowało się tylko zerowanie zmiennych &quot;timerH&quot; i &quot;pomocnicza&quot; oraz rejestru TCNT2 funkcja działała dobrze tylko do 255ms. I to mnie zaskoczyło dlaczego tylko do 255? Co takiego dziwnego wprowadza ATOMIC_BLOCK, że zmianna deklarowana jako 16 bitowa jest traktowana jako 8 bitowa?<br />Po zastanowieniu należało by zrobić coś w rodzaju:<br />[syntax=c]void opoznienie_1ms(uint16_t czas_opoznienia_1ms)<br />{<br />        uint8_t flaga=0;<br />TCNT2=0;<br />timerH=0;<br />pomocnicza=0;<br />while(flaga==0)<br />        {<br />       ATOMIC_BLOCK(ATOMIC_FORCEON)<br />       {<br />                      if(timerH &gt;= czas_opoznienia_1ms) flaga=1;<br />               } <br />       }<br />}[/syntax]<br />i takie rozwiązanie działa i w tym przypadku zmienne traktowane są już jako 16 bitowe.<br />Co do możliwości generowania interwałów przy pomocy tyknięć TCNT2 nie pomyślałem. Będę musiał to zastosować.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8587">dejmos</a> — 13 gru 2016, o 11:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-12-13T11:10:15+01:00</updated>
<published>2016-12-13T11:10:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177355#p177355</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177355#p177355"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177355#p177355"><![CDATA[
<div class="quotetitle">dejmos napisał(a):</div><div class="quotecontent"><br />Można przyjąć, że problem połowicznie został rozwiązany tylko dlaczego ATOMIC_BLOCK wprowadza takie problemy.<br /></div><br />Nie wiem o czym mówisz - ja pisałem tobie o włączeniu do atomic block a ty piszesz że w ogóle usunąłeś - nie wiem co robisz<br /><br /><div class="quotetitle">dejmos napisał(a):</div><div class="quotecontent"><br />. tylko w przyszłości będą mi potrzebne interwały krótsze niż 1ms<br /></div><br />to się robi inaczej ... wtedy można ustawić timer z odpowiednią częstotliwością i zliczać same tyknięcia timera w TCNT0<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 13 gru 2016, o 11:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dejmos]]></name></author>
<updated>2016-12-13T11:07:00+01:00</updated>
<published>2016-12-13T11:07:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177353#p177353</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177353#p177353"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177353#p177353"><![CDATA[
Dziękuję za odpowiedź. Procesor taktowany jest zegarem 8MHz więc myślę że powinien dać radę. Mogę w sumie zwolnić 100 krotnie wywołanie przerwania od timera2 i wtedy procek na pewno da sobie radę. tylko w przyszłości będą mi potrzebne interwały krótsze niż 1ms i dlatego wolałbym zostawić to tak jak jest. Najdziwniejsze jest to, że pozbycie się ATOMIC_BLOCK powoduje, że funkcja działa dobrze. <br />Co do asemblera to nie wiem dlaczego ale dla trybu CTC jest vektor3 a dla trybu OVERFLOW jest vektor4 zaś w moim pliku *.lss jest tylko wektor 4 i ma postać<br /> <div class="codetitle"><b>Code:</b></div><div class="codecontent">000000b4 &lt;__vector_4&gt;:<br />  b4:   1f 92          push   r1<br />  b6:   0f 92          push   r0<br />  b8:   0f b6          in   r0, 0x3f   ; 63<br />  ba:   0f 92          push   r0<br />  bc:   11 24          eor   r1, r1<br />  be:   8f 93          push   r24<br />  c0:   9f 93          push   r25<br />  c2:   80 91 a0 00    lds   r24, 0x00A0<br />  c6:   90 91 a1 00    lds   r25, 0x00A1<br />  ca:   01 96          adiw   r24, 0x01   ; 1<br />  cc:   90 93 a1 00    sts   0x00A1, r25<br />  d0:   80 93 a0 00    sts   0x00A0, r24<br />  d4:   80 91 8f 00    lds   r24, 0x008F<br />  d8:   8f 5f          subi   r24, 0xFF   ; 255<br />  da:   80 93 8f 00    sts   0x008F, r24<br />  de:   80 91 8f 00    lds   r24, 0x008F<br />  e2:   84 36          cpi   r24, 0x64   ; 100<br />  e4:   58 f0          brcs   .+22        ; 0xfc &lt;__vector_4+0x48&gt;<br />  e6:   10 92 8f 00    sts   0x008F, r1<br />  ea:   80 91 90 00    lds   r24, 0x0090<br />  ee:   90 91 91 00    lds   r25, 0x0091<br />  f2:   01 96          adiw   r24, 0x01   ; 1<br />  f4:   90 93 91 00    sts   0x0091, r25<br />  f8:   80 93 90 00    sts   0x0090, r24<br />  fc:   9f 91          pop   r25<br />  fe:   8f 91          pop   r24<br /> 100:   0f 90          pop   r0<br /> 102:   0f be          out   0x3f, r0   ; 63<br /> 104:   0f 90          pop   r0<br /> 106:   1f 90          pop   r1<br /> 108:   18 95          reti</div><br />Można przyjąć, że problem połowicznie został rozwiązany tylko dlaczego ATOMIC_BLOCK wprowadza takie problemy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8587">dejmos</a> — 13 gru 2016, o 11:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-12-13T10:26:57+01:00</updated>
<published>2016-12-13T10:26:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177350#p177350</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177350#p177350"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177350#p177350"><![CDATA[
łaaaaał - no teraz tak napisany kod to MIODZIO ! ... aż miło popatrzeć i szkoda nie podpowiedzieć czegoś <br /><br />jaką częstotliwością taktujesz procka ? to ważne pytanie bo .... widzę teraz ładnie z kodu - że ustawiasz działanie timera2 na 50 kHz ! ... czy sprawdzałeś sobie czy w ogóle wyrabia ci się to czasowo ? to bardzo wysoka częstotliwość - przelicz sobie ilość rozkazów asm kodu w procedurze obsługi przerwania w pliku *.lss ... bo mogę się mylić ale na moje oko to robi się już kiszka - szczególnie jeśli jeszcze być może wolno taktujesz procka<br /><br />druga sprawa - zrobiłeś ładnie Atomic block ale nie na to co głównie potrzeba <br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />ATOMIC_BLOCK(ATOMIC_FORCEON)<br />        {<br />                TCNT2=0;<br />                timerH=0;<br />                pomocnicza=0;<br />        }<br />        <span style="color: #FF0000">while(timerH &lt;= czas_opoznienia_1ms);</span><br /></div><br /><br />Zobacz to co na czerwono to porównywanie zmiennej 16-bitowej która jest napędzana w przerwaniu - a więc w trakcie porównania może dojść do przerwania i ... ? .... i klops<br /><br />to while powinno być w ramach Atomic Block<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 13 gru 2016, o 10:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dejmos]]></name></author>
<updated>2016-12-13T10:12:52+01:00</updated>
<published>2016-12-13T10:12:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177348#p177348</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177348#p177348"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=177348#p177348"><![CDATA[
Witam. Nie będę zakładał drugiego wątku tylko pociągnę już istniejący. Mianowicie chodzi o to, że w kodzie poniżej funkcja void opoznienie_1ms(uint16_t czas_opoznienia_1ms) generuje opóźnienia poprawnie tylko do 255ms powyżej tej wartości opóźnienia są generowane jako 255ms. Wygląda tak jakby kompilator traktował zmienną czas_opoznienia_1ms i zmienną timerH jako uint8_t a nie jak to jest zadeklarowanie uint16_t i dla wartości powyżej 255 wstawiał 255. Co jest nie tak? Bo wg mnie wszystko powinno być ok. Z góry dziękuję za odpowiedź.<br /><br /><br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/atomic.h&gt;<br />#include &lt;stdint.h&gt;<br /><br />//------------- zmienne globalne----------------------------<br />volatile uint16_ttimerH;<br />volatile uint8_tpomocnicza;<br /><br />//------------- deklaracje funkcji-------------------------<br />void opoznienie_1ms(uint16_t czas_opoznienia_1ms);<br />void Timer2_start(void);<br />void PortsInit(void);<br /><br />//------------------FUNKCJA GŁÓWNA-------------------------<br />int main(void)<br />{<br /><br />PortsInit();         //inicjuj porty<br />Timer2_start();   //inicjuj timer<br />sei();                //odblokuj przerwania<br />        while(1)<br />        {<br />           PORTB ^= (1&lt;&lt;PB7);<br />           opoznienie_1ms(500);<br />        }<br />}<br /><br />//--------------inicjacja timera 2-------------------------<br />void Timer2_start(void)//start timer 2<br />{<br />TCCR2 |= (1&lt;&lt;WGM21);//tryb CTC<br />TCCR2 |= (1&lt;&lt;CS20); //bez preskalera<br />OCR2 = 79;                        //częstotliwoć 50kHz<br />TIMSK |= (1&lt;&lt;OCIE2);//przerwanie od timera2<br />}<br /><br />//-------------wektor timera 2-----------------------------<br />ISR (TIMER2_COMP_vect)<br />{<br />pomocnicza++;<br />if(pomocnicza &gt; 99)<br />{<br />pomocnicza = 0;<br />timerH++;//1ms<br />}<br />}<br /><br />//------------funkcja opóźnienia---------------------------<br />void opoznienie_1ms(uint16_t czas_opoznienia_1ms)  //<br />{<br />ATOMIC_BLOCK(ATOMIC_FORCEON)<br />{<br />TCNT2=0;<br />timerH=0;<br />pomocnicza=0;<br />}<br />while(timerH &lt;= czas_opoznienia_1ms);<br />}<br /><br />//--------------inicjacja portów----------------------------<br />void PortsInit(void)<br />{<br />DDRA = 0x00; //PORTA wejścia<br />PORTA = 0xff; //wejcia w stan 1<br /><br />DDRB = 0xff; //PORTB wyjścia<br />PORTB = 0x00; //wyjcia w stan 0<br /><br />DDRC = 0xff; //PORTC wyjcia<br />PORTC = 0x00; //wyjcia w stan 0<br /><br />DDRD =  0xe2;//0b11100010;<br />PORTD = 0x08; //ustaw PORTD w stan 00001000<br />}<br />//---------------------------------------------------------[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8587">dejmos</a> — 13 gru 2016, o 10:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-12-09T14:24:46+01:00</updated>
<published>2016-12-09T14:24:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176975#p176975</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176975#p176975"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176975#p176975"><![CDATA[
No i właśnie tylko o to chodzi - żeby zwrócić uwagę na takie w gruncie rzeczy drobiazgi - i stosować się do tego - a sam zobaczysz że szybko się przyzwyczaisz i docenisz to wkrótce.<br /><br />z tym wywoływaniem funkcji w przerwaniu to nie chodzi o jakieś opóźnienia drastyczne bo to nie są duże opóźnienia - skok do funkcji i odłożenie na stosie kilku elementów ... Tu chodzi właśnie bardziej o dbanie o zajętość stosu. Ja nie mówię przy tym, że nigdy tak nie można - bo można - ale .... ale trzeba mieć DOKŁADNĄ świadomość cyklu życia funkcji i właśnie takie zagadnienia od podstaw oraz wiele innych wyjaśniam w swojej niebieskiej książce. Bez tej wiedzy o takich podstawach - początkujący później właśnie nieświadomie wciąż powielają pewne błędy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 9 gru 2016, o 14:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dejmos]]></name></author>
<updated>2016-12-09T14:10:57+01:00</updated>
<published>2016-12-09T14:10:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176973#p176973</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176973#p176973"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176973#p176973"><![CDATA[
Dziękuję bardzo. Teraz już wiem o co chodzi. Chciałbym się troszeczkę wytłumaczyć. Przyzwyczaiłem się, że zawsze funkcję main mam na samym końcu chociaż posiadanie jej na początku jest dużo lepsze. Przesunięć bitowych się nie boję i używam i nie wiem dlaczego ale przyzwyczaiłem się do makra _BV - po prostu zawsze go używałem to tak na usprawiedliwienie. I tu też się zgodzę, że łatwiej się czyta kod gdy używamy przesunięć. Typy zmiennych - rzeczywiście raz używam uint8_t raz char tutaj ewidentnie jest moja wina. Co do wywoływania funkcji w przerwaniu ... zazwyczaj tego nie robię i zdziwiło mnie że taką masakrę z opóźnieniami robi taka mała funkcja .... muszę o tym doczytać. Dziękuję za zwrócenie na te kwestie uwagi większość wynika z moich przyzwyczajeń część z niewiedzy. Postaram się te złe nawyki u siebie eliminować i doczytać pewne rzeczy. Pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8587">dejmos</a> — 9 gru 2016, o 14:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-12-09T13:42:42+01:00</updated>
<published>2016-12-09T13:42:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176968#p176968</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176968#p176968"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176968#p176968"><![CDATA[
<div class="quotetitle">dejmos napisał(a):</div><div class="quotecontent"><br />Chociaż wg mnie styl pisania dla programisty jest jak jego &quot;odcisk palca&quot;<br /></div><br />Oj masz rację, w 100% masz rację i od razu widać np kto jak źle pisze i nie trzyma się dobrego stylu programowania<br /><br /><div class="quotetitle">dejmos napisał(a):</div><div class="quotecontent"><br />i każdy pisze jak mu jest wygodnie<br /></div><br />Masz rację i NIKT ci tego nie zabroni - rób jak chcesz ... ale ... ale sobie zapamiętaj, że:<br /><br />1. Ja poprzez swoje wszystkie książki i poradniki UCZĘ jak pisać w tzw &quot;dobrym stylu programowania&quot; w języku C (to jest pewien zbiór prostych w sumie zasad, które ułatwiają życie nie tylko gdy pracujemy w zespole ale również nam samym - początkującym szczególnie. I szczególnie gdy po jakimś czasie wracamy do własnego kodu - żeby go szybciej sobie przypomnieć i zrozumieć) ... Ty sobie nawet trudu nie zadałeś żeby poszukać co to jest &quot;dobry styl pisania kodu&quot; albo żeby podpytać i nawet jak widzę tego kompletnie nie rozumiesz a co gorsze nawet nie chcesz się dowiedzieć - nauczyć - trudno twoja sprawa NIKT ci nie zabroni <br /><br />2. To jest forum które pomaga wielu ludziom, w tym początkującym, którzy się uczą a zatem to nie dziwne że wskazuję kody na forum, które są niestety paskudnie napisane pod tym względem <br /><br />3. To jest forum na którym się UCZYMY i kody przeglądają początkujące osoby i muszą wiedzieć co i jak<br /><br />4. U nas na forum jest taka ZASADA - że jak wstawiamy kod to warto go pokazać właśnie żeby był napisany w dobrym stylu - żeby inni mogli szybko zrozumieć w czym rzecz. Ja np, gdy widzę, że ktoś nie stosuje w ogóle zasad dobrego stylu to nawet nie zagłębiam się w kod i nie pomagam ponieważ TU WŁAŚNIE WYCHODZI - widzisz pan - że nie piszesz sam dla siebie - tylko ZADAJESZ pytania innym i jeśli piszesz kod byle jak to nie dziw się, że mało osób w ogóle zainteresuje się twoim problemem - większość osób oczekuje szacunku, tak tak - gdy zadajesz pytanie to mógłbyś postarać się przynajmniej nauczyć się podstaw tego dobrego stylu pisania albo ....<br /><br />albo wykazać chęć nauki - nie zaś pisać bajek o swoich odciskach palców ...<br /><br /><div class="quotetitle">dejmos napisał(a):</div><div class="quotecontent"><br />bo dla kompilatora chyba nie ma różnicy czy ktoś sobie zdefiniuje takie czy inne makra<br /></div><br /><br />żebyś się nie zdziwił czasem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... Nawet nie wiesz ile błędów można uniknąć stosują dobry styl programowania - nie zdajesz sobie z tego sprawy bo NIGDY tego nie robiłeś - więc proszę cię nie dziw się<br /><br /><div class="quotetitle">dejmos napisał(a):</div><div class="quotecontent"><br />Dlatego krytyka za pisanie kodu nie zgodnie z zasadami trochę mnie zdziwiła.<br /></div><br /><br />Nie dziw się - bo to jest PODSTAWA - i przypominam po raz kolejny - nie piszesz sam dla siebie skoro zadajesz pytanie na forum i pokazujesz tak napisany kod a piszesz do tego że:<br /><br /><div class="quotetitle">dejmos napisał(a):</div><div class="quotecontent"><br />Każdy powinien pisać tak jak uważa jeżeli tylko się w tym odnajduje.<br /></div><br />Bo to jest jedna z najgorszych bzdur ...<br /><br />ale UWAGA! na koniec - bo pewnie nawet nie wiesz o czym mówię odnośnie stylu dobrego programowania bo pewnie ani nie masz żadnej mojej książki ani pewnie nie oglądałeś moich poradników - to podam ci kilka przykładów, żebyś nie myślał że styl dobrego pisania kodu oznacza, że chodzi o to że ktoś ZAWSZE napisze od razu sprawdzony i działający KOD - to byłaby bzdura <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />1. to może najmniejszy problem ale na tym forum nie używamy kocich makr _BV() więc zamiast pisać<br /><br />[syntax=c]_BV(PA7)[/syntax]<br /><br />pisz np:<br /><br />[syntax=c](1&lt;&lt;PA7)[/syntax]<br /><br />nie bój się przesunięć bitowych <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... ale ok to pikuś<br /><br />--------------------------<br /><br />2. NA POCZĄTKU kodu piszemy ZAWSZE ciało funkcji main() a dopiero dalej pod nią definicje innych funkcji. Za to na górze nad main() piszemy tylko deklaracje (nagłówki) tych funkcji poniżej main() - chodzi o to żeby ZAWSZE SZYBKO i najłatwiej było znaleźć GŁÓWNĄ funkcję programu - jego miejsce STARTOWE zamiast się przedzierać w kodzie przez szereg funkcji i to jeszcze bez BEZ ŻADNYCH KOMENTARZY jak u ciebie<br /><br />-----------------------------------<br /><br />3. piszemy komentarze w kodzie to PODSTAWA - PODSTAW - chociażby minimalne ale kod bez komentarzy jest kodem od razu do śmietnika <br /><br />---------------------------------<br /><br />4. Jeśli piszesz kod w języku AVR GCC to stosuj typy przewidziane w tym języku a zatem uint16_t a nie unsigned int<br /><br />-------------------------------------------------<br /><br />5. Widać że nie znasz też do końca jeszcze podstaw C dlatego polecałem ci książkę ... a z tego wynika kolejny babol który robisz czyli<br /><br /><div class="quotetitle">dejmos napisał(a):</div><div class="quotecontent"><br />volatile unsigned int opoznienie_1ms<strong><span style="color: #FF0000">=0</span></strong>;<br /></div><br /><br />po co inicjalizujesz ZEREM zmienne globalne ? jeśli wiadomo ze standardu języka C że one są inicjalizowane ZEREM domyślnie ? a więc kolejne zamieszanie w twoim kodzie<br /><br />--------------------------<br /><br />6. nazwy MAKR w C pisz DUŻYMI literami - bo lepiej później odróżniają się w kodzie pomiędzy nazwami różnych funkcji i zmiennych, które warto z kolei pisać małymi literami. Albo tzw stylem wielbłądzim - jeśli wiesz co to jest a jeśli nie - to zajrzyj do wikipedii co to jest styl wielbłądzi i dlaczego się go stosuje do nazw. Ty natomiast robisz jeszcze gorzej bo jedne makra piszesz małymi literami a inne dużymi a więc już w ogóle wprowadzasz totalny MISZ-MASZ<br /><br /><br />-------------------------------<br /><br />7. gdy piszesz funkcję bez argumentów stosuj dla porządku void czyli np<br /><br />[syntax=c]void funkcja( void ) {[/syntax]<br /><br />i robisz tak nawet w swojej funkcji main( void ) w kodzie ale już dalej znowu niekonsekwencja bo w pozostałych nie ma tego void w miejscu argumentów<br /><br /><br />-----------------------------------------------<br /><br />8. stosuj przerwy chociaż JEDNĄ kurczę linię pomiędzy sekcjami programu a już szczególnie pomiędzy definicjami funkcji a nie wszystko ciurkiem się ciągnie jak rozgotowany makaron<br /><br />-------------------------------------------<br /><br />9. kompletnie nie zwracasz uwagi na ważne w sumie szczegóły np:<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />#include&lt;avr<strong><span style="color: #FF0000">\</span></strong>io.h&gt;                                                                                                                                     <br />#include &lt;avr<strong><span style="color: #FF0000">/</span></strong>interrupt.h&gt;<br /></div><br />mów sobie co chcesz ale to to już jest MASAKRA ... i co więcej nawet jakby ktoś z forum chciał szybko skopiować i wkleić do siebie twój kod żeby coś sprawdzić to to może raz działać a raz nie działać. A i tobie po roku czy dwóch np gdy weźmiesz inny kompilator to nagle to przestanie działać i co ?  Nie dość że różne ukośniki to jeszcze tu spacja, tam bez spacji ... całość wtedy wygląda TRAGICZNIE ... no tragicznie<br /><br />-------------------------<br /><br />10. UNIKAJ JAK OGNIA wywoływania funkcji z procedur obsługi przerwań bo sobie sam robisz masakrę amerykańską piłą tarczową na przyszłość - czy wiesz jaki to ma wpływ na stos czy nie za bardzo się orientujesz ? .... Być może nie orientujesz się w ogóle jak wygląda cykl życia funkcji - i wtedy może to doprowadzać do tragicznych baboli w kodzie w przyszłości ....<br /><br />----------------------<br /><br />11. nie stosuj takich zapisów<br /><br />[syntax=c]PORTC |= (1&lt;&lt;6)[/syntax]<br /><br />tylko takie żeby było jaśniej<br /><br />[syntax=c]PORTC |= (1&lt;&lt;PC6)[/syntax]<br /><br />---<br /><br /><br />mógłbym tak jeszcze dalej pisać o twoim kodzie ale myślę, że tych kilka przykładów być może natchnie cię do tego żebyś w końcu zastanowił się co to znaczy styl dobrego pisania kodu i że warto się go uczyć chłopie <br /><br />na koniec żeby nie być gołosłownym - i żeby ci pokazać, że ja nie krytykuję - bo krytykiem nie jestem - tylko zwracam uwagę na WAŻNE aspekty uczenia się programowania, że nie mam zamiaru ci dogryzać albo przygadywać - to poświęcę się i proszę pokażę ci jak powinien wyglądać ten twój kod z pierwszego postu (NIE WAŻNE CZY ŹLE DZIAŁA CZY DOBRZE!!!) ważne żebyś sobie porównał i chociaż spróbował zrozumieć o czym mówię i na co ci zwracam uwagę - czego warto się uczyć - zamiast dziwić i focha strzelać<br /><br />troszkę dla przykładu dodałem komentarzy ale ty ZOBACZ JAK POPRAWIŁEM inicjalizację timera i jak podzieliłem kod<br /><br />[syntax=c]#include &lt;avr/io.h&gt;                                                                                                                                     <br />#include &lt;avr/interrupt.h&gt;<br /> <br />//--------- makra<br />#define WCISNIETY_PROGRAMUJ ((przyciski_old ^ przyciski) &amp; (1&lt;&lt;PA7)) &amp;&amp; (przyciski &amp; (1&lt;&lt;PA7))==0<br />#define LED_POPRAWNY_ON         PORTC |= (1&lt;&lt;6)<br />#define LED_POPRAWNY_OFF PORTC &amp;= ~(1&lt;&lt;6)   <br /><br />//--------- zmienne globalne<br />volatile uint16_t opoznienie_1ms;<br /><br />//--------- deklaracje funkcji<br />void Timer0_start( void );<br />void Obsluga_przyciskow( void );<br /><br /><br />//*********** GŁÓWNA FUNKCJA PROGRAMU ************************************ <br />int main(void)<br />{<br />//----- inicjalizacja<br />        PortsInit();<br />        Timer0_start();<br />        <br />        sei();// globalne zezwolenie na przerwania<br />        <br />        while(1)// główna pętla programu<br />       {<br />                if(wcisniety_programuj)<br />                {<br />                        LED_POPRAWNY_ON;<br />                        opoznienie_1ms=0;<br />                        while(opoznienie_1ms&lt;=500); //opóźnienie 500ms<br />                        LED_POPRAWNY_OFF;<br />                }<br />         }<br />}<br /><br /><br />//*********** inicjalizacja timera0<br />void Timer0_start( void )<br />{<br />        TCCR0 |= (1&lt;&lt;WGM01);       // tryb CTC<br />        TCCR0 |= (1&lt;&lt;CS01) | (1&lt;&lt;CS00);    // tryb CTC preskaler 64<br />        OCR0 = 124;                                                    <br />        TIMSK |= (1&lt;&lt;OCIE0);   // zezwolenie na przerwanie CTC<br />}<br /><br />//*********** obsługa przycisków<br />void Obsluga_przyciskow( void )<br />{<br />        static uint8_t Licznik&#91;2&#93;;<br />        uint8_t k=PINA;<br />        <br />        if(Licznik&#91;0&#93;==0)<br />        {<br />                if(((k^przyciski) &amp; (1&lt;&lt;PA6)) &amp;&amp; ((k &amp;(1&lt;&lt;PA6))==1)) Licznik&#91;0&#93;=100;<br />                przyciski&amp;=~(1&lt;&lt;PA6);<br />                przyciski |=(k &amp; (1&lt;&lt;PA6));<br />        }<br />        else Licznik&#91;0&#93;--;<br />        <br />        if(Licznik&#91;1&#93;==0)<br />        {<br />                if(((k^przyciski) &amp; (1&lt;&lt;PA7)) &amp;&amp; ((k &amp;(1&lt;&lt;PA7))==1)) Licznik&#91;1&#93;=100;<br />                przyciski&amp;=~(1&lt;&lt;PA7);<br />                przyciski |=(k &amp; (1&lt;&lt;PA7));<br />        }<br />        else Licznik&#91;0&#93;--;<br /> <br />}<br /><br /><br />//*********** obsługa przerwania Timer0<br />ISR(TIMER0_COMP_vect)<br />{<br />        opoznienie_1ms++;<br />        Obsluga_przyciskow();<br />}[/syntax]<br /><br />i jak mi powiesz, że to nie jest po 1000-kroć czytelniejsze od tego co ty pokazałeś - to .... to szkoda gadać<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 9 gru 2016, o 13:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dejmos]]></name></author>
<updated>2016-12-09T12:42:11+01:00</updated>
<published>2016-12-09T12:42:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176965#p176965</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176965#p176965"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176965#p176965"><![CDATA[
Dziękuję za odpowiedź. Ja wiem o tym, że tak opóźnień się nie daje <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> to jest tylko testowy program który miał mi posłużyć do sprawdzenia timera (generowanie przebiegu prostokątnego) i umieszczenia go tutaj na forum w celu zobrazowania problemu zaś cały program ma ponad 1500 linii i kilkanaście flag ustawianych w 5 różnych przerwaniach. Zdziwiło mnie to, że wrzucenie do przerwania wywołania funkcji obsługujące dwa przyciski tak bardzo zaburza jego pracę, że co jakiś czas funkcja generująca opóźnienie 500ms generuje opóźnienie około 250ms. Konkretnej odpowiedzi nie uzyskałem zaś zostałem skrytykowany za jakość pisanego kodu. Chociaż wg mnie styl pisania dla programisty jest jak jego &quot;odcisk palca&quot; i każdy pisze jak mu jest wygodnie bo dla kompilatora chyba nie ma różnicy czy ktoś sobie zdefiniuje takie czy inne makra, czy da nawias w tej samej linijce co pętla czy też pod nią, czy zastosuje wcięcia czy też nie. Każdy powinien pisać tak jak uważa jeżeli tylko się w tym odnajduje. Dlatego krytyka za pisanie kodu nie zgodnie z zasadami trochę mnie zdziwiła.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8587">dejmos</a> — 9 gru 2016, o 12:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jaca_76]]></name></author>
<updated>2016-12-09T11:48:32+01:00</updated>
<published>2016-12-09T11:48:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176961#p176961</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176961#p176961"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176961#p176961"><![CDATA[
Chociażby w niewłaściwy sposób używasz timerów, równie dobrze mógłbyś dać tam delay.<br />A używanie w ten sposób w jaki jest zaprezentowane powyżej uniemożliwi Ci multipleksowanie.<br />[syntax=c]while(opoznienie_1ms&lt;=500); //opóźnienie 500ms[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2479">jaca_76</a> — 9 gru 2016, o 11:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dejmos]]></name></author>
<updated>2016-12-08T07:44:26+01:00</updated>
<published>2016-12-08T07:44:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176859#p176859</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176859#p176859"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176859#p176859"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />widzę tylko w jaki sposób pisany jest kod<br /></div><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />który również nie jest pisany zgodnie z zasadami dobrego pisania kodu<br /></div><br />Dziękuję za odpowiedz. Mam nadzieję, że nie nadużywam cierpliwości Pana, ale chciałbym żeby mi Pan podpowiedział w którym miejscu coś jest napisanie nie w taki sposób jak powinno? Z góry dziękuję za odpowiedź.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8587">dejmos</a> — 8 gru 2016, o 07:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq5rix]]></name></author>
<updated>2016-12-07T20:20:46+01:00</updated>
<published>2016-12-07T20:20:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176811#p176811</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176811#p176811"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176811#p176811"><![CDATA[
W przerwaniu można ustawić np. zmienna volatile którą będzie odczytywać np. co sekundę albo i rzadziej funkcja obsługująca wyświetlacz. Ważne, żeby ta funkcja była nie za często wywoływana, bo LCD lubią blokować i jest z tego katastrofa.... I nie naraz trzy, tylko po kolei, np. co sekundę kolejny LCD. <br />W ten sposób będzie wilk syty i owca cała, czyli wyświetli się coś i przerwanie nie zablokuje procesora.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5966">sq5rix</a> — 7 gru 2016, o 20:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-12-07T16:01:42+01:00</updated>
<published>2016-12-07T16:01:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176781#p176781</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176781#p176781"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176781#p176781"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Dziękuję za krytykę.<br /></div><br />Nie zrozum mnie źle, ja nie krytykuję - widzę tylko w jaki sposób pisany jest kod i tu mi w ogóle nie chodzi o niespójność ... ale jak mówię, to była tylko luźna propozycja. Ja natomiast nie mam na tyle czasu aby analizować kod na forum, który również nie jest pisany zgodnie z zasadami dobrego pisania kodu. Ale może ktoś inny będzie miał czas i ochotę się nad tym pochylić, ja podpowiedziałem na szybko to co mogłem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 7 gru 2016, o 16:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dejmos]]></name></author>
<updated>2016-12-07T14:58:47+01:00</updated>
<published>2016-12-07T14:58:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176776#p176776</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176776#p176776"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176776#p176776"><![CDATA[
Dziękuję za krytykę. Chodzi o to, że to co przedstawiłem jest wyrywkiem dużo większej całości więc może dlatego jest takie niespójne. Nigdy nie używałem ATOMIC_BLOCK więc dlatego pytam czy o to chodziło. Co do multipleksowania to myślę, że orientuję się w temacie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8587">dejmos</a> — 7 gru 2016, o 14:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-12-07T14:23:19+01:00</updated>
<published>2016-12-07T14:23:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176771#p176771</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176771#p176771"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176771#p176771"><![CDATA[
Na prawdę - patrząc na to jak kolega pisze kod, na problemy z multipleksowaniem itp - polecam książkę:<br /><br /><!-- m --><a class="postlink" href="http://atnel.pl/mikrokontrolery-avr-jezyk-c.html" >http://atnel.pl/mikrokontrolery-avr-jezyk-c.html</a><!-- m --><br /><br />Myślę, że bardzo dużo może ona wnieść do nauki programowania w C<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 7 gru 2016, o 14:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dejmos]]></name></author>
<updated>2016-12-07T13:44:30+01:00</updated>
<published>2016-12-07T13:44:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176769#p176769</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176769#p176769"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176769#p176769"><![CDATA[
Dziękuję za szybką odpowiedź. Mam nadzieję, że o to chodzi <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Bo pomogło. <br /><br />[syntax=c]ATOMIC_BLOCK(ATOMIC_FORCEON)<br />{<br />opoznienie_1ms=0;<br />TCNT0=0;<br />}<br />while(opoznienie_1ms&lt;=500);[/syntax]<br /><br />Chciałem jeszcze dołożyć wywołanie obsługi 3 wyświetlaczy 7-seg w tym przerwaniu ale wtedy już nawet ATOMIC_BLOCK nie pomaga.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8587">dejmos</a> — 7 gru 2016, o 13:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-12-07T13:11:30+01:00</updated>
<published>2016-12-07T13:11:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176766#p176766</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176766#p176766"/>
<title type="html"><![CDATA[Re: Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176766#p176766"><![CDATA[
<div class="quotetitle">dejmos napisał(a):</div><div class="quotecontent"><br />chodzi o to, że timer0 w trybie CTC nie zawsze działa dobrze<br /></div><br />Timer na 100% działa dobrze, za to kolega źle napisał program i tak należy do tego podejść. Ciężko mi analizować tak napisany kod, ale tylko na pierwszy rzut oka rzuca się właśnie brak ATOMIC_BLOCK<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 7 gru 2016, o 13:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dejmos]]></name></author>
<updated>2016-12-07T13:00:46+01:00</updated>
<published>2016-12-07T13:00:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176764#p176764</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176764#p176764"/>
<title type="html"><![CDATA[Atmega32, tryb CTC - nie zawsze właściwy czas opóźnienia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17003&amp;p=176764#p176764"><![CDATA[
Witam. Próbuję napisać program na atmega32 - co ma robić program to na razie nie jest istotne - chodzi o to, że timer0 w trybie CTC nie zawsze działa dobrze.<br />[syntax=c]#include&lt;avr\io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define wcisniety_programuj ((przyciski_old ^ przyciski) &amp; _BV(PA7)) &amp;&amp; (przyciski &amp; _BV(PA7))==0<br />#define LED_POPRAWNY_ON PORTC |= _BV(6)<br />#define LED_POPRAWNY_OFF PORTC &amp;= ~_BV(6)<br />volatile unsigned int opoznienie_1ms=0;<br />void Timer0_start()<br />{<br />TCCR0 |= _BV(WGM01) | _BV(CS01) | _BV(CS00);//tryb CTC preskaler 64<br />OCR0 = 124; <br />TIMSK |= _BV(OCIE0);<br />}<br />void Obsluga_przyciskow()<br />{<br />static uint8_t Licznik&#91;2&#93;;<br />uint8_t k=PINA;<br />if(Licznik&#91;0&#93;==0)<br />{<br />if(((k^przyciski) &amp; _BV(PA6)) &amp;&amp; ((k &amp;_BV(PA6))==1)) Licznik&#91;0&#93;=100;<br />przyciski&amp;=~_BV(PA6);<br />przyciski |=(k &amp; _BV(PA6));<br />}<br />else Licznik&#91;0&#93;--;<br />if(Licznik&#91;1&#93;==0)<br />{<br />if(((k^przyciski) &amp; _BV(PA7)) &amp;&amp; ((k &amp;_BV(PA7))==1)) Licznik&#91;1&#93;=100;<br />przyciski&amp;=~_BV(PA7);<br />przyciski |=(k &amp; _BV(PA7));<br />}<br />else Licznik&#91;0&#93;--;<br /><br />}<br />ISR(TIMER0_COMP_vect)<br />{<br />opoznienie_1ms++;<br />        Obsluga_przyciskow();<br />}<br /><br />int main(void)<br />{<br />PortsInit();<br />Timer0_start();<br />sei();<br />        while(1)<br />       {<br />if(wcisniety_programuj)<br />{<br />LED_POPRAWNY_ON;<br />opoznienie_1ms=0;<br />            while(opoznienie_1ms&lt;=500); //opóźnienie 500ms<br />            LED_POPRAWNY_OFF;<br />}<br />         }<br />}[/syntax]<br /><br />Mianowicie while(opoznienie_1ms&lt;=500); co któreś naciśnięcie przycisku generuje opóźnienie 250ms zamiast 500ms (pomiar przeprowadzony na oscyloskopie).<br />Co może być nie tak? Według mnie powinno być wszystko ok.<br />Z góry dziękuję za pomoc<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8587">dejmos</a> — 7 gru 2016, o 13:00</p><hr />
]]></content>
</entry>
</feed>