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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-08-08T07:27:46+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=3799&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-08-08T07:27:46+01:00</updated>
<published>2013-08-08T07:27:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3799&amp;p=44823#p44823</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3799&amp;p=44823#p44823"/>
<title type="html"><![CDATA[Re: Obsługa RTC dla leniwych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3799&amp;p=44823#p44823"><![CDATA[
Jeśli nie do końca rozumiecie np co to jest:<br /><br /><div class="quotetitle">Paul Dirac napisał(a):</div><div class="quotecontent"><br />&quot;-bed=pen+mad.&quot;[m]<br /></div><br /><br />to zajrzyjcie tutaj <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2013/08/amigowka-w-c-ale-pouczajaca.html" >http://mirekk36.blogspot.com/2013/08/am ... ajaca.html</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 8 sie 2013, o 07:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PawelGaj]]></name></author>
<updated>2013-08-07T21:23:07+01:00</updated>
<published>2013-08-07T21:23:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3799&amp;p=44808#p44808</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3799&amp;p=44808#p44808"/>
<title type="html"><![CDATA[Re: Obsługa RTC dla leniwych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3799&amp;p=44808#p44808"><![CDATA[
<div class="quotetitle">Paul Dirac napisał(a):</div><div class="quotecontent"><br />W sumie nie rozumiem tego fragmentu, domyslam się, że to ma przeliczyć dzień i tydzień roku<br />[syntax=c]y-=m&lt;3;<br />        uint8_t weekday;<br />        weekday = (y+y/4-y/100+y/400+&quot;-bed=pen+mad.&quot;&#91;m&#93;+d)%7;<br /> <br />        return weekday;[/syntax]<br /><br />A co do kodu, spoko.<br /></div><br />A to z internetu jest, działa więc zostawiłem <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> Funkcja ta oblicza dzień tygodnia<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=784">PawelGaj</a> — 7 sie 2013, o 21:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Paul Dirac]]></name></author>
<updated>2013-08-07T21:22:23+01:00</updated>
<published>2013-08-07T21:22:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3799&amp;p=44807#p44807</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3799&amp;p=44807#p44807"/>
<title type="html"><![CDATA[Re: Obsługa RTC dla leniwych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3799&amp;p=44807#p44807"><![CDATA[
W sumie nie rozumiem tego fragmentu, domyslam się, że to ma przeliczyć dzień i tydzień roku<br />[syntax=c]y-=m&lt;3;<br />        uint8_t weekday;<br />        weekday = (y+y/4-y/100+y/400+&quot;-bed=pen+mad.&quot;&#91;m&#93;+d)%7;<br /> <br />        return weekday;[/syntax]<br /><br />A co do kodu, spoko.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1035">Paul Dirac</a> — 7 sie 2013, o 21:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-08-07T21:03:28+01:00</updated>
<published>2013-08-07T21:03:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3799&amp;p=44805#p44805</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3799&amp;p=44805#p44805"/>
<title type="html"><![CDATA[Re: Obsługa RTC dla leniwych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3799&amp;p=44805#p44805"><![CDATA[
Bardzo mi się podobają takie usprawnienia &quot;dla leniwych&quot; <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> — 7 sie 2013, o 21:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PawelGaj]]></name></author>
<updated>2013-08-07T20:44:32+01:00</updated>
<published>2013-08-07T20:44:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3799&amp;p=44802#p44802</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3799&amp;p=44802#p44802"/>
<title type="html"><![CDATA[Obsługa RTC dla leniwych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3799&amp;p=44802#p44802"><![CDATA[
Witam,<br />Ostatnio zacząłem się bawić RTC, i myśleć jakby to zautomatyzować aby wszystko się działo &quot;w tle&quot;, było uniwersalne i wygodnie się tego używało. Starałem się również aby zajmował jak najmniej miejsca w pamięci, jednak to nie było moim głównym piorytetem. Biblioteka może działać i z LCD monochromatycznymi takimi jak HD44780 czy KS0108. Może również działać z kolorowymi, lub w ogóle bez wyświetlacza. Wszystko jest oparte na wskaźnikach do funkcji.<br /><br />Inicjalizacja RTC odbywa się w następujący sposób :<br />[syntax=c]RTCIntInit();// Init przerwania zewnetrznego<br />RTCTimeStructInit(&amp;Czas, 2, 0, 1, ':', lcd_str, lcd_locate);<br />RTCDataStructInit(&amp;Czas, 0, 1, 1, '.', lcd_str, lcd_locate);<br /><br />while(1)<br />{<br />RTCEvent();<br />}[/syntax]<br />Najpierw init przerwania zewnętrznego. Potem struktury RTC. Parametry są następujące. Wskaźnik na strukturę, lokalizacja na wyświetlaczu - szerokość i wysokość, separator czasu i wskaźnik do funkcji wyświetlającej tekst na wyświetlaczu i ustawianie kursora w odpowiednim miejscu. Dla kolorowego wyświetlacza jest tak samo, tylko dodane są parametry koloru tekstu i tła.<br /><br />Możemy sobie również dodawać callback`i. W tej bibliotece są one rozbudowane. Nie ma jednego callbacka, zamiast jednego są cztery. Odpowiednio przed odczytem czasu, po odczycie czasu i analogicznie dla daty. Można zadawać sobie pytanie &quot;po co ?&quot;. Przytoczę tutaj jeden przykład. Mamy sobie kolorowego LCD, wyświetlanie działa, jednak teksty z każdym odczytem daty i czasu brzydko się nakładają jeden na drugi. Tu z pomocą przychodzą callbacki przed odczytem. Wtedy rejestrujemy sobie callbacka, w funkcji callbacka czyścimy sobie fragment LCD aby nie usunąć reszty wyświetlacza i wszystko śmiga. Owszem, można dać czyszczenie tego fragmentu w pętli while, jednak wyświetliłby się ten tekst, minęła by chwila i za drugim obiegiem pętli while wszystko by się usunęło i byśmy mogli w ogóle nie zobaczyć tego tekstu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. <br /><br />Biblioteka również umożliwia udostępnianie czasu bibliotece FatFS <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Jeszcze jedna drobniutka zaleta. Chodzi mi o funkcje RTCSaveRegister. Przy użyciu enumeratora który jest już w bibliotece możemy pięknie sobie zapisywać cokolwiek chcemy do RTC. Przykład z godziną :<br />[syntax=c]RTCSaveRegister(21, Godzina);[/syntax]<br />Niby nic, a cieszy <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<br /><br />Teraz kod <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />PCF8583.c :<br />[syntax=c]/*<br /> * PCF8583.c<br /> *<br /> *  Created on: 07-08-2013<br /> *      Author: Pawel<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;PCF8583.h&quot;<br />#include &quot;../I2C/I2C.h&quot;<br /><br />#if FAT_FS == 1<br />#include &quot;rtc.h&quot;// Tu ustawiamy lokalizacje pliku rtc.h<br />#endif<br /><br />T_TIME *TimeStruct;<br /><br />enum {x02,x03,x04,x05,x06,x07};<br />uint8_t Bufor&#91;6&#93;;<br /><br />volatile uint8_t RTCIntFlag;<br /><br />void ParseTime(uint8_t *Val1, uint8_t *Val2, uint8_t *Val3, char *Separator, char *Output);<br />uint8_t Dec2Bcd(uint8_t dec);<br />uint8_t Bcd2Dec(uint8_t bcd);<br />uint8_t DniTygodnia (uint8_t m, uint8_t d, uint16_t y);<br />void RTCReadTime(void);<br /><br />void RTCEvent(void)<br />{<br />if(RTCIntFlag)<br />{<br />RTCReadTime();<br />RTCIntFlag = 0;<br />}<br />}<br /><br />// ###############################<br />// ########## CALLBACKI ##########<br />// ###############################<br />#if TIME_PRE_CALLBACK == 1<br />void (*RTCTimePreCallback)();<br /><br />void RTCRegisterTimePreCallback(void(*Callback)())<br />{<br />RTCTimePreCallback = Callback;<br />}<br />#endif<br /><br />#if TIME_POST_CALLBACK == 1<br />void (*RTCTimePostCallback)();<br /><br />void RTCRegisterTimePostCallback(void(*Callback)())<br />{<br />RTCTimePostCallback = Callback;<br />}<br />#endif<br /><br />#if DATA_PRE_CALLBACK == 1<br />void (*RTCDataPreCallback)();<br /><br />void RTCRegisterDataPreCallback(void(*Callback)())<br />{<br />RTCDataPreCallback = Callback;<br />}<br />#endif<br /><br />#if DATA_POST_CALLBACK == 1<br />void (*RTCDataPostCallback)();<br /><br />void RTCRegisterDataPostCallback(void(*Callback)())<br />{<br />RTCDataPostCallback = Callback;<br />}<br />#endif<br /><br />void RTCIntInit(void)<br />{<br />#if RTC_INT == INT0<br />MCUCR |= (1&lt;&lt;ISC01);// wyzwalanie zboczem opadającym<br />GICR |= (1&lt;&lt;INT0);// odblokowanie przerwania<br />PORTD |= (1&lt;&lt;PD2);// podciągnięcie pinu INT0 do VCC<br />#endif<br /><br />#if RTC_INT == INT1<br />MCUCR |= (1&lt;&lt;ISC11);<br />GICR |= (1&lt;&lt;INT1);<br />PORTD |= (1&lt;&lt;PD3);<br />#endif<br /><br />#if RTC_INT == INT2<br />GICR |= (1&lt;&lt;INT2);<br />PORTB |= (1&lt;&lt;PB2);<br />#endif<br /><br />I2C_SetBitrate(I2C_BITRATE_KHZ);<br />}<br /><br />#if USE_LCD == 1<br /><br /><br />#if USE_COLOR_LCD == 1<br /><br />// ########## COLOR LCD ##########<br />void RTCTimeStructInit(T_TIME *Struct, int x, int y, uint16_t ForegroundColor, uint16_t BackgroundColor, uint8_t Show, char Separator, void(*LcdString), void(*LcdLocate))<br />{<br />Struct -&gt; TimeX = x;<br />Struct -&gt; TimeY = y;<br />Struct -&gt; TimeForegroundColor= ForegroundColor;<br />Struct -&gt; TimeBackgroundColor= BackgroundColor;<br />Struct -&gt; TimeShow = Show;<br />Struct -&gt; TimeSeparator&#91;0&#93; = Separator;<br />Struct -&gt; TimeLcdColorLocate = LcdLocate;<br />Struct -&gt; TimeLcdColorStr = LcdString;<br />TimeStruct = Struct;<br />}<br /><br />void RTCDataStructInit(T_TIME *Struct, int x, int y, uint16_t ForegroundColor, uint16_t BackgroundColor, uint8_t Show, char Separator, void(*LcdString), void(*LcdLocate))<br />{<br />Struct -&gt; DataX = x;<br />Struct -&gt; DataY = y;<br />Struct -&gt; DataForegroundColor= ForegroundColor;<br />Struct -&gt; DataBackgroundColor= BackgroundColor;<br />Struct -&gt; DataShow = Show;<br />Struct -&gt; DataSeparator&#91;0&#93; = Separator;<br />Struct -&gt; DataLcdColorLocate = LcdLocate;<br />Struct -&gt; DataLcdColorStr = LcdString;<br />TimeStruct = Struct;<br />}<br />#endif<br /><br />#if USE_COLOR_LCD == 0<br /><br />// ########## MONOCHROME LCD ##########<br />// ########## COLOR LCD ##########<br />void RTCTimeStructInit(T_TIME *Struct, int x, int y, uint8_t Show, char Separator, void(*LcdString), void(*LcdLocate))<br />{<br />Struct -&gt; TimeX = x;<br />Struct -&gt; TimeY = y;<br />Struct -&gt; TimeShow = Show;<br />Struct -&gt; TimeSeparator&#91;0&#93; = Separator;<br />Struct -&gt; TimeLcdLocate = LcdLocate;<br />Struct -&gt; TimeLcdStr = LcdString;<br />TimeStruct = Struct;<br />}<br /><br />void RTCDataStructInit(T_TIME *Struct, int x, int y, uint8_t Show, char Separator, void(*LcdString), void(*LcdLocate))<br />{<br />Struct -&gt; DataX = x;<br />Struct -&gt; DataY = y;<br />Struct -&gt; DataShow = Show;<br />Struct -&gt; DataSeparator&#91;0&#93; = Separator;<br />Struct -&gt; DataLcdLocate = LcdLocate;<br />Struct -&gt; DataLcdStr = LcdString;<br />TimeStruct = Struct;<br />}<br />#endif<br />#endif<br /><br />#if USE_LCD == 0<br />// ########## NO LCD ##########<br />void RTCTimeStructInit(T_TIME *Struct, char Separator)<br />{<br />Struct -&gt; TimeSeparator&#91;0&#93; = Separator;<br />TimeStruct = Struct;<br />}<br /><br />void RTCDataStructInit(T_TIME *Struct, char Separator)<br />{<br />Struct -&gt; DataSeparator&#91;0&#93; = Separator;<br />TimeStruct = Struct;<br />}<br />#endif<br /><br />void RTCReadTime(void)<br />{<br />if(TimeStruct)// Zabezpieczenie na wypadek pustego wskaźnika<br />{<br /><br />#if TIME_PRE_CALLBACK == 1<br />if(RTCTimePreCallback)RTCTimePreCallback();<br />#endif<br /><br />I2C_read_buf( PCF8583_ADDR, 0x02, 5, Bufor );// Odczytaj czas z RTC do bufora w formacie BCD<br /><br />TimeStruct -&gt; Sekunda = Bcd2Dec(Bufor&#91;x02&#93;);// Odczytaj sekunde i przekonwertuj na dec<br />TimeStruct -&gt; Minuta = Bcd2Dec(Bufor&#91;x03&#93;);<br />TimeStruct -&gt; Godzina = Bcd2Dec(Bufor&#91;x04&#93;);<br />TimeStruct -&gt; Dzien = Bcd2Dec(Bufor&#91;x05&#93; &amp; 0b00111111);// Odczytaj dzien, zamaskuj odpowiednie bity i przekonwertuj na dec<br />TimeStruct -&gt; Miesiac = Bcd2Dec(Bufor&#91;x06&#93; &amp; 0b00011111);// Odczytaj miesiac, zamaskuj odpowiednie bity i przekonwertuj na dec<br />TimeStruct -&gt; Rok = 13;<br />TimeStruct -&gt; DzienTygodnia = DniTygodnia(TimeStruct -&gt; Miesiac, TimeStruct -&gt; Dzien, (TimeStruct -&gt; Rok) + 2000);<br /><br /><br />// ######################################################<br />// ########## Przygotowywanie stringa z czasem ##########<br />// ######################################################<br /><br />ParseTime(&amp;TimeStruct -&gt; Godzina, &amp;TimeStruct -&gt; Minuta, &amp;TimeStruct -&gt; Sekunda, &amp;TimeStruct -&gt; TimeSeparator&#91;0&#93;, TimeStruct -&gt; TimeString);// Przygotuj stringa z czasem<br />#if USE_LCD == 1<br />#if USE_COLOR_LCD == 1<br /><br />if(TimeStruct -&gt; TimeShow)// Jesli zmienna odpowiedzialna za pokazywanie daty == 1 to wyswietl czas na podanej lokalizacji<br />{<br />if(TimeStruct -&gt; TimeLcdColorLocate) TimeStruct -&gt; TimeLcdColorLocate(TimeStruct -&gt; TimeX, TimeStruct -&gt; TimeY);// Ustaw kursor w podanym wczesniej miejscu<br />if(TimeStruct -&gt; TimeLcdColorStr) TimeStruct -&gt; TimeLcdColorStr(TimeStruct -&gt; TimeString, TimeStruct -&gt; TimeForegroundColor, TimeStruct -&gt; TimeBackgroundColor);// I wyswietl string z data na wyswietlaczu<br />}<br /><br />#endif<br /><br />#if USE_COLOR_LCD == 0<br /><br />if(TimeStruct -&gt; TimeShow)// Jesli zmienna odpowiedzialna za pokazywanie daty == 1 to wyswietl Time na podanej lokalizacji<br />{<br />if(TimeStruct -&gt; TimeLcdLocate) TimeStruct -&gt; TimeLcdLocate(TimeStruct -&gt; TimeX, TimeStruct -&gt; TimeY);// Ustaw kursor w podanym wczesniej miejscu<br />if(TimeStruct -&gt; TimeLcdStr) TimeStruct -&gt; TimeLcdStr(TimeStruct -&gt; TimeString);// I wyswietl string z data na wyswietlaczu<br />}<br /><br />#endif<br />#endif<br /><br />#if TIME_POST_CALLBACK == 1<br />if(RTCTimePostCallback)RTCTimePostCallback();<br />#endif<br /><br />// ####################################################<br />// ########## Przygotowywanie stringa z data ##########<br />// ####################################################<br /><br />#if DATA_PRE_CALLBACK == 1<br />if(RTCDataPreCallback)RTCDataPreCallback();<br />#endif<br /><br />ParseTime(&amp;TimeStruct -&gt; Dzien, &amp;TimeStruct -&gt; Miesiac, &amp;TimeStruct -&gt; Rok, &amp;TimeStruct -&gt; DataSeparator&#91;0&#93;, TimeStruct -&gt; DataString);// Przygotuj stringa z data<br /><br />#if USE_LCD == 1<br /><br />#if USE_COLOR_LCD == 1<br />if(TimeStruct -&gt; DataShow)// Jesli zmienna odpowiedzialna za pokazywanie daty == 1 to wyswietl Data na podanej lokalizacji<br />{<br />if(TimeStruct -&gt; DataLcdColorLocate) TimeStruct -&gt; DataLcdColorLocate(TimeStruct -&gt; DataX, TimeStruct -&gt; DataY);// Ustaw kursor w podanym wczesniej miejscu<br />if(TimeStruct -&gt; DataLcdColorStr) TimeStruct -&gt; DataLcdColorStr(TimeStruct -&gt; DataString, TimeStruct -&gt; DataForegroundColor, TimeStruct -&gt; DataBackgroundColor);// I wyswietl string z data na wyswietlaczu<br />}<br />#endif<br /><br />#if USE_COLOR_LCD == 0<br />if(TimeStruct -&gt; DataShow)// Jesli zmienna odpowiedzialna za pokazywanie daty == 1 to wyswietl Data na podanej lokalizacji<br />{<br />if(TimeStruct -&gt; DataLcdLocate) TimeStruct -&gt; DataLcdLocate(TimeStruct -&gt; DataX, TimeStruct -&gt; DataY);// Ustaw kursor w podanym wczesniej miejscu<br />if(TimeStruct -&gt; DataLcdStr) TimeStruct -&gt; DataLcdStr(TimeStruct -&gt; DataString);// I wyswietl string z data na wyswietlaczu<br />}<br />#endif<br />#endif<br /><br />#if DATA_POST_CALLBACK == 1<br />if(RTCDataPostCallback)RTCDataPostCallback();<br />#endif<br /><br />#if FAT_FS == 1<br />TimeToFatFS(TimeStruct);<br />#endif<br /><br />}<br />}<br /><br />void RTCSaveTime(T_TIME *Struct)<br />{<br />Bufor&#91;x02&#93; = Dec2Bcd(TimeStruct -&gt; Sekunda);<br />Bufor&#91;x03&#93; = Dec2Bcd(TimeStruct -&gt; Minuta);<br />Bufor&#91;x04&#93; = Dec2Bcd(TimeStruct -&gt; Godzina);<br />Bufor&#91;x05&#93; = Dec2Bcd(TimeStruct -&gt; Dzien);<br />Bufor&#91;x06&#93; = Dec2Bcd(TimeStruct -&gt; Miesiac);<br /><br />I2C_write_buf(PCF8583_ADDR, 0x02, 5, Bufor);<br />}<br /><br />void RTCSaveRegister(uint8_t Value, T_PCF8583Reg Register)<br />{<br />uint8_t Buff;<br /><br />Buff = Dec2Bcd(Value);<br /><br />I2C_write_buf(PCF8583_ADDR, Register, 1, &amp;Buff);<br />}<br /><br />void ParseTime(uint8_t *Val1, uint8_t *Val2, uint8_t *Val3, char *Separator, char *Output)<br />{<br />char Buf&#91;3&#93;;// Bufor dla funkcji itoa<br />uint8_t Wsk = 0;<br /><br />for(uint8_t i = 0; i &lt; strlen(Output); i++)<br />{<br />*Output = 0;<br />Output++;<br />Wsk++;<br />}<br /><br />Output -= Wsk;<br /><br />if(*Val1 &lt; 10)<br />{<br />strcat(Output, &quot;0&quot;);// To dodaj przed nia 0<br />itoa(*Val1, Buf, 10);// Przekonwertuj zmienna na string<br />strcat(Output, Buf);// I doklej na koniec parsowanego stringa<br />}<br />else<br />{<br />itoa(*Val1, Buf, 10);// Przekonwertuj zmienna na string<br />strcat(Output, Buf);// I doklej na koniec parsowanego stringa<br />}<br /><br />strcat(Output, Separator);// Doklej na koniec parsowanego stringa separator<br /><br />if(*Val2 &lt; 10)<br />{<br />strcat(Output, &quot;0&quot;);<br />itoa(*Val2, Buf, 10);<br />strcat(Output, Buf);<br />}<br />else<br />{<br />itoa(*Val2, Buf, 10);<br />strcat(Output, Buf);<br />}<br /><br />strcat(Output, Separator);<br /><br />if(*Val3 &lt; 10)<br />{<br />strcat(Output, &quot;0&quot;);<br />itoa(*Val3, Buf, 10);<br />strcat(Output, Buf);<br />}<br />else<br />{<br />itoa(*Val3, Buf, 10);<br />strcat(Output, Buf);<br />}<br />}<br /><br />uint8_t Dec2Bcd(uint8_t dec)<br />{<br />return ((dec / 10)&lt;&lt;4) | (dec % 10);<br />}<br /><br />uint8_t Bcd2Dec(uint8_t bcd)<br />{<br />    return ((((bcd) &gt;&gt; 4) &amp; 0x0F) * 10) + ((bcd) &amp; 0x0F);<br />}<br /><br />uint8_t DniTygodnia (uint8_t m, uint8_t d, uint16_t y)<br />{<br />y-=m&lt;3;<br />uint8_t weekday;<br />weekday = (y+y/4-y/100+y/400+&quot;-bed=pen+mad.&quot;&#91;m&#93;+d)%7;<br /><br />return weekday;<br />}<br /><br />#if RTC_INT == INT0<br />ISR( INT0_vect )<br />{<br />RTCIntFlag = 1;<br />}<br />#endif<br /><br />#if RTC_INT == INT1<br />ISR( INT1_vect )<br />{<br />RTCIntFlag = 1;<br />}<br />#endif<br /><br />#if RTC_INT == INT2<br />ISR( INT2_vect )<br />{<br />RTCIntFlag = 1;<br />}<br />#endif<br /><br />#if FAT_FS == 1<br /><br />void TimeToFatFS(T_TIME *Struktura)<br />{<br />rtc.year = 2000 + (Struktura -&gt; Rok);<br />rtc.month = Struktura -&gt; Miesiac;<br />rtc.mday = Struktura -&gt; Dzien;<br />rtc.hour = Struktura -&gt; Godzina;<br />rtc.min = Struktura -&gt; Minuta;<br />rtc.sec = Struktura -&gt; Sekunda;<br />}<br /><br />#endif[/syntax]<br /><br />PCF8583.h :<br />[syntax=c]/*<br /> * PCF8583.h<br /> *<br /> *  Created on: 07-08-2013<br /> *      Author: Pawel<br /> */<br /><br />#ifndef PCF8583_H_<br />#define PCF8583_H_<br /><br />#define USE_LCD 1<br />#define USE_COLOR_LCD 0<br /><br />#define TIME_PRE_CALLBACK0<br />#define TIME_POST_CALLBACK0<br /><br />#define DATA_PRE_CALLBACK0<br />#define DATA_POST_CALLBACK0<br /><br />#define PCF8583_ADDR 0xA2<br />#define I2C_BITRATE_KHZ 100<br />#define RTC_INT INT0// Wybor przerwania (INT0, INT1, INT2)<br /><br />#define FAT_FS 0<br /><br />typedef enum { Sekunda = 0x02, Minuta, Godzina, Dzien, Miesiac } T_PCF8583Reg;<br /><br />typedef struct TIME T_TIME;<br />struct TIME {<br />uint8_t Sekunda;<br />uint8_t Minuta;<br />uint8_t Godzina;<br />uint8_t Dzien;<br />uint8_t Miesiac;<br />uint8_t Rok;<br />uint8_t DzienTygodnia;<br /><br />char TimeString&#91;9&#93;;// Aktualny czas w formie stringa<br />char TimeSeparator&#91;2&#93;;// Separator między jednostkami, np : albo .<br /><br />#if USE_LCD == 1<br />uint8_tTimeShow:1;// Zmienna decydujaca o wyswietlaniu Timeu na wyswietlaczu (1 - Nie wyswietla, 0 - Wyswietla)<br />intTimeX;<br />intTimeY;<br />#if USE_COLOR_LCD == 1<br />uint16_t TimeForegroundColor;<br />uint16_t TimeBackgroundColor;<br />void(*TimeLcdColorStr)(char *Bufor, uint16_t ForegroundColor, uint16_t BackgroundColor);<br />void(*TimeLcdColorLocate)(int x, int y);<br />#endif<br />#if USE_COLOR_LCD == 0<br />void(*TimeLcdStr)(char *Bufor);<br />void(*TimeLcdLocate)(int x, int y);<br />#endif<br />#endif<br /><br />char DataString&#91;9&#93;;<br />char DataSeparator&#91;2&#93;;<br />#if USE_LCD == 1<br />uint8_tDataShow:1;<br />intDataX;<br />intDataY;<br />#if USE_COLOR_LCD == 1<br />uint16_t DataForegroundColor;<br />uint16_t DataBackgroundColor;<br />void(*DataLcdColorStr)(char *Bufor, uint16_t ForegroundColor, uint16_t BackgroundColor);<br />void(*DataLcdColorLocate)(int x, int y);<br />#endif<br />#if USE_COLOR_LCD == 0<br />void(*DataLcdStr)(char *Bufor);<br />void(*DataLcdLocate)(int x, int y);<br />#endif<br />#endif<br />};<br /><br />#if USE_LCD == 1<br /><br /><br />#if USE_COLOR_LCD == 1<br /><br />// ########## COLOR LCD ##########<br />void RTCTimeStructInit(T_TIME *Struct, int x, int y, uint16_t ForegroundColor, uint16_t BackgroundColor, uint8_t Show, char Separator, void(*LcdString), void(*LcdLocate));<br />void RTCDataStructInit(T_TIME *Struct, int x, int y, uint16_t ForegroundColor, uint16_t BackgroundColor, uint8_t Show, char Separator, void(*LcdString), void(*LcdLocate));<br />#endif<br /><br />#if USE_COLOR_LCD == 0<br /><br />// ########## MONOCHROME LCD ##########<br />void RTCTimeStructInit(T_TIME *Struct, int x, int y, uint8_t Show, char Separator, void(*LcdString), void(*LcdLocate));<br />void RTCDataStructInit(T_TIME *Struct, int x, int y, uint8_t Show, char Separator, void(*LcdString), void(*LcdLocate));<br />#endif<br />#endif<br /><br />#if USE_LCD == 0<br />void RTCTimeStructInit(T_TIME *Struct, char Separator);<br />void RTCDataStructInit(T_TIME *Struct, char Separator);<br />#endif<br /><br /><br />#if TIME_PRE_CALLBACK == 1<br />void RTCRegisterTimePreCallback(void(*Callback)());<br />#endif<br /><br />#if TIME_POST_CALLBACK == 1<br />void RTCRegisterTimePostCallback(void(*Callback)());<br />#endif<br /><br />#if DATA_PRE_CALLBACK == 1<br />void RTCRegisterDataPreCallback(void(*Callback)());<br />#endif<br /><br />#if DATA_POST_CALLBACK == 1<br />void RTCRegisterDataPostCallback(void(*Callback)());<br />#endif<br /><br /><br />void RTCIntInit(void);<br />void RTCEvent(void);<br />void RTCSaveTime(T_TIME *Struct);<br />void RTCSaveRegister(uint8_t Value, T_PCF8583Reg Register);<br /><br />#if FAT_FS == 1<br />void TimeToFatFS(T_TIME *Struktura);<br />#endif<br /><br />#endif /* PCF8583_H_ */[/syntax]<br /><br /><strong>Jeszcze jedna ważna rzecz. Jeżeli ktoś by próbował uruchomić tego libsa z Mirkowymi libsami do HD44780 to może się rozczarować że lokalizacja na LCD nie działa prawidłowo. Powodem tego jest że Mirek w funkcji lcd_locate ma najpierw wysokość potem szerokość. W mojej bibliotece ustawia się najpierw szerokość potem wysokość. Więc jak używamy tych bibliotek to trzeba odwrotnie wpisać w inicjalizacji struktury lokalizację na LCD. Najpierw wysokość potem szerokość <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Żeby nie było marudzenia że coś nie działa <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /></strong><br />To by było chyba na tyle <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Jeżeli znajdziecie jakiś błąd czy coś nie będzie działać - piszcie, postaram się pomóc <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=784">PawelGaj</a> — 7 sie 2013, o 20:44</p><hr />
]]></content>
</entry>
</feed>