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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2012-12-21T12:16:12+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=1964&amp;mode</id>
<entry>
<author><name><![CDATA[perlon]]></name></author>
<updated>2012-12-21T12:16:12+01:00</updated>
<published>2012-12-21T12:16:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1964&amp;p=21771#p21771</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1964&amp;p=21771#p21771"/>
<title type="html"><![CDATA[Re: Timer programowy, zła częstotliwość?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1964&amp;p=21771#p21771"><![CDATA[
Z opisu wynika, że wywołujesz przerwanie teoretycznie co 8 cykli maszynowych. A ile cykli maszynowych trwa procedura przerwania? Na moje oko zanim skończysz dekrementować zmienne Timer to licznik timera już postawi flagę do następnego przerwania. A gdzie reszta programu w pętli głównej. No i obsługa LCD co każdy obieg pętli głównej to niezły hardcor. Stan żadnej z diod się nie zmieni dopóki nie zakończysz obsługi wyświetlacza. I nie ma znaczenia jak szybko będzie napierniczał timer programowy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=382">perlon</a> — 21 gru 2012, o 12:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-12-21T12:09:43+01:00</updated>
<published>2012-12-21T12:09:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1964&amp;p=21768#p21768</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1964&amp;p=21768#p21768"/>
<title type="html"><![CDATA[Re: Timer programowy, zła częstotliwość?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1964&amp;p=21768#p21768"><![CDATA[
Panowie, panowie panowie .... <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> no bo się rozpłaczę zaraz <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />no ile razy mam powtarzać, że już 1ms rozdzielczości czasowej dla timerów programowych to jakiś pomysł z KOSMOSU, a tu proszę kolega zapędził się jeszcze dalej - dla timerów programowych zachciało mu się 1us !!!!!!! to już pewnie podpowiedź Alfa z planety Melmak <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />proszę jednak wrócić do książki do rozdziału o wstępie do systemów czasu rzeczywistego i poczytać troszeczkę jak się dobiera rozdzielczość czasową i dlaczego to tak ważne oraz dlaczego jeśli programujemy w C to w zasadzie nie powinna ona być mniejsza niż 10ms !<br /><br />Poza tym co to za nieziemskie miganie diodą LED co 300us albo jeszcze lepiej co 3us ..... no proszę chociaż troszeczkę się zastanowić - bo jeśli kolega chce odróżniać to własnym okiem i widzi różnicę pomiędzy miganiem diody co 3us od migania co 300us to przepraszam  - no może ja czegoś nie wiem a kolega jest matrixem. Nie mówię tego broń boże kąśliwie ... jeśli tak to odbierzesz to przepraszam .... <br /><br />ale zacznij testy od rozdzielczości czasowej 10ms tak jak to opisuję w książce i poczytaj dlaczego tak - a jak nie zrozumiesz czegoś to wtedy dopytaj ok? chętnie pomogę wtedy ....<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 21 gru 2012, o 12:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Janadamis]]></name></author>
<updated>2012-12-21T11:37:01+01:00</updated>
<published>2012-12-21T11:37:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1964&amp;p=21761#p21761</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1964&amp;p=21761#p21761"/>
<title type="html"><![CDATA[Timer programowy, zła częstotliwość?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1964&amp;p=21761#p21761"><![CDATA[
Witam<br />Mam taki kłopot że Musze zrobić timer programowy który co określony czas będzie zmieniał stan diody na przeciwny.<br />To jest opis w skrócie tego co chcę zrobić.<br />Przyjmijmy że co 3us , 300us, 3000us ma mrugać nasza dioda<br />Zlepiłem taki kod:<br />[syntax=c]<br />/*<br /> * main.c<br /> *<br /> *  Created on: 2012-12-21<br /> *      Author: Janadamis<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;IR_DECODE/ir_decode.h&quot;<br /><br />//Do uruchomienia zasilania<br />#define Uruchom (1&lt;&lt;PC3)    // Przekaznikwyjscie<br />#define KeyZgas (1&lt;&lt;PC4)    // Przyciskwejscie<br />#define Zgas !(PINC &amp; KeyZgas)<br />//////////////////////////////////////<br /><br />#define Step1Uc1 (1&lt;&lt;PA0)//Step 1 UC 1Wyjście<br />#define Step2Uc1 (1&lt;&lt;PA1)//Step 2 UC 1Wyjście<br /><br />#define Step1Uc2 (1&lt;&lt;PA2)//Step 1 UC 2Wyjście<br />#define Step2Uc2 (1&lt;&lt;PA3)//Step 2 UC 2Wyjście<br /><br />#define Step1Uc3 (1&lt;&lt;PA4)//Step 1 UC 3Wyjście<br />#define Step2Uc3 (1&lt;&lt;PA5)//Step 2 UC 3Wyjście<br /><br />#define Gaszenie1 (1&lt;&lt;PB1)//Gaszenie silnikauC1Wyjście<br />#define Gaszenie2 (1&lt;&lt;PB2)//Gaszenie silnikauC2Wyjście<br />#define Gaszenie3 (1&lt;&lt;PB3)//Gaszenie silnikauC3Wyjście<br />#define SD_OnOff (1&lt;&lt;PC5)//Zasilanie karty SD<br /><br />#define Zapis (1&lt;&lt;PB0)//Zapis<br /><br /><br /><br />volatile uint16_t Timer1,Timer2,Timer3;<br /><br /><br />int main(void)<br />{<br />// ustawienia TIMER2 w tryb CTC<br />TCCR2 |= (1&lt;&lt;WGM21);// tryb  CTC<br />TCCR2 |= (1&lt;&lt;CS21);// preskaler = 8<br />OCR2 = 1;// dodatkowy podział częstotliwości przez 1<br />TIMSK |= (1&lt;&lt;OCIE2);// zezwolenie na przerwanie CompareMatch<br />//Przerwanie wykonywane z częstotliwościa 1MHz czyli co 1us<br /><br /><br /><br />/////////////////////////////////////<br />//Do uruchomienia zasilania<br />DDRC |= Uruchom;//Wyjscie<br />PORTC &amp;= ~Uruchom;//Stan niski<br />DDRC &amp;= ~KeyZgas;//Kierunek pinu PC6 - wejsciowy<br />PORTC |= KeyZgas;//Podciagniecie pinu do VCC<br />/////////////////////////////////////<br />lcd_init();//Inicjalizacja lcd<br />ir_init();/* inicjalizacja dekodowania IR */<br />sei();/* włączamy globalne przerwania */<br /><br /><br />DDRA |= Step1Uc1 | Step2Uc1 | Step1Uc2 | Step2Uc2 | Step1Uc3 | Step2Uc3;//Wyjscie            STEP UC 1<br />PORTA |= Step1Uc1 | Step2Uc1 | Step1Uc2 | Step2Uc2 | Step1Uc3 | Step2Uc3;//Stan wysoki        STEP UC 1<br /><br />DDRB |= (Gaszenie1 | Gaszenie2 | Gaszenie3);//Wyjscie<br />PORTB |= (Gaszenie1 | Gaszenie2 | Gaszenie3);//Stan wysoki<br /><br />DDRB |= Zapis;//Wyjscie<br />PORTB |= Zapis;//Stan wysoki<br /><br /><br />PORTB &amp;= ~(Gaszenie1 | Gaszenie2 | Gaszenie3);//Stan niski<br />while(1)<br />{<br /><br />//Jesli wcisnieto przycisk gaszenia wylacz przekaznik<br />if(Zgas || (Ir_key_press_flag &amp;&amp; command==12)) PORTC |= Uruchom;<br />if(Ir_key_press_flag &amp;&amp; !address)//Jesli wcisnieto jakikolwiek pryzcisk wyzeruj flagi<br />{<br />_delay_ms(5);<br />Ir_key_press_flag=0;<br />command=0xff;<br />address=0xff;<br />}<br />//////////////////////////////////////////////////////////////////////////////////////////////////<br />//////////////////////////////////////////////////////////////////////////////////////////////////<br />//////////////////////////////////////////////////////////////////////////////////////////////////<br />        lcd_locate(0,0);<br />lcd_str(&quot;Test LCD 4x20&quot;);<br /><br /><br />if(!Timer1)<br />{<br />Timer1=3;<br />PORTA ^= Step1Uc1;//Zmiana stanu na przeciwny   STEP1<br />}<br /><br /><br />if(!Timer2)<br />{<br />Timer2=300;<br />PORTA ^= Step1Uc2;//Zmiana stanu na przeciwny   STEP1<br />}<br /><br />if(!Timer3)<br />{<br />Timer3=3000;<br />PORTA ^= Step1Uc3;//Zmiana stanu na przeciwny   STEP1<br />}<br /><br /><br />}//while<br />}//main<br /><br /><br />ISR(TIMER2_COMP_vect)<br />{<br />uint16_t x;<br />x = Timer1;//Timer1 1MHz<br />if (x) Timer1= --x;<br /><br />x = Timer2;//Timer2 1MHz<br />if (x) Timer2= --x;<br /><br />x = Timer3;//Timer2 1MHz<br />if (x) Timer3= --x;<br />}<br />[/syntax] <br /><br />Żeby diody tak mrugały to trzeba ustawić, że przerwanie timera ma być co 1us czyli 1MHz<br />Jednak ja widzę jak one mrugają jak to możliwe? Przecież to jest bardzo duża częstotliwość!!<br />Na pewno coś źle policzyłem ale co?<br />Proszę o pomoc. Będę bardzo wdzięczny.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=288">Janadamis</a> — 21 gru 2012, o 11:37</p><hr />
]]></content>
</entry>
</feed>