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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-02-15T17:36:27+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=2972&amp;mode</id>
<entry>
<author><name><![CDATA[Mellanogaster]]></name></author>
<updated>2017-02-15T17:36:27+01:00</updated>
<published>2017-02-15T17:36:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=182725#p182725</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=182725#p182725"/>
<title type="html"><![CDATA[Re: Dataloger na karcie SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=182725#p182725"><![CDATA[
Jakimś cudem popchnąłem temat do przodu <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br /><br />po pierwsze:<br />   update bibliotek ze strony elm-chan - potrzebna były opcja <strong>FA_OPEN_APPEND</strong><br /><br />po drugie:<br />   po restarcie trzeba odpowiednio ustawić wskaźnik do miejsca od którego mają być zapisywane pliki po awarii - tu pomocna okazała się funkcja <strong>f_size</strong><br /><br />efekt jaki uzyskałem (a raczej jego namiastka - bo pracy jeszcze sporo):<br /><a href="https://obrazkiforum.atnel.pl/2911/ba9c40a7d137c83f5b19efb2e8b512b6.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2911/ba9c40a7d137c83f5b19efb2e8b512b6.JPG" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2911">Mellanogaster</a> — 15 lut 2017, o 17:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2016-11-06T21:31:24+01:00</updated>
<published>2016-11-06T21:31:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=173978#p173978</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=173978#p173978"/>
<title type="html"><![CDATA[Dataloger na karcie SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=173978#p173978"><![CDATA[
Moze twórz codziennie następny plik? Wtedy padnie tylko ostatni dzien. Mozna tez dorobic zapisywanie/zamykanie pliku jak zniknie zasilanie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 6 lis 2016, o 21:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Mellanogaster]]></name></author>
<updated>2016-11-06T10:08:40+01:00</updated>
<published>2016-11-06T10:08:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=173918#p173918</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=173918#p173918"/>
<title type="html"><![CDATA[Re: Dataloger na karcie SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=173918#p173918"><![CDATA[
normalnie char'y w stringach  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> <br />powalczę jeszcze z tym  FatFS<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2911">Mellanogaster</a> — 6 lis 2016, o 10:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-11-06T08:59:04+01:00</updated>
<published>2016-11-06T08:59:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=173911#p173911</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=173911#p173911"/>
<title type="html"><![CDATA[Re: Dataloger na karcie SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=173911#p173911"><![CDATA[
Była - gościu wpadł, opisał ile błędów jest w programie autora wątku - też widziałem to i czytałem - po czym jak widać skasował swój post (bo nie było kolejnego) i zniknął <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> — 6 lis 2016, o 08:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Mellanogaster]]></name></author>
<updated>2016-11-06T08:48:48+01:00</updated>
<published>2016-11-06T08:48:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=173907#p173907</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=173907#p173907"/>
<title type="html"><![CDATA[Re: Dataloger na karcie SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=173907#p173907"><![CDATA[
Daję słowo, wczoraj tu była czyjaś odpowiedź  <img src="https://forum.atnel.pl/images/smilies/icon_eek.gif" alt=":shock:" title="Zaszokowany" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2911">Mellanogaster</a> — 6 lis 2016, o 08:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Mellanogaster]]></name></author>
<updated>2016-11-05T16:58:36+01:00</updated>
<published>2016-11-05T16:58:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=173836#p173836</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=173836#p173836"/>
<title type="html"><![CDATA[Re: Dataloger na karcie SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=173836#p173836"><![CDATA[
<strong>PawelGaj</strong> - bardzo inspirujący jest Twój kod!<br />Mam pytanie, ponieważ za każdym razem gdy zresetuję uC to plik traci swoją zawartość i jest tworzony na nowo. Jeśli jesteś w temacie lub ktoś inny to jak przerobić funkcję zapisu aby DOPISYWAĆ do istniejącego już pliku. Wiecie, miesiąc się zapisywały dane, na chwilę brakło prądu i cała archiwizacja się skasowała  <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> <br />Z góry dzięki <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=2911">Mellanogaster</a> — 5 lis 2016, o 16:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kevin27]]></name></author>
<updated>2015-09-22T14:13:16+01:00</updated>
<published>2015-09-22T14:13:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=140391#p140391</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=140391#p140391"/>
<title type="html"><![CDATA[Re: Dataloger na karcie SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=140391#p140391"><![CDATA[
Witam,<br />Na początku chciałem podziękować autorowi za świetny projekt, super opisany, działa pięknie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Uruchomiłem FAT FS na zestawie ATB + atmega32 + 11,059 MHz+ karta 2 GB klasy 2 - działa świetnie, ale z czasem zaczęło brakować pamięci Flash. Przesiadłem sie na Atmege644PU, poprawiłem rejestry dla Timera2 i obsługi przerwania z RTC.<br /><br />Program wgrałem, RTC - działa, przerwanie z INT - również. Krata SD sie inicjalizacje, montuje, ale nie tworzy nowego pliku i nic nie zapisuje. Obsługa błędów zwraca &quot;FR_DISK_ERR, (1) A hard error occured in the low level disk I/O layer&quot;  <br />Dioda LED przy SD miga 3 razy na sekundę (zasilanie SD zwarte niebieską zworką do GND). <br /><br />Porównałem rejestry SPI ATmegi644 z ATmegi32 - są identyczne. Zmieniłem Timer2 na Timer0 - bez rezultatu. Wyłączyłem JTAG, i CKDIV/8 we FuseBit'ach. Połączenia na zestawie ATB są prawidłowe, ponieważ zmieniając Atmege 644 na Atmege 32 program działa poprawnie. Wgrywając ten sam program z ATmegi644 na 32 (przy zmienię rejestrów Timera2 i obsługi przerwania) również jest OK. <br /><br />Zastanawia mnie tryb USART in SPI mode z danych katalogowych, oraz dzielenie wyprowadzeń kontrolera SPI z Timerem0 i przerwaniami zewnętrznymi (np. dla wyprowadzenia PB4 jest PCINT12 / OCB0/ SS). Niestety moja wiedza jeszcze nie ogarnia tak rozbudowanego kontrolera. <br /><br />Czy możecie coś podpowiedzieć ?<br /><br />Pozdrawiam<br /><span style="color: #FF0000">______________________________________________________________________________</span><br /><br />Problem rozwiązany, informacja dla potomnych:<br />Zestaw ATB zasilałem z programatora USBISP. Po odłączeniu programatora i dołączeniu zewnętrznego zasilania FAT-FS wystartował. <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=475">kevin27</a> — 22 wrz 2015, o 14:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[pacholgarbaty]]></name></author>
<updated>2015-03-06T14:13:40+01:00</updated>
<published>2015-03-06T14:13:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=122237#p122237</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=122237#p122237"/>
<title type="html"><![CDATA[Re: Dataloger na karcie SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=122237#p122237"><![CDATA[
Witam, chciałbym pogratulować autorowi świetnego programu, dodatkowo mam pytanie :<br />[syntax=c]// ########## Zapis przygotowanego stringa na karcie SD w odpowiednim miejscu ##########<br />                        res = FatFS_Write(      &amp;FIL,                                                                                  <br />                                                                &quot;data.csv&quot;,                                                                     // Nazwa pliku<br />                                                                (Wiersz * strlen(BuforSD) + StrlenPoczatek),    // Obliczanie odpowiedniej lokalizacji w pliku<br />                                                                BuforSD,                                                                                // Dane do zapisu<br />                                                                strlen(BuforSD),                                                                // Liczba bajtow do zapisu<br />                                                                FA_CREATE_ALWAYS | FA_WRITE);                                   // Okreslenie typu dostepu[/syntax]<br />niebardzo mogę się połapać w tym, mój program błędnie zapisuje stringi różnej długości, czy sposób wywołania funkcji jak wyżej, działa tylko na stringach o jednej długości?<br />pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8760">pacholgarbaty</a> — 6 mar 2015, o 14:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[lauba1]]></name></author>
<updated>2014-11-13T18:39:21+01:00</updated>
<published>2014-11-13T18:39:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=103783#p103783</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=103783#p103783"/>
<title type="html"><![CDATA[Re: Dataloger na karcie SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=103783#p103783"><![CDATA[
Dobra sam sobie odpowiedziałem już;) jakbyś ktoś kiedyś szukał to CS jest sterowane w pliku mmc.c.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 3 minutach ]</span></strong><br /><br />Dziękuje panie Mirku za odp. Za szybko chce ogarnąć obsługę kart SD i później człowiek nie pomyśli, a napiszę. Ale i tak pana odp się przydała bo raz na zawsze wyjaśniła mi się funkcja CS, dzięki!;)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=291">lauba1</a> — 13 lis 2014, o 18:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-11-13T18:37:42+01:00</updated>
<published>2014-11-13T18:37:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=103781#p103781</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=103781#p103781"/>
<title type="html"><![CDATA[Re: Dataloger na karcie SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=103781#p103781"><![CDATA[
<div class="quotetitle">lauba1 napisał(a):</div><div class="quotecontent"><br />skoro urządzenie w spi aktywuję się podając stan niski na CS?<br /></div><br />A kolega myśli że co ? podczas inicjalizacji raz na zawsze należy ustawić ZERO na CS ? <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> ... a co ? jeśli na SPI miałyby pracować jeszcze inne moduły ? toż byłaby istna JATKA <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />linią CS operuje się TYLKO i WYŁĄCZNIE podczas funkcji dostępu do modułu SPI, czyli wtedy gdy dokonujemy zapisu lub odczytu. A przy inicjalizacji właśnie na wszelki wypadek ustawia się wszystkie linie CS w stan wysoki żeby nie było konfliktu w razie czego z innymi modułami.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 13 lis 2014, o 18:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[lauba1]]></name></author>
<updated>2014-11-13T18:27:14+01:00</updated>
<published>2014-11-13T18:27:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=103775#p103775</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=103775#p103775"/>
<title type="html"><![CDATA[Re: Dataloger na karcie SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=103775#p103775"><![CDATA[
[syntax=c]static void FatFS_IoInit ()<br />{<br /> <br />        PORTB |= (1&lt;&lt;PB7)|(1&lt;&lt;PB5)|(1&lt;&lt;PB4);<br />        DDRB |= (1&lt;&lt;PB7)|(1&lt;&lt;PB6);<br /> <br />        DDRB |= (1&lt;&lt;CS)|(1&lt;&lt;MOSI)|(1&lt;&lt;SCK)|(1&lt;&lt;CS);<br />        PORTB |= (1&lt;&lt;CS);<br /> <br />        SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR);<br /> <br />        //atmega32<br />        /* Timer2 – inicjalizacja przerwania co 10ms */<br />        TCCR2 = (1&lt;&lt;WGM21);             // tryb pracy CTC<br />        TCCR2 = (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);  // preskaler = 1024<br />        OCR2 = 108;             // przerwanie porównania co 10ms (100Hz)<br />        TIMSK = (1&lt;&lt;OCIE2);     // Odblokowanie przerwania CompareMatch<br /> <br />        //rtc_init();                   // Initialize RTC<br /> <br />        sei();<br />}[/syntax]<br /><br />Możecie mi wytłumaczyć ponieważ nie łapię jednego, skoro podczas inicjalizacji void FatFS_IoInit () ustawiamy pin CHIP SELECT ( PORTB |= (1&lt;&lt;CS) ) na jeden, a następnie nigdzie go nie zerujemy, to jak działa obsługa karty, skoro urządzenie w spi aktywuję się podając stan niski na CS?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=291">lauba1</a> — 13 lis 2014, o 18:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PawelGaj]]></name></author>
<updated>2013-04-28T21:26:33+01:00</updated>
<published>2013-04-28T21:26:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=35546#p35546</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=35546#p35546"/>
<title type="html"><![CDATA[Re: Dataloger na karcie SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=35546#p35546"><![CDATA[
Wiem, wiem o tej pamięci Flash, już nawet to zrobiłem ale był warning i w sumie jakoś to usunąłem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Jutro postaram się również napisać soft w C# ładnie interpretujący ten plik z datalogera, rysowanie wykresów w wybranym przedziale czasowym itd. <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> — 28 kwi 2013, o 21:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-04-28T21:10:34+01:00</updated>
<published>2013-04-28T21:10:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=35543#p35543</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=35543#p35543"/>
<title type="html"><![CDATA[Re: Dataloger na karcie SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=35543#p35543"><![CDATA[
No to ja też gratuluję uporu i przejścia hmm opanowania FatFS ... masz rację - jak się już człowiek za niego zabierze to okazuje się że to całkiem przyjazne zwierzątko <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />odnośnie zmian w bibliotece do LCD pod atmel toolchain to warto a nawet trzeba zrobić dwie i tam mała literówka ci się zdarzyła bo specyfikator const powinien być przed typem ale ja chciałem zwrócić uwagę żebyś na przyszłość w gotowym kodzie nie używał wyświetlania stałych tekstów tak:<br /><br />[syntax=c]lcd_str(&quot;SD INIT ERROR&quot;);[/syntax]<br /><br />tylko tak<br /><br />[syntax=c]lcd_str_P( PSTR(&quot;SD INIT ERROR&quot;) );[/syntax]<br /><br />to bardzo ważne bo tracisz nie tylko FLASH na ten tekst ale i RAM !!! rozumiesz ? dużo może ci go pożreć kod w którym dużo masz takich wyświetleń bez tego _P, a wtedy nagłówki dwóch funkcji trzeba przerobić o tak:<br /><br />[syntax=c]void lcd_str_P(const char * str);[/syntax]<br /><br />oraz:<br /><br />[syntax=c]void lcd_defchar_P(uint8_t nr, const uint8_t *def_znak);[/syntax]<br /><br />Jeśli zaś chodzi o sam kod - to jak pisał Anty wyżej, plus za komentarze, ale w kolejnych wersjach staraj się już dzielić go na więcej plików bo tak - analiza tego to hmmmm ... sam się przekonasz jak wrócisz do niego np za rok <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> — 28 kwi 2013, o 21:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PawelGaj]]></name></author>
<updated>2013-05-08T21:04:00+01:00</updated>
<published>2013-04-28T20:44:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=35536#p35536</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=35536#p35536"/>
<title type="html"><![CDATA[Dataloger na karcie SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2972&amp;p=35536#p35536"><![CDATA[
Witam.<br /><br />Dzisiaj mam do zaprezentowania dataloger. Jest to taki mój twór który zapisuje datę, czas i temperaturę na karcie SD w formacie zjadliwym dla Excela, czyli : <br />28.04.13;21:09; 09,3; 21,4;<br />No i tak właśnie zapisuje to ATMega na karcie SD. Dodam jeszcze że biblioteki do zapisu na karcie SD to ociężałe FatFS. Sam bałem się do tego podejść, przez to że jest taki opasły, ma tyyyle plików i kod jest taki długi. Jednak się przełamałem i ogarnąłem te biblioteki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Nie jest to takie trudne jak mogłoby się wydawać. Po ogarnięciu zapisu postanowiłem zrobić coś innego, bardziej trudnego. I przyszedł mi na myśl dataloger. Kod zajmuje 24KB. Po otwarciu w Excelu i zrobieniu wykresu wygląda to tak : <br /><br /><br />Myślę że starczy już tego rozwodzenia się nad pomysłem i trudnością FatFSa. Czas przejść do meritum, czyli kodu.<br />Plik main.c wygląda tak : <br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;FatFS/ff.h&quot;<br />#include &quot;FatFS/diskio.h&quot;<br />#include &quot;rtc.h&quot;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br /><br />// ###########################<br />// ########## FatFS ##########<br />// ###########################<br /><br />#define SCK PB7// Definicje pinow<br />#define MOSI PB5// do podlaczenia<br />#define CS PB4// karty SD<br /><br />volatile WORD Timer; // Zmienna do soft-timera dla FatFS<br />FRESULT res;// Zmienna wyniku funkcji - potrzebna do obslugi bledow<br />RTC rtc;// Struktura RTC - potrzebna do przekazania czasu bibliotece FatFS<br /><br />static void FatFS_IoInit();// Inicjalizacja pinow potrzebnych karcie SD<br />DWORD get_fattime ();// Przekazywanie czasu bibliotece FatFS<br /><br />typedef uint8_t u08;<br /><br />// #######################################<br />// ########## Zmienne i tablice ##########<br />// #######################################<br /><br />char BuforSD&#91;50&#93; = {&quot;Data;Czas;Out;In\r\n&quot;};// Bufor do zapisu na karcie SD - tutaj wpisujemy co ma byc zapisane przed wejsciem do petli while<br /><br />uint8_t const OK&#91;&#93; PROGMEM = {0, 0, 1, 1, 18, 26, 12, 4};// wzór znaku buźki w pamięci FLASH<br />uint8_t const ERR&#91;&#93; PROGMEM = {0, 0, 17, 27, 14, 14, 27, 17};<br /><br />u08 IloscDS18B20;// Ilosc czujnikow na magistrali 1Wire<br />u08 StrlenPoczatek;// Dlugosc stringa poczatkowego<br />uint64_t Wiersz;// Aktualny wiersz w pliku<br /><br />// ###############################<br />// ########## Struktury ##########<br />// ###############################<br /><br />typedef struct DS18B20 DS18B20;// Definiujemy typ struktury<br /><br />struct DS18B20{<br />u08 Cel;// Czesc calkowita<br />u08 CelFract;// Czesc dziesietna<br />u08 Subzero;// Temperatura ujemna (1 - tak, 0 - nie)<br />DS18B20 *Next;// Wskaznik na nastepna strukture<br />u08 x;// Lokalizacja na<br />u08 y;// wyswietlaczu<br />char String&#91;6&#93;;// Temperatura w formie stringa<br />u08 Hide;// Zmienna decydujaca o wyswietlaniu na LCD (1 - Nie wyswietla, 0 - Wyswietla)<br />};<br /><br />DS18B20 DS18B20_1;// Definiuj strukture dla czujnikow DS18B20<br />DS18B20 DS18B20_2;// ROBIMY TYLE STRUKTUR ILE MAMY CZUJNIKOW - INACZEJ PROGRAM NIE ODCZYTA Z NICH TEMPERATURY<br />DS18B20 *DS18B20_Temp;<br /><br />TIME Czas;// Definiuj strukture czasu<br /><br /><br />// #############################<br />// ########## Funkcje ##########<br />// #############################<br /><br />// ########## Temperatura ##########<br />void DS18B20StructInit(DS18B20 *Struct, uint8_t x, uint8_t y, uint8_t Hide, DS18B20 *Next);<br />void DS18B20Read(void);<br />void WyswietlTemperature(void);<br />void TempParse(char *String);<br /><br />// ########## Czas ##########<br />void RTCStructInitDate(TIME *Struct, uint8_t x, uint8_t y, uint8_t Hide, char Sep, void(*lcd_puts_func)(char *Bufor), void(*lcd_goto)(uint8_t y, uint8_t x));<br />void RTCStructInitTime(TIME *Struct, uint8_t x, uint8_t y, uint8_t Hide, char Sep, void(*lcd_puts_func)(char *Bufor), void(*lcd_goto)(uint8_t y, uint8_t x));<br />void OdczytajCzasZRTC(TIME *Struktura);<br />void ParseTime(uint8_t *Val1, uint8_t *Val2, uint8_t *Val3, char *Separator, char *Output);<br />void TimeToFatFS(TIME *Struktura);<br /><br />// ########## Rozne ##########<br />void UsunStaryString(char *String);<br />FRESULT FatFS_Write(FIL *File, char *Nazwa, DWORD Przesuniecie,char *Data, UINT IleBajtow, uint8_t Mode);<br /><br />int main (void)<br />{<br />FATFS FS;<br />FIL FIL;<br /><br />FatFS_IoInit();// Ustaw kierunki portow dla obslugi karty SD<br /><br />// #################### Wyswietlacz LCD ####################<br />lcd_init();// Inicjalizacja wyswietlacza LCD<br /><br />lcd_defchar_P(0x80, OK);// Wgraj do pamieci RAM wyswietlacza<br />lcd_defchar_P(0x81, ERR);// symbole OK i ERR<br /><br />LCD_LED_INIT// Ustaw kierunek pinu dla podswietlenia LCD<br />LCD_LED_ON// Wlacz podswietlenie LCD<br /><br /><br /><br />// #################### RTC ####################<br />i2cSetBitrate(100);// Ustaw bitrate dla I2C<br />RTCIntInit();// i zainicjalizuj przerwanie od RTC (INT0 - PD2)<br /><br />RTCStructInitTime(&amp;Czas, 0, 0, 0, ':', lcd_str, lcd_locate);// Inicjalizuj strukture daty<br />RTCStructInitDate(&amp;Czas, 0, 1, 0, '.', lcd_str, lcd_locate);// i czasu<br />Czas.Rok = 13;<br /><br /><br />// #################### Karta SD ####################<br />res = disk_initialize(0);// Inicjalizacja karty SD<br />if(res != 0)// Jezeli inicjalizacja sie nie powiodla<br />{<br />lcd_locate(0,0);// Ustaw kursor na LCD<br />lcd_str(&quot;SD INIT ERROR&quot;);// Wyswietl komunikat o bledzie inicjalizacji karty<br />lcd_locate(1,7);// Ustaw odpowiednia lokalizacje <br />lcd_str(&quot;\x81&quot;);// I wyswietl krzyzyk<br />_delay_ms(5000);// Czekaj 5s i idz dalej<br />}<br />else// Jesli sie powiodla<br />{<br />res = f_mount(0, &amp;FS);// To montuj karte SD<br />if(res != 0)// Jesli montowanie sie nie powiodlo<br />{<br />lcd_locate(0,0);// Ustaw kursor na LCD<br />lcd_str(&quot;SD MOUNT ERROR&quot;);// Wyswietl komunikat o bledzie montowania karty<br />lcd_locate(1,7);// Ustaw lokalizacje dla wyswietlania krzyzyka<br />lcd_str(&quot;\x81&quot;);// Wyswietl krzyzyk<br />_delay_ms(5000);// Czekaj 5s i idz dalej<br />}<br />else// Jesli sie powiodlo<br />{<br />lcd_locate(1,7);// To ustaw lokalizacje dla wyswietlenia ptaszka<br />lcd_str(&quot;\x80&quot;);// Wyswietl ptaszka<br />}<br />}<br /><br /><br /><br />// #################### 1Wire ####################<br />IloscDS18B20 = search_sensors();// Szukaj DS18B20 na 1Wire<br />DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);// I wyslij do nich polecenie pomiaru<br /><br />DS18B20StructInit(&amp;DS18B20_1, 11, 0, 0, &amp;DS18B20_2);// Inicjalizuj struktury<br />DS18B20StructInit(&amp;DS18B20_2, 11, 1, 0, NULL);// czujnikow DS18B20<br /><br />_delay_ms(750);// Czekaj na pomiar temperatury<br /><br /><br /><br />// #################### Zapis poczatkowej ramki na karcie SD ####################<br />StrlenPoczatek = strlen(BuforSD);// Okresl dlugosc ramki <br />FatFS_Write(&amp;FIL, &quot;data.csv&quot;, 0, BuforSD, StrlenPoczatek, FA_CREATE_ALWAYS | FA_WRITE);// Zapisz ramke na karcie SD<br /><br /><br /><br />lcd_cls();// Wyczysc wyswietlacz przed wejsciem do glownej petli<br /><br />while(1)<br />{<br />if(RTCIntFlag)<br />{<br />OdczytajCzasZRTC(&amp;Czas);// Odczytywanie czasu z RTC<br />TimeToFatFS(&amp;Czas);// Przekazywanie czasu do FatFS<br /><br />DS18B20Read();// Odczytywanie temperatury ze wszystkich DSow<br />WyswietlTemperature();// No i wyswietlanie temperatury<br /><br />UsunStaryString(BuforSD);// Usuwanie starego stringa<br /><br />strcat(BuforSD, Czas.DataString);// Na poczatku doklej do stringa date<br />strcat(BuforSD, &quot;;&quot;);// i separator<br />// BuforSD = 28.04.13;<br /><br />strcat(BuforSD, Czas.CzasString);// Potem doklej czas<br />strcat(BuforSD, &quot;;&quot;);// i separator<br />// BuforSD = 28.04.13;19:59;<br /><br />TempParse(BuforSD);// Tu doklejamy temperatury ze wszystkich czujnikow<br /><br />strcat(BuforSD, &quot;\r\n&quot;);// No i znak entera i nowej linii<br />// Teraz BuforSD wyglada tak : 28.04.13;19:59; 09,3; 21,2;\r\n<br /><br />// ########## Zapis przygotowanego stringa na karcie SD w odpowiednim miejscu ##########<br />res = FatFS_Write(&amp;FIL,<br />&quot;data.csv&quot;, // Nazwa pliku<br />(Wiersz * strlen(BuforSD) + StrlenPoczatek), // Obliczanie odpowiedniej lokalizacji w pliku<br />BuforSD, // Dane do zapisu<br />strlen(BuforSD),// Liczba bajtow do zapisu<br />FA_CREATE_ALWAYS | FA_WRITE);// Okreslenie typu dostepu<br /><br /><br />// ########## Obsluga bledow ##########<br /><br />if(res == FR_OK)// Jesli wszystko OK<br />{<br />lcd_locate(0,9);// To ustaw kursor w odpowiednim miejscu<br />lcd_str(&quot;\x80&quot;);// I wyswietl ptaszka<br />}<br />else// Jesli nie<br />{<br />lcd_locate(0,9);// To ustaw kursor w odpowiednim miejscu<br />lcd_str(&quot;\x81&quot;);// I wyswietl krzyzyk<br />}<br /><br />Wiersz++;// Inkrementuje zmienna wiersza potrzebna do odpowiedniego przesuniecia wskaznika do miejsca zapisu na karcie SD<br />RTCIntFlag = 0;// Zeruje flage RTC<br /><br />// Uff, to koniec ;)<br />}<br />}<br /><br />}<br /><br />void RTCStructInitDate(TIME *Struct, uint8_t x, uint8_t y, uint8_t Hide, char Sep, void(*lcd_puts_func)(char *Bufor), void(*lcd_goto)(uint8_t y, uint8_t x))<br />{<br />Struct -&gt; DataX = x;<br />Struct -&gt; DataY = y;<br />Struct -&gt; DataHide = Hide;<br />Struct -&gt; DataSep = Sep;<br />Struct -&gt; lcd_goto = lcd_goto;<br />Struct -&gt; lcd_puts_func = lcd_puts_func;<br />}<br /><br />void RTCStructInitTime(TIME *Struct, uint8_t x, uint8_t y, uint8_t Hide, char Sep, void(*lcd_puts_func)(char *Bufor), void(*lcd_goto)(uint8_t y, uint8_t x))<br />{<br />Struct -&gt; CzasX = x;<br />Struct -&gt; CzasY = y;<br />Struct -&gt; CzasHide = Hide;<br />Struct -&gt; CzasSep = Sep;<br />Struct -&gt; lcd_goto = lcd_goto;<br />Struct -&gt; lcd_puts_func = lcd_puts_func;<br />}<br /><br />void DS18B20StructInit(DS18B20 *Struct, uint8_t x, uint8_t y, uint8_t Hide, DS18B20 *Next)<br />{<br />Struct -&gt; Next = Next;<br />Struct -&gt; x = x;<br />Struct -&gt; y = y;<br />Struct -&gt; Hide = Hide;<br />}<br /><br />void TempParse(char *String)<br />{<br />DS18B20_Temp = &amp;DS18B20_1;// Ustaw wskaznik na pierwsza strukture<br /><br />for(uint8_t i = 0; i &lt; IloscDS18B20; i++)<br />{<br />strcat(String, DS18B20_Temp -&gt; String);// Doklej do podanego wskaznika na stringa string z temperatura<br />strcat(String, &quot;;&quot;);// Doklej separator<br />DS18B20_Temp = DS18B20_Temp -&gt; Next;// Ustaw wskazni do stuktury na nastepna strukture<br />}<br /><br />}<br /><br />void UsunStaryString(char *String)<br />{<br />uint8_t Wsk = 0;// Zmienna do cofania wskaznika<br /><br />for(uint8_t i = 0; i &lt; strlen(String); i++)// Petla wykona sie tyle razy ile jest znakow w buforze<br />{<br />Wsk++;// Inkrementuj zmienna wskaznika, aby mozna bylo potem cofnac wskaznik do poczatku<br />*String = 0;// Usun stary tekst<br />String++;// Inkrementuj wskaznik<br />}<br />}<br /><br />void OdczytajCzasZRTC(TIME *Struktura)<br />{<br /><br />TWI_read_buf( 0xA2, 0x02, 5, Bufor );// Odczytaj czas z RTC do bufora w formacie BCD<br /><br />Struktura -&gt; Sekunda = Bcd2Dec(Bufor&#91;x02&#93;);// Odczytaj sekunde i przekonwertuj na dec<br />Struktura -&gt; Minuta = Bcd2Dec(Bufor&#91;x03&#93;);<br />Struktura -&gt; Godzina = Bcd2Dec(Bufor&#91;x04&#93;);<br />Struktura -&gt; Dzien = Bcd2Dec(Bufor&#91;x05&#93; &amp; 0b00111111);// Odczytaj dzien, zamaskuj odpowiednie bity i przekonwertuj na dec<br />Struktura -&gt; Miesiac = Bcd2Dec(Bufor&#91;x06&#93; &amp; 0b00011111);// Odczytaj miesiac, zamaskuj odpowiednie bity i przekonwertuj na dec<br /><br /><br />// ######################################################<br />// ########## Przygotowywanie stringa z czasem ##########<br />// ######################################################<br /><br />ParseTime(&amp;Struktura -&gt; Godzina, &amp;Struktura -&gt; Minuta, &amp;Struktura -&gt; Sekunda, &amp;Struktura -&gt; CzasSep, Struktura -&gt; CzasString);// Przygotuj stringa z czasem<br /><br />if(Struktura -&gt; CzasHide == 0)// Jesli zmienna odpowiedzialna za ukrywanie daty == 0 to wyswietl czas na podanej lokalizacji<br />{<br />Struktura -&gt; lcd_goto(Struktura -&gt; CzasY, Struktura -&gt; CzasX);// Ustaw kursor w podanym wczesniej miejscu<br />Struktura -&gt; lcd_puts_func(Struktura -&gt; CzasString);// I wyswietl string z data na wyswietlaczu<br />}<br /><br /><br />// ####################################################<br />// ########## Przygotowywanie stringa z data ##########<br />// ####################################################<br /><br />ParseTime(&amp;Struktura -&gt; Dzien, &amp;Struktura -&gt; Miesiac, &amp;Struktura -&gt; Rok, &amp;Struktura -&gt; DataSep, Struktura -&gt; DataString);// Przygotuj stringa z data<br /><br />if(Struktura -&gt; DataHide == 0)// Jesli zmienna odpowiedzialna za ukrywanie daty == 0 to wyswietl czas na podanej lokalizacji<br />{<br />Struktura -&gt; lcd_goto(Struktura -&gt; DataY, Struktura -&gt; DataX);// Ustaw kursor w podanym wczesniej miejscu<br />Struktura -&gt; lcd_puts_func(Struktura -&gt; DataString);// I wyswietl string z data na wyswietlaczu<br />}<br /><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 /><br />UsunStaryString(Output);<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 />void WyswietlTemperature(void)<br />{<br />DS18B20_Temp = &amp;DS18B20_1;// Ustaw wskaznik na pierwszy czujnik<br /><br />// ##########        Petla odczytujaca dane z czujnika DS18B20       ##########<br />// ########## wykona sie tyle razy, ile jest czujnikow na magistrali ##########<br />for(uint8_t i = 0; i &lt; IloscDS18B20; i++)<br />{<br />lcd_locate(DS18B20_Temp -&gt; y, DS18B20_Temp -&gt; x);// Ustaw odpowiednia lokalizacje na wyswietlaczu<br /><br />if(DS18B20_Temp -&gt; Subzero) lcd_str(&quot;-&quot;);// Jezeli temperatura jest ujemna to napisz -<br /><br />lcd_int(DS18B20_Temp -&gt; Cel);// Wyswietl temperature - czesc liczb calkowitych<br />lcd_str(&quot;.&quot;);// Wyswietl kropke<br />lcd_int(DS18B20_Temp -&gt; CelFract);// Wyswietl temperature - czesc dziesetna<br /><br />DS18B20_Temp = DS18B20_Temp -&gt; Next;// Przestaw wskaznik do struktury na nastepny<br />}<br />}<br /><br />void DS18B20Read(void)<br />{<br />DS18B20_Temp = &amp;DS18B20_1;// Ustaw wskaznik na pierwsza strukture czujnika<br /><br />char Buf&#91;3&#93;;// Bufor na konwersje zmiennych do stringa<br /><br />// ##########        Petla odczytujaca dane z czujnika DS18B20       ##########<br />// ########## wykona sie tyle razy, ile jest czujnikow na magistrali ##########<br />for(u08 i = 0; i &lt; IloscDS18B20; i++)<br />{<br />DS18X20_read_meas(gSensorIDs&#91;i&#93;, &amp;DS18B20_Temp -&gt; Subzero, &amp;DS18B20_Temp -&gt; Cel, &amp;DS18B20_Temp -&gt; CelFract); // Odczytaj temperature<br /><br />// ########## Petla usuwajaca poprzedniego stringa<br />for(uint8_t e = 0; e &lt; sizeof(DS18B20_Temp -&gt; String); e++)<br />{<br />DS18B20_Temp -&gt; String&#91;e&#93; = 0;<br />}<br /><br />if(DS18B20_Temp -&gt; Subzero) strcat(DS18B20_Temp -&gt; String, &quot;-&quot;);// Jezeli temperatura jest na minusie to doklej minusa na poczatku<br />elsestrcat(DS18B20_Temp -&gt; String, &quot; &quot;);// Jezeli nie, to doklej spacje<br /><br />if(DS18B20_Temp -&gt; Cel &lt; 10)// Jesli zmienna jest mniejsza niz 10<br />{<br />itoa(DS18B20_Temp -&gt; Cel, Buf, 10);// To przekonwertuj zmienna na string<br />strcat(DS18B20_Temp -&gt; String, &quot;0&quot;);// Doklej zero do stringa<br />strcat(DS18B20_Temp -&gt; String, Buf);// I na koncu temperature<br />}<br />else// Jesli zmienna jest wieksza niz 10<br />{<br />itoa(DS18B20_Temp -&gt; Cel, Buf, 10);// To przekonwertuj zmienna na string<br />strcat(DS18B20_Temp -&gt; String, Buf);// I doklej ja do stringa<br />}<br /><br />strcat(DS18B20_Temp -&gt; String, &quot;,&quot;);// Dodawanie przecinka<br />itoa(DS18B20_Temp -&gt; CelFract, Buf, 10);// Przekonwertuj dziesietne temperatury na string<br />strcat(DS18B20_Temp -&gt; String, Buf);// I doklej je do stringa<br /><br />DS18B20_Temp = (DS18B20_Temp -&gt; Next);// Ustaw wskaznik na nastepny czujnik<br />}<br /><br />IloscDS18B20 = search_sensors();// Szukaj czujnikow na magistrali<br />DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);// i wyslij do wszystkich polecenie pomiaru<br />}<br /><br />void TimeToFatFS(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 />FRESULT FatFS_Write(FIL *File, char *Nazwa, DWORD Przesuniecie,char *Data, UINT IleBajtow, uint8_t Mode)<br />{<br />UINT bw;// Zmienna zapisanych bajtow<br />FRESULT res;// Zmienna rezultatu funkcji<br /><br />res = f_open(File, Nazwa, Mode);// Otworz plik<br />if(res == FR_OK)// Jesli wszystko OK - idziemy dalej<br />{<br />res = f_lseek(File, Przesuniecie);// Ustaw wskaznik zapisu do pliku w odpowiednim miejscu<br />if(res == FR_OK)// Jesli wszystko OK - idziemy dalej<br />{<br />res = f_write(File, Data, IleBajtow, &amp;bw);// Zapisz co trzeba do pliku<br />if(res == FR_OK)// Jesli OK - idziemy dalej<br />{<br />res = f_close(File);// Zamknij plik<br />}<br />}<br />}<br /><br />return res;// No i zwroc rezultat funkcji<br />}<br /><br />// ###################################<br />// ########## Funkcje FatFS ##########<br />// ###################################<br /><br />DWORD get_fattime ()<br />{<br /><br />return  ((DWORD)(rtc.year - 1980) &lt;&lt; 25)<br />| ((DWORD)rtc.month &lt;&lt; 21)<br />| ((DWORD)rtc.mday &lt;&lt; 16)<br />| ((DWORD)rtc.hour &lt;&lt; 11)<br />| ((DWORD)rtc.min &lt;&lt; 5)<br />| ((DWORD)rtc.sec &gt;&gt; 1);<br />}<br /><br />static void FatFS_IoInit ()<br />{<br /><br />PORTB |= (1&lt;&lt;PB7)|(1&lt;&lt;PB5)|(1&lt;&lt;PB4);<br />DDRB |= (1&lt;&lt;PB7)|(1&lt;&lt;PB6);<br /><br />DDRB |= (1&lt;&lt;CS)|(1&lt;&lt;MOSI)|(1&lt;&lt;SCK)|(1&lt;&lt;CS);<br />PORTB |= (1&lt;&lt;CS);<br /><br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR);<br /><br />//atmega32<br />/* Timer2 – inicjalizacja przerwania co 10ms */<br />TCCR2 = (1&lt;&lt;WGM21);// tryb pracy CTC<br />TCCR2 = (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);// preskaler = 1024<br />OCR2 = 108;// przerwanie porównania co 10ms (100Hz)<br />TIMSK = (1&lt;&lt;OCIE2);// Odblokowanie przerwania CompareMatch<br /><br />//rtc_init();// Initialize RTC<br /><br />sei();<br />}<br /><br />ISR(TIMER2_COMP_vect)<br />{<br />Timer++;/* Performance counter for this module */<br />disk_timerproc();/* Drive timer procedure of low level disk I/O module */<br />}[/syntax]<br /><br />Wiem że jest nawalone bardzo dużo komentarzy, ale starałem się żeby kod był bardziej zrozumiały dla zielonych i żeby uświadomili sobie że to nie jest takie trudne. Oczywiście Mirkowe biblioteki należy dokleić sobie do projektu, jednak ja zrobiłem gdzieniegdzie kilka zmian, o których zaraz napiszę. <br /><br />W pliku lcd44780.c zmieniłem to :<br />[syntax=c]void lcd_defchar_P(uint8_t nr, uint8_t *def_znak)[/syntax]<br />na to:<br />[syntax=c]void lcd_defchar_P(uint8_t nr, uint8_t const *def_znak)[/syntax]<br />ponieważ kompilator Tollchaina wyrzucał warninga. <br /><br />Do pliku twi.h dokleiłem również deklaracje mojej struktury czasu i kilku funkcji <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />[syntax=c]extern volatile uint8_t RTCIntFlag;<br /><br />enum {x02,x03,x04,x05,x06,x07};<br />extern uint8_t Bufor&#91;6&#93;;<br /><br />typedef struct TIME TIME;<br /><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 /><br />char CzasString&#91;9&#93;;// Aktualny czas w formie stringa<br />char CzasSep;// Separator między jednostkami, np : albo .<br />uint8_t CzasX;// Lokalizacja czasu<br />uint8_t CzasY;// na wyswietlaczu<br />uint8_t CzasHide;// Zmienna decydujaca o wyswietlaniu czasu na wyswietlaczu (1 - Nie wyswietla, 0 - Wyswietla)<br /><br /><br />char DataString&#91;9&#93;;<br />char DataSep;<br />uint8_t DataX;<br />uint8_t DataY;<br />uint8_t DataHide;<br /><br /><br />void(*lcd_puts_func)(char *Bufor);// Wskaznik do funkcji do wyswietlania stringow<br />void(*lcd_goto)(uint8_t y, uint8_t x);// Wskaznik do funkcji ustawiania <br />};<br /><br />uint8_t Dec2Bcd(uint8_t dec);<br />uint8_t Bcd2Dec(uint8_t bcd);<br />void RTCIntInit(void);[/syntax]<br /><br />No i zmiany w pliku twi.c<br />[syntax=c]volatile uint8_t RTCIntFlag;<br /><br /><br />uint8_t Bufor&#91;6&#93;;<br /><br />void RTCIntInit(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 /><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 />ISR( INT0_vect )<br />{<br />RTCIntFlag = 1;<br />}[/syntax]<br /><br />I to chyba wszystko, jak macie jakieś uwagi to piszcie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Zapomniałem dodać, drzewko projektu wygląda tak : <br /><br /><br /><br /><br /><strong><span style="color: #FF0000">PROSZĘ POPRAWIĆ OBRAZKI W POŚCIE  ---   <br />ZASADY UMIESZCZANIA OBRAZKÓW  ---  <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic44.html" >topic44.html</a><!-- l -->    ...:: SunRiver ::...<br /></span></strong><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=784">PawelGaj</a> — 28 kwi 2013, o 20:44</p><hr />
]]></content>
</entry>
</feed>