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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2012-04-27T06:35:33+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=1035&amp;mode</id>
<entry>
<author><name><![CDATA[miszczo]]></name></author>
<updated>2012-04-27T06:35:33+01:00</updated>
<published>2012-04-27T06:35:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1035&amp;p=5869#p5869</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1035&amp;p=5869#p5869"/>
<title type="html"><![CDATA[Re: Zegarek binarny - zmiana pinów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1035&amp;p=5869#p5869"><![CDATA[
Wiem, że nie jest duże, ale muszą zmieścić je w zegarku casio aw159 gdzie obszar widoczny jest 20x10mm<br /><!-- m --><a class="postlink" href="http://www.polyvore.com/casio_aw159_watch_silver/thing?id=12485748">http://www.polyvore.com/casio_aw159_wat ... d=12485748</a><!-- m --><br />Zegarek sam w sobie niby fajny i bym go nie ruszał, ale był tak wodoszczelny, że jak złapał wodę to już jej nie chciał wypuścić <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br />Zniknęła mi połowa wyświetlanych cyfr i postanowiłem sobie zrobić właśnie taki projekt.<br />Co do kodu to rzeczywiście ciężko się go analizuje. Wszędzie _BV i jakieś dziwne nazwy funkcji i zmiennych. No nic. Na razie pomęczę płytkę, a później się będę martwił kodem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=78">miszczo</a> — 27 kwi 2012, o 06:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-04-26T23:04:57+01:00</updated>
<published>2012-04-26T23:04:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1035&amp;p=5863#p5863</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1035&amp;p=5863#p5863"/>
<title type="html"><![CDATA[Re: Zegarek binarny - zmiana pinów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1035&amp;p=5863#p5863"><![CDATA[
A dlaczego chcesz zmieniać ?? to pcb duże nie jest naprawdę <br />wydrukuj sobie i zmierz <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=58">SunRiver</a> — 26 kwi 2012, o 23:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-04-26T21:09:23+01:00</updated>
<published>2012-04-26T21:09:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1035&amp;p=5846#p5846</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1035&amp;p=5846#p5846"/>
<title type="html"><![CDATA[Re: Zegarek binarny - zmiana pinów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1035&amp;p=5846#p5846"><![CDATA[
Oj - ale ja nie jestem w stanie analizować takich długich kodów źródłowych programu - problemy z czasem. Jak będzie bardziej konkretne pytanie to tak - nie ma sprawy. Ale może ktoś inny rzuci na dłużej okiem - zobaczymy.<br /><br />Proponuję popróbować we własnym zakresie - na pewno da radę - a potem może właśnie ew wyklują się konkretne pytania - OK?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 26 kwi 2012, o 21:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[miszczo]]></name></author>
<updated>2012-04-26T18:34:11+01:00</updated>
<published>2012-04-26T18:34:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1035&amp;p=5838#p5838</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1035&amp;p=5838#p5838"/>
<title type="html"><![CDATA[Zegarek binarny - zmiana pinów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1035&amp;p=5838#p5838"><![CDATA[
Witam<br />Mam zamiar zaprojektować płytkę pod zegarek binarny opisany w  EDW 07/2011, a jako, że muszą to zrobić na bardzo małym obszarze dobrze byłoby zmienić piny do których podłączone będą diody. I tu rodzi się moje pytanie - czy w poniższym kodzie nie będzie większych problemów ze zmianą wyprowadzeń? Niby są definicje, ale są one określone dla jednego portu. Najpewniej wyjdzie mi to tak, że podłączenia będą porozrzucane po całej medze do różnych portów.<br /><br />[syntax=c]//////////////////////////////////////////////////////////<br />// uClock bsw v.2.0<br />//////////////////////////////////////////////////////////<br /><br />#include &lt;avr\io.h&gt;<br />#include &lt;avr\interrupt.h&gt;<br />#include &lt;avr\pgmspace.h&gt;<br />#include &lt;avr\sleep.h&gt;<br />#include &lt;avr\eeprom.h&gt;<br />#include &lt;util\delay.h&gt;<br /><br />//////////////////////////////////////////////////////////<br />// Makra upraszczające dostęp do portów<br />//////////////////////////////////////////////////////////<br /><br />// PORT<br />#define PORT(x) XPORT(x)<br />#define XPORT(x) (PORT##x)<br />// PIN<br />#define PIN(x) XPIN(x)<br />#define XPIN(x) (PIN##x)<br />// DDR<br />#define DDR(x) XDDR(x)<br />#define XDDR(x) (DDR##x)<br /><br />//////////////////////////////////////////////////////////<br />// Makro upraszczające definicję zmiennych eeprom<br />//////////////////////////////////////////////////////////<br />#define EEPROM __attribute__ ((section (&quot;.eeprom&quot;)))<br /><br />//////////////////////////////////////////////////////////<br />// Definicje portów<br />//////////////////////////////////////////////////////////<br /><br />// Definicje wyprowadzeń portu B<br /><br /><br />// Definicje wyprowadzeń portu C<br /><br />#define H01 0<br />#define H02 1<br />#define H04 2<br />#define H08 3<br /><br />// Definicje wyprowadzeń portu D<br /><br />#define KEY 2<br /><br />#define M32 1<br />#define M16 3<br />#define M08 4<br />#define M04 5<br />#define M02 7<br />#define M01 6<br /><br />// Definicje trybów wyświetlania<br />#define DISP_MODE_OFF 0<br />#define DISP_MODE_BIN 1<br />#define DISP_MODE_BIN2 2<br />#define DISP_MODE_POV 3<br />#define DISP_MODE_SET 4<br />#define DISP_MODE_SETH 5<br />#define DISP_MODE_SETM 6<br />#define DISP_MODE_SETN 7<br />#define DISP_MODE_SETC 8<br />#define DISP_MODE_TO_OFF 9<br /><br />// Definicje symboli w trybie ustawiania<br />#define SYMB_HI 48<br />#define SYMB_LO 3<br />#define SYMB_CR 12<br /><br /><br /><br />// Definicje stałych<br />#define SECOND_TO_ADD 2<br /><br />#define BELL_2SECONDS 1800<br /><br />#define BLINK_DELAY 150<br />#define STEP_DELAY 150<br />#define CORRECTION_DELAY STEP_DELAY*6<br /><br />#define POV_DELAY 1000<br />#define SET_DELAY 1200<br />#define LONG_DELAY 5000<br /><br />// wzorce cyfer w pamięci programu<br />prog_uint8_t g_Digit[41]=<br />{<br />   _BV(2) | _BV(4),                                     //:<br />   _BV(2) | _BV(3) | _BV(4) | _BV(5),                    //0<br />   _BV(1) | _BV(6),                                      //0<br />   _BV(1) | _BV(6),                                      //0<br />   _BV(2) | _BV(3) | _BV(4) | _BV(5),                    //0<br />   0,                                                   //1<br />   _BV(3),                                              //1<br />   _BV(2),                                              //1<br />   _BV(1) | _BV(2) | _BV(3) | _BV(4) | _BV(5) | _BV(6), //1<br />   _BV(2) | _BV(5) | _BV(6),                             //2<br />   _BV(1) | _BV(4) | _BV(6),                             //2<br />   _BV(1) | _BV(4) | _BV(6),                             //2<br />   _BV(2) | _BV(3) | _BV(6),                             //2<br />   _BV(2) | _BV(5),                                     //3<br />   _BV(1) | _BV(6),                                     //3<br />   _BV(1) | _BV(3) | _BV(6),                            //3<br />   _BV(2) | _BV(4) | _BV(5),                            //3<br />   _BV(3) | _BV(4),                                      //4<br />   _BV(2) | _BV(4),                                      //4<br />   _BV(1) | _BV(2) | _BV(3) | _BV(4) | _BV(5) | _BV(6),  //4<br />   _BV(4),                                               //4<br />   _BV(1) | _BV(2) | _BV(3) | _BV(5),                   //5<br />   _BV(1) | _BV(3) | _BV(6),                            //5<br />   _BV(1) | _BV(3) | _BV(6),                            //5<br />   _BV(1) | _BV(4) | _BV(5),                            //5<br />   _BV(2) | _BV(3) | _BV(4) | _BV(5),                    //6<br />   _BV(1) | _BV(3) | _BV(6),                             //6<br />   _BV(1) | _BV(3) | _BV(6),                             //6<br />   _BV(1) | _BV(4) | _BV(5),                             //6<br />   _BV(1),                                              //7<br />   _BV(1) | _BV(4) | _BV(5) | _BV(6),                   //7<br />   _BV(1) | _BV(3),                                     //7<br />   _BV(1) | _BV(2),                                     //7<br />   _BV(2) | _BV(4) | _BV(5),                             //8<br />   _BV(1) | _BV(3) | _BV(6),                             //8<br />   _BV(1) | _BV(3) | _BV(6),                             //8<br />   _BV(2) | _BV(4) | _BV(5),                             //8<br />   _BV(2) | _BV(3) | _BV(6),                            //9<br />   _BV(1) | _BV(3) | _BV(6),                            //9<br />   _BV(1) | _BV(3) | _BV(6),                            //9<br />   _BV(2) | _BV(3) | _BV(4) | _BV(5)                    //9<br />};<br /><br />//////////////////////////////////////////////////////////<br />// TIME<br />//////////////////////////////////////////////////////////<br /><br />// typ czas<br />typedef struct<br />{<br />   uint8_t Sec;<br />   uint8_t Min;<br />   uint8_t Hour;<br />} Time;<br /><br />// globalnie czas<br />volatile Time g_CurrTime;<br /><br />// wyświetlany czas<br />volatile Time g_DispTime;<br /><br />//korekcja czasu<br />uint8_t CorrectionValue EEPROM;<br />volatile uint8_t g_CorrectionValue = 0;<br />volatile uint8_t g_LastCorrection = 0;<br /><br />// wyliczenie korekcji czasu<br />uint8_t CalculateCorrectionTime(void)<br />{<br />   if(g_LastCorrection&gt;0)<br />   {<br />      g_LastCorrection--;<br />      return 0;<br />   }<br /><br />   if(0==g_CorrectionValue) return 0;<br />   if(g_CurrTime.Min&gt;0) return 0;<br />   if(!((3==g_CurrTime.Hour)||(9==g_CurrTime.Hour))) return 0;<br /><br />   if((30==g_CurrTime.Sec)||(31==g_CurrTime.Sec))<br />   {<br />       g_LastCorrection=15;<br /><br />       uint8_t Value;<br /><br />   if(g_CorrectionValue&gt;=8)<br />      return Value=g_CorrectionValue-8;<br />   else<br />      return Value=g_CorrectionValue;<br /><br />   if(3==g_CurrTime.Hour)<br />      Value = Value/2;<br />   else<br />      Value = Value/2 + Value%2;<br /><br />   if(g_CorrectionValue&gt;=8)<br />      return -Value;<br />   else<br />      return Value;<br />   }<br />   else return 0;<br />}<br /><br />//////////////////////////////////////////////////////////<br />// DISPLAY POV<br />//////////////////////////////////////////////////////////<br /><br />#define MAX_POV 60<br /><br />// Bufor wyświetlacza POV<br />typedef struct<br />{<br />   uint8_t Buffer[MAX_POV];<br />   uint8_t Phase;<br />} DisplayPov;<br /><br />volatile DisplayPov g_DisplayPov;<br /><br />// ustaw bufor wyswietlacza POV<br />void SetDisplayPov(uint8_t hour, uint8_t min)<br />{<br />   uint8_t h1 = hour/10;<br />   uint8_t h2 = hour%10;<br />   uint8_t m1 = min/10;<br />   uint8_t m2 = min%10;<br />   uint8_t i;<br /><br />   for(i=0;i&lt;MAX_POV;i++) g_DisplayPov.Buffer[i]=0;<br /><br />   g_DisplayPov.Phase=0;<br />   for(i=4;i&gt;0;--i)<br />   {<br />      g_DisplayPov.Buffer[g_DisplayPov.Phase++]=pgm_read_byte(&amp;g_Digit[m2*4+i]);<br />      g_DisplayPov.Buffer[g_DisplayPov.Phase++]=0;<br />   }<br />   g_DisplayPov.Buffer[g_DisplayPov.Phase++]=0;<br />   for(i=4;i&gt;0;--i)<br />   {<br />      g_DisplayPov.Buffer[g_DisplayPov.Phase++]=pgm_read_byte(&amp;g_Digit[m1*4+i]);<br />      g_DisplayPov.Buffer[g_DisplayPov.Phase++]=0;<br />   }<br />   g_DisplayPov.Buffer[g_DisplayPov.Phase++]=0;<br />   g_DisplayPov.Buffer[g_DisplayPov.Phase++]=0;<br />      g_DisplayPov.Buffer[g_DisplayPov.Phase++]=pgm_read_byte(&amp;g_Digit[0]);<br />      g_DisplayPov.Buffer[g_DisplayPov.Phase++]=pgm_read_byte(&amp;g_Digit[0]);<br />   g_DisplayPov.Buffer[g_DisplayPov.Phase++]=0;<br />   g_DisplayPov.Buffer[g_DisplayPov.Phase++]=0;<br />   g_DisplayPov.Buffer[g_DisplayPov.Phase++]=0;<br />   for(i=4;i&gt;0;--i)<br />   {<br />      g_DisplayPov.Buffer[g_DisplayPov.Phase++]=pgm_read_byte(&amp;g_Digit[h2*4+i]);<br />      g_DisplayPov.Buffer[g_DisplayPov.Phase++]=0;<br />   }<br />   if(h1&gt;0)<br />   {<br />      g_DisplayPov.Buffer[g_DisplayPov.Phase++]=0;<br />      for(i=4;i&gt;0;--i)<br />      {<br />         g_DisplayPov.Buffer[g_DisplayPov.Phase++]=pgm_read_byte(&amp;g_Digit[h1*4+i]);<br />        g_DisplayPov.Buffer[g_DisplayPov.Phase++]=0;<br />      }<br />      g_DisplayPov.Phase=0;<br />   }<br />}<br /><br />// Ustaw wyświetlacz POV<br />void ShowDisplayPov(void)<br />{<br />   uint8_t line = g_DisplayPov.Buffer[g_DisplayPov.Phase++];<br /><br />   PORT(D) = ~(((line &amp; _BV(1))&gt;&gt;1)*_BV(M01) | ((line &amp; _BV(2))&gt;&gt;2)*_BV(M02) |<br />               ((line &amp; _BV(3))&gt;&gt;3)*_BV(M04) | ((line &amp; _BV(4))&gt;&gt;4)*_BV(M08) |<br />               ((line &amp; _BV(5))&gt;&gt;5)*_BV(M16) | ((line &amp; _BV(6))&gt;&gt;6)*_BV(M32));<br /><br />   if(g_DisplayPov.Phase&gt;=MAX_POV) g_DisplayPov.Phase=0;<br />}<br /><br />//////////////////////////////////////////////////////////<br />// DISPLAY BIN<br />//////////////////////////////////////////////////////////<br /><br />// Bufor wyświetlacza BIN<br />typedef struct<br />{<br />   uint8_t h08,h04,h02,h01;<br />   uint8_t m32,m16,m08,m04,m02,m01;<br />} DisplayBuf;<br /><br />volatile DisplayBuf g_DisplayBuf;<br /><br />// ustaw bufor wyswietlacza BIN<br />void SetDisplayBin(uint8_t hour, uint8_t min)<br />{<br />   g_DisplayBuf.h08 = ((hour &amp; (1&lt;&lt;3))&gt;&gt;3);<br />   g_DisplayBuf.h04 = ((hour &amp; (1&lt;&lt;2))&gt;&gt;2);<br />   g_DisplayBuf.h02 = ((hour &amp; (1&lt;&lt;1))&gt;&gt;1);<br />   g_DisplayBuf.h01 = (hour &amp; (1&lt;&lt;0));<br /><br />   g_DisplayBuf.m32 = ((min &amp; (1&lt;&lt;5))&gt;&gt;5);<br />   g_DisplayBuf.m16 = ((min &amp; (1&lt;&lt;4))&gt;&gt;4);<br />   g_DisplayBuf.m08 = ((min &amp; (1&lt;&lt;3))&gt;&gt;3);<br />   g_DisplayBuf.m04 = ((min &amp; (1&lt;&lt;2))&gt;&gt;2);<br />   g_DisplayBuf.m02 = ((min &amp; (1&lt;&lt;1))&gt;&gt;1);<br />   g_DisplayBuf.m01 = (min &amp; (1&lt;&lt;0));<br />}<br /><br />// Ustaw wyświetlacz BIN<br />void ShowDisplayBin(void)<br />{<br />   PORT(C) = ~(g_DisplayBuf.h01*_BV(H01) | g_DisplayBuf.h02*_BV(H02) |<br />               g_DisplayBuf.h04*_BV(H04) | g_DisplayBuf.h08*_BV(H08));<br /><br />   PORT(D) = ~(g_DisplayBuf.m01*_BV(M01) | g_DisplayBuf.m02*_BV(M02) |<br />               g_DisplayBuf.m04*_BV(M04) | g_DisplayBuf.m08*_BV(M08) |<br />               g_DisplayBuf.m16*_BV(M16) | g_DisplayBuf.m32*_BV(M32));<br />}<br /><br />// wyczyść wyświetlacz<br />void ClearDisplay(void)<br />{<br />   PORT(C) = _BV(H01) | _BV(H02) | _BV(H04) | _BV(H08);<br />   PORT(D) = _BV(M01) | _BV(M02) | _BV(M04) | _BV(M08) |<br />             _BV(M16) | _BV(M32) | _BV(KEY);<br />}<br /><br />//////////////////////////////////////////////////////////<br />// GLOBAL<br />//////////////////////////////////////////////////////////<br /><br />volatile uint8_t g_Mode = DISP_MODE_TO_OFF;<br /><br />volatile uint16_t g_BellMode = 0;<br /><br />volatile uint8_t g_DisplaySec = 0;<br />volatile uint8_t g_DisplayBlink = 0;<br />volatile uint8_t g_DisplayPhase = 0;<br />volatile uint16_t g_DisplayDelay = 0;<br /><br />//////////////////////////////////////////////////////////<br />// MAIN<br />//////////////////////////////////////////////////////////<br /><br />int main(void)<br />{<br />   //konfiguracja portów - wyjść<br />   DDR(C) = _BV(H01) | _BV(H02) | _BV(H04) | _BV(H08);<br />   DDR(D) = _BV(M01) | _BV(M02) | _BV(M04) | _BV(M08) | _BV(M16) | _BV(M32);<br /><br />   //wyłączenie komparatora analogowego (oszczędność prądu)<br />   ACSR = _BV(ACD);<br /><br />   //ustawienie timera 0 do obsługi wyświetlacza<br />   TIMSK = _BV(TOIE0);             //Obsługa T/C<br />   TCNT0 = 0x00;<br />   TCCR0 = _BV(CS02);              //prescaler/256<br /><br />   //ustawienie timera 2 do obsługi zliczania czasu z zewnętrznego kwarcu w trybie asynchronicznym<br />   TIMSK |= _BV(TOIE2);            //Obsługa T/C Overflow Interrupt Enable<br />   ASSR  = _BV(AS2);<br />   TCNT2 = 0x00;<br />   TCCR2 = _BV(CS22) | _BV(CS21);  //prescaler/256 -2sek<br /><br />   //umożliwienie usypiania<br />   MCUCR = _BV(SE);<br /><br />   //czas początkowy<br />   g_CurrTime.Sec=0;<br />   g_CurrTime.Min=0;<br />   g_CurrTime.Hour=12;<br /><br />   g_DispTime = g_CurrTime;<br /><br />   //wartość korekcji czasu<br />   g_CorrectionValue=eeprom_read_byte(&amp;CorrectionValue);<br />   if(g_CorrectionValue&gt;15) g_CorrectionValue=0;<br /><br />   ClearDisplay();<br /><br />   //globalne zezwolenie na przerwania<br />   sei();<br /><br />   for(;;)<br />   {<br />      //obsługa klawisza<br />      if(!(PIN(D) &amp; _BV(KEY))) //czy wcisniety<br />      {<br />         _delay_ms(10);<br />         //jednak wcisciety<br />         if(!(PIN(D) &amp; _BV(KEY)))<br />         {<br />            //wyzeruj czas wcinięcia<br />            g_DisplayDelay = 0;<br /><br />            //nadal wciśnięty<br />            while (!(PIN(D) &amp; _BV(KEY)))<br />            {<br />               _delay_ms(10);<br /><br />               //tryb mrugania co minutę<br />               if((DISP_MODE_SET==g_Mode)&amp;&amp;(g_DisplayDelay&gt;=STEP_DELAY))<br />               {<br />                  if(g_BellMode&gt;0)<br />                     SetDisplayBin(0,0);<br />                  else<br />                     SetDisplayBin(15,63);<br />               }<br />               else<br />               //tryb korekcji<br />               if((DISP_MODE_SETH==g_Mode)&amp;&amp;(g_DisplayDelay&gt;=CORRECTION_DELAY))<br />               {<br />                  SetDisplayBin(g_CorrectionValue,SYMB_CR);<br />               }<br />               else<br />               //inne tryby ustawień<br />               if(g_DisplayDelay&gt;=STEP_DELAY)<br />               {<br />                  if(DISP_MODE_SETH==g_Mode)  SetDisplayBin(g_DispTime.Min,SYMB_HI);<br />                  if(DISP_MODE_SETM==g_Mode)  SetDisplayBin(g_DispTime.Sec,SYMB_LO);<br />                  if(DISP_MODE_SETN==g_Mode)<br />                  {<br />                     g_DisplayBlink = 0;<br />                     SetDisplayBin(g_DispTime.Hour,g_DispTime.Min*10+g_DispTime.Sec);<br />                  }<br />                  if(DISP_MODE_SETC==g_Mode)<br />                  {<br />                     g_DisplayBlink = 0;<br />                     SetDisplayBin(g_DispTime.Hour,SYMB_CR);<br />                  }<br />               }<br /><br />            }<br />            //zwolniony<br />            switch(g_Mode)<br />            {<br />               case DISP_MODE_BIN: if(g_DisplayDelay&lt;STEP_DELAY) g_Mode=DISP_MODE_POV;<br />                                   else g_Mode=DISP_MODE_TO_OFF;<br />                                   break;<br />               case DISP_MODE_BIN2: g_Mode=DISP_MODE_TO_OFF;<br />                                   break;<br />               case DISP_MODE_POV: if(g_DisplayDelay&lt;STEP_DELAY) g_Mode=DISP_MODE_SET;<br />                                   else g_Mode=DISP_MODE_TO_OFF;<br />                                   break;<br />               case DISP_MODE_SET: if(g_DisplayDelay&lt;STEP_DELAY)<br />                                    {<br />                                       //przejdź do trybu ustawiania godzin<br />                                       g_DisplayBlink = 1;<br />                                       g_Mode=DISP_MODE_SETH;<br />                                       SetDisplayBin(g_DispTime.Hour,0);<br />                                       //przelicz na jedności(Sec) i dziesiątki minut(Min)<br />                                       g_DispTime.Sec=g_DispTime.Min%10;<br />                                       g_DispTime.Min=g_DispTime.Min/10;<br />                                    }<br />                                    else<br />                                    if(g_DisplayDelay&gt;=STEP_DELAY)<br />                                    {<br />                                       //przełącz tryb mrugania co minutę<br />                                       if(g_BellMode&gt;0)<br />                                          g_BellMode = 0;<br />                                       else<br />                                          g_BellMode = BELL_2SECONDS;<br />                                       g_Mode=DISP_MODE_TO_OFF;<br />                                    }<br />                                    break;<br />               case DISP_MODE_SETH: if(g_DisplayDelay&lt;STEP_DELAY)<br />                                    {<br />                                       //inkrementuj godzinę<br />                                       g_DispTime.Hour++;<br />                                       if(g_DispTime.Hour&gt;12) g_DispTime.Hour=1;<br />                                       SetDisplayBin(g_DispTime.Hour,0);<br />                                    }<br />                                    else<br />                                    if(g_DisplayDelay&gt;=CORRECTION_DELAY)<br />                                    {<br />                                       //przełącz w tryb ustawiania korekcji czasu<br />                                       g_Mode=DISP_MODE_SETC;<br />                                       g_DispTime.Hour=g_CorrectionValue;<br />                                       SetDisplayBin(g_DispTime.Hour,SYMB_CR);<br />                                    }<br />                                    else<br />                                    {<br />                                       //przełącz w tryb ustawiania dziesiatek minut<br />                                       g_Mode=DISP_MODE_SETM;<br />                                       SetDisplayBin(g_DispTime.Min,SYMB_HI);<br />                                    }<br />                                    break;<br />               case DISP_MODE_SETM: if(g_DisplayDelay&lt;STEP_DELAY)<br />                                    {<br />                                       //inkrementuj dziesiątki minut<br />                                       g_DispTime.Min++;<br />                                       if(g_DispTime.Min&gt;5) g_DispTime.Min=0;<br />                                       SetDisplayBin(g_DispTime.Min,SYMB_HI);<br />                                    }<br />                                    else<br />                                    {<br />                                       //przełącz w tryb ustawiania jedności minut<br />                                       g_Mode=DISP_MODE_SETN;<br />                                       SetDisplayBin(g_DispTime.Sec,SYMB_LO);<br />                                    }<br />                                    break;<br />               case DISP_MODE_SETN: if(g_DisplayDelay&lt;STEP_DELAY)<br />                                    {<br />                                       //inkrementuj jedności minut<br />                                       g_DispTime.Sec++;<br />                                       if(g_DispTime.Sec&gt;9) g_DispTime.Sec=0;<br />                                       SetDisplayBin(g_DispTime.Sec,SYMB_LO);<br />                                    }<br />                                    else<br />                                    {<br />                                       //ustaw obowiązujący czas<br />                                       g_DispTime.Min=g_DispTime.Min*10+g_DispTime.Sec;<br />                                       g_DispTime.Sec=0;<br />                                       g_CurrTime=g_DispTime;<br />                                       g_Mode=DISP_MODE_TO_OFF;<br />                                    }<br />                                    break;<br />               case DISP_MODE_SETC: if(g_DisplayDelay&lt;STEP_DELAY)<br />                                    {<br />                                       //inkrementuj zmienną pomocniczą korekcji<br />                                       g_DispTime.Hour++;<br />                                       if(8==g_DispTime.Hour) g_DispTime.Hour==9;<br />                                       if(g_DispTime.Hour&gt;15) g_DispTime.Hour=0;<br />                                       SetDisplayBin(g_DispTime.Hour,SYMB_CR);<br />                                    }<br />                                    else<br />                                    {<br />                                       //ustaw obowiązującą wartość korekcji<br />                                       if(g_CorrectionValue!=g_DispTime.Hour)<br />                                       {<br />                                          g_CorrectionValue=g_DispTime.Hour;<br />                                          eeprom_write_byte(&amp;CorrectionValue,g_CorrectionValue);<br />                                       }<br />                                       g_DispTime = g_CurrTime;<br />                                       g_Mode=DISP_MODE_TO_OFF;<br />                                    }<br />                                    break;<br />            }<br />         }<br />      }<br /><br />      //obsługa zwłoki (czy za długo nic się nie dzieje?)<br />      switch(g_Mode)<br />      {<br />         case DISP_MODE_POV: if(g_DisplayDelay&gt;POV_DELAY) g_Mode=DISP_MODE_TO_OFF; break;<br />         case DISP_MODE_BIN2:<br />         case DISP_MODE_SET: if(g_DisplayDelay&gt;SET_DELAY) g_Mode=DISP_MODE_TO_OFF; break;<br />         case DISP_MODE_BIN:<br />         case DISP_MODE_SETH:<br />         case DISP_MODE_SETM:<br />         case DISP_MODE_SETN:<br />         case DISP_MODE_SETC: if(g_DisplayDelay&gt;LONG_DELAY) g_Mode=DISP_MODE_TO_OFF; break;<br />      }<br /><br />      //przygotowanie do uśpienia<br />      if(DISP_MODE_TO_OFF==g_Mode)<br />      {<br />         //ustawinie obsługi przerwania Int0...<br />         GICR = _BV(INT0);<br />         //zgaszenie wyświetlacza<br />         ClearDisplay();<br />         g_DisplaySec = 0;<br />         g_DisplayBlink = 0;<br />         g_Mode=DISP_MODE_OFF;<br />      }<br /><br />      //przejście w uśpienie<br />      if(DISP_MODE_OFF==g_Mode)<br />      {<br />         set_sleep_mode(SLEEP_MODE_PWR_SAVE);<br />         sleep_mode();<br />      }<br />   }<br />   return 0;<br />}<br /><br />//////////////////////////////////////////////////////////<br />// SIGNAL<br />//////////////////////////////////////////////////////////<br /><br />// Przycisk<br />SIGNAL(SIG_INTERRUPT0)<br />{<br />   if(DISP_MODE_OFF==g_Mode)<br />   {<br />      //wyłączenie obsługi przerwania INT0<br />      GICR = 0;<br /><br />      //obliczenie czasu do wyświetlenia<br />      g_DispTime = g_CurrTime;<br />      SetDisplayBin(g_DispTime.Hour,g_DispTime.Min);<br />      SetDisplayPov(g_DispTime.Hour,g_DispTime.Min);<br /><br />      //przełączenie na wyświetlanie BIN<br />      g_DisplayDelay = 0;<br />      g_Mode = DISP_MODE_BIN;<br />   }<br />}<br /><br />// Wyświetlanie<br />SIGNAL(SIG_OVERFLOW0)<br />{<br />   //wartość początkowa<br />   TCNT0 = 249;<br /><br />   //inkrementacja dla obsługi klawiatury<br />   if(DISP_MODE_OFF!=g_Mode)<br />      g_DisplayDelay++;<br /><br />   //tryb widmowy POV<br />   if(DISP_MODE_POV==g_Mode)<br />   {<br />      ClearDisplay();<br />      ShowDisplayPov();<br />   }<br /><br />   //tryb binarny (wyświetlania i nastawiania)<br />   if(DISP_MODE_BIN==g_Mode ||<br />      DISP_MODE_BIN2==g_Mode ||<br />      DISP_MODE_SET==g_Mode ||<br />      DISP_MODE_SETH==g_Mode ||<br />      DISP_MODE_SETM==g_Mode ||<br />      DISP_MODE_SETN==g_Mode ||<br />      DISP_MODE_SETC==g_Mode)<br />   {<br />      g_DisplayPhase++;<br /><br />      if(0==g_DisplayBlink || g_DisplayPhase&lt;=BLINK_DELAY)<br />      {<br />         //pojedyncze mignięcie co 2 sekundy<br />         if(g_DisplaySec&gt;0)<br />         {<br />            g_DisplaySec = 0;<br />            PORT(C) = 0;<br />            PORT(D) = _BV(KEY);<br />         }<br />         //wyświetlanie czasu<br />         else<br />         {<br />            ShowDisplayBin();<br />         }<br />      }<br />      //przerwa w wyświetlaniu (mruganie w trybie ustawiania)<br />      else<br />      {<br />         ClearDisplay();<br />      }<br />   }<br />}<br /><br />// Zliczanie czasu<br />SIGNAL(SIG_OVERFLOW2)<br />{<br />   //inkrementacja bieżącego czasu<br />   g_CurrTime.Sec+=SECOND_TO_ADD;<br /><br />   if(g_CurrTime.Sec&gt;=60)<br />   {<br />      g_CurrTime.Sec=g_CurrTime.Sec-60;<br />      g_CurrTime.Min++;<br />   }<br />   if(g_CurrTime.Min&gt;=60)<br />   {<br />      g_CurrTime.Min=g_CurrTime.Min-60;<br />      g_CurrTime.Hour++;<br />   }<br />   if(g_CurrTime.Hour&gt;12)<br />   {<br />      g_CurrTime.Hour=g_CurrTime.Hour-12;<br />   }<br /><br />   //korekcja czasu<br />   g_CurrTime.Sec+=CalculateCorrectionTime();<br /><br />   //ustawienie aktualnego czasu dla wyświetlacza w trybie BIN<br />   if(((DISP_MODE_BIN==g_Mode)||(DISP_MODE_BIN2==g_Mode))&amp;&amp;<br />       (g_CurrTime.Min!=g_DispTime.Min))<br />   {<br />      g_DispTime = g_CurrTime;<br />      SetDisplayBin(g_DispTime.Hour,g_DispTime.Min);<br />   }<br /><br />   //tryb mrugania co minutę<br />   if(g_BellMode&gt;0)<br />   {<br />      g_BellMode--;<br />      if((DISP_MODE_OFF==g_Mode)&amp;&amp;((0==g_CurrTime.Sec)||(1==g_CurrTime.Sec)||<br />                                   (15==g_CurrTime.Sec)||(16==g_CurrTime.Sec)||<br />                                   (30==g_CurrTime.Sec)||(31==g_CurrTime.Sec)||<br />                                   (45==g_CurrTime.Sec)||(46==g_CurrTime.Sec)))<br />      {<br />         g_DispTime = g_CurrTime;<br />         SetDisplayBin(g_DispTime.Hour,g_DispTime.Min);<br />         g_Mode = DISP_MODE_BIN2;<br />         g_DisplayDelay = 0;<br />         GICR = 0;<br />      }<br />   }<br /><br />   //ustawienie mrugnięcia co 2 sek<br />   if(DISP_MODE_BIN==g_Mode ||<br />      DISP_MODE_BIN2==g_Mode ||<br />      DISP_MODE_SET==g_Mode)<br />   {<br />      g_DisplaySec = 1;<br />   }<br />}<br /><br />//////////////////////////////////////////////////////////<br />// KONIEC<br />//////////////////////////////////////////////////////////<br /><br />[/syntax]<br />źródło<br /><!-- m --><a class="postlink" href="http://elportal.pl/ftp_05/201107avt2983.zip">http://elportal.pl/ftp_05/201107avt2983.zip</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=78">miszczo</a> — 26 kwi 2012, o 18:34</p><hr />
]]></content>
</entry>
</feed>