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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-09-13T15:54:05+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=19162&amp;mode</id>
<entry>
<author><name><![CDATA[jez2000]]></name></author>
<updated>2017-09-13T15:54:05+01:00</updated>
<published>2017-09-13T15:54:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19162&amp;p=195028#p195028</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19162&amp;p=195028#p195028"/>
<title type="html"><![CDATA[Re: Problem z funcją get_datatime]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19162&amp;p=195028#p195028"><![CDATA[
Babol wstrętny znaleziony<br /><br />w linijce zamiast<br /><br />[syntax=c]TWI_read_buf( PCF8583_ADDR, 2, 5, datatime.pcf_buf);<br />TWI_read_buf( PCF8583_ADDR, 16, 2, (uint8_t*)datatime.YY );     //odczyt z pamięci RAM[/syntax]<br /><br />powinno być<br /><br />[syntax=c]TWI_read_buf( PCF8583_ADDR, 2, 5, dt-&gt;pcf_buf);<br />TWI_read_buf( PCF8583_ADDR, 16, 2, (uint8_t*)&amp;dt-&gt;YY );[/syntax]<br /><br />i nie wiem czy dobrze to rozumię czy:<br /><br />zapis:<br />[syntax=c]TWI_read_buf( PCF8583_ADDR, 2, 5, datatime.pcf_buf);[/syntax] - zapisuję wartość odczytane z PCF pod adres nie na jaki wskazuje datatime.pcf_buf tylko na adres jaki przechowuje zmienną datatime.pcf_buf?<br /><br />i tak samo<br /><br />[syntax=c]TWI_read_buf( PCF8583_ADDR, 16, 2, (uint8_t*)datatime.YY );     //odczyt z pamięci RAM[/syntax] ??<br /><br />pewnie się mylę ale nie wiem jak to przeanalizować i zrozumieć<br /><br /><br />Już wiem, p. Mirek tłumaczy to w kolejnym odcinku <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=11828">jez2000</a> — 13 wrz 2017, o 15:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jez2000]]></name></author>
<updated>2017-09-12T16:55:02+01:00</updated>
<published>2017-09-12T16:55:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19162&amp;p=194943#p194943</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19162&amp;p=194943#p194943"/>
<title type="html"><![CDATA[Re: Problem z funcją get_datatime]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19162&amp;p=194943#p194943"><![CDATA[
Korzystałem ale petla wykonuje się jeden raz i koniec.<br /><br />Wprowadziłem zmienną <span style="color: #400080"><strong>licznik</strong></span> którą mam w pętli, w kilku miejscach i widzę ile razy się wykonuje i gdzie się zatrzymuje<br /><br />[syntax=c]void get_datetime( TDATETIME * dt){<br /><br />lcd_locate(1,0);//##############pierwszy obieg 1/ drogi 5<br />lcd_int(++licznik);<br /><br />TWI_read_buf( PCF8583_ADDR, 2, 5, datatime.pcf_buf);<br /><br />lcd_locate(1,0);<br />lcd_int(++licznik);//############## pierwszy obieg 2/drogi 6<br /><br />TWI_read_buf( PCF8583_ADDR, 16, 2, (uint8_t*)datatime.YY );//odczyt z pamięci RAM<br />//rzutujemy na wskaznik uint8_t i traktujemy zmienna 16 b jako bufor:)<br /><br />int8_t i;<br />uint8_t * wsk = dt-&gt;pcf_buf;<br />#if DATATIME_AS_STRING == 1<br />char * znak = dt-&gt;time;//https://youtu.be/2qJDq2d0Qe0?t=1415<br />#endif<br />for( i=2; i&gt;-1; i-- ){<br /><br />#if DATATIME_AS_STRING == 1<br />*(znak++) = ( (*(wsk + i) &amp; ( 2==i?0x3F:0x7F) ) &gt;&gt; 4) + '0';//maskujemy /zamieniamy bufor&#91;2&#93; na ascii<br />*(znak++) = (*(wsk + i) &amp; 0x0F) + '0';<br />*(znak++) = i?':':0;<br /><br />#endif<br />*( (uint8_t*) dt  + 2 - i) = bcd2dec( *(wsk+i) );//rzutowanie zmiennej typu TDATETIME do uint8_t<br />}<br /><br />dt-&gt;DD = bcd2dec( *(wsk+3) &amp; 0x3F );<br />uint8_t yr = wsk&#91;3&#93; &gt;&gt; 6;<br /><br />if( dt-&gt;YY &gt; 2100 ) dt-&gt;YY = 2000;<br /><br />//SYLWESTROWA LINIJKA DLA PCF8583<br /><br />lcd_locate(1,0);<br />lcd_int(++licznik);//##############pierwszy obieg 3<br /><br />if( (dt-&gt;YY &amp; 3) != yr){<br />while( (dt-&gt;YY &amp; 3) !=yr ) dt-&gt;YY++;<br /><br />TWI_write_buf( PCF8583_ADDR, 16, 2, (uint8_t*)&amp;dt-&gt;YY);//traktujemy jako tablice dwu elementowa<br />}<br /><br />lcd_locate(1,0);<br />lcd_int(++licznik);//##############pierwszy obieg 4<br /><br />dt-&gt;MM = bcd2dec( *(wsk+4) &amp; 0x1F);<br />dt-&gt;weekday = wsk&#91;4&#93; &gt;&gt; 5;<br /><br />#if DATATIME_AS_STRING == 1<br /><br />znak = dt-&gt;date;<br />itoa( dt-&gt;YY, znak, 10);//rok<br />znak+=4;//przesuwamy się o 4 znaki czyli 2017<br />*(znak++) = DATE_SEPARATOR;<br /><br />*(znak++) = ( ( wsk&#91;4&#93; &amp; 0x1F ) &gt;&gt; 4 ) + '0';//miesiac 10<br />*(znak++) = ( ( wsk&#91;4&#93; &amp; 0x0F ) ) + '0';//miesac 1<br /><br />*(znak++) = DATE_SEPARATOR;<br /><br />*(znak++) = ( ( wsk&#91;3&#93; &amp; 0x1F ) &gt;&gt; 4 ) + '0';//dni dziesiatki<br />*(znak++) = ( ( wsk&#91;3&#93; &amp; 0x0F ) ) + '0';//dni<br /><br />*znak = 0;<br /><br />#endif<br /><br />}[/syntax]<br /><br />Licznik dochodzi do wartości<span style="color: #400080"><strong> 6</strong></span> co swiadczy o tym, że zatrzymuje się na odczycie z PCF a nie wiem dlaczego skoro w pierwszym obiegu odcztytało z PCF.<br /><br />Nie rozumię też dlaczego, jak zakomentuję linię <br />[syntax=c]//while( (dt-&gt;YY &amp; 3) !=yr ) dt-&gt;YY++;[/syntax]<br /><br />to pętla wykonuje się w całości co sekundę<br /><br />Kompletnie nie mogę dojść co się dzieje<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11828">jez2000</a> — 12 wrz 2017, o 16:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-09-11T15:50:05+01:00</updated>
<published>2017-09-11T15:50:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19162&amp;p=194873#p194873</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19162&amp;p=194873#p194873"/>
<title type="html"><![CDATA[Re: Problem z funcją get_datatime]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19162&amp;p=194873#p194873"><![CDATA[
<div class="quotetitle">Krystek napisał(a):</div><div class="quotecontent"><br />A korzystałeś kiedys z debuggera na jednej diodzie?<br /></div><br />BARDZO dobra sugestia <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> — 11 wrz 2017, o 15:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krystek]]></name></author>
<updated>2017-09-11T15:34:29+01:00</updated>
<published>2017-09-11T15:34:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19162&amp;p=194871#p194871</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19162&amp;p=194871#p194871"/>
<title type="html"><![CDATA[Re: Problem z funcją get_datatime]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19162&amp;p=194871#p194871"><![CDATA[
A korzystałeś kiedys z debuggera na jednej diodzie? Polecam sprawdzić : <!-- m --><a class="postlink" href="http://mirekk36.blogspot.de/2014/04/puapki-programowe-debuger-na-jednej.html" >http://mirekk36.blogspot.de/2014/04/pua ... ednej.html</a><!-- m -->  . Wstawiasz kod debugera tam gdzie spodziewasz sie błędu i obserwujesz <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=1207">Krystek</a> — 11 wrz 2017, o 15:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jez2000]]></name></author>
<updated>2017-09-10T19:41:37+01:00</updated>
<published>2017-09-10T19:41:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19162&amp;p=194840#p194840</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19162&amp;p=194840#p194840"/>
<title type="html"><![CDATA[Problem z funcją get_datatime]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19162&amp;p=194840#p194840"><![CDATA[
Cześć.<br /><br />Mam problem z funkcją get_datatime. Po skompilowaniu i wgraniu - całego kodu jak w poradniku na YT na LCD wyświetla godzinę, tyle że godzina nie aktualizuje się co sekundę. Jeżeli zakomentuję fragment z &quot;sylwestrowej linijki&quot; [syntax=c]while( (dt-&gt;YY &amp; 3) !=yr ) dt-&gt;YY++;[/syntax] to na LCD co sekundę aktualizują się sekundy co sekundę tak jak powinno. Nie wiem gdzie mam babola, nie mogę go znaleść <img src="https://forum.atnel.pl/images/smilies/icon_cry.gif" alt=":cry:" title="Płacze" /> <br /><br />[syntax=c]void get_datetime( TDATETIME * dt){<br /><br />TWI_read_buf( PCF8583_ADDR, 2, 5, datatime.pcf_buf);<br />TWI_read_buf( PCF8583_ADDR, 16, 2, (uint8_t*)datatime.YY );//odczyt z pamięci RAM<br />//rzutujemy na wskaznik uint8_t i traktujemy zmienna 16 b jako bufor:)<br />//dt-&gt;ss = bcd2dec( dt-&gt;pcf_buf&#91;0&#93; );//odwołujemy się do bufora z sekundami<br />//dt-&gt;mm = bcd2dec( dt-&gt;pcf_buf&#91;1&#93; );//odwołujemy się do bufora z sekundami<br />//dt-&gt;hh = bcd2dec( dt-&gt;pcf_buf&#91;2&#93; &amp; 0x3F );//maskujemy PM/AM, 12h<br />//<br />//sprintf( dt-&gt;time, &quot;%d:%d:%d&quot;, dt-&gt;ss, dt-&gt;mm, dt-&gt;hh);<br /><br /><br />int8_t i;<br />uint8_t * wsk = dt-&gt;pcf_buf;<br />#if DATATIME_AS_STRING == 1<br />char * znak = dt-&gt;time;//https://youtu.be/2qJDq2d0Qe0?t=1415<br />#endif<br />for( i=2; i&gt;-1; i-- ){<br /><br />#if DATATIME_AS_STRING == 1<br />*(znak++) = ( (*(wsk + i) &amp; ( 2==i?0x3F:0x7F) ) &gt;&gt; 4) + '0';//maskujemy /zamieniamy bufor&#91;2&#93; na ascii<br />*(znak++) = (*(wsk + i) &amp; 0x0F) + '0';<br />*(znak++) = i?':':0;<br />//if( i!= 0 ) *(znak++) = ':';<br />//else *(znak++) = 0;<br />#endif<br />*( (uint8_t*) dt  + 2 - i) = bcd2dec( *(wsk+i) );//rzutowanie zmiennej typu TDATETIME do uint8_t<br />//dt-&gt;hh = bcd2dec( *(wsk+i) );<br />}<br /><br />dt-&gt;DD = bcd2dec( *(wsk+3) &amp; 0x3F );<br />uint8_t yr = wsk&#91;3&#93; &gt;&gt; 6;<br /><br />if( dt-&gt;YY &gt; 2100 ) dt-&gt;YY = 2000;<br /><br />//SYLWESTROWA LINIJKA DLA PCF8583<br />if( (dt-&gt;YY &amp; 3) != yr){<br />while( (dt-&gt;YY &amp; 3) !=yr ) dt-&gt;YY++;<br />TWI_write_buf( PCF8583_ADDR, 0x10, 2, (uint8_t*)&amp;dt-&gt;YY);//traktujemy jako tablice dwu elementowa<br />}<br /><br />dt-&gt;MM = bcd2dec( *(wsk+4) &amp; 0x1F);<br />dt-&gt;weekday = wsk&#91;4&#93; &gt;&gt; 5;<br /><br />#if DATATIME_AS_STRING == 1<br /><br />znak = dt-&gt;date;<br />itoa( dt-&gt;YY, znak, 10);//rok<br />znak+=4;//przesuwamy się o 4 znaki czyli 2017<br />*(znak++) = DATE_SEPARATOR;<br /><br />*(znak++) = ( ( wsk&#91;4&#93; &amp; 0x1F ) &gt;&gt; 4 ) + '0';//miesiac 10<br />*(znak++) = ( ( wsk&#91;4&#93; &amp; 0x0F ) ) + '0';//miesac 1<br /><br />*(znak++) = DATE_SEPARATOR;<br /><br />*(znak++) = ( ( wsk&#91;3&#93; &amp; 0x1F ) &gt;&gt; 4 ) + '0';//dni dziesiatki<br />*(znak++) = ( ( wsk&#91;3&#93; &amp; 0x0F ) ) + '0';//dni<br /><br />*znak = 0;<br /><br />#endif<br /><br /><br />}[/syntax]<br /><br /><br />main.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/wdt.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;MK_USART/mkuart.h&quot;<br />#include &quot;PCF8583.h&quot;<br /><br /><br /><br />//***********deklaracje zmiennych***********<br /><br />volatile uint16_t Timer1, Timer2;<br />char uart_buf&#91;100&#93;;<br />//uint8_t get_time;<br />uint8_t actual_at_cmd;<br /><br />enum { _none, _at_gmt };<br /><br /><br />//***********deklaracje funkcji*************<br /><br />void parse_rs232( char * buf);<br />void GetNtpTime_EVENT( volatile uint16_t * tmr_100ms, uint8_t ss, uint8_t mm, uint8_t hh, void(*timer100ms)(void) );<br />void pokazuj_date_czas( TDATETIME * dt );<br /><br />int main(void){<br /><br />DDRC |= (1&lt;&lt;PC6);//migajaca dioda led<br />PORTC |= (1&lt;&lt;PC6);<br /><br />DDRC |= (1&lt;&lt;PC7);//migajaca dioda led<br />PORTC |= (1&lt;&lt;PC7);<br /><br />TCCR2 |= (1&lt;&lt;WGM21);<br />TCCR2 |= (1&lt;&lt;CS22) | (1&lt;&lt;CS21) | (1&lt;&lt;CS20);<br />OCR2 |= 107;<br />TIMSK |= (1&lt;&lt;OCIE2);<br /><br />DDRA |= (1&lt;&lt;PA7);<br />PORTA |= (1&lt;&lt;PA7);<br />lcd_init();<br /><br />USART_Init(__UBRR);<br /><br />register_uart_str_rx_event_callback( parse_rs232 );<br />init_rtc();<br />register_RTC_event_callback( pokazuj_date_czas );<br /><br />lcd_str(&quot;start...&quot;);<br /><br />sei();<br /><br />while(1){<br /><br />//UART_RX_STR_EVENT( uart_buf );<br /><br />//GetNtpTime_EVENT( &amp;Timer2, 0, 1, 0, NULL );<br /><br />RTC_EVENT();<br /><br /><br /><br />//if( !Timer1 ){<br />//PORTC ^= (1&lt;&lt;PC7);<br />//Timer1 = 25;//co 25 ms<br />//}<br /><br />}<br />}<br /><br />//************************własne funkcje**********<br /><br />void parse_rs232( char * buf){<br /><br />if( !buf&#91;0&#93; ) return;<br /><br />//uint8_t MM, DD, gg, mm, ss;<br />//uint16_t YY = 0;<br /><br />char * dt;<br />char * tm;<br /><br />//+ok=2015-04-27 20:03:15<br />if( _at_gmt == actual_at_cmd ){<br />if( !strncasecmp(&quot;+ok=&quot;, buf, 4)){<br />dt = strtok(buf, &quot;=&quot;);//w miejsce separatora &quot;=&quot; wstawia 0, i zwraca wskaznik do pierwszego tokena czyli +ok<br />dt = strtok(NULL, &quot; &quot;);// podajemy NULL, to znaczy że dalej parsuje ten sam string os ostatniego separatora czyli od 2<br />tm = strtok(NULL, &quot; &quot;);// nia ma ostatniej spacji. Ale jak nie znajdzie to funkcja trafia na 0 - koniez znaku i zwraca wsk do tokena;<br />if( 10 == strlen( dt ) &amp;&amp; 8 == strlen( tm )){<br /><br />lcd_locate(0,0);<br />lcd_str( dt );<br />lcd_locate(1,0);<br />lcd_str( tm );<br /><br />//YY = atoi( strtok(dt,&quot;-&quot;));<br />//MM = atoi( strtok(NULL,&quot;-&quot;));<br />//DD = atoi( strtok(dt,&quot;-&quot;));<br />//<br />//gg = atoi( strtok(tm,&quot;:&quot;));<br />//mm = atoi( strtok(NULL,&quot;:&quot;));<br />//ss = atoi( strtok(NULL,&quot;:&quot;));<br /><br />//ustaw_czas(gg, mm, hh);<br />}<br /><br />}<br />}<br /><br />if( !strncasecmp(&quot;AT+RST?&quot;, buf, 7)){<br />cli();<br />wdt_enable( 0 );<br />while(1);<br />}<br />}<br /><br />ISR( TIMER2_COMP_vect){<br /><br />uint16_t n;<br /><br />n = Timer1;<br />if(n) Timer1 = --n;<br /><br />n = Timer2;<br />if(n) Timer2 = --n;<br />}<br /><br />void pokazuj_date_czas( TDATETIME * dt ){<br /><br />#if DATATIME_AS_STRING == 1<br />lcd_locate(0,0);<br />lcd_str( dt-&gt;time);<br />#endif<br />}<br /><br />void GetNtpTime_EVENT( volatile uint16_t * tmr_100ms, uint8_t ss, uint8_t mm, uint8_t hh, void(*timer100ms)(void) ){<br /><br />static uint32_t ms100_tick;<br /><br />uint32_t co_ile_czasu = ( ss*10u ) + ( mm*10ul*60ul ) + ( hh*10ul*60ul*60ul);<br /><br />if( !*tmr_100ms ){<br /><br />switch ( ms100_tick ) {<br />case 0 ... 2: uart_puts(&quot;+&quot;); break;<br />case 3: uart_puts(&quot;a&quot;); break;<br />case 5: actual_at_cmd = _at_gmt; uart_puts(&quot;AT+GMT=1\r&quot;); break;//ustawienie czasu letniego<br />case 10: uart_puts(&quot;AT+ENTM\r&quot;); break;//przejscie w tryb transparetny<br />}<br />ms100_tick++;<br />if(ms100_tick &gt; co_ile_czasu) ms100_tick = 0;<br /><br />if( timer100ms ) timer100ms();<br /><br />*tmr_100ms = 10;<br />}<br />}[/syntax]<br /><br />PCF8583.c<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br /><br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br />#include &quot;PCF8583.h&quot;<br />#include &quot;LCD/lcd44780.h&quot;<br /><br /><br />volatile uint8_t int0_flag;<br /><br />TDATETIME datatime;<br /><br />//wskaxnik do funkcji callback dla zdarzenia RTC_EVENT()<br />static void (*rtc_callback)( TDATETIME * dt );<br /><br />//funkcja do rejestracji funkcji zwrotnej w zdarzeniu RTC_EVENT()<br />void register_RTC_event_callback (void (*callback)(TDATETIME *dt)){<br />rtc_callback = callback;<br />}<br /><br /><br /><br />void init_rtc( void ){<br /><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 /><br />i2cSetBitrate( 100 );<br /><br /><br /><br /><br />}<br /><br /><br /><br />void RTC_EVENT( void ){//callback - wskaźnik na funkcje<br /><br />if( int0_flag ){<br /><br />get_datetime( &amp;datatime );//tu jest cos nakutane<br /><br />if( rtc_callback ) rtc_callback( &amp;datatime );<br /><br />PORTC ^= (1&lt;&lt;PC6);<br /><br />int0_flag = 0;<br />}<br />}<br /><br />void get_datetime( TDATETIME * dt){<br /><br />TWI_read_buf( PCF8583_ADDR, 2, 5, datatime.pcf_buf);<br />TWI_read_buf( PCF8583_ADDR, 16, 2, (uint8_t*)datatime.YY );//odczyt z pamięci RAM<br />//rzutujemy na wskaznik uint8_t i traktujemy zmienna 16 b jako bufor:)<br />//dt-&gt;ss = bcd2dec( dt-&gt;pcf_buf&#91;0&#93; );//odwołujemy się do bufora z sekundami<br />//dt-&gt;mm = bcd2dec( dt-&gt;pcf_buf&#91;1&#93; );//odwołujemy się do bufora z sekundami<br />//dt-&gt;hh = bcd2dec( dt-&gt;pcf_buf&#91;2&#93; &amp; 0x3F );//maskujemy PM/AM, 12h<br />//<br />//sprintf( dt-&gt;time, &quot;%d:%d:%d&quot;, dt-&gt;ss, dt-&gt;mm, dt-&gt;hh);<br /><br /><br />int8_t i;<br />uint8_t * wsk = dt-&gt;pcf_buf;<br />#if DATATIME_AS_STRING == 1<br />char * znak = dt-&gt;time;//https://youtu.be/2qJDq2d0Qe0?t=1415<br />#endif<br />for( i=2; i&gt;-1; i-- ){<br /><br />#if DATATIME_AS_STRING == 1<br />*(znak++) = ( (*(wsk + i) &amp; ( 2==i?0x3F:0x7F) ) &gt;&gt; 4) + '0';//maskujemy /zamieniamy bufor&#91;2&#93; na ascii<br />*(znak++) = (*(wsk + i) &amp; 0x0F) + '0';<br />*(znak++) = i?':':0;<br />//if( i!= 0 ) *(znak++) = ':';<br />//else *(znak++) = 0;<br />#endif<br />*( (uint8_t*) dt  + 2 - i) = bcd2dec( *(wsk+i) );//rzutowanie zmiennej typu TDATETIME do uint8_t<br />//dt-&gt;hh = bcd2dec( *(wsk+i) );<br />}<br /><br />dt-&gt;DD = bcd2dec( *(wsk+3) &amp; 0x3F );<br />uint8_t yr = wsk&#91;3&#93; &gt;&gt; 6;<br /><br />if( dt-&gt;YY &gt; 2100 ) dt-&gt;YY = 2000;<br /><br />//SYLWESTROWA LINIJKA DLA PCF8583<br />if( (dt-&gt;YY &amp; 3) != yr){<br />while( (dt-&gt;YY &amp; 3) !=yr ) dt-&gt;YY++;<br />TWI_write_buf( PCF8583_ADDR, 0x10, 2, (uint8_t*)&amp;dt-&gt;YY);//traktujemy jako tablice dwu elementowa<br />}<br /><br />dt-&gt;MM = bcd2dec( *(wsk+4) &amp; 0x1F);<br />dt-&gt;weekday = wsk&#91;4&#93; &gt;&gt; 5;<br /><br />#if DATATIME_AS_STRING == 1<br /><br />znak = dt-&gt;date;<br />itoa( dt-&gt;YY, znak, 10);//rok<br />znak+=4;//przesuwamy się o 4 znaki czyli 2017<br />*(znak++) = DATE_SEPARATOR;<br /><br />*(znak++) = ( ( wsk&#91;4&#93; &amp; 0x1F ) &gt;&gt; 4 ) + '0';//miesiac 10<br />*(znak++) = ( ( wsk&#91;4&#93; &amp; 0x0F ) ) + '0';//miesac 1<br /><br />*(znak++) = DATE_SEPARATOR;<br /><br />*(znak++) = ( ( wsk&#91;3&#93; &amp; 0x1F ) &gt;&gt; 4 ) + '0';//dni dziesiatki<br />*(znak++) = ( ( wsk&#91;3&#93; &amp; 0x0F ) ) + '0';//dni<br /><br />*znak = 0;<br /><br />#endif<br /><br /><br />}<br /><br />//procedura ibsługi przerwania INT0<br />ISR( INT0_vect ){<br />int0_flag = 1;<br />//PORTC ^= (1&lt;&lt;PC6);<br />}<br /><br /><br />uint8_t dec2bcd(uint8_t dec) {<br />return ((dec / 10)&lt;&lt;4) | (dec % 10);<br />}<br /><br />// konwersja liczby BCD na dziesiętną<br />uint8_t bcd2dec(uint8_t bcd) {<br />    return ((((bcd) &gt;&gt; 4) &amp; 0x0F) * 10) + ((bcd) &amp; 0x0F);<br />}[/syntax]<br /><br />PCF8583.h<br /><br />[syntax=c]#ifndef PCF8583_H_<br />#define PCF8583_H_<br /><br />#define DATATIME_AS_STRING 1<br />#define DATE_SEPARATOR '-'<br /><br />#define PCF8583_ADDR 0xA2//A1 --&gt; Vcc<br /><br />typedef enum {pon, wto, sro, czw, pia, sob, nie} TDAYS;<br /><br />typedef struct{<br />uint8_t hh;<br />uint8_t mm;<br />uint8_t ss;<br />uint16_t YY;<br />uint8_t MM;<br />uint8_t DD;<br />uint8_t weekday;<br />uint8_t dst;<br />#if DATATIME_AS_STRING == 1<br />char time&#91;9&#93;;<br />char date&#91;11&#93;;<br />#endif<br />uint8_t pcf_buf&#91;5&#93;;<br /><br />} TDATETIME;<br /><br /><br />void init_rtc( void );<br /><br />void register_RTC_event_callback (void (*callback)(TDATETIME *dt));<br />void RTC_EVENT(void);<br /><br /><br />void get_datetime( TDATETIME * dt);<br /><br />uint8_t dec2bcd(uint8_t dec);<br />uint8_t bcd2dec(uint8_t bcd);<br /><br />#endif /* PCF8583_H_ */[/syntax]<br /><br /><br />Funkcja wykonuje się jeden raz, bo pobiera godzinę ale już drogi raz gdzieś się zatrzymuje i nie wiem gdzie<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11828">jez2000</a> — 10 wrz 2017, o 19:41</p><hr />
]]></content>
</entry>
</feed>