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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-04-24T16:56:42+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=6868&amp;mode</id>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-04-24T16:56:42+01:00</updated>
<published>2014-04-24T16:56:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6868&amp;p=79070#p79070</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6868&amp;p=79070#p79070"/>
<title type="html"><![CDATA[Re: [ATmega328p] Przerwanie timera1 - brak zmiany daty]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6868&amp;p=79070#p79070"><![CDATA[
<div class="quotetitle">DuMAM napisał(a):</div><div class="quotecontent"><br />Sprawdzanie flag jest jak najbardziej poprawne (nawet w książce tak było robione)<br /></div><br />A w którym miejscu książki jest tak robione? Bo szukam i nie mogę znaleźć.<br /><br />Jak na moje to masz błędne sprawdzanie flag. Jeśli będziesz miał ustawioną flagę minut, godzin i dni czyli clock_flag będzie miała wartość 0b00000111. I teraz w pierwszym warunku if robisz coś takiego<br />[syntax=c]clock_flag &amp;=(DT_MIN | DT_HOUR)[/syntax] czyli [syntax=c]clock_flag = clock_flag &amp; (DT_MIN | DT_HOUR)[/syntax]<br />clock_flag - 0b00000111<br />(DT_MIN | DT_HOUR) - 0b00000011<br /><br />Sprawdź co będziesz miał w zmiennej clock_flag po takiej operacji 0b00000111 &amp; 0b00000011<br /><br />Flaga dni niechcący zostanie wyzerowana<br /><br />Aby to potwierdzić napisałem króciutki programik, który na lcd wyświetla sekundy, minuty, godziny i dni. Jeśli sprawdzałem flagi ifami w zaremowanych liniach to wyświetlało mi tylko sekundy, minuty i godziny. Po zmianie warunków sprawdzania flag zaczęło wyświetlać mi wszystkie zmienne.<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br /><br />#define DT_MIN  1<br />#define DT_HOUR 2<br />#define DT_DAY  4<br />#define DT_MONT 8<br />#define DT_YEAR 16<br />#define DT_DOT  32<br /><br />typedef struct {<br />        volatile uint8_t godz;<br />        volatile uint8_t min;<br />        volatile uint8_t sek;<br />        volatile uint8_t dzien;<br />        volatile uint8_t miesiac;<br />        volatile uint8_t rok;<br />} t_dt;<br /><br />typedef union {<br />        volatile uint8_t idx&#91;6&#93;;<br />        volatile t_dt data_czas;<br />} t_datetime;<br /><br />t_datetime zegarek;<br /><br />volatile uint8_t clock_flag=0;<br /><br />int main(void)<br />{<br />lcd_init();<br />DDRA |=(1&lt;&lt;PA7);<br />PORTA |=(1&lt;&lt;PA7);<br />lcd_str(&quot;Start&quot;);<br /><br />TCCR1B |=(1&lt;&lt;WGM12);<br />TCCR1B |= (1 &lt;&lt; CS12) | (1 &lt;&lt; CS10);<br />OCR1A = 15624;<br />TIMSK |= (1 &lt;&lt; OCIE1A);<br /><br />sei();<br /><br />zegarek.data_czas.godz=23;<br /><br />while(1)<br />{<br /> lcd_locate(1,0);<br />lcd_int(zegarek.data_czas.sek);<br />lcd_str(&quot; &quot;);<br /><br />// if(clock_flag &amp;=(DT_MIN | DT_HOUR))<br />    if( (clock_flag &amp; DT_MIN)  || (clock_flag &amp; DT_HOUR) )<br /><br /> {<br /> clock_flag &amp;=~(DT_MIN | DT_HOUR);<br /> lcd_locate(1,3);<br /> lcd_int(zegarek.data_czas.min);<br /> lcd_str(&quot; &quot;);<br /><br /> lcd_locate(1,6);<br /> lcd_int(zegarek.data_czas.godz);<br /> lcd_str(&quot; &quot;);<br /> }<br /><br />// if(clock_flag &amp;=(DT_DAY | DT_MONT | DT_YEAR)){<br /> if( (clock_flag &amp; DT_DAY) | (clock_flag &amp; DT_MONT) | (clock_flag &amp; DT_YEAR)){<br /> clock_flag &amp;=~(DT_DAY | DT_MONT | DT_YEAR);<br /> lcd_locate(1,9);<br /> lcd_int(zegarek.data_czas.dzien);<br /> lcd_str(&quot; &quot;);<br /> }<br />}<br />}<br /><br />ISR(TIMER1_COMPA_vect){<br />        zegarek.data_czas.sek++;<br />        //if(zegarek.data_czas.sek%5==0)<br />        //      clock_set_flag(DT_DOT);<br />        if(zegarek.data_czas.sek==60){                                          // ODLICZENIE 60 SEK I USTAWIENIE FLAGI<br />                zegarek.data_czas.sek=0;                                                // INFORMUJACEJ O KONIECZNOSCI AKTUALIZACJI<br />                clock_flag |= DT_MIN;                                   // WYSWIETLACZA<br />                zegarek.data_czas.min++;<br />        }<br />        if(zegarek.data_czas.min==60){                                          // ODLICZENIE 60 MIN I USTAWIENIE FLAGI<br />                zegarek.data_czas.min=0;                                                // INFORMUJACEJ O KONIECZNOSCI AKTUALIZACJI<br />                clock_flag |= DT_HOUR;                          // WYSWIETLACZA<br />                zegarek.data_czas.godz++;<br />        }<br />        if(zegarek.data_czas.godz==24){<br />                clock_flag |= DT_DAY;<br />                zegarek.data_czas.godz=0;<br />                zegarek.data_czas.dzien++;<br />        }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 24 kwi 2014, o 16:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-04-24T14:24:11+01:00</updated>
<published>2014-04-24T14:24:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6868&amp;p=79055#p79055</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6868&amp;p=79055#p79055"/>
<title type="html"><![CDATA[Re: [ATmega328p] Przerwanie timera1 - brak zmiany daty]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6868&amp;p=79055#p79055"><![CDATA[
Pierwsze co mi się rzuciło w oczy to ta linia w pliku .h[syntax=c]static uint8_t clock_flag=0;[/syntax]<br />W plikach .h nie umieszcza się definicji zmiennych. Poza tym ta zmienna chyba powinna być volatile.<br /><br />Wg mnie to poprawnie powinno być tak<br />plik .h deklaracja zmiennej[syntax=c]extern volatile uint8_t clock_flag;[/syntax]Extern bo zmienna używana jest na &quot;zewnątrz&quot;.<br /><br />plik .c definicja zmiennej[syntax=c]volatile uint8_t clock_flag=0;[/syntax]<br /><br />No i sprawdzanie flag. Nie sprawdzałem jak to będzie działać[syntax=c]if(clock_flag &amp;=(DT_MIN | DT_HOUR))[/syntax]ale ja bym to zapisał tak[syntax=c]if( (clock_flag &amp; DT_MIN)  || (clock_flag &amp; DT_HOUR) )[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 24 kwi 2014, o 14:24</p><hr />
]]></content>
</entry>
</feed>