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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-07-25T15:33:35+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=3657&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-07-25T15:33:35+01:00</updated>
<published>2013-07-25T15:33:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3657&amp;p=43315#p43315</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3657&amp;p=43315#p43315"/>
<title type="html"><![CDATA[Re: Synchronizer czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3657&amp;p=43315#p43315"><![CDATA[
<div class="quotetitle">developer85 napisał(a):</div><div class="quotecontent"><br />he.. Mirek zrobił to lepiej:)<br /></div><br /><br />a tam lepiej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ale nie w C# <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ...<br /><br />więc bardzo dobrze, że takie praktyczne projekty się na naszym forum pojawiają <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> — 25 lip 2013, o 15:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[developer85]]></name></author>
<updated>2013-07-25T13:20:43+01:00</updated>
<published>2013-07-25T13:20:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3657&amp;p=43309#p43309</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3657&amp;p=43309#p43309"/>
<title type="html"><![CDATA[Re: Synchronizer czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3657&amp;p=43309#p43309"><![CDATA[
he.. Mirek zrobił to lepiej:)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=390">developer85</a> — 25 lip 2013, o 13:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xamrex]]></name></author>
<updated>2013-07-25T13:16:03+01:00</updated>
<published>2013-07-25T13:16:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3657&amp;p=43307#p43307</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3657&amp;p=43307#p43307"/>
<title type="html"><![CDATA[Re: Synchronizer czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3657&amp;p=43307#p43307"><![CDATA[
Chyba Mirek coś podobnego zrobił <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><!-- m --><a class="postlink" href="http://www.mirekk36.blogspot.com/2013/07/ucpc-time-sync-bluetoothrs232.html" >http://www.mirekk36.blogspot.com/2013/0 ... rs232.html</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=74">xamrex</a> — 25 lip 2013, o 13:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[developer85]]></name></author>
<updated>2013-07-25T12:02:05+01:00</updated>
<published>2013-07-25T12:02:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3657&amp;p=43297#p43297</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3657&amp;p=43297#p43297"/>
<title type="html"><![CDATA[Synchronizer czasu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3657&amp;p=43297#p43297"><![CDATA[
Hejka!<br />Ostatnio na forum możemy zauważyć wysyp zegarków robionych na wyświetlaczach 7-segmentowych (no w końcu obsługa wyświetlacza 7-segmentowego to jedna z pierwszych lekcji w Mirka książce &quot;<strong>Mikrokonreolery AVR Jęsyk C podstawy programowania</strong>&quot;). Ja chciałem pokazać nie co inne podejście do zrobienia takiego zegarka tzn. nie poszedłem łatwiejszą ścieżką czyli np wykorzystać zewnętrzne przerwanie od ukłądu PCF8583 i zliczać impulsy co jedną sekundę od tego układu, lub zrobić taki zegarek na timerze, lecz prosto odczytywać czas z układu PCF8583 - ponieważ sobie pomyślałem od tego Mirek go umieścił na ATB:). <br /><br />Do synchronizacji układu zegarka napisałem  prostą aplikację w c#, która poprzez port COM wysyła aktualny czas pobrany z PC - a przecież czas w komputerze jest synchronizowany z serwerami NTP więc mamy aktualny czas:). Generalnie aplikacja nic wielkiego nie robi tylko pokazuje aktualną datę i godzinę. Kiedy wciśniemy przycisk &quot;Connect&quot; połączymy się z portem COM (u mnie to COM3), i przyciskiem &quot;Send&quot; wyślemy godzinę, minuty i sekundy do procka.<br /><br />Cały myk polega na sparsowaniu w procku wysłanej godziny czyli &quot;hh:mm:ss&quot;. Oczywiście skorzystałem z biblioteki do USART-a z drugiej książki Mirka &quot;<strong>Język C Pasja Programowania mikrokontrolerów 8-bitowyc</strong>h&quot;, ale Mireczek przygotował tak biblioteki że to jest przysłowiowa bułka z masłem. Zegarek co 10 sek, wyświetla jeszcze aktualną temperaturę co myślę że udało mi się pokazać na filmie.<br /><br />fotka aplikacji:<br /><a href="http://forum.atnel.pl/_obrazki/o/390/d03d2c2dc8eeda8fe925fda698c20e3f.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/390/d03d2c2dc8eeda8fe925fda698c20e3f.jpg" alt="Obrazek" /></a><br /><br />filmik z działania zegarka:<br /><br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br /><br /><br />troszkę kodu w c#<br />[syntax=csharp]using System;<br />using System.Collections.Generic;<br />using System.ComponentModel;<br />using System.Data;<br />using System.Drawing;<br />using System.Linq;<br />using System.Text;<br />using System.Windows.Forms;<br /><br />namespace Time<br />{<br />    public partial class Time : Form<br />    {<br />        <br />        DateTime dateTime = DateTime.Now;<br />        public Time()<br />        {<br />            InitializeComponent();<br />            DateTime dateTime = DateTime.Now;<br />            timer1.Start();<br />        }<br /><br />        public void timer1_Tick(object sender, EventArgs e)<br />        {<br />            DateTime dateTime = DateTime.Now;<br />                        <br />            this.label2.Text = dateTime.ToString();<br />            <br />        }<br /><br />        private void button1_Click(object sender, EventArgs e)<br />        {<br />           DateTime dateTime = DateTime.Now;<br />           this.serialPort1.WriteLine(&quot;AT+TIMES=&quot;+dateTime.ToLongTimeString()+&quot;\r&quot;);<br />           <br />        }<br /><br />        private void button2_Click(object sender, EventArgs e)<br />        {<br />            <br />            try<br />            {<br /><br /><br />                if (!serialPort1.IsOpen) // jeśli port nie otwarty to otwiera<br />                {<br /><br />                    serialPort1.Open();                                                                //otwarcie portu com<br /><br />                    this.button2.Text = &quot;Disconnect&quot;;                                             // jeśli połączenie z comem nastąpiło zmienia kolor przycisku connect na czerwony i zmiena napis na disconnect<br />                    this.button2.BackColor = Color.Red;<br /><br /><br />                }<br />                else<br />                {<br /><br />                    serialPort1.Close();<br />                    this.button2.Text = &quot;Connect&quot;;<br />                    this.button2.BackColor = Color.Green;<br /><br /><br />                }<br /><br />            }<br />            catch (UnauthorizedAccessException ex)<br />            {<br /><br />                MessageBox.Show(ex.Message);                  // wyświetla błądy<br />            }<br /><br />        }<br /><br />        private void Time_Load(object sender, EventArgs e)<br />        {<br /><br />        }<br />        //private string rxString;<br />        //private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)<br />        //{<br />        //    rxString = serialPort1.ReadExisting(); //zapisuje string do zmiennej rxString                    <br />        //    this.Invoke(new EventHandler(displayText)); // ???<br />        //}<br /><br />        //private void displayText(object o, EventArgs e)<br />        //{<br />        //    richTextBox1.Text = String.Empty; //czyści okno przed odebraniem stringa<br />        //    richTextBox1.AppendText(rxString); //wyświetla string w oknie<br />        //}<br />       <br />    }<br />}[/syntax]<br /><br />bibliotek nie mogę umieścić więc pokazuje najważniejsze części kodu dla procka:<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2010-03-30<br /> *       Autor: Developer85<br /> */<br />#include &lt;avr/io.h&gt;// dołączenie głównego systemowego  pliku nagłówkowego<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />#include &quot;MK_USART/mkuart.h&quot;<br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br />#include &quot;d_led.h&quot;// dołączenie naszego pliku nagłówkowego (obsługa LED)<br />#include &quot;common.h&quot;<br />#include &quot;komendy_at.h&quot;<br /><br /><br /><br />// utworzenie typu u08, odpowiednika uint8_t aby kod był bardziej czytelny<br />typedef unsigned char  u08;<br />typedef unsigned short u16;<br /><br />volatile uint8_t int0_flag=1;// flaga zmieniana w przerwaniu i sprawdzana w pętli głównej<br />volatile uint8_t int0_flag2=0;<br /><br />char bufor&#91;100&#93;;<br /><br />// konwersja liczby dziesiętnej na BCD<br />uint8_t dec2bcd(uint8_t dec);<br />// konwersja liczby BCD na dziesiętną<br />uint8_t bcd2dec(uint8_t bcd);<br /><br />uint8_t czujniki_cnt;/* ilość czujników na magistrali */<br />volatile uint8_t s1_flag;/* flaga tyknięcia timera co 1 sekundę */<br />volatile uint8_t sekundy;/* licznik sekund 0-59 */<br /><br />uint8_t subzero, cel, cel_fract_bits;<br /><br /><br />int main(void)<br />{<br />// ****** inicjalizacja *********<br />d_led_init();   // inicjalizacja wyświetlacza multipleksowanego<br />soft_timer2_init();<br />i2cSetBitrate(100);<br />USART_Init(__UBRR);<br /><br />// Przerwanie 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 /><br /><br />// definiujemy sobie dla polepszenia czytelności programu typ wyliczeniowy<br />// wskazujący nam później na odpowiednie indeksy w tablicy (buforze)<br />enum {ss=1, mm, hh};<br />uint8_t bufor&#91;4&#93;;// rezerwacja bufora 4 bajty<br />uint8_t sekundy, minuty, godziny;<br /><br />// Ustawianie czasu na godzinę:<br /><br />//bufor&#91;0&#93; = 0;// setne części sekundy<br />//bufor&#91;1&#93; = dec2bcd(10);// sekundy<br />//bufor&#91;2&#93; = dec2bcd(58);// minuty<br />//bufor&#91;3&#93; = dec2bcd(19);// godziny<br />//// zapis 4 bajtów z bufora pod adres 0x01 w pamięci RAM naszego RTC<br />//TWI_write_buf( PCF8583_ADDR, 0x01, 4, bufor );<br /><br /><br />// testowa inicjalizacja zmiennych oraz liczb mających się wyświetlać na wyrw. LED<br /><br />// rejestracja własnej funkcji do analizowania danych odebranych przez UART<br />register_uart_str_rx_event_callback( parse_uart_data );<br /><br />/* sprawdzamy ile czujników DS18xxx widocznych jest na magistrali */<br />czujniki_cnt = search_sensors();<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />_delay_ms(750); //odczekujemy 750ms na konwersje<br /><br />sei();// włączenie globalnego zezwolenia na przerwania<br /><br />while(1){<br />UART_RX_STR_EVENT(bufor);//zdarzenie event od Usarta<br /><br />if ( int0_flag ) {<br />//odczyt 4 bajtów do bufora od adresu 0x01 z pamięci RAM naszego RTC<br />TWI_read_buf( PCF8583_ADDR, 0x01, 4, bufor );<br /><br />sekundy = bcd2dec( bufor&#91;ss&#93; );<br />minuty = ( bufor&#91;mm&#93; );<br />godziny = ( bufor&#91;hh&#93; );<br /><br />cy1=godziny &gt;&gt; 4;<br />cy2=godziny &amp; 0x0F;<br />cy3=minuty &gt;&gt; 4;  //dziesiątki<br />cy4=minuty &amp; 0x0F; //jednosci<br /><br /><br />if(int0_flag2==10){<br />czujniki_cnt = search_sensors();<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits)) {<br />//uart_putint(time,10);<br />//uart_puts(&quot;.&quot;);<br />//uart_putint(cel_fract_bits,10);<br />//uart_puts(&quot; °C&quot;);<br />//uart_puts(&quot;\r\n&quot;);<br />cy1=(dec2bcd(cel))&gt;&gt;4;<br />cy2=(dec2bcd(cel)) &amp; 0x0F;<br />cy3=10;//wywietlenie znaku celsjusza °<br />cy4=11;//wywietlenie C<br />}<br />int0_flag2 =0;<br /><br />}<br /><br /><br />int0_flag=0;<br /><br />}<br /><br />}<br />}<br />// procedura obsługi przerwania INT 0<br />ISR( INT0_vect ) {<br /><br />int0_flag = 1;<br />int0_flag2++;[/syntax]<br /><br />komenty_at.c<br /><br />funkcja at_time_service():<br />[syntax=c]int8_t at_times_service(uint8_t inout, char * params){<br />uint8_t bufor&#91;4&#93;;// rezerwacja bufora 4 bajty<br />char * wsk;<br />if(1 == inout){<br />// sprawdzamy czy są parametry, jeli nie to błąd<br />if(!strlen(params)) return -1;<br />// wyłuskujemy pierwszy parametr do dwukropka<br />wsk = strtok(params, &quot;:&quot;);<br />// sprawdzamy czy są parametry, jeli nie to błąd<br />if(!strlen(wsk)) return -1;<br />// zamieniamy liczbę ASCII na wartość dziesiętną<br />hours=atoi(wsk);<br />// wyłuskujemy drugi parametr do pdwukropka<br />wsk = strtok(NULL, &quot;:&quot;);<br />// sprawdzamy czy są parametry, jeli nie to błąd<br />if(!strlen(wsk)) return -1;<br />// zamieniamy liczbę ASCII na wartość dziesiętną<br />minutes=atoi(wsk);<br />// wyłuskujemy trzeci parametr do dwukropka l<br />wsk = strtok(NULL, &quot;:&quot;);<br />// sprawdzamy czy są parametry, jeli nie to błąd<br />if(!strlen(wsk)) return -1;<br />// zamieniamy liczbę ASCII na wartość dziesiętną<br />seconds=atoi(wsk);<br />// wyłuskujemy trzeci parametr do dwukropka lub null<br />wsk = strtok(NULL, &quot;:&quot;);<br />// sprawdzamy czy są parametry, jeli nie to błąd<br />if(!strlen(wsk)) return -1;<br /><br />//uart_putint(hours,10);<br />//uart_puts(&quot;:&quot;);<br />//uart_putint(minutes,10);<br />//uart_puts(&quot;:&quot;);<br />//uart_putint(seconds,10);<br />//uart_puts(&quot;\r\n&quot;);<br /><br />bufor&#91;0&#93; = 0;// setne części sekundy<br />bufor&#91;1&#93; = dec2bcd(seconds);// sekundy<br />bufor&#91;2&#93; = dec2bcd(minutes);// minuty<br />bufor&#91;3&#93; = dec2bcd(hours);// godziny<br />// zapis 4 bajtów z bufora pod adres 0x01 w pamięci RAM naszego RTC<br />TWI_write_buf( PCF8583_ADDR, 0x01, 4, bufor );<br />}<br />return 0;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=390">developer85</a> — 25 lip 2013, o 12:02</p><hr />
]]></content>
</entry>
</feed>