<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=7793&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-09-24T11:35:45+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=7793&amp;mode</id>
<entry>
<author><name><![CDATA[charsz]]></name></author>
<updated>2014-09-24T11:35:45+01:00</updated>
<published>2014-09-24T11:35:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96554#p96554</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96554#p96554"/>
<title type="html"><![CDATA[Re: Rejestrator ADC Atmega 1284P - problem z zapisem na SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96554#p96554"><![CDATA[
i dalej to samo. po co ci przerwanie ADC?!?!?! jak rownoczenie chcesz czekac na zakonczenie konwersji uzywajac: <br />while(ADCSRA &amp; (1&lt;&lt;ADSC));  ?<br /><br />czytales moj post w ogole?<br /><br />zrob tak:<br />- wywal z ADC obsluge przerwan<br />- zrob timer 10 ms (czy co ile potrzebujesz odczytywac, dla bezpieczenstwa na poczatek proponuje wieksza wartosc, np 100ms)<br />- w timerze zrob:<br />1) wybierz bufor do ktorej zapisujesz<br />2) przelec przez wszystkie kanaly admuxa ktore chcesz odczytac uzywac recznego odczytywania*<br />3) zaznacz ze bufor jest gotowy do zapisywania. <br /><br />flaguj tez sobie (moze robisz, nie wiem) czy dany bufor zostal juz zapisany na karte SD i dopiero wtedy go 'zwalniaj do zapisywania'. <br /><br />*reczne odczytywanie:<br />ustawienie kanalu<br />start konwersji<br />while(czekaj_az_skonczy_sie_konwersja).<br /><br />ps.         disk_timerproc();//do obsługi karty SD - zalecane jest co 10ms a wedlug komentarza masz timer ustawiony na 1ms.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=926">charsz</a> — 24 wrz 2014, o 11:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Payfer]]></name></author>
<updated>2014-09-24T08:49:22+01:00</updated>
<published>2014-09-24T08:49:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96536#p96536</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96536#p96536"/>
<title type="html"><![CDATA[Re: Rejestrator ADC Atmega 1284P - problem z zapisem na SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96536#p96536"><![CDATA[
Rozumiem, że dokładniejsze będzie wykonywanie pomiarów ADC w trybie &quot;ręcznym&quot;.<br />Czy Timer 0 powinien więc być skonfigurowany więc w następujący sposób:?<br />[syntax=c]//////////////////////////TIMER0//////////CTC co 1ms///////////////////////<br /><br />TCCR0A |= (1&lt;&lt;WGM01);<br />TCCR0B |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00); //preskaler ustawiony na 1024//speed = F_CPU/1024<br /><br />TIMSK0 |= (1&lt;&lt;OCIE0A); // włączone przerywanie od timera0 match a<br />OCR0A =16;// 1 ms przerywanie przy 16MHz[/syntax]<br /><br />A inicjalizacje ADC konfigurować w taki sposób?:<br /><br />[syntax=c]void init_adc(void)<br /> {<br /><br />ADCSRA |= ((1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0));    //16Mhz/128 = 125Khz the ADC reference clock<br />ADCSRA |= (1 &lt;&lt; ADEN);  // Włączenie ADC<br />ADCSRA |= (1 &lt;&lt; ADIE);  // Załączenie przerywania<br />ADCSRA |= (1 &lt;&lt; ADSC);  // Rozpoczęcie konwersji A2D<br />ADMUX |= (1 &lt;&lt; REFS0); // Ustawienie Napięcia referyncyjnego do AVCC<br />ADMUX |= (1 &lt;&lt; ADLAR); // Justowanie do lewej<br />ADCSRB |= (1&lt;&lt;ADTS1) | (1&lt;&lt;ADTS0); //Wyzwalanie ADC przez timer0 compare match a<br /><br />  }[/syntax]<br /><br />Czy w przerywaniu  ISR(ADC_vect) wykonywać kopiowanie wyników konwersji do poszczególnych buforów?<br />[syntax=c]ISR(ADC_vect)<br />{<br /><br />if (recflag==1)<br />{<br /><br /> if(zapiszdobuforanr==2)<br /> {<br /> adc_test=2;<br /> ////////////////////////////////////////zapis do bufora 2///////////////////////////////////////<br />if (adc_wskbuf2&lt;=ADCBUFSIZE)<br />{<br />adc_bufor2&#91;adc_wskbuf2++&#93; = adc0;//0<br />adc_bufor2&#91;adc_wskbuf2++&#93; = adc1;//1<br />adc_bufor2&#91;adc_wskbuf2++&#93; = adc2;//2<br />adc_bufor2&#91;adc_wskbuf2++&#93; = adc4;//3<br />adc_bufor2&#91;adc_wskbuf2++&#93; = adc5;//4<br />adc_bufor2&#91;adc_wskbuf2++&#93; = adc6;//5<br />adc_bufor2&#91;adc_wskbuf2++&#93; = adc_test;//6<br /><br />}<br />else<br />{<br />adc_ovfbuf2=1;<br />adc_wskbuf2=0;<br /><br />}<br />}<br /> if(zapiszdobuforanr==1)<br /> {<br /> adc_test=1;<br />  ////////////////////////////////////////zapis do bufora 1/////////////////////////////////////////<br />if (adc_wskbuf1&lt;=ADCBUFSIZE)<br />{<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc0;//0<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc1;//1<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc2;//2<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc4;//3<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc5;//4<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc6;//5<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc_test;//6<br />}<br />else<br />{<br />adc_ovfbuf1=1;<br />adc_wskbuf1=0;<br /><br />}  <br /> <br /> }<br />else if(zapiszdobuforanr==3)<br /> {<br /> adc_test=3;<br /> ////////////////////////////////////////zapis do bufora 3/////////////////////////////////////////<br /> if (adc_wskbuf3&lt;=ADCBUFSIZE)<br /> {<br /> adc_bufor3&#91;adc_wskbuf3++&#93; = adc0;//0<br />adc_bufor3&#91;adc_wskbuf3++&#93; = adc1;//1<br />adc_bufor3&#91;adc_wskbuf3++&#93; = adc2;//2<br />adc_bufor3&#91;adc_wskbuf3++&#93; = adc4;//3<br />adc_bufor3&#91;adc_wskbuf3++&#93; = adc5;//4<br />adc_bufor3&#91;adc_wskbuf3++&#93; = adc6;//5<br />adc_bufor3&#91;adc_wskbuf3++&#93; = adc_test;//6<br /><br /> }<br /> else<br /> {<br /> adc_ovfbuf3=1;<br /> adc_wskbuf3=0;<br /><br /> }<br /><br /> <br /> }<br />else if(zapiszdobuforanr==4)<br />{<br />adc_test=4;<br />////////////////////////////////////////zapis do bufora 4/////////////////////////////////////////<br />if (adc_wskbuf4&lt;=ADCBUFSIZE)<br /> {<br /> adc_bufor4&#91;adc_wskbuf4++&#93; = adc0;//0<br />adc_bufor4&#91;adc_wskbuf4++&#93; = adc1;//1<br />adc_bufor4&#91;adc_wskbuf4++&#93; = adc2;//2<br />adc_bufor4&#91;adc_wskbuf4++&#93; = adc4;//3<br />adc_bufor4&#91;adc_wskbuf4++&#93; = adc5;//4<br />adc_bufor4&#91;adc_wskbuf4++&#93; = adc6;//5<br />adc_bufor4&#91;adc_wskbuf4++&#93; = adc_test;//6<br /> }<br /> else<br /> {<br /> adc_ovfbuf4=1;<br /> adc_wskbuf4=0;<br /><br /> }<br /><br /><br />}<br />}<br />else if(recflag==0 &amp; zapiszdobuforanr==0)<br />{<br />adc_test=0;<br /> ////////////////////////////////////////zapis do bufora 1/////////////////////////////////////////<br /> <br /> if (adc_wskbuf1&lt;=ADCBUFSIZE)<br /> {<br /> adc_bufor1&#91;adc_wskbuf1++&#93; = adc0;//0<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc1;//1<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc2;//2<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc4;//3<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc5;//4<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc6;//5<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc_test;//6<br /><br /> }<br /> else<br /> {<br /> adc_ovfbuf1=1;<br /> adc_wskbuf1=0;<br /><br /> }<br /> <br />}<br />}[/syntax]<br /><br />Czy w przerywaniach od Timera0 powinna być funkcja switch przełączająca pomiędzy poszczególnymi kanałami ADC?<br />Czy ustawienie w rejestrach ADC powoduje automatyczne rozpoczęcie i zakończenie konwersji?<br /><br />Czy ma o wyglądać tak?:<br />[syntax=c]ISR(TIMER0_COMPA_vect) <br />{  //przerywanie co 1ms<br /><br />switch (channel) // wybór kanału do odczytu ADC<br />{<br /><br />/////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />case (1): //           ADC0<br /><br />ADMUX  =   (1&lt;&lt;ADLAR) |(1&lt;&lt;REFS0)| channel; //Ustawianie nowych wartości<br /><br />do<br />{<br />adc0 = ADCH;<br />}<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));            // SPRAWDZENIE CZY JUŻ SIĘ SKOŃCZYŁO<br /><br />break;<br />/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />case (2): //           ADC1<br /><br />ADMUX  =   (1&lt;&lt;ADLAR) |(1&lt;&lt;REFS0)| channel; //Ustawianie nowych wartości<br />do<br />{<br />adc1 = ADCH;<br />}<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));           // SPRAWDZENIE CZY JUŻ SIĘ SKOŃCZYŁO<br /><br /><br />break;<br />/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />case (3): //           ADC2<br /><br />ADMUX  =   (1&lt;&lt;ADLAR) |(1&lt;&lt;REFS0)| channel; //Ustawianie nowych wartości<br />do<br />{<br />adc2 = ADCH;<br />}<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));            // SPRAWDZENIE CZY JUŻ SIĘ SKOŃCZYŁO<br /><br /><br />break;<br />/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br /><br />case (4): //           ADC3<br /><br />ADMUX  =   (1&lt;&lt;ADLAR) |(1&lt;&lt;REFS0)| channel; //Ustawianie nowych wartości<br /><br />do<br />{<br />adc3 = ADCH;<br />}<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));            // SPRAWDZENIE CZY JUŻ SIĘ SKOŃCZYŁO<br /><br /><br />break;<br />////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br /><br />case (5): //           ADC4<br /><br />ADMUX  =   (1&lt;&lt;ADLAR) |(1&lt;&lt;REFS0)| channel; //Ustawianie nowych wartości<br /><br />do<br />{<br />adc4 = ADCH;<br />}<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));            // SPRAWDZENIE CZY JUŻ SIĘ SKOŃCZYŁO<br /><br />break;<br />//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br /><br />case (6): //           ADC5<br /><br />ADMUX  =   (1&lt;&lt;ADLAR) |(1&lt;&lt;REFS0)| channel; //Ustawianie nowych wartości<br /><br />do<br />{<br />adc5 = ADCH;<br />}<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));            // SPRAWDZENIE CZY JUŻ SIĘ SKOŃCZYŁO<br /><br />break;<br /><br />/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />case (0): //            ADC6<br /><br />ADMUX  =   (1&lt;&lt;ADLAR) |(1&lt;&lt;REFS0)| channel; //Ustawianie nowych wartości<br />do<br />{<br />adc6 = ADCH;<br />}<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));            // SPRAWDZENIE CZY JUŻ SIĘ SKOŃCZYŁO<br /><br />break;<br />}<br /><br />if(channel&lt;6)<br />channel++;<br />else<br />channel=0;<br /><br />ADCSRA |= _BV(ADSC); // start konwersji<br /><br />  Timer++;//do obsługi karty SD<br />disk_timerproc();//do obsługi karty SD<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2431">Payfer</a> — 24 wrz 2014, o 08:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[charsz]]></name></author>
<updated>2014-09-23T14:42:41+01:00</updated>
<published>2014-09-23T14:42:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96453#p96453</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96453#p96453"/>
<title type="html"><![CDATA[Re: Rejestrator ADC Atmega 1284P - problem z zapisem na SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96453#p96453"><![CDATA[
zaraz zaraz, czy ty przypadkiem nie mieszasz dwoch sposobow obslugi ADC?<br /><br />ISR(ADC_vect) - zazwyczaj uzywane we free runing<br />while(ADCSRA &amp; (1&lt;&lt;ADSC)) - zazwyczaj uzywane w single conversion<br /><br />kolejna i chyba wazniejsza sprawa, w jaki sposob kontrolujesz zeby odczyt ADC do kolejnego bufora byl co 10ms? <br />Czytalem kod pobieznie (sorry, ale formatowanie kodu, ilosc zbednych funkcji, flag, nie ulatwia tego zadania) i nic nie wskazalo zebys pilnowal czasu odczytu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=926">charsz</a> — 23 wrz 2014, o 14:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirkoT]]></name></author>
<updated>2014-09-23T12:45:33+01:00</updated>
<published>2014-09-23T12:45:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96446#p96446</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96446#p96446"/>
<title type="html"><![CDATA[Re: Rejestrator ADC Atmega 1284P - problem z zapisem na SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96446#p96446"><![CDATA[
Skoro nie &quot;dotestowałeś klocków&quot; to sam widzisz, że trzeba znów rozłożyć problem<br />na części składowe i od początku zacząć testować poszczególne elementy.<br />A nie tak jak teraz chcesz zrobić, że cały program. I tłumaczenie, że Ty chcesz tylko<br />żeby Ci w tym kodzie malutkie fragmenciki sprawdzić  <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> <br />No niestety nie ma innej drogi  <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=189">MirkoT</a> — 23 wrz 2014, o 12:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Payfer]]></name></author>
<updated>2014-09-23T11:43:07+01:00</updated>
<published>2014-09-23T11:43:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96445#p96445</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96445#p96445"/>
<title type="html"><![CDATA[Re: Rejestrator ADC Atmega 1284P - problem z zapisem na SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96445#p96445"><![CDATA[
Wszystko razem działa ale nie tak jak należy, bardziej chodziło mi o sam fakt, że udało się to odpalić razem.<br />Jeśli próbuję tylko sam zapis na kartę SD (przy wyłączonym LCD i rejestrami przesuwnymi) sytuacja jest identyczna - skokowy zapis.<br />A co do podziału projektu na części...To w taki sposób budowałem ten program. Najpierw chciałem, żeby to odpaliło wszystko razem a później dopiero zauważyłem, że coś jest nie tak z płynnym zapisem, przełączaniem się buforów. Pisałem to na różne sposoby ale to nie przynosiło rezultatu...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2431">Payfer</a> — 23 wrz 2014, o 11:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirkoT]]></name></author>
<updated>2014-09-23T10:11:44+01:00</updated>
<published>2014-09-23T10:11:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96442#p96442</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96442#p96442"/>
<title type="html"><![CDATA[Re: Rejestrator ADC Atmega 1284P - problem z zapisem na SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96442#p96442"><![CDATA[
<div class="quotetitle">Payfer napisał(a):</div><div class="quotecontent"><br />Jeśli SPI wykorzystuje jedynie na transmisję z kartą SD, problem dokładnie ten sam. Także mogę podejrzewać, że SPI jest dobrze skonfigurowane i problem może tkwić gdzieś indziej.<br /></div><br />Wydawało mi się, że napisałeś gdzieś, że zapis na kartę uruchomiłeś i wszystko działa...<br />To jak to w końcu jest?<br />Dlatego właśnie sugerowałem, żebyś podzielił projekt i kod &quot;na kawałki&quot;. <br />Najpierw sama komunikacja z kartą.<br />Potem dopiero cała reszta. I to też nie wszystko na raz. Tylko stopniowo coraz więcej.<br /><br />Powtórzę jeszcze raz:<br />Trudno jest analizować czyjś liczący ponad 1000 linii kod.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=189">MirkoT</a> — 23 wrz 2014, o 10:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Payfer]]></name></author>
<updated>2014-09-23T09:45:50+01:00</updated>
<published>2014-09-23T09:45:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96440#p96440</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96440#p96440"/>
<title type="html"><![CDATA[Re: Rejestrator ADC Atmega 1284P - problem z zapisem na SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96440#p96440"><![CDATA[
Jeśli SPI wykorzystuje jedynie na transmisję z kartą SD, problem dokładnie ten sam. Także mogę podejrzewać, że SPI jest dobrze skonfigurowane i problem może tkwić gdzieś indziej.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 4 minutach ]</span></strong><br /><br />Odnośnie programu, który zawarłem w poście powyżej to chodziło mi o sprawdzenie tylko paru funkcji odnośnie zapisu.<br /><br />Czy mam poprawną konfigurację ADC?<br />Czy funkcje &quot;adcinttostr_buf...&quot; zapełniania poszczególnych buforów jest poprawna? Czy konwersja z int na string ma odbywać się tak często?<br />Czy funkcja &quot;zapis&quot; służąca do przełączania pomiędzy kolejno zapychającymi się buforami jest poprawnie napisana?<br />Czy funkcja &quot;FatFS_Write&quot; wywoływana jest w odpowiednim miejscu?<br />Czy funkcja switch do przełączenia się kanałów ADC w przerywaniu od ADC jest poprawna oraz czy warunek (while(ADCSRA &amp; (1&lt;&lt;ADSC));) o zakończonej konwersji Analog Cyfra jest poprawny? <br />Czy konfiguracja timerów i innych peryferiów jest poprawna?<br /><br />Między innymi na te pytania chciałem otrzymać odpowiedź....<br />A wkleiłem cały program żeby nie wklejać osobno poszczególnych funkcji.<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2431">Payfer</a> — 23 wrz 2014, o 09:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[charsz]]></name></author>
<updated>2014-09-22T20:47:28+01:00</updated>
<published>2014-09-22T20:47:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96412#p96412</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96412#p96412"/>
<title type="html"><![CDATA[Re: Rejestrator ADC Atmega 1284P - problem z zapisem na SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96412#p96412"><![CDATA[
Nie umiem Ci pomoc techniczne. Dam tylko rade, skoro podejrzewasz ze problemem jest &quot;przeciazenie SPI&quot; to moze zbuduj prototyp gdzie SPI bedzie wykorzystywane tylko do zapisu na karte.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=926">charsz</a> — 22 wrz 2014, o 20:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Payfer]]></name></author>
<updated>2014-09-22T12:22:07+01:00</updated>
<published>2014-09-22T12:22:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96325#p96325</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96325#p96325"/>
<title type="html"><![CDATA[Re: Rejestrator ADC Atmega 1284P - problem z zapisem na SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=96325#p96325"><![CDATA[
Proszę o odpowiedz lub wskazówki.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2431">Payfer</a> — 22 wrz 2014, o 12:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Payfer]]></name></author>
<updated>2014-09-16T18:40:17+01:00</updated>
<published>2014-09-16T18:40:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=95688#p95688</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=95688#p95688"/>
<title type="html"><![CDATA[Re: Rejestrator ADC Atmega 1284P - problem z zapisem na SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=95688#p95688"><![CDATA[
Po Twoich wskazówkach próbowałem samodzielnie udoskonalić działanie programu. Jednak mimo moich usilnych prób nic z tego nie wychodzi. Dalej zapisuje skokowo. <br /><br />Główny problem najprawdopodobniej polega na traceniu się wyników pomiędzy przełączaniem się na kolejny bufor. Kolejnym problemem może być choć nie musi sposób wysyłania danych przez SPI. Na jednym sprzętowym SPI jest Karta SD + bufor 74LCV125D oraz 3 rejestry przesuwne 74HC595, do których podłączone są diody oraz wyświetlacz 4x40. Zatrzask dla rejestrów przesuwnych jest na pinie PA7 natomiast CS dla karty jest na pinie PB4.<br /><br />W moim miasteczku nie ma raczej osoby, która interesowałaby się programowaniem mikrokontrolerów w C. Stąd moja ogromna prośba o zdalną pomoc. <br /><br />Poniżej program główny:<br />[syntax=cpp]#define F_CPU 16000000UL<br />#include &lt;avr/io.h&gt;<br />#define __PROG_TYPES_COMPAT__ <br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;inttypes.h&gt;<br />#include &lt;avr/signal.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#define BUFFER_SIZE 64<br />#define BUFFER_MASK ( BUFFER_SIZE - 1)<br /><br />//#include &quot;uart.h&quot;<br />#include &quot;xitoa.h&quot;<br />#include &quot;ff.h&quot;<br />#include &quot;diskio.h&quot;<br />#include &quot;rtc.h&quot;<br />#include &quot;LCD4x40.h&quot;<br /><br />#define MOSI PB5<br />#define SCK PB7<br />#define CS PB4<br />#define LT PA7<br /><br />//////////////////////////////////////ADC///////////////////////////////////////////////////////<br />volatile int adc0,adc1,adc2,adc3,adc4,adc5,adc6,adc7,adc_test;<br />volatile int channel;<br />volatile int wskbufrec;<br />volatile int adc_wskbuf1;<br />volatile int adc_wskbuf2;<br />volatile int adc_wskbuf3;<br />volatile int adc_wskbuf4;<br />volatile int adc_ovfbuf1;<br />volatile int adc_ovfbuf2;<br />volatile int adc_ovfbuf3;<br />volatile int adc_ovfbuf4;<br />/*volatile int adc_bufsize=ADCBUFSIZE*/<br />volatile int adc_bufor1&#91;ADCBUFSIZE&#93;;<br />volatile int adc_bufor2&#91;ADCBUFSIZE&#93;;<br />volatile int adc_bufor3&#91;ADCBUFSIZE&#93;;<br />volatile int adc_bufor4&#91;ADCBUFSIZE&#93;;<br /><br />volatile int wskbuf1A;<br />volatile int wskbuf1B;<br />volatile int wskbuf1C;<br /><br />volatile int wskbuf2A;<br />volatile int wskbuf2B;<br />volatile int wskbuf2C;<br /><br />volatile int wskbuf3A;<br />volatile int wskbuf3B;<br />volatile int wskbuf3C;<br /><br />volatile int wskbuf4A;<br />volatile int wskbuf4B;<br />volatile int wskbuf4C;<br /><br />volatile int zapiszdobuforanr;<br /><br />char tmpadc0&#91;3&#93;;<br />char tmpadc1&#91;3&#93;;<br />char tmpadc2&#91;3&#93;;<br />//volatile char tmpadc3&#91;3&#93;;<br />char tmpadc4&#91;3&#93;;<br />char tmpadc5&#91;3&#93;;<br />char tmpadc6&#91;3&#93;;<br />char tmptest&#91;3&#93;;<br /><br />DWORD Wiersz; // Aktualny wiersz w pliku<br />int ovfbuf1; //wskaznik przepełnienia bufora 1<br />int ovfbuf2; //wskaznik przepełnienia bufora 2<br />int ovfbuf3; //wskaznik przepełnienia bufora 3<br />int ovfbuf4; //wskaznik przepełnienia bufora 4<br />int strbufsize;<br /><br />volatile char bufor1&#91;1024&#93;;<br />volatile char bufor2&#91;1024&#93;;<br />volatile char bufor3&#91;1024&#93;;<br />volatile char bufor4&#91;1024&#93;;<br />volatile int bajtow=985; <br />volatile int recflag;<br />volatile int  liczzap;<br /><br />//////////////////////////////////////////Tekst dla WYSWIETLACZA//////////////////////////////////////////////////////<br />char adc0_char &#91;1&#93;;//bufor tekstowy, adc0<br />char adc1_char &#91;1&#93;;//bufor tekstowy, adc1<br />char adc2_char &#91;1&#93;;//bufor tekstowy, adc2<br />char adc3_char &#91;1&#93;;//bufor tekstowy, adc3<br />char adc4_char &#91;1&#93;;//bufor tekstowy, adc4<br />char adc5_char &#91;1&#93;;//bufor tekstowy, adc5<br />char adc6_char &#91;1&#93;;//bufor tekstowy, adc6<br />char adc7_char &#91;1&#93;;//bufor tekstowy, adc7<br /><br />char wiersz_char &#91;1&#93;;//bufor tekstowy<br />///////////////////////////////////////////////TIMERY///////////////////////////////////////////////////////////////<br />volatile int spi_ch;<br />volatile int lcdonoff;<br />volatile int test;<br />volatile int recstart;;<br />/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br /><br /><br />#if _USE_LFN<br />char Lfname&#91;_MAX_LFN+1&#93;;<br />#endif<br /><br />DWORD AccSize;/* Work register for fs command */<br />WORD AccFiles, AccDirs;<br />FILINFO Finfo;<br />char Line&#91;80&#93;;/* Console input buffer */<br />BYTE Buff&#91;512&#93;;/* Working buffer */<br />FATFS FatFs&#91;_VOLUMES&#93;;/* File system object for each logical drive */<br />DIR Dir;/* Directory object */<br />UINT bw;<br />BYTE RtcOk;/* RTC is available */<br />volatile UINT Timer;/* Performance timer (100Hz increment) */<br />FRESULT res; <br /><br />FRESULT FatFS_Write(FIL *File, char *Nazwa, DWORD Przesuniecie,char *Data, UINT IleBajtow, uint8_t Mode);<br />void Przerywania(void)<br />{<br />//Przerywania<br /> EIMSK|= _BV(INT0) | _BV(INT1) | _BV(INT2);  //włącz INT0 INT1 i INT2 <br />}<br />void adcinttostr_buf1(void)<br />{<br />wskbuf1B=0;<br />wskbuf1C=0;<br /> do<br /> {<br /><br /> <br /> itoa(adc_bufor1&#91;wskbuf1C++&#93;,tmpadc0,10);<br /><br /> for(wskbuf1B=0; wskbuf1B&lt;=2; wskbuf1B++)<br /> {<br /> bufor1&#91;wskbuf1A++&#93; = tmpadc0&#91;wskbuf1B&#93;;<br /> }<br /> bufor1&#91;wskbuf1A++&#93; = ';';<br /><br /><br /><br /> itoa(adc_bufor1&#91;wskbuf1C++&#93;,tmpadc1,10);<br /><br /> for(wskbuf1B=0; wskbuf1B&lt;=2; wskbuf1B++)<br /> {<br /> bufor1&#91;wskbuf1A++&#93; = tmpadc0&#91;wskbuf1B&#93;;<br /> }<br /> bufor1&#91;wskbuf1A++&#93; = ';';<br /><br /><br /><br /> itoa(adc_bufor1&#91;wskbuf1C++&#93;,tmpadc2,10);<br /><br /> for(wskbuf1B=0; wskbuf1B&lt;=2; wskbuf1B++)<br /> {<br /> bufor1&#91;wskbuf1A++&#93; = tmpadc2&#91;wskbuf1B&#93;;<br /> }<br /> bufor1&#91;wskbuf1A++&#93; = ';';<br /><br /> <br /><br /> itoa(adc_bufor1&#91;wskbuf1C++&#93;,tmpadc4,10);<br /><br /> for(wskbuf1B=0; wskbuf1B&lt;=2; wskbuf1B++)<br /> {<br /> bufor1&#91;wskbuf1A++&#93; = tmpadc4&#91;wskbuf1B&#93;;<br /> }<br /> bufor1&#91;wskbuf1A++&#93; = ';';<br /><br /><br /><br /> itoa(adc_bufor1&#91;wskbuf1C++&#93;,tmpadc5,10);<br /><br /> for(wskbuf1B=0; wskbuf1B&lt;=2; wskbuf1B++)<br /> {<br /> bufor1&#91;wskbuf1A++&#93; = tmpadc5&#91;wskbuf1B&#93;;<br /> }<br /> bufor1&#91;wskbuf1A++&#93; = ';';<br /><br /><br /><br /> itoa(adc_bufor1&#91;wskbuf1C++&#93;,tmpadc6,10);<br /><br /> for(wskbuf1B=0; wskbuf1B&lt;=2; wskbuf1B++)<br /> {<br /> bufor1&#91;wskbuf1A++&#93; = tmpadc6&#91;wskbuf1B&#93;;<br /> }<br /> bufor1&#91;wskbuf1A++&#93; = ';';<br /><br /><br /><br /> itoa(adc_bufor1&#91;wskbuf1C++&#93;,tmptest,10);<br /><br /> for(wskbuf1B=0; wskbuf1B&lt;=2; wskbuf1B++)<br /> {<br /> bufor1&#91;wskbuf1A++&#93; = tmptest&#91;wskbuf1B&#93;;<br /> }<br /> // bufor1&#91;wskbuf1A++&#93; = ';';<br /> <br /> bufor1&#91;wskbuf1A++&#93; = '\r';<br /> bufor1&#91;wskbuf1A++&#93; = '\n';<br /> <br /> <br />}<br />while(wskbuf1A&lt;=bajtow);<br /><br />ovfbuf1=1;<br />wskbuf1B=0;<br />wskbuf1A=0;<br />wskbuf1C=0;<br /><br />}<br />void adcinttostr_buf2(void)<br />{<br />wskbuf2B=0;<br />wskbuf2C=0;<br />do<br />{<br /><br /><br />itoa(adc_bufor2&#91;wskbuf2C++&#93;,tmpadc0,10);<br /><br />for(wskbuf2B=0; wskbuf2B&lt;=2; wskbuf2B++)<br />{<br />bufor2&#91;wskbuf2A++&#93; = tmpadc0&#91;wskbuf2B&#93;;<br />}<br />bufor2&#91;wskbuf2A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor2&#91;wskbuf2C++&#93;,tmpadc1,10);<br /><br />for(wskbuf2B=0; wskbuf2B&lt;=2; wskbuf2B++)<br />{<br />bufor2&#91;wskbuf2A++&#93; = tmpadc0&#91;wskbuf2B&#93;;<br />}<br />bufor2&#91;wskbuf2A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor2&#91;wskbuf2C++&#93;,tmpadc2,10);<br /><br />for(wskbuf2B=0; wskbuf2B&lt;=2; wskbuf2B++)<br />{<br />bufor2&#91;wskbuf2A++&#93; = tmpadc2&#91;wskbuf2B&#93;;<br />}<br />bufor2&#91;wskbuf2A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor2&#91;wskbuf2C++&#93;,tmpadc4,10);<br /><br />for(wskbuf2B=0; wskbuf2B&lt;=2; wskbuf2B++)<br />{<br />bufor2&#91;wskbuf2A++&#93; = tmpadc4&#91;wskbuf2B&#93;;<br />}<br />bufor2&#91;wskbuf2A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor2&#91;wskbuf2C++&#93;,tmpadc5,10);<br /><br />for(wskbuf2B=0; wskbuf2B&lt;=2; wskbuf2B++)<br />{<br />bufor2&#91;wskbuf2A++&#93; = tmpadc5&#91;wskbuf2B&#93;;<br />}<br />bufor2&#91;wskbuf2A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor2&#91;wskbuf2C++&#93;,tmpadc6,10);<br /><br />for(wskbuf2B=0; wskbuf2B&lt;=2; wskbuf2B++)<br />{<br />bufor2&#91;wskbuf2A++&#93; = tmpadc6&#91;wskbuf2B&#93;;<br />}<br />bufor2&#91;wskbuf2A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor2&#91;wskbuf2C++&#93;,tmptest,10);<br /><br />for(wskbuf2B=0; wskbuf2B&lt;=2; wskbuf2B++)<br />{<br />bufor2&#91;wskbuf2A++&#93; = tmptest&#91;wskbuf2B&#93;;<br />}<br />// bufor2&#91;wskbuf2A++&#93; = ';';<br /><br />bufor2&#91;wskbuf2A++&#93; = '\r';<br />bufor2&#91;wskbuf2A++&#93; = '\n';<br /><br /><br />}<br />while(wskbuf2A&lt;=bajtow);<br /><br />ovfbuf2=1;<br />wskbuf2B=0;<br />wskbuf2A=0;<br />wskbuf2C=0;<br /><br />}<br />void adcinttostr_buf3(void)<br />{<br />wskbuf3B=0;<br />wskbuf3C=0;<br />do<br />{<br /><br /><br />itoa(adc_bufor3&#91;wskbuf3C++&#93;,tmpadc0,10);<br /><br />for(wskbuf3B=0; wskbuf3B&lt;=2; wskbuf3B++)<br />{<br />bufor3&#91;wskbuf3A++&#93; = tmpadc0&#91;wskbuf3B&#93;;<br />}<br />bufor3&#91;wskbuf3A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor3&#91;wskbuf3C++&#93;,tmpadc1,10);<br /><br />for(wskbuf3B=0; wskbuf3B&lt;=2; wskbuf3B++)<br />{<br />bufor3&#91;wskbuf3A++&#93; = tmpadc0&#91;wskbuf3B&#93;;<br />}<br />bufor3&#91;wskbuf3A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor3&#91;wskbuf3C++&#93;,tmpadc2,10);<br /><br />for(wskbuf3B=0; wskbuf3B&lt;=2; wskbuf3B++)<br />{<br />bufor3&#91;wskbuf3A++&#93; = tmpadc2&#91;wskbuf3B&#93;;<br />}<br />bufor3&#91;wskbuf3A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor3&#91;wskbuf3C++&#93;,tmpadc4,10);<br /><br />for(wskbuf3B=0; wskbuf3B&lt;=2; wskbuf3B++)<br />{<br />bufor3&#91;wskbuf3A++&#93; = tmpadc4&#91;wskbuf3B&#93;;<br />}<br />bufor3&#91;wskbuf3A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor3&#91;wskbuf3C++&#93;,tmpadc5,10);<br /><br />for(wskbuf3B=0; wskbuf3B&lt;=2; wskbuf3B++)<br />{<br />bufor3&#91;wskbuf3A++&#93; = tmpadc5&#91;wskbuf3B&#93;;<br />}<br />bufor3&#91;wskbuf3A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor3&#91;wskbuf3C++&#93;,tmpadc6,10);<br /><br />for(wskbuf3B=0; wskbuf3B&lt;=2; wskbuf3B++)<br />{<br />bufor3&#91;wskbuf3A++&#93; = tmpadc6&#91;wskbuf3B&#93;;<br />}<br />bufor3&#91;wskbuf3A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor3&#91;wskbuf3C++&#93;,tmptest,10);<br /><br />for(wskbuf3B=0; wskbuf3B&lt;=2; wskbuf3B++)<br />{<br />bufor3&#91;wskbuf3A++&#93; = tmptest&#91;wskbuf3B&#93;;<br />}<br />// bufor1&#91;wskbuf1A++&#93; = ';';<br /><br />bufor3&#91;wskbuf3A++&#93; = '\r';<br />bufor3&#91;wskbuf3A++&#93; = '\n';<br /><br /><br />}<br />while(wskbuf3A&lt;=bajtow);<br /><br />ovfbuf3=1;<br />wskbuf3B=0;<br />wskbuf3A=0;<br />wskbuf3C=0;<br /><br />}<br />void adcinttostr_buf4(void)<br />{<br />wskbuf4B=0;<br />wskbuf4C=0;<br />do<br />{<br /><br /><br />itoa(adc_bufor4&#91;wskbuf4C++&#93;,tmpadc0,10);<br /><br />for(wskbuf4B=0; wskbuf4B&lt;=2; wskbuf4B++)<br />{<br />bufor4&#91;wskbuf4A++&#93; = tmpadc0&#91;wskbuf4B&#93;;<br />}<br />bufor4&#91;wskbuf4A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor4&#91;wskbuf4C++&#93;,tmpadc1,10);<br /><br />for(wskbuf4B=0; wskbuf4B&lt;=2; wskbuf4B++)<br />{<br />bufor4&#91;wskbuf4A++&#93; = tmpadc0&#91;wskbuf4B&#93;;<br />}<br />bufor4&#91;wskbuf4A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor4&#91;wskbuf4C++&#93;,tmpadc2,10);<br /><br />for(wskbuf4B=0; wskbuf4B&lt;=2; wskbuf4B++)<br />{<br />bufor4&#91;wskbuf4A++&#93; = tmpadc2&#91;wskbuf4B&#93;;<br />}<br />bufor4&#91;wskbuf4A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor4&#91;wskbuf4C++&#93;,tmpadc4,10);<br /><br />for(wskbuf4B=0; wskbuf4B&lt;=2; wskbuf4B++)<br />{<br />bufor4&#91;wskbuf4A++&#93; = tmpadc4&#91;wskbuf4B&#93;;<br />}<br />bufor4&#91;wskbuf4A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor4&#91;wskbuf4C++&#93;,tmpadc5,10);<br /><br />for(wskbuf4B=0; wskbuf4B&lt;=2; wskbuf4B++)<br />{<br />bufor4&#91;wskbuf4A++&#93; = tmpadc5&#91;wskbuf4B&#93;;<br />}<br />bufor4&#91;wskbuf4A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor4&#91;wskbuf4C++&#93;,tmpadc6,10);<br /><br />for(wskbuf4B=0; wskbuf4B&lt;=2; wskbuf4B++)<br />{<br />bufor4&#91;wskbuf4A++&#93; = tmpadc6&#91;wskbuf4B&#93;;<br />}<br />bufor4&#91;wskbuf4A++&#93; = ';';<br /><br /><br /><br />itoa(adc_bufor4&#91;wskbuf4C++&#93;,tmptest,10);<br /><br />for(wskbuf4B=0; wskbuf4B&lt;=2; wskbuf4B++)<br />{<br />bufor4&#91;wskbuf4A++&#93; = tmptest&#91;wskbuf4B&#93;;<br />}<br />// bufor4&#91;wskbuf4A++&#93; = ';';<br /><br />bufor4&#91;wskbuf4A++&#93; = '\r';<br />bufor4&#91;wskbuf4A++&#93; = '\n';<br /><br /><br />}<br />while(wskbuf4A&lt;=bajtow);<br /><br />ovfbuf4=1;<br />wskbuf4B=0;<br />wskbuf4A=0;<br />wskbuf4C=0;<br /><br />}<br />void init_adc(void)<br /> {<br /><br />ADCSRA |= ((1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0));    //16Mhz/128 = 125Khz the ADC reference clock<br />ADCSRA |= (1 &lt;&lt; ADEN);  // Włączenie ADC<br />ADCSRA |= (1 &lt;&lt; ADIE);  // Załączenie przerywania<br />ADCSRA |= (1 &lt;&lt; ADSC);  // Rozpoczęcie konwersji A2D<br />ADMUX |= (1 &lt;&lt; REFS0); // Ustawienie Napięcia referyncyjnego do AVCC<br />ADMUX |= (1 &lt;&lt; ADLAR); // Justowanie do lewej<br /><br />//ADCSRB |= (1&lt;&lt;ADTS1) | (1&lt;&lt;ADTS0); //Wyzwalanie ADC przez timer0<br />//DIDR0 |= (1&lt;&lt;ADC0D);<br />  }<br />void zapis(void)<br />{<br /><br />FIL FIL;<br /><br />if(adc_ovfbuf1==1)<br />{<br />test=1;//nr bufora<br />zapiszdobuforanr=2;<br />adcinttostr_buf1();<br /><br />if (ovfbuf1==1)<br />{<br />res = FatFS_Write(      &amp;FIL,<br />&quot;data.csv&quot;,                                                         // Nazwa pliku<br />(Wiersz * (bajtow+1)),    // Obliczanie odpowiedniej lokalizacji w pliku<br />bufor1,                                                            // Dane do zapisu<br />bajtow+1,                                                                 // Liczba bajtow do zapisu<br />FA_CREATE_ALWAYS | FA_WRITE);// Okreslenie typu dostepu<br />} <br /><br /> if(res == FR_OK)                // Jesli wszystko OK<br /> {<br />Wiersz++; <br />adc_ovfbuf1=0;<br />ovfbuf1=0;<br /><br /> }<br /> else                                    // Jesli nie<br /> {<br /><br /> }<br /><br />}<br /><br />else if(adc_ovfbuf2==1)<br />{<br />test=2;//nr bufora<br />zapiszdobuforanr=3;<br />adcinttostr_buf2();<br /><br />if (ovfbuf2==1)<br />{<br /><br />res = FatFS_Write(      &amp;FIL,<br />&quot;data.csv&quot;,                                                         // Nazwa pliku<br />(Wiersz * (bajtow+1)),    // Obliczanie odpowiedniej lokalizacji w pliku<br />bufor2,                                                            // Dane do zapisu<br />bajtow+1,                                                                 // Liczba bajtow do zapisu<br />FA_CREATE_ALWAYS | FA_WRITE);// Okreslenie typu dostepu<br /><br />}<br /> if(res == FR_OK)                // Jesli wszystko OK<br /> {<br /> Wiersz++; <br /> adc_ovfbuf2=0;<br /> ovfbuf2=0;<br /> }<br /> else                                    // Jesli nie<br /> {<br /><br /> }<br /><br /><br /><br />}<br />else if(adc_ovfbuf3==1)<br />{<br />test=3;//nr bufora<br />zapiszdobuforanr=4;<br />adcinttostr_buf3();//test=(Wiersz * (bajtow+1));<br /><br /><br />res = FatFS_Write(      &amp;FIL,<br />&quot;data.csv&quot;,                                                         // Nazwa pliku<br />(Wiersz * (bajtow+1)),    // Obliczanie odpowiedniej lokalizacji w pliku<br />bufor3,                                                            // Dane do zapisu<br />bajtow+1,                                                                 // Liczba bajtow do zapisu<br />FA_CREATE_ALWAYS | FA_WRITE);// Okreslenie typu dostepu<br /><br /><br /><br />if(res == FR_OK)                // Jesli wszystko OK<br />{<br />Wiersz++;<br />adc_ovfbuf3=0;<br />ovfbuf3=0;<br />}<br />else                                    // Jesli nie<br />{<br /><br />}<br /><br /><br /><br />}<br /><br />else if(adc_ovfbuf4==1)<br />{<br />test=4;//nr bufora<br />zapiszdobuforanr=1;<br />adcinttostr_buf4();<br /><br />res = FatFS_Write(      &amp;FIL,<br />&quot;data.csv&quot;,                                                         // Nazwa pliku<br />(Wiersz * (bajtow+1)),    // Obliczanie odpowiedniej lokalizacji w pliku<br />bufor4,                                                            // Dane do zapisu<br />bajtow+1,                                                                 // Liczba bajtow do zapisu<br />FA_CREATE_ALWAYS | FA_WRITE);// Okreslenie typu dostepu<br /><br /><br /><br />if(res == FR_OK)                // Jesli wszystko OK<br />{<br />Wiersz++;<br />adc_ovfbuf4=0;<br />ovfbuf4=0;<br />}<br />else                                    // Jesli nie<br />{<br /><br />}<br /><br /><br /><br />}<br /><br /><br /><br />}<br />DWORD get_fattime (void)<br />{<br />RTC rtc;<br /><br />if (!RtcOk) return 0;<br /><br />/* Get local time */<br />rtc_gettime(&amp;rtc);<br /><br />/* Pack date and time into a DWORD variable */<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 />static void put_dump (const BYTE *buff, DWORD ofs, BYTE cnt)<br />{<br />BYTE i;<br />xprintf(PSTR(&quot;%08lX:&quot;), ofs);<br /><br />for(i = 0; i &lt; cnt; i++)<br />xprintf(PSTR(&quot; %02X&quot;), buff&#91;i&#93;);<br /><br />xputc(' ');<br />for(i = 0; i &lt; cnt; i++)<br />xputc((buff&#91;i&#93; &gt;= ' ' &amp;&amp; buff&#91;i&#93; &lt;= '~') ? buff&#91;i&#93; : '.');<br /><br />xputc('\n');<br />}<br />static void get_line (char *buff, int len)<br />{<br />BYTE c;<br />int i = 0;<br /><br />for (;;) {<br />c = uart_getc();<br />if (c == '\r') break;<br />if ((c == '\b') &amp;&amp; i) {<br />i--;<br />uart_putc(c);<br />continue;<br />}<br />if (c &gt;= ' ' &amp;&amp; i &lt; len - 1) {/* Visible chars */<br />buff&#91;i++&#93; = c;<br />xputc(c);<br />}<br />}<br />buff&#91;i&#93; = 0;<br />uart_putc('\n');<br />}<br />static FRESULT scan_files (char* path)<br />{<br />DIR dirs;<br />FRESULT res;<br />int i;<br />char *fn;<br /><br />res = f_opendir(&amp;dirs, path);<br />if (res == FR_OK) {<br />i = strlen(path);<br />while (((res = f_readdir(&amp;dirs, &amp;Finfo)) == FR_OK) &amp;&amp; Finfo.fname&#91;0&#93;) {<br />if (_FS_RPATH &amp;&amp; Finfo.fname&#91;0&#93; == '.') continue;<br />#if _USE_LFN<br />fn = *Finfo.lfname ? Finfo.lfname : Finfo.fname;<br />#else<br />fn = Finfo.fname;<br />#endif<br />if (Finfo.fattrib &amp; AM_DIR) {<br />AccDirs++;<br />path&#91;i&#93; = '/'; strcpy(path+i+1, fn);<br />res = scan_files(path);<br />path&#91;i&#93; = '\0';<br />if (res != FR_OK) break;<br />} else {<br />//xprintf(PSTR(&quot;%s/%s\n&quot;), path, fn);<br />AccFiles++;<br />AccSize += Finfo.fsize;<br />}<br />}<br />}<br /><br />return res;<br />}<br />static void put_rc (FRESULT rc)<br />{<br />const prog_char *p;<br />static const prog_char str&#91;&#93; =<br />&quot;OK\0&quot; &quot;DISK_ERR\0&quot; &quot;INT_ERR\0&quot; &quot;NOT_READY\0&quot; &quot;NO_FILE\0&quot; &quot;NO_PATH\0&quot;<br />&quot;INVALID_NAME\0&quot; &quot;DENIED\0&quot; &quot;EXIST\0&quot; &quot;INVALID_OBJECT\0&quot; &quot;WRITE_PROTECTED\0&quot;<br />&quot;INVALID_DRIVE\0&quot; &quot;NOT_ENABLED\0&quot; &quot;NO_FILE_SYSTEM\0&quot; &quot;MKFS_ABORTED\0&quot; &quot;TIMEOUT\0&quot;<br />&quot;LOCKED\0&quot; &quot;NOT_ENOUGH_CORE\0&quot; &quot;TOO_MANY_OPEN_FILES\0&quot;;<br />FRESULT i;<br /><br />for (p = str, i = 0; i != rc &amp;&amp; pgm_read_byte_near(p); i++) {<br />while(pgm_read_byte_near(p++));<br />}<br />//xprintf(PSTR(&quot;rc=%u FR_%S\n&quot;), rc, p);<br />}<br />void ioinit (void)<br />{<br />DDRA &amp;=~ (1&lt;&lt;PA3);  //ustawwienia przycisku rec <br />PORTA |= (1&lt;&lt;PA3);  //przycisk rec pullup do vcc<br /> DDRA &amp;=~ (1&lt;&lt;PA0);<br /> DDRA &amp;=~ (1&lt;&lt;PA1);<br /> DDRA &amp;=~ (1&lt;&lt;PA2);<br /> DDRA &amp;=~ (1&lt;&lt;PA4);<br /> DDRA &amp;=~ (1&lt;&lt;PA5);<br /> DDRA &amp;=~ (1&lt;&lt;PA6);<br /><br />DDRC |= (1&lt;&lt;PC3); //jako wyjście <br />DDRC |= (1&lt;&lt;PC2); //jako wyjście <br /><br />DDRC |= (1&lt;&lt;PC5); //jako wyjście <br />DDRC |= (1&lt;&lt;PC4); //jako wyjście <br /><br />DDRD &amp;= ~(1&lt;&lt;PD0); // wejscie<br />DDRD &amp;= ~(1&lt;&lt;PD1); // wejscie<br /><br />PORTD |= (1&lt;&lt;PD0); //pull up na wejście<br />PORTD |= (1&lt;&lt;PD1); //pull up na wejście<br /><br />   DDRD &amp;= ~(1&lt;&lt;PD2); // <br />   DDRB &amp;= ~(1&lt;&lt;PB0); //<br />   PORTD |= (1&lt;&lt;PD2);<br />   PORTB |= (1&lt;&lt;PB0);<br />   <br />   DDRD &amp;= ~(1&lt;&lt;PD3); // <br />   DDRB &amp;= ~(1&lt;&lt;PB1); //<br />   PORTD |= (1&lt;&lt;PD3);<br />   PORTB |= (1&lt;&lt;PB1);<br />   <br />   <br />    DDRB &amp;= ~(1&lt;&lt;PB2); // <br />    DDRB &amp;= ~(1&lt;&lt;PB3); //<br />    PORTB |= (1&lt;&lt;PB2);<br />    PORTB |= (1&lt;&lt;PB3);  <br /> <br />   DDRD |= (1&lt;&lt;PD5); //wyjscie <br />   DDRD |= (1&lt;&lt;PD4); //wyjscie <br />   DDRD |= (1&lt;&lt;PD7); //wyjscie <br />   <br />   DDRD |= (1&lt;&lt;PD6); //wyjscie<br />   DDRC |= (1&lt;&lt;PC7); //wyjscie <br />   DDRC |= (1&lt;&lt;PC6); //wyjscie <br /><br /><br /><br />}<br />void timery(void)<br />{<br />///////////////////////////////////PWM////////////////////////////////////////////////////////<br /><br />////////////////////////////////TIMER1//8bit////////Phase Correct mode 1//////////////////////<br />TCCR1A |= (1&lt;&lt;WGM10)|(1&lt;&lt;COM1A1)|(1&lt;&lt;COM1B1);<br />TCCR1B |= (1&lt;&lt;CS10);//prescaller ustawiony na 1 na kanale OC1A i OC1B<br />////////////////////////////////TIMER2/8bit////////Phase Correct mode 1///////////////////////<br />TCCR2A |= (1&lt;&lt;COM2A1)|(1&lt;&lt;WGM20);<br />TCCR2B |= (1&lt;&lt;CS20);//prescaller ustawiony na 1 OC2A<br /><br />//////////////////////////TIMER0//////////CTC co 1ms///////////////////////<br />// <br />TCCR0A |= (1&lt;&lt;WGM01);<br />TCCR0B |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00); //preskaler ustawiony na 1024//speed = F_CPU/1024<br /><br />TIMSK0 |= (1&lt;&lt;OCIE0A); // enable interrupt for timer match a<br />OCR0A =16;// 1 ms interrupt at 16MHz<br /><br /><br />//////////////////////TIMER0//////////CTC co 10ms///////////////////////<br /><br />// TCCR0A |= (1&lt;&lt;WGM01);<br />// TCCR0B |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00); //preskaler ustawiony na 1024//speed = F_CPU/1024<br />// <br />// TIMSK0 |= (1&lt;&lt;OCIE0A); // enable interrupt for timer match a<br />// OCR0A =159;// 10 ms interrupt at 16MHz<br /><br />}<br />FRESULT FatFS_Write(FIL *File, char *Nazwa, DWORD Przesuniecie,char *Data, UINT IleBajtow, uint8_t Mode)<br />{<br />UINT bw;                // zapisanych bajtow<br />FRESULT res;    // rezultat funkcji<br /><br />res = f_open(File, Nazwa, Mode);        // Otwiera plik<br />if(res == FR_OK)                                        <br />{<br />res = f_lseek(File, Przesuniecie);      // Ustawia wskaznik zapisu do pliku w odpowiednim miejscu<br />if(res == FR_OK)                                       <br />{<br />res = f_write(File, Data, IleBajtow, &amp;bw);              // Zapisz bajtow do pliku<br />if(res == FR_OK)                                                                <br />{<br />res = f_close(File);    // Zamkyka plik<br />}<br />}<br />}<br /><br />return res;             // rezultat funkcji<br />}<br />void init_spi(void)<br />{<br />DDRB |= (1&lt;&lt;CS)|(1&lt;&lt;MOSI)|(1&lt;&lt;SCK);// piny SPI jako wyjścia<br />DDRA |= (1&lt;&lt;LT); // zatrzask<br /><br />PORTB|= (1&lt;&lt;CS);<br /><br />_delay_ms(100);<br /><br />//SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(1&lt;&lt;SPR1)|(1&lt;&lt;SPR0); //włącz SPI//  ustaw na Master// fosc/128 125kHz<br />SPCR |= 0x52; //włącz SPI//  ustaw na Master// fosc/64 250kHz<br />}<br />void sdcard_init(void)<br />{<br />res = disk_initialize(0);               // Inicjalizacja karty SD<br />if(res != 0)                                            // Jezeli inicjalizacja sie nie powiodla<br />{<br />_delay_ms(100);<br />LCD_GoTo(0,1);<br />LCD_WriteText(&quot;************SD INIT ERROR*************&quot;);<br />_delay_ms(100);<br />LCD_Clear();<br />}<br />else                                                            // Jesli sie powiodla<br />{<br />f_mount(&amp;FatFs&#91;0&#93;, Line, 0);<br /><br />if(res != 0)                                            // Jesli montowanie sie nie powiodlo<br />{<br />_delay_ms(100);<br />LCD_GoTo(0,1);<br />LCD_WriteText(&quot;************SD MOUNT ERROR*************&quot;);<br />_delay_ms(100);<br />LCD_Clear();<br />}<br />else                                                            // Jesli sie powiodlo<br />{<br />_delay_ms(100);<br />LCD_GoTo(0,1);<br />LCD_WriteText(&quot;*************SD CARD OK*************&quot;);<br />_delay_ms(100);<br />LCD_Clear();<br />}<br />}<br />}<br /><br />int main (void)<br />{<br /><br />FATFS FS;<br />FIL FIL;<br /><br />ovfbuf1=0;<br />ovfbuf2=0;<br />ovfbuf3=0;<br />ovfbuf4=0;<br />adc_ovfbuf1=0;<br />adc_ovfbuf2=0;<br />adc_ovfbuf3=0;<br />adc_ovfbuf4=0;<br />zapiszdobuforanr=0;<br />recflag=0;<br />recstart=0;<br />lcdonoff=1;// WŁĄCZ (1) WYŁĄCZ (0) LCD REJESTR i KLAWISZE<br />RTC rtc;<br /><br /><br />ioinit();<br />timery();<br />init_spi();<br />LCD_Initalize();<br />Przerywania();<br />init_adc();<br />sdcard_init();<br /><br />if (rtc_init() &amp;&amp; rtc_gettime(&amp;rtc)) {/* Initialize RTC */<br />RtcOk = 1;<br />//xprintf(PSTR(&quot;Current time: %u/%u/%u %02u:%02u:%02u\n&quot;), rtc.year, rtc.month, rtc.mday, rtc.hour, rtc.min, rtc.sec);<br />} else {<br />//xputs(PSTR(&quot;RTC is not available.\n&quot;));<br />}<br />   <br />_delay_ms(500);   <br />LCD_Clear();<br />sei();<br /><br />while(1)<br /> /////////////////////////////////////////PETLA GLOWNA PROGRAMU/////////////////////////////////////////////<br />{ <br /><br />lcdonoff=1;// WŁĄCZ WYŁĄCZ LCD REJESTR i KLAWISZE<br /><br /> if(!(PINA &amp; (1&lt;&lt;PA3)))// Rozpoczęcie rejestrowania<br /> {<br /> _delay_ms(100);<br /><br /> if (recstart==1)<br /> {<br /> recstart=0;<br /> }<br /> else if(recstart==0)<br /> {<br /> recstart++;<br /> }<br /> _delay_ms(100);<br /> }<br /> <br /> if(recstart==1)<br /> {<br /> zapis();<br /> recflag=1;<br /> }<br /> if(recstart==0)<br /> {<br /> recflag=0;<br /> }<br /><br />//////////////////////////////////////////////WYŚWIETLACZ 4x40////////////////////////////////////<br /><br />LCD_GoTo(0,0);<br />LCD_WriteText(&quot;rec=    &quot;);<br />itoa(Wiersz,wiersz_char,10);<br />LCD_GoTo(6,0);<br />LCD_WriteText(wiersz_char);<br /><br /><br />/////////////////////////////////////////////////E2///////////////////////////////////////////<br />LCD_GoTo(0,2);<br />LCD_WriteText(&quot;ADC0=     &quot;);<br />itoa(adc0,adc0_char,10);<br />LCD_GoTo(6,2);<br />LCD_WriteText(adc0_char);<br /><br />LCD_GoTo(10,2);<br />LCD_WriteText(&quot;ADC1=     &quot;);<br />itoa(adc1,adc1_char,10);<br />LCD_GoTo(16,2);<br />LCD_WriteText(adc1_char);<br /><br />LCD_GoTo(20,2);<br />LCD_WriteText(&quot;ADC2=     &quot;);<br />itoa(adc2,adc2_char,10);<br />LCD_GoTo(26,2);<br />LCD_WriteText(adc2_char);<br /><br />//    LCD_GoTo(30, 2);<br />//    LCD_WriteText(&quot;ADC3=     &quot;);<br />//    itoa(adc3,adc3_char,10);<br />//    LCD_GoTo(36, 2);<br />//    LCD_WriteText(adc3_char);<br /><br />LCD_GoTo(0,3);<br />LCD_WriteText(&quot;ADC4=     &quot;);<br />itoa(adc4,adc4_char,10);<br />LCD_GoTo(6,3);<br />LCD_WriteText(adc4_char);<br /><br />LCD_GoTo(10,3);<br />LCD_WriteText(&quot;ADC5=    &quot;);<br />itoa(adc5,adc5_char,10);<br />LCD_GoTo(16,3);<br />LCD_WriteText(adc5_char);<br /><br />LCD_GoTo(20,3);<br />LCD_WriteText(&quot;ADC6=    &quot;);<br />itoa(adc6,adc6_char,10);<br />LCD_GoTo(26,3);<br />LCD_WriteText(adc6_char);<br /><br />// LCD_GoTo(30, 3);<br />// LCD_WriteText(&quot;ADC7=   &quot;);<br />// itoa(adc7,adc7_char,10);<br />// LCD_GoTo(36, 3);<br />// LCD_WriteText(adc7_char);<br /><br />}//pentla for<br /><br /><br />}//main<br /><br /><br />ISR(ADC_vect)<br />{<br /><br />if (recflag==1)<br />{<br /><br /> if(zapiszdobuforanr==2)<br /> {<br /> adc_test=2;<br /> ////////////////////////////////////////zapis do bufora 2///////////////////////////////////////<br />if (adc_wskbuf2&lt;=ADCBUFSIZE)<br />{<br />adc_bufor2&#91;adc_wskbuf2++&#93; = adc0;//0<br />adc_bufor2&#91;adc_wskbuf2++&#93; = adc1;//1<br />adc_bufor2&#91;adc_wskbuf2++&#93; = adc2;//2<br />adc_bufor2&#91;adc_wskbuf2++&#93; = adc4;//3<br />adc_bufor2&#91;adc_wskbuf2++&#93; = adc5;//4<br />adc_bufor2&#91;adc_wskbuf2++&#93; = adc6;//5<br />adc_bufor2&#91;adc_wskbuf2++&#93; = adc_test;//6<br /><br />}<br />else<br />{<br />adc_ovfbuf2=1;<br />adc_wskbuf2=0;<br /><br />}<br />}<br /> if(zapiszdobuforanr==1)<br /> {<br /> adc_test=1;<br />  ////////////////////////////////////////zapis do bufora 1/////////////////////////////////////////<br />if (adc_wskbuf1&lt;=ADCBUFSIZE)<br />{<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc0;//0<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc1;//1<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc2;//2<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc4;//3<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc5;//4<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc6;//5<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc_test;//6<br />}<br />else<br />{<br />adc_ovfbuf1=1;<br />adc_wskbuf1=0;<br /><br />}  <br /> <br /> }<br />else if(zapiszdobuforanr==3)<br /> {<br /> adc_test=3;<br /> ////////////////////////////////////////zapis do bufora 3/////////////////////////////////////////<br /> if (adc_wskbuf3&lt;=ADCBUFSIZE)<br /> {<br /> adc_bufor3&#91;adc_wskbuf3++&#93; = adc0;//0<br />adc_bufor3&#91;adc_wskbuf3++&#93; = adc1;//1<br />adc_bufor3&#91;adc_wskbuf3++&#93; = adc2;//2<br />adc_bufor3&#91;adc_wskbuf3++&#93; = adc4;//3<br />adc_bufor3&#91;adc_wskbuf3++&#93; = adc5;//4<br />adc_bufor3&#91;adc_wskbuf3++&#93; = adc6;//5<br />adc_bufor3&#91;adc_wskbuf3++&#93; = adc_test;//6<br /><br /> }<br /> else<br /> {<br /> adc_ovfbuf3=1;<br /> adc_wskbuf3=0;<br /><br /> }<br /><br /> <br /> }<br />else if(zapiszdobuforanr==4)<br />{<br />adc_test=4;<br />////////////////////////////////////////zapis do bufora 4/////////////////////////////////////////<br />if (adc_wskbuf4&lt;=ADCBUFSIZE)<br /> {<br /> adc_bufor4&#91;adc_wskbuf4++&#93; = adc0;//0<br />adc_bufor4&#91;adc_wskbuf4++&#93; = adc1;//1<br />adc_bufor4&#91;adc_wskbuf4++&#93; = adc2;//2<br />adc_bufor4&#91;adc_wskbuf4++&#93; = adc4;//3<br />adc_bufor4&#91;adc_wskbuf4++&#93; = adc5;//4<br />adc_bufor4&#91;adc_wskbuf4++&#93; = adc6;//5<br />adc_bufor4&#91;adc_wskbuf4++&#93; = adc_test;//6<br /> }<br /> else<br /> {<br /> adc_ovfbuf4=1;<br /> adc_wskbuf4=0;<br /><br /> }<br /><br /><br />}<br />}<br />else if(recflag==0 &amp; zapiszdobuforanr==0)<br />{<br />adc_test=0;<br /> ////////////////////////////////////////zapis do bufora 1/////////////////////////////////////////<br /> <br /> if (adc_wskbuf1&lt;=ADCBUFSIZE)<br /> {<br /> adc_bufor1&#91;adc_wskbuf1++&#93; = adc0;//0<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc1;//1<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc2;//2<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc4;//3<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc5;//4<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc6;//5<br />adc_bufor1&#91;adc_wskbuf1++&#93; = adc_test;//6<br /><br /> }<br /> else<br /> {<br /> adc_ovfbuf1=1;<br /> adc_wskbuf1=0;<br /><br /> }<br /> <br />}<br /><br /><br />/////////////////////////////////////////////////////////<br />switch (channel) // wybór kanału do odczytu ADC<br />{<br /><br />/////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />case (1): //           ADC0<br /><br />ADMUX  =   (1&lt;&lt;ADLAR) |(1&lt;&lt;REFS0)| channel; //Ustawianie nowych wartości<br /><br />do<br />{<br />adc0 = ADCH;<br />}<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));            // SPRAWDZENIE CZY JUŻ SIĘ SKOŃCZYŁO<br /><br />break;<br />/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />case (2): //           ADC1<br /><br />ADMUX  =   (1&lt;&lt;ADLAR) |(1&lt;&lt;REFS0)| channel; //Ustawianie nowych wartości<br />do<br />{<br />adc1 = ADCH;<br />}<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));           // SPRAWDZENIE CZY JUŻ SIĘ SKOŃCZYŁO<br /><br /><br />break;<br />/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />case (3): //           ADC2<br /><br />ADMUX  =   (1&lt;&lt;ADLAR) |(1&lt;&lt;REFS0)| channel; //Ustawianie nowych wartości<br />do<br />{<br />adc2 = ADCH;<br />}<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));            // SPRAWDZENIE CZY JUŻ SIĘ SKOŃCZYŁO<br /><br /><br />break;<br />/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br /><br />case (4): //           ADC3<br /><br />ADMUX  =   (1&lt;&lt;ADLAR) |(1&lt;&lt;REFS0)| channel; //Ustawianie nowych wartości<br /><br />do<br />{<br />adc3 = ADCH;<br />}<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));            // SPRAWDZENIE CZY JUŻ SIĘ SKOŃCZYŁO<br /><br /><br />break;<br />////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br /><br />case (5): //           ADC4<br /><br />ADMUX  =   (1&lt;&lt;ADLAR) |(1&lt;&lt;REFS0)| channel; //Ustawianie nowych wartości<br /><br />do<br />{<br />adc4 = ADCH;<br />}<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));            // SPRAWDZENIE CZY JUŻ SIĘ SKOŃCZYŁO<br /><br />break;<br />//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br /><br />case (6): //           ADC5<br /><br />ADMUX  =   (1&lt;&lt;ADLAR) |(1&lt;&lt;REFS0)| channel; //Ustawianie nowych wartości<br /><br />do<br />{<br />adc5 = ADCH;<br />}<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));            // SPRAWDZENIE CZY JUŻ SIĘ SKOŃCZYŁO<br /><br />break;<br /><br />/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br /><br />case (0): //            ADC6<br /><br />ADMUX  =   (1&lt;&lt;ADLAR) |(1&lt;&lt;REFS0)| channel; //Ustawianie nowych wartości<br />do<br />{<br />adc6 = ADCH;<br />}<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));            // SPRAWDZENIE CZY JUŻ SIĘ SKOŃCZYŁO<br /><br />break;<br /><br />}<br /><br />if(channel&lt;6)<br />channel++;<br />else<br />channel=0;<br /><br />ADCSRA |= _BV(ADSC); // start konwersji<br />}<br /><br />ISR(TIMER0_COMPA_vect) <br />{  //powinno być co 10ms<br /><br />  Timer++;<br />disk_timerproc();<br />}[/syntax]<br /><br />Bardzo proszę o pomoc w przeanalizowaniu problemu.<br />Z góry bardzo dziękuję za chęć pomocy i poświęcony czas.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2431">Payfer</a> — 16 wrz 2014, o 18:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-07-17T20:12:51+01:00</updated>
<published>2014-07-17T20:12:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=87941#p87941</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=87941#p87941"/>
<title type="html"><![CDATA[Re: Rejestrator ADC Atmega 1284P - problem z zapisem na SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=87941#p87941"><![CDATA[
<div class="quotetitle">Payfer napisał(a):</div><div class="quotecontent"><br />Mam wrażenie, że przerywania (od ADC) za szybko zapełniają bufory.<br /></div><br />Atmega 1284 ma 16KB pamięci RAM możesz zwiększyć liczbę buforów. Problemem może być długi zapis bufora na kartę. Nie chodzi mi tutaj o sam fakt wysłania przez SPI, ale o fizyczny zapis w pamięci Flash karty SD: <!-- m --><a class="postlink" href="http://elm-chan.org/docs/mmc/mmc_e.html" >http://elm-chan.org/docs/mmc/mmc_e.html</a><!-- m --><br /><br /><div class="quotetitle">Payfer napisał(a):</div><div class="quotecontent"><br />Kiedy zapisywać dane do buforów i gdzie najlepiej to wykonywać czy w przerywaniach czy w pętli głównej?<br /></div>W przerwaniach. To krótka operacja.<br /><div class="quotetitle">Payfer napisał(a):</div><div class="quotecontent"><br />Jeśli w przerywaniach to: Czy zapełnianie bufora 1 i 2 mam wykonywać w przerywaniach od ADC czy np od Timera?<br /></div>W przerwaniu ADC. Skoro wynik jest gotowy to należy go skopiować.<br /><div class="quotetitle">Payfer napisał(a):</div><div class="quotecontent"><br />Czy przetwornik ADC powinien być ustawiony w tryb Free Running Mode?(gdzieś na forach znalazłem taką podpowiedź)<br /></div> W trybie Free Running osiągniesz najwyższe prędkości, ale nie masz wtedy dokładnego sterowania co ile zrobić pomiar. Można wykorzystać tryb CTC timera, który będzie wyzwalał pomiar. Przykładowy kod niezwiązany z tematem takiego ustawienia:<br />[syntax=c]#define S_Freq 44100 //sampling frequency min 9,8kHz max 46,3kHz<br /><br />void adc_init(void)<br />{<br />        //ADC<br />        ADMUX |= (1&lt;&lt;REFS0) | (1&lt;&lt;ADLAR); //AREF=AVCC, Left Adj.,ADC0<br />        ADCSRA |= (1&lt;&lt;ADEN) | (1&lt;&lt;ADATE) | (1&lt;&lt;ADIE) | (1&lt;&lt;ADPS2) | (1&lt;&lt;ADPS0);<br />        //enable ADC, Auto Trigger ADC, ADC interrupt, prescaler 32 (20MHz/32=625kHz )<br />        //625k/13.5=46,3k<br />        ADCSRB |= (1&lt;&lt;ADTS1) | (1&lt;&lt;ADTS0); //Timer0 Compare Match will trigger ADC<br />        DIDR0 |= (1&lt;&lt;ADC0D);<br /> <br />        //Timer0<br />        TCCR0A |= (1&lt;&lt;WGM01); //CTC mode<br />        OCR0A = F_CPU/8/S_Freq;<br />        TCCR0B |= (1&lt;&lt;CS01); //clk/8, start timer0<br />}[/syntax]<br /><div class="quotetitle">Payfer napisał(a):</div><div class="quotecontent"><br />Myślałem również nad buforami kołowymi i kolejkach FIFO....ale nie wiem czy w moim przypadku jest to konieczne.<br /></div>To się tutaj nie nadaje. Do zapisu na kartę potrzebujesz blok danych i bufory to dobre rozwiązanie. FIFO mógłbyś wykorzystać do ciągłego wysyłania tych pomiarów na port szeregowy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 17 lip 2014, o 20:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Payfer]]></name></author>
<updated>2014-07-17T10:57:49+01:00</updated>
<published>2014-07-17T10:57:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=87881#p87881</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=87881#p87881"/>
<title type="html"><![CDATA[Rejestrator ADC Atmega 1284P - problem z zapisem na SD]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7793&amp;p=87881#p87881"><![CDATA[
Witam,<br /><br />Buduję rejestrator ADC z zapisem/odczytem na kartę SD.Układ oparty jest na procesorze Atmega 1284P. Taktowany jest zewnętrznym kwarcem 16MHz. Cały układ pracuje na napięciu 5V poza kartą SD (zasilanie 3.3V + 74LCV125D). Od strony elektronicznej-hardware'owej wszystko pracuje prawidłowo, problemem jest oprogramowanie.<br /><br />Urządzenie składa się z wyświetlacza, potencjometrów (ADC), przycisków zrobionych na drabince rezystorów oraz podświetlania przycisków za pomocą diód led.<br />Wyświetlacz 4x40 i podświetlanie przycisków mam zrobione na 3 rejestrach przesuwnych. Dane wysyłam za pomocą sprzętowego SPI. <br /><br />Na sprzętowym SPI mam również podłączoną kartę SD, na którą chciałbym zapisywać dane.<br />Na karcie SD chciałbym rejestrować sygnał z 5 kanałów ADC w krótkich odstępach czasowych( np. co 1ms – zależy mi na dokładności) i zapisywać je na karcie SD w formacie .csv. Później chciałbym te dane odtwarzać i sterować wypełnieniem wyjść PWM z taką samą prędkością jak zapis nie zakłócając tym samym pracy wyświetlacza, czy też podświetlania klawiszy.<br /><br />Udało mi się zainicjować bibliotekę FatFS od Elm-chana. Przetestowałem ją i działa mi zapis na kartę, jak również odtwarzanie na przykładzie ze strony elm-chana z konsolą po RS232. <br /><br />Poradziłem sobie z odpaleniem wszystkiego razem, działającym przełączaniem kanałów SPI, LCD przyciski itp.<br />Wszystko działa poza poprawnością zapisu z buforów na kartę.<br /><br />Szczegółowe założenia jakimi się kierowałem:<br />Chciałbym zapisywać wartości poszczególnych kanałów adc w przerywaniach ADC do buforów. Gdy skończy się zapis danych z kanałów adc do bufora 1 rozpoczyna się zapis na kartę SD z bufora 1 i w trakcie zapisu na kartę wykonywany jest zapis wartości adc do bufora 2. Gdy skończy się zapis na kartę SD z bufora 1 następuje zapis na kartę z bufora 2 oraz zapis wartości z adc do bufora 1. No i tak w kółko dzięki ustawianiu odpowiednich flag o przepełnieniu bądź o zezwoleniu na zapełnianie się poszczególnych buforów. <br />W tym celu stworzyłem przykładową ramkę danych buforów o rozmiarze 512 w których zapisywane mają być wiersze/pomiary - (493 komórki) wyglądające w następujący sposób:<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/2431/e37929bfb64d0694a99dbcd1f13ac177.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/2431/e37929bfb64d0694a99dbcd1f13ac177.jpg" alt="Obrazek" /></a><br /><br />Aktualnie zapis działa jednak w taki sposób, że gdy kręcę potencjometrem wartości adc zmieniają się w zapisie co 17 wierszy (czyli co bufor) skokowo choć czasem zdarzy się zapis różnych wartrości w 17 pomiarach w buforze 1 lub 2 . Chciałbym uzyskać w poszczególnych wierszach bufora również wartości pomiędzy tymi skokami. Poniżej przykład zapisywanych danych obecnie:<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/2431/6f730e04327aef2bee7898dc2dbd6afd.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/2431/6f730e04327aef2bee7898dc2dbd6afd.jpg" alt="Obrazek" /></a><br /><br />ADC mam ustawione następująco:<br />[syntax=c]ADCSRA |= ((1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0));    //16Mhz/128 = 125Khz the ADC reference clock<br />ADCSRA |= (1 &lt;&lt; ADEN);  // Włączenie ADC<br />ADCSRA |= (1 &lt;&lt; ADIE);  // Załączenie przerywania<br />ADCSRA |= (1 &lt;&lt; ADSC);  // Rozpoczęcie konwersji A2D<br />ADMUX |= (1 &lt;&lt; REFS0); // Ustawienie Napięcia  do AVCC<br />ADMUX |= (1 &lt;&lt; ADLAR); // Justowanie do lewej[/syntax]<br />Pomiędzy kanałami ADC przełączam się po przez funkcję switch(channel) w przerywaniach od ADC. Przełączanie i zapisywanie do zmiennych adc0,adc1,adc2...itd działa poprawnie.<br /><br />Mam wrażenie, że przerywania (od ADC) za szybko zapełniają bufory.<br />Zależy mi na zapisie ok 1000 wierszy danych na sekundę lub więcej nie tracąc wartości pośrednich tak jak dzieje mi się teraz.<br /><br />Proszę Was o odpowiedz na pytania:<br />Kiedy zapisywać dane do buforów i gdzie najlepiej to wykonywać czy w przerywaniach czy w pętli głównej?<br />Jeśli w przerywaniach to: Czy zapełnianie bufora 1 i 2 mam wykonywać w przerywaniach od ADC czy np od Timera?<br />Czy przetwornik ADC powinien być ustawiony w tryb Free Running Mode?(gdzieś na forach znalazłem taką podpowiedź)<br />Myślałem również nad buforami kołowymi i kolejkach FIFO....ale nie wiem czy w moim przypadku jest to konieczne.<br /><br /><br />Bardzo proszę o wskazówki i pomoc.<br />P.S.<br />Przeglądałem projekt Pana Mirka - Wav recordera i wiem, że prędkość z częstotliwością 1kHz jest jak najbardziej osiągalna.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2431">Payfer</a> — 17 lip 2014, o 10:57</p><hr />
]]></content>
</entry>
</feed>