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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-08-13T12:14:08+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=22487&amp;mode</id>
<entry>
<author><name><![CDATA[JarekK]]></name></author>
<updated>2019-08-13T12:14:08+01:00</updated>
<published>2019-08-13T12:14:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221230#p221230</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221230#p221230"/>
<title type="html"><![CDATA[Re: Odliczanie czasu działania programu ATMEGA8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221230#p221230"><![CDATA[
&quot;... timer ma wyłączać ledy po to, gdyby np. ledy same się zapaliły przez błąd czujki&quot;.<br />Podane przykłady jak stosować timer nie rozwiązują jeszcze powyższego założenia.<br />Jeżeli jest błąd czujki to należy doprowadzić do wyłączenia sterownika, tak by nie reagował w ogóle na czujkę a wręcz sygnalizował stan awarii, który wymaga ręcznego resetu przez autora sterownika lub naprawy czujki.<br />Czyli np. po przekroczeniu krytycznego czasu podawania ciągłego sygnału przez czujki następuje wyłączenie wszystkich LED od oświetlenia schodów oraz blokowany jest port lub piny przychodzącego sygnału od czujki i ewentualnie zapalenie jakiejś dodatkowej diody LED sygnalizującej stan awarii.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=224">JarekK</a> — 13 sie 2019, o 12:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Alef2]]></name></author>
<updated>2019-08-13T11:49:51+01:00</updated>
<published>2019-08-13T11:49:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221227#p221227</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221227#p221227"/>
<title type="html"><![CDATA[Re: Odliczanie czasu działania programu ATMEGA8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221227#p221227"><![CDATA[
Musisz uruchomić jakiś timer. Proponuję TIMER0, bo jest najprostszy.<br />Aby to zrobic należy:<br />dodać plik nagłówkowy interrupt.h (#include &lt;avr/interrupt.h&gt;)<br />uruchomic timer[syntax=c]TIMSK |= (1&lt;&lt;TOIE0);<br />TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);        <br />sei();/[/syntax]<br />dodać obsługę przerwania timera, np. taką[syntax=c]ISR(TIMER0_OVF_vect)<br />{<br />static uint8_t tick=0;<br />  tick++;     <br />  if(tick&gt;122)  <br />  {<br />    //tu gaszenie led<br />    tick=0;    <br />  }[/syntax]<br />wartość 122 w if() jest &quot;z rękawa&quot;. Nie wiem z jaka częstotliwością pracuje u Ciebie Atmega. Dla 8MHz przerwanie be4dzie wykonywać się z częstotliwością<br />8000000/(1024*256)=30,5Hz, a if wykona sie co ok 4s. Uzyskanie dłuższych czasów nie powinno być już dla Ciebie problemem.<br />Przerwanie odliczania czasu też nie powinno sprawić kłopotu. Można wyzerować zmienną tick.<br />I jeszcze mała uwaga. warto sekwencje zapalania i gaszenia led umi4eścić w odpowiednich funkcjach,. wtedy analiza kodu będzie znacznie prostsza.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14998">Alef2</a> — 13 sie 2019, o 11:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2019-08-13T11:45:09+01:00</updated>
<published>2019-08-13T11:45:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221226#p221226</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221226#p221226"/>
<title type="html"><![CDATA[Re: Odliczanie czasu działania programu ATMEGA8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221226#p221226"><![CDATA[
Tak na początek to mała uwaga na temat makra _delay_ms(), a mianowicie jest to makro a nie funkcja, tak więc nie powinno się wartości czasu podawać w postaci zmiennej, ponieważ kompilator to makro zamienia na blok zawierające &quot;pustą instrukcję&quot; (poprostu kompilator liczy ile tych pustych instrukcji musi wstawić aby opóźnienie było takie jakie chcemy). W twoim programie masz do tego makra wstawione zmienne, ale masz je od razu zainicjowane więc kompilator zna ich wartość w momencie kompilacji, ale jeśli w programie były by wykonywane jakieś operacje na tych zmiennych to program by Ci się nie skompilował a kompilator wypluł by błąd.<br />Jak chcesz mieć możliwość łatwej zmiany czasu bez przerabiania kodu zdefiniuj te wartości  poleceniem #define<br />czyli zamiast<br />[syntax=c]int a;<br />int b;<br />int c;<br />a = 250;<br />b = 1000;<br />c = 350;[/syntax]<br />użyj czegoś takiego<br />[syntax=c]#define CZAS_A 250<br />#define CZAS_B 1000<br />#define CZAS_C 350<br /><br />//i wtedy  w dalayach <br />_delay_ms(CZAS_A);[/syntax]<br />Takie rozwiązanie zadziała zawsze i nie zajmie pamięci ram procesora.<br /><br />Wracając do tematu to musisz uruchomić tejmer sprzętowy który atmega8 posiada w ilości 3 na swoim wyposażeniu, proponuję timer1 bo na nim najwygodniej dostosować czas, a i tak leży odłogiem.<br />Włączasz przerwanie od porównania timera i ustawiasz timer tak by generował przerwanie co powiedzmy 1s.<br />W programie tworzysz zmienną, to będzie licznik sekund zliczający do 300 (czyli twoje 5minut świecenia).<br />Zmienna powinna być opatrzona jako volatile oraz powinna być 16 bitowa:<br />[syntax=c]volatile uint16_t licznik;[/syntax]<br />W obsłudze przerwania wstawiasz coś w tym stylu:<br />[syntax=c]if(licznik&gt;1) licznik--;[/syntax]<br />a w pętli głównej dodajesz warunek:<br />[syntax=c]if(licznik==1){<br />//instrukcja zgaś ledy;<br />licznik=0;<br />}[/syntax]<br />Na koniec w warunkach zapalających ledy ładujesz licznik na zadany czas czyli nasze 300.<br />I teraz w momencie gdy czujka zainicjuje zapalenie ledów, załaduje również licznik. Tykające przerwanie ten licznik będzie co sekundę zmniejszało o 1. Gdy licznik dojdzie do 1 odliczanie się zatrzyma, równocześnie spełniony zostanie warunek w głównej pętli programu odpowiedzialny za natychmiastowe zgaszenie ledów, jednocześnie licznik zostanie wyzerowany i cały mechanizm zdezaktywowany)<br />Dla porządku możesz w warunku stopniowego gaszenia również wyzerować licznik by mechanizm bezwarunkowego gaszenie nie wywoływał się gdy ledy już wcześniej zostały wygaszone przez czujkę.<br />To chyba tyle. Mam nadzieję że coś zrozumiesz i sobie poradzisz. Ewentualnie dopytaj.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 13 sie 2019, o 11:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kozak0211]]></name></author>
<updated>2019-08-13T10:06:26+01:00</updated>
<published>2019-08-13T10:06:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221222#p221222</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221222#p221222"/>
<title type="html"><![CDATA[Re: Odliczanie czasu działania programu ATMEGA8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221222#p221222"><![CDATA[
<div class="quotetitle">xentis napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"> I nie proszę tutaj &quot;Panowie, zróbcie mi ten program tak by było dobrze&quot;, tylko o jakiekolwiek wskazówki<br /></div>widzisz, piszesz że nie masz czasu na naukę programowania, to jak ktoś ma Ci dać wskazówki skoro prawdopodobnie bez douczenie nie będziesz w stanie ich wykorzystać?<br />Ale ok, mogę spróbować Ci pomóc tylko jeszcze musisz uzupełnić założenia. Ten timer po odliczeniu ma wyłączyć ledy i zablokować ich zapalanie na jakiś czas, czy do resetu czy jeszcze jakoś inaczej?</div><br /><br /><br />Masz rację, jednak gdybym otrzymał jakąś wskazówkę, to jakby zakres poszukiwań rozwiązania by się diametralnie zawęził, bo doskonale wiem, że programowania nie da się nauczyć w tydzień czy miesiąc. Bardzo dziękuję za litość <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Timer po odliczeniu ma wyłączyć po prostu zapalone ledy - jeżeli nie są zapalone to odliczanie nie ma być realizowane. Nie ma blokować ich zapalenia, ten timer ma wyłączać ledy po to, gdyby np. ledy same się zapaliły przez błąd czujki, żeby nie świeciły cały dzień gdy nie ma mnie w domu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13834">kozak0211</a> — 13 sie 2019, o 10:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2019-08-13T08:04:48+01:00</updated>
<published>2019-08-13T08:04:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221221#p221221</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221221#p221221"/>
<title type="html"><![CDATA[Re: Odliczanie czasu działania programu ATMEGA8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221221#p221221"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />I nie proszę tutaj &quot;Panowie, zróbcie mi ten program tak by było dobrze&quot;, tylko o jakiekolwiek wskazówki<br /></div>widzisz, piszesz że nie masz czasu na naukę programowania, to jak ktoś ma Ci dać wskazówki skoro prawdopodobnie bez douczenie nie będziesz w stanie ich wykorzystać?<br />Ale ok, mogę spróbować Ci pomóc tylko jeszcze musisz uzupełnić założenia. Ten timer po odliczeniu ma wyłączyć ledy i zablokować ich zapalanie na jakiś czas, czy do resetu czy jeszcze jakoś inaczej?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 13 sie 2019, o 08:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[michu]]></name></author>
<updated>2019-08-12T17:08:46+01:00</updated>
<published>2019-08-12T17:08:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221207#p221207</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221207#p221207"/>
<title type="html"><![CDATA[Re: Odliczanie czasu działania programu ATMEGA8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221207#p221207"><![CDATA[
A fuj z tymi delayami  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> <br />Jeśli masz BB to gotowiec jest  na stronie od 326 do 329.<br />Pisząc gotowiec mam na myśli że jest tam pokazane jak się do tego <br />zabrać <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9810">michu</a> — 12 sie 2019, o 17:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2019-08-12T14:12:20+01:00</updated>
<published>2019-08-12T14:12:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221203#p221203</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221203#p221203"/>
<title type="html"><![CDATA[Re: Odliczanie czasu działania programu ATMEGA8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221203#p221203"><![CDATA[
z całym szacunkiem ale połączenie IDEI działania obu programów wymaga co najmniej przepisania od nowa tego pierwszego - a nie tam jakichś wskazówek jak to połączyć - przecież tam masz drastyczne programowanie liniowe - toż już na pierwszy rzut oka widać, że można by tam byle pętle zastosować i funkcje żeby to uprościć do maksimum a później móc łączyć z czymś innym - więc takie mogą być wskazówki.<br /><br />I ja rozumiem, że ktoś nie chce się uczyć podstaw programowania - ja mam tak samo np z linuxem - już się go nie nauczę w życiu, a próbowałem - tyle że czasu nie starcza aby dalej się uczyć - ale też nie rzucam się wtedy na linuxa - no bo jak ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 12 sie 2019, o 14:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kozak0211]]></name></author>
<updated>2019-08-12T13:59:13+01:00</updated>
<published>2019-08-12T13:59:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221202#p221202</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221202#p221202"/>
<title type="html"><![CDATA[Re: Odliczanie czasu działania programu ATMEGA8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221202#p221202"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />To ja ci tylko podpowiem, że warto zacząć od tej książki:<br /><br /><!-- m --><a class="postlink" href="https://atnel.pl/mikrokontrolery-avr-jezyk-c.html" >https://atnel.pl/mikrokontrolery-avr-jezyk-c.html</a><!-- m --><br /><br />bo te dwa jak je nazwałeś &quot;programy&quot; ciężko nazwać programami - szczególnie ten pierwszy .... Ok ja rozumiem, że zaczynasz - no ale ... warto jednak zrobić krok naprzód - bo w ten sposób nigdy nie pisze się programów a ich łączenie - to po prostu istna mordęga<br /></div><br /><br />Z całym szacunkiem dla Ciebie Mirku, ale już wybrałem inny kierunek w swojej karierze, a programowanie dla mnie jest bardzo czasochłonne - nie posiadam niestety tyle czasu, by rozpocząć naukę od podstaw. Doskonale zdaję sobie sprawę, że aż oczy bolą jak się widzi takie programowe herezje, jednak dla mnie najważniejszą rzeczą jest to, że ten program mimo wszystko działa jak należy, chciałem tylko zastosować ten timer w jednym programie, ponieważ ATTiny przestał działać. Spodziewałem się, że nie jest to jakaś trudna sprawa dla doświadczonego programisty. I nie proszę tutaj &quot;Panowie, zróbcie mi ten program tak by było dobrze&quot;, tylko o jakiekolwiek wskazówki, ale jeżeli mówisz, że zastosowanie timera w programie głównym to istna mordęga, to rzeczywiście tak musi być.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13834">kozak0211</a> — 12 sie 2019, o 13:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2019-08-12T13:33:44+01:00</updated>
<published>2019-08-12T13:33:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221201#p221201</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221201#p221201"/>
<title type="html"><![CDATA[Re: Odliczanie czasu działania programu ATMEGA8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221201#p221201"><![CDATA[
To ja ci tylko podpowiem, że warto zacząć od tej książki:<br /><br /><!-- m --><a class="postlink" href="https://atnel.pl/mikrokontrolery-avr-jezyk-c.html" >https://atnel.pl/mikrokontrolery-avr-jezyk-c.html</a><!-- m --><br /><br />bo te dwa jak je nazwałeś &quot;programy&quot; ciężko nazwać programami - szczególnie ten pierwszy .... Ok ja rozumiem, że zaczynasz - no ale ... warto jednak zrobić krok naprzód - bo w ten sposób nigdy nie pisze się programów a ich łączenie - to po prostu istna mordęga<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 12 sie 2019, o 13:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kozak0211]]></name></author>
<updated>2019-08-12T13:23:29+01:00</updated>
<published>2019-08-12T13:23:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221200#p221200</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221200#p221200"/>
<title type="html"><![CDATA[Odliczanie czasu działania programu ATMEGA8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22487&amp;p=221200#p221200"><![CDATA[
Witam serdecznie.<br /><br />Od razu mówię, że nie jestem profesjonalistą w dziedzinie programowania w języku C, dlatego też proszę o pomoc. Kilka lat temu napisałem program na ATMEGA8 realizujący sekwencyjne zapalanie ledów, umieszczonych w stopniach schodowych. Program ten jest uruchamiany za pomocą 2 czujek podających stan wysoki, gdy wykryją ruch. Miałem wtedy problem z jedną rzeczą: <br /><br />&quot;co zrobić, gdy ledy zapalą się samoczynnie przez np. błąd czujki i program będzie realizowany bez przerwy?&quot; <br /><br />Chciałem napisać tzw. timer do tego programu, który by odliczał czas np. &quot;jeżeli ledy świecą ponad 5 minut, wyłącz&quot;, jednak nie wiedziałem jak to zlepić wszystko do kupy by trybiło w jednym, spójnym programie. Dlatego zastosowałem drugi mikrokontroler ATTiny, który odliczał czas i gdy minęło załóżmy 5 minut, podawał stan wysoki na jedną z nóżek, która natomiast była przylutowana do pinu wejścia ATMEGA8. Dzięki temu ATMEGA8 otrzymując stan wysoki od ATTIny na wejście realizowała sekwencje gaszenia ledów. <br /><br />Wiem, że jest to durna realizacja, bo jestem pewien, że da się to zaimplementować po prostu w programie i wystarczyłaby sama ATMEGA8, jednak nie mam pojęcia jak tego dokonać, dlatego proszę o wskazówki. Poniżej wstawiam obydwa programy (ATMEGA8 i ATTiny).<br /><br />Główny program na ATMEGA8 realizujący zapalanie/gaszenie ledów schodowych<br /><br />[syntax=csharp]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />int main(void)<br />{<br />//Port B i D jako wyjścia<br />DDRB = 0XFF;<br />DDRD = 0XFF;<br />//Stan niski na wyjściach<br />PORTB = 0X00;<br />PORTD = 0X00;<br />//Port C  jako wejścia<br />DDRC = 0x00;<br />//wejścia podciągnięte do GND (PRZYCISK TEST &quot;PC5&quot; DO VCC!)<br />PORTC = 0x20;<br />//inicjowanie zmiennych ustalających opóźnienie czasowe<br />int a;<br />int b;<br />int c;<br />a = 250;<br />    b = 1000;<br />c = 350;<br />//Początek nieskończonej pętli<br />while(1)<br />{<br />//Jeżeli na PINC1 podany zostanie stan wysoki<br />if(PINC &amp; 0X02)<br />{<br />PORTB = 0XFE;<br />PORTD = 0X7F;<br />_delay_ms(a);<br />PORTB = 0XFC;<br />PORTD = 0X3F;<br />_delay_ms(a);<br />PORTB = 0XF8;<br />PORTD = 0X1F;<br />_delay_ms(a);<br />PORTB = 0XF0;<br />PORTD = 0X0F;<br />_delay_ms(a);<br />PORTB = 0XE0;<br />PORTD = 0X07;<br />_delay_ms(a);<br />PORTB = 0XC0;<br />PORTD = 0X03;<br />_delay_ms(a);<br />PORTB = 0X80;<br />PORTD = 0X01;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0x00;<br />}<br />// jeżeli na PINC3 padany zostanie stan wysoki<br />if(PINC &amp; 0X08)<br />{ _delay_ms(0);<br />if(PORTB == 0)  // jeżeli schody wygaszone, świeć<br />{<br />//sekwencja zapalania schodów od punktu A do punktu B<br />PORTB = 0X01;<br />PORTD = 0X00;<br />_delay_ms(a);<br />PORTB = 0X03;<br />PORTD = 0X00;<br />_delay_ms(a);<br />PORTB = 0X07;<br />PORTD = 0X00;<br />_delay_ms(a);<br />PORTB = 0X0F;<br />PORTD = 0X00;<br />_delay_ms(a);<br />PORTB = 0X1F;<br />PORTD = 0X00;<br />_delay_ms(a);<br />PORTB = 0X3F;<br />PORTD = 0X00;<br />_delay_ms(a);<br />PORTB = 0X7F;<br />PORTD = 0X00;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0X00;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0X01;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0X03;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0X07;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0X0F;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0X1F;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0X3F;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0X7F;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0XFF;<br />_delay_ms(100);<br />}<br />else  //jeżeli schody zapalone, gaś<br />{<br />//sekwencja wygaszania schodów od puntku B do punktu A<br /><br />_delay_ms(6000);<br />PORTB = 0XFF;<br />    PORTD = 0XFF;<br />_delay_ms(c);<br />PORTB = 0XFF;<br />PORTD = 0X7F;<br />_delay_ms(c);<br />PORTB = 0XFF;<br />PORTD = 0X3F;<br />_delay_ms(c);<br />    PORTB = 0XFF;<br />   PORTD = 0X1F;<br />    _delay_ms(c);<br />    PORTB = 0XFF;<br />    PORTD = 0X0F;<br />    _delay_ms(c);<br />    PORTB = 0XFF;<br />    PORTD = 0X07;<br />    _delay_ms(c);<br />    PORTB = 0XFF;<br />    PORTD = 0X03;<br />    _delay_ms(c);<br />    PORTB = 0XFF;<br />    PORTD = 0X01;<br />    _delay_ms(c);<br />    PORTB = 0XFF;<br />    PORTD = 0X00;<br />    _delay_ms(c);<br />    PORTB = 0X7F;<br />    PORTD = 0X00;<br />    _delay_ms(c);<br />    PORTB = 0X3F;<br />    PORTD = 0X00;<br />    _delay_ms(c);<br />    PORTB = 0X1F;<br />    PORTD = 0X00;<br />    _delay_ms(c);<br />    PORTB = 0X0F;<br />    PORTD = 0X00;<br />    _delay_ms(c);<br />    PORTB = 0X07;<br />    PORTD = 0X00;<br />    _delay_ms(c);<br />    PORTB = 0X03;<br />PORTD = 0X00;<br />    _delay_ms(c);<br />    PORTB = 0X01;<br />    PORTD = 0X00;<br />    _delay_ms(c);<br />    PORTB = 0X00;<br />    PORTD = 0X00;<br />    _delay_ms(4000);<br />   }<br />}<br /><br />if(PINC &amp; 0X10)  //Jeżeli na PINC4 podany zostanie stany wysoki<br />{_delay_ms(0);<br />if(PORTB == 0) //Jeżeli schody wygaszone, świeć<br />{<br />//sekwencja świecenia schodów od punktu B do punktu A<br />PORTB = 0X00;<br />PORTD = 0X80;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0XC0;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0XE0;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0XF0;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0XF8;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0XFC;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0XFE;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0XFF;<br />_delay_ms(a);<br />PORTB = 0X80;<br />PORTD = 0XFF;<br />_delay_ms(a);<br />PORTB = 0XC0;<br />PORTD = 0XFF;<br />_delay_ms(a);<br />PORTB = 0XE0;<br />PORTD = 0XFF;<br />_delay_ms(a);<br />PORTB = 0XF0;<br />PORTD = 0XFF;<br />_delay_ms(a);<br />PORTB = 0XF8;<br />PORTD = 0XFF;<br />_delay_ms(a);<br />PORTB = 0XFC;<br />PORTD = 0XFF;<br />_delay_ms(a);<br />PORTB = 0XFE;<br />PORTD = 0XFF;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0XFF;<br />_delay_ms(100);<br />}<br />else //jeżeli schody zapalone, gaś<br />{<br />//sekwencja gaszenia schodów od punktu A do punktu B<br /> <br />_delay_ms(6000);<br />PORTB = 0XFE;<br /> PORTD = 0XFF;<br /> _delay_ms(c);<br /> PORTB = 0XFC;<br /> PORTD = 0XFF;<br /> _delay_ms(c);<br /> PORTB = 0XF8;<br /> PORTD = 0XFF;<br /> _delay_ms(c);<br /> PORTB = 0XF0;<br /> PORTD = 0XFF;<br /> _delay_ms(c);<br /> PORTB = 0XE0;<br /> PORTD = 0XFF;<br /> _delay_ms(c);<br /> PORTB = 0XC0;<br /> PORTD = 0XFF;<br /> _delay_ms(c);<br /> PORTB = 0X80;<br /> PORTD = 0XFF;<br /> _delay_ms(c);<br /> PORTB = 0X00;<br /> PORTD = 0XFF;<br /> _delay_ms(c);<br /> PORTB = 0X00;<br /> PORTD = 0XFE;<br /> _delay_ms(c);<br /> PORTB = 0X00;<br /> PORTD = 0XFC;<br /> _delay_ms(c);<br /> PORTB = 0X00;<br /> PORTD = 0XF8;<br /> _delay_ms(c);<br /> PORTB = 0X00;<br /> PORTD = 0XF0;<br /> _delay_ms(c);<br /> PORTB = 0X00;<br /> PORTD = 0XE0;<br /> _delay_ms(c);<br /> PORTB = 0X00;<br /> PORTD = 0XC0;<br /> _delay_ms(c);<br /> PORTB = 0X00;<br /> PORTD = 0X80;<br /> _delay_ms(c);<br /> PORTB = 0X00;<br /> PORTD = 0X00;<br /> _delay_ms(4000);<br /> }<br /><br />}<br /><br />//program testujący (Przycisk TEST)<br /><br />if(!(PINC &amp; 0X20)) //jeżli podany zostanie stan niski na PINC5<br />{<br />//sekwencja zapalania od punktu A do B<br />_delay_ms(100);<br />PORTB = 0X01;<br />PORTD = 0X00;<br />_delay_ms(a);<br />PORTB = 0X03;<br />PORTD = 0X00;<br />_delay_ms(a);<br />PORTB = 0X07;<br />PORTD = 0X00;<br />_delay_ms(a);<br />PORTB = 0X0F;<br />PORTD = 0X00;<br />_delay_ms(a);<br />PORTB = 0X1F;<br />PORTD = 0X00;<br />_delay_ms(a);<br />PORTB = 0X3F;<br />PORTD = 0X00;<br />_delay_ms(a);<br />PORTB = 0X7F;<br />PORTD = 0X00;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0X00;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0X01;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0X03;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0X07;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0X0F;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0X1F;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0X3F;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0X7F;<br />_delay_ms(a);<br />PORTB = 0XFF;<br />PORTD = 0XFF; //wszystkie schody swiecą<br />//sekwencja wygaszania od punktu A do B<br />_delay_ms(a);<br />PORTB = 0XFE;<br />PORTD = 0XFF;<br />_delay_ms(a);<br />PORTB = 0XFC;<br />PORTD = 0XFF;<br />_delay_ms(a);<br />PORTB = 0XF8;<br />PORTD = 0XFF;<br />_delay_ms(a);<br />PORTB = 0XF0;<br />PORTD = 0XFF;<br />_delay_ms(a);<br />PORTB = 0XE0;<br />PORTD = 0XFF;<br />_delay_ms(a);<br />PORTB = 0XC0;<br />PORTD = 0XFF;<br />_delay_ms(a);<br />PORTB = 0X80;<br />PORTD = 0XFF;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0XFF;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0XFE;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0XFC;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0XF8;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0XF0;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0XE0;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0XC0;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0X80;<br />_delay_ms(a);<br />PORTB = 0X00;<br />PORTD = 0X00;<br />//wszystkie wygaszone<br />//pojedyncze zapalanie tam i z powrotem<br />_delay_ms(b);<br />PORTB = 0X01;<br />PORTD = 0X00;<br />_delay_ms(b);<br />PORTB = 0X02;<br />PORTD = 0X00;<br />_delay_ms(b);<br />PORTB = 0X04;<br />PORTD = 0X00;<br />_delay_ms(b);<br />PORTB = 0X08;<br />PORTD = 0X00;<br />_delay_ms(b);<br />PORTB = 0X10;<br />PORTD = 0X00;<br />_delay_ms(b);<br />PORTB = 0X20;<br />PORTD = 0X00;<br />_delay_ms(b);<br />PORTB = 0X40;<br />PORTD = 0X00;<br />_delay_ms(b);<br />PORTB = 0X80;<br />PORTD = 0X00;<br />_delay_ms(b);<br />PORTB = 0X00;<br />PORTD = 0X01;<br />_delay_ms(b);<br />PORTB = 0X00;<br />PORTD = 0X02;<br />_delay_ms(b);<br />PORTB = 0X00;<br />PORTD = 0X04;<br />_delay_ms(b);<br />PORTB = 0X00;<br />PORTD = 0X08;<br />_delay_ms(b);<br />PORTB = 0X00;<br />PORTD = 0X10;<br />_delay_ms(b);<br />PORTB = 0X00;<br />PORTD = 0X20;<br />_delay_ms(b);<br />PORTB = 0X00;<br />PORTD = 0X40;<br />_delay_ms(b);<br />PORTB = 0X00;<br />PORTD = 0X80;<br />_delay_ms(b);<br />PORTB = 0X80;<br />PORTD = 0X00;<br />_delay_ms(b);<br />PORTB = 0X40;<br />PORTD = 0X00;<br />_delay_ms(b);<br />PORTB = 0X20;<br />PORTD = 0X00;<br />_delay_ms(b);<br />PORTB = 0X10;<br />PORTD = 0X00;<br />_delay_ms(b);<br />PORTB = 0X08;<br />PORTD = 0X00;<br />_delay_ms(b);<br />PORTB = 0X04;<br />PORTD = 0X00;<br />_delay_ms(b);<br />PORTB = 0X02;<br />PORTD = 0X00;<br />_delay_ms(b);<br />PORTB = 0X01;<br />PORTD = 0X00;<br />_delay_ms(b);<br />PORTB = 0X00;<br />PORTD = 0X80;<br />_delay_ms(b);<br />PORTB = 0X00;<br />PORTD = 0X40;<br />_delay_ms(b);<br />PORTB = 0X00;<br />PORTD = 0X20;<br />_delay_ms(b);<br />PORTB = 0X00;<br />PORTD = 0X10;<br />_delay_ms(b);<br />PORTB = 0X00;<br />PORTD = 0X08;<br />_delay_ms(b);<br />PORTB = 0X00;<br />PORTD = 0X04;<br />_delay_ms(b);<br />PORTB = 0X00;<br />PORTD = 0X02;<br />_delay_ms(b);<br />PORTB = 0X00;<br />PORTD = 0X00;<br />_delay_ms(b);<br />}<br />}<br />}[/syntax]<br /><br />Drugi program ATTiny realizujący odliczanie czasowe:<br /><br />[syntax=csharp]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /> <br />void mDelay( uint16_t ms);<br /> <br />int main(void)<br />{<br />        //Port B jako wyjścia z wyjątkiem PB2, które jest wejściem<br />        DDRB = 0X2B;<br />        //Stan niski na wyjściach<br />        PORTB = 0x00;      <br /> <br />        //Początek nieskończonej pętli<br />        while(1)<br />        {<br />                //Jeżeli na pin PB2 podany zostanie stan wysoki<br />                if(PINB &amp; 0X04) { <br />mDelay(15000);   <br />                        PORTB = 0X02;      //stan wysoki na PB1<br />                        mDelay(1000);           //opóżnienie 1000 * 1ms = 1000ms = 1s<br />                        PORTB = 0X00;     //stan niski na PB1<br />                }<br />        }<br />}<br /> <br />void mDelay( uint16_t ms) {<br />        while( ms-- )<br />{ <br />    _delay_ms(1);<br />    if( !(PINB &amp; 0x04) ) break; //jeśli PB2 w stanie niskim, przerwij wykonywanie pętli<br />}<br />}[/syntax]<br /><br />Bardzo bym prosił o jakąkolwiek pomoc w jaki sposób &quot;zlepić&quot; te dwa programy w jedną całość.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13834">kozak0211</a> — 12 sie 2019, o 13:23</p><hr />
]]></content>
</entry>
</feed>