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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-07-17T12:37:10+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=18797&amp;mode</id>
<entry>
<author><name><![CDATA[Paplo]]></name></author>
<updated>2017-07-17T12:37:10+01:00</updated>
<published>2017-07-17T12:37:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18797&amp;p=192227#p192227</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18797&amp;p=192227#p192227"/>
<title type="html"><![CDATA[Re: Liczenie czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18797&amp;p=192227#p192227"><![CDATA[
Dziękuję za zainteresowanie i przepraszam, że tak późno odpisuję, lecz nie było mnie w domu.<br /><br /><div class="quotetitle">xentis napisał(a):</div><div class="quotecontent"><br />Zacznę może od błędu który po wklejeniu twojego kodu do eclips powodują błąd, a mianowicie skąd Ci się wzięły zmienne cyf1 ... cyf4? Przecież w bibliotece zmienne dla poszczególnych wyświetlaczy noszą nazwy cy1 ... cy4.<br /></div><br /><br />Rzeczywiście, zapomniałem dodać, że zmieniłem u siebie nazwy tych zmiennych w bibliotece.<br /><br />Jeżeli chodzi o dwucyfrową liczbę, to jest to tylko indeks tablicy, pod którym jest zapisane zero z kropką. W przerwaniu, na podstawie tego indeksu, jest przekazywana do portu odpowiednia wartość, tak aby wyświetlił się pożądany znak.<br /><br /><div class="quotetitle">xentis napisał(a):</div><div class="quotecontent"><br />Zauważ że w momencie gdy start_counting zostanie ustawiony na 1 zmienna delay3s pozostaje już niezmieniona i o wartości 600 czyli tyle ile w warunku if, czyli od tego momentu warunek będzie ZAWSZE spełniony. Wystarczy we wnętrzu warunku dodać delay3s=0; i problem zniknie.<br /></div><br /><br />Faktycznie nie pomyślałem o tym, że delay3s będzie miał cały czas wartość 600 i będzie warunek będzie stale spełniony. Po wyzerowaniu tej zmiennej program działa tak jak powinien.<br /><br />Jeszcze raz dzięki za pomoc <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=7529">Paplo</a> — 17 lip 2017, o 12:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2017-07-14T08:34:27+01:00</updated>
<published>2017-07-14T08:34:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18797&amp;p=192095#p192095</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18797&amp;p=192095#p192095"/>
<title type="html"><![CDATA[Re: Liczenie czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18797&amp;p=192095#p192095"><![CDATA[
Zacznę może od błędu który po wklejeniu twojego kodu do eclips powodują błąd, a mianowicie skąd Ci się wzięły zmienne cyf1 ... cyf4? Przecież w bibliotece zmienne dla poszczególnych wyświetlaczy noszą nazwy cy1 ... cy4.<br /><br /><div class="quotetitle">Paplo napisał(a):</div><div class="quotecontent"><br />[syntax=c]//<br />    if (delay3s == 600) {<br />       cyf1 = 29;              //0.<br />       cyf2 = 0;               //0<br />       cyf3 = 29;              //0.<br />       cyf4 = 0;               //0<br />       start_counting = 1;             <br />    }[/syntax]<br /></div><br /><br />Druga kwestia to w tych zmiennych powinno się umieszczać pojedyncze cyfry a nie liczby dwucyfrowe, w takiej konwencji będą pojawiać się krzaki na wyświetlaczach. Jak chcesz na wyświetlacze wysyłać po prostu liczby to wykorzystaj kod który w ćwiczeniu mieli się w głównej pętli programu - zapakuj go w funkcję i liczby przekazuj poprzez tę funkcję.<br /><br />A teraz sedno sprawy czyli dla czego nie zmienia się cyfra na czwartym wyświetlaczu. A tu Cię pewnie zaskoczę ale się zmienia, ale nie ma szans się wyświetlić, bo warunek if który wyżej już zacytowałem nie jest blokowany po odblokowaniu start_counting i on cięgle z częstotliwością wykonywania głównej pętli programu ustawia same zera(czy tam krzaki bo we wklejonym kodzie do dwóch cyfr pakujesz liczby 29). Zauważ że w momencie gdy start_counting zostanie ustawiony na 1 zmienna delay3s pozostaje już niezmieniona i o wartości 600 czyli tyle ile w warunku if, czyli od tego momentu warunek będzie ZAWSZE spełniony. Wystarczy we wnętrzu warunku dodać delay3s=0; i problem zniknie.<br /><br />[syntax=c]//<br />    if (delay3s == 600) {<br />cy1 = 0;               //0.<br />cy2 = 0;               //0<br />cy3 = 0;               //0.<br />cy4 = 0;               //0<br />start_counting = 1;<br />delay3s = 0;<br />    }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 14 lip 2017, o 08:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Paplo]]></name></author>
<updated>2017-07-13T13:14:05+01:00</updated>
<published>2017-07-13T13:14:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18797&amp;p=192048#p192048</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18797&amp;p=192048#p192048"/>
<title type="html"><![CDATA[Liczenie czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18797&amp;p=192048#p192048"><![CDATA[
Cześć  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br />Po dwóch latach przerwy wracam do programowania (w zasadzie można powiedzieć, że zaczynam od nowa), a zmotywował mnie fakt, iż na uczelni miałem zajęcia z programowania mikroprocesorów (80515 w assemblerze).<br />Postanowiłem, że odtworzę program pisany na zajęciach. Jego założenia:<br /> - po uruchomieniu, na wyświetlaczu LED ma się pokazać data urodzenia,<br /> - po 3 sekundach na wyświetlaczu mają się pojawić zera i  ma uruchomić się odliczanie czasu od 0 do 9:59:9.<br /><br />Zrealizowałem to przy pomocy dwóch zmiennych pomocniczych (delay3s, counter) w roli liczników, które inkrementowane są w przerwaniu (zależnie od stanu flagi start_counting). W pętli głównej sprawdzam wartość licznika delay3s (który odlicza 3 sekundową przerwę), jeśli odliczy odpowiednią wartość, to na wyświetlaczu LED pojawiają się zera. Zmieniam również stan flagi start_counting, która powoduje zatrzymanie inkrementowania zmiennej delay3s, a uruchamia inkrementowanie zmiennej counter. Drugi if w pętli głównej sprawdza stan zmiennej counter. Jeśli if się wykona (tj. counter będzie miał pożądaną wartość), to zwiększam zmienną set i przekazuje ją do zmiennej cyf4, co ma spowodować wyświetlanie się odpowiadającej cyfry na wyświetlaczu LED. <br /><br />I tutaj przechodzimy do sedna problemu. Testowo, spróbowałem wpisać w drugim ifie na sztywno do zmiennej cyf4, wartość liczby 6 i okazało się, że po trzech sekundach ta 6 nie pokazuje się na wyświetlaczu, ale nadal jest zero. Dodałem wtedy w drugim ifie sterowanie diodą led, aby zobaczyć czy zmienna counter prawidłowo się zlicza. Okazało się, że dioda LED miga co sekundę (dla testów 1 setna sekundy trwa sekundę), ale na wyświetlaczu nadal jest zero.<br /><br />Nie mam pojęcia dlaczego sterowanie diodą działa, a ustawienie wartości na wyświetlaczu LED już nie.<br /><br />Przerwanie wykonuje się co 5ms.<br /><br />Poniżej program główny:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;//plik nagl. do obsl. przerwan<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;d_led.h&quot;<br /><br />uint8_t set;<br />uint8_t sek;<br />uint8_t min;<br /><br /><br />int main(void){<br /><br />//ustawienia portu i pinu dla diody debug<br />DEBUG_LED_DIR |= DEBUG_LED;<br />DEBUG_LED_PORT |= DEBUG_LED;<br /><br />d_led_init();<br /><br />cyf1 = 0;//0<br />cyf2 = 31;//2.<br />cyf3 = 0;//0<br />cyf4 = 37;//8.<br /><br />start_counting = 0;//flaga odliczania<br /><br />sei();<br /><br />while(1){<br /><br />if (delay3s == 600) {<br />cyf1 = 29;//0.<br />cyf2 = 0;//0<br />cyf3 = 29;//0.<br />cyf4 = 0;//0<br />start_counting = 1;<br />};<br /><br />if (counter == 200){<br />cyf4 = 6;<br />DEBUG_LED_TOG;//dioda debug<br /><br />counter = 0;<br />}<br /><br /><br /><br /><br />}<br /><br />}[/syntax]<br /><br />W procedurze obsługi przerwania dodałem warunki(plik d_led.c z multipleksowania LED z  BB):<br />[syntax=c]if (!start_counting) delay3s++;<br />if (start_counting) counter++;[/syntax]<br /><br />Zmienne w d_led.c<br />[syntax=c]volatile uint8_t counter;<br />volatile uint16_t delay3s;<br />volatile uint8_t start_counting;[/syntax]<br /><br />A w pliku d_led.h dodałem:<br />[syntax=c]#define DEBUG_LED_PORT PORTD<br />#define DEBUG_LED_DIR DDRD<br />#define DEBUG_LED (1&lt;&lt;PD7)<br /><br />#define DEBUG_LED_ON DEBUG_LED_PORT &amp;=~ DEBUG_LED<br />#define DEBUG_LED_OFF DEBUG_LED_PORT |= DEBUG_LED<br />#define DEBUG_LED_TOG DEBUG_LED_PORT ^= DEBUG_LED<br /><br />extern volatile uint8_t counter;<br />extern volatile uint16_t delay3s;<br />extern volatile uint8_t start_counting;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7529">Paplo</a> — 13 lip 2017, o 13:14</p><hr />
]]></content>
</entry>
</feed>