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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-02-15T22:43:43+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=50&amp;t=10658&amp;mode</id>
<entry>
<author><name><![CDATA[macko333]]></name></author>
<updated>2015-02-15T22:43:43+01:00</updated>
<published>2015-02-15T22:43:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10658&amp;p=119264#p119264</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10658&amp;p=119264#p119264"/>
<title type="html"><![CDATA[Re: Sprawdzenie projektu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10658&amp;p=119264#p119264"><![CDATA[
Tak rozumiem, wkleiłem dla siebie. A czy dobrze rozwiązałem sprawę z odczytem adc i wysłaniem? nie wiem czy odpowiednio zdefiniowałem to wszystko. <br /><br />Byłbym wdzięczny za jakąkolwiek podpowiedz co tu poprawić by działało.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8413">macko333</a> — 15 lut 2015, o 22:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matw]]></name></author>
<updated>2015-02-15T20:26:13+01:00</updated>
<published>2015-02-15T20:26:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10658&amp;p=119209#p119209</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10658&amp;p=119209#p119209"/>
<title type="html"><![CDATA[Re: Sprawdzenie projektu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10658&amp;p=119209#p119209"><![CDATA[
<div class="quotetitle">macko333 napisał(a):</div><div class="quotecontent"><br />#define F_CPU 8000000UL<br /></div><br />Tego nie umieszcza się w kodzie a w ustawieniach projektu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2394">matw</a> — 15 lut 2015, o 20:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[D_C]]></name></author>
<updated>2015-02-15T16:36:23+01:00</updated>
<published>2015-02-15T16:36:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10658&amp;p=119116#p119116</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10658&amp;p=119116#p119116"/>
<title type="html"><![CDATA[Re: Sprawdzenie projektu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10658&amp;p=119116#p119116"><![CDATA[
pierwsze co rzuciło mi sie w oczy to wartość kwarcu, jezeli dasz pelna wartośc, u ciebie 8Mhz, to mozesz spodziewac się błędów w transmisji, zastosuj rezonator z wartością niepełną np. 11.0592 MHz<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1165">D_C</a> — 15 lut 2015, o 16:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[macko333]]></name></author>
<updated>2015-02-15T15:54:47+01:00</updated>
<published>2015-02-15T15:54:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10658&amp;p=119112#p119112</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10658&amp;p=119112#p119112"/>
<title type="html"><![CDATA[Sprawdzenie projektu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10658&amp;p=119112#p119112"><![CDATA[
Witam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />W skrócie napisałem program który otrzymuje polecenia przez USART(przez bluetooth) i steruje odpowiednimi wyjściami.<br /><br />Dodatkowo mam możliwość sprawdzenia stanu czujnika analogowego + jeśli osiągnie wartość minimalną wyłączy on układ.<br /><br />Przy pisaniu programu podtrzymywałem się innym, jednak mam duże wątpliwości co do działania ukladu ADC i przesyłania jego danych do telefonu. Prosił bym o sprawdzenie, raczej jestem początkujący w tych sprawach.<br /><br />Wyjścia binarne : PD2-7<br />Wejście adc : PC0<br /><br />Zewnętrzny kwarc 8MHz<br /><br />Cały kod:<br /><br />[syntax=cpp]#define F_CPU 8000000UL<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br /> <br /> <br />//=== Flagi ====================<br />//flaga globalna informująca main() o odebraniu komendy do dalszej analizy<br />volatile unsigned char odb_flaga = 0;<br /> <br /> <br />//=== Komendy AT ====================<br />#define AT_ILOSC_ZNAKOW10//maksymalna długość komendy wraz ze znakiem \n<br /> <br />//tablica wzorców komend AT<br />//UWAGA!!! <br />//1. Każda komenda w tablicy wzorców musi kończyć się znakiem null: \n<br />//2. Podczas wysyłania komend AT za pomocą Bluetooth komenda także powinna<br />//być kończona znakiem: \n<br />const char wzorce_komend&#91;&#93;&#91;AT_ILOSC_ZNAKOW&#93; PROGMEM = {&quot;AT+STAN\n&quot;,<br />&quot;AT+POMPA\n&quot;,<br />&quot;AT+SIEC\n&quot;,<br />&quot;AT+PRZOD\n&quot;,<br />&quot;AT+BOK\n&quot;,<br />&quot;AT+TYL\n&quot;,<br />&quot;AT+STOP\n&quot;};<br /> <br />//Oblicz ilość wprowadzonych wzorców komend AT<br />#define AT_ILOSC_WZORCOW(sizeof(wzorce_komend)/AT_ILOSC_ZNAKOW)<br /> <br /> <br />//=== Bufor odebranych komend ====================<br />char bufor_odb&#91;AT_ILOSC_ZNAKOW + 1&#93;;//bufor<br />volatile char at_odebrano_znakow = 0;//indeks znaku w tablicy bufora<br /> <br /> <br />//=== Bufor nadawczy (wysyłany tekst) ====================<br />#define BUFOR_NAD_IL_ZNAKOW 16<br />char bufor_nad&#91;BUFOR_NAD_IL_ZNAKOW&#93;;<br />int i;<br /><br /><br /> <br />//--------------------------------------------------------------<br /> <br /> <br />void usart_inicjuj(void)<br />{<br />//Definiowanie parametrów transmisji za pomocą makr zawartych w pliku<br />//nagłówkowym setbaud.h. Jeżeli wybierzesz prędkość, która nie będzie<br />//możliwa do realizacji otrzymasz ostrzeżenie:<br />//#warning &quot;Baud rate achieved is higher than allowed&quot;<br />//Nie lekceważ go!!!<br /> <br />#define BAUD 9600 //9600bps standardowa prędkość transmisji modułu HC-05<br />#include &lt;util/setbaud.h&gt; //linkowanie tego pliku musi nastąpić<br />  //po zdefiniowaniu BAUD<br /> <br />//ustaw obliczone przez makro wartości<br />UBRRH = UBRRH_VALUE;<br />UBRRL = UBRRL_VALUE;<br />#if USE_2X<br />UCSRA |=  (1&lt;&lt;U2X);<br />#else<br />UCSRA &amp;= ~(1&lt;&lt;U2X);<br />#endif<br /> <br /> <br />//Ustawiamy pozostałe parametry modułu USART<br />//U W A G A !!!<br />//W ATmega8, aby zapisać do rejestru UCSRC należy ustawiać bit URSEL<br />//zobacz także: http://mikrokontrolery.blogspot.com/2011/04/avr-czyhajace-pulapki.html#avr_pulapka_2<br />//standardowe parametry transmisji modułu HC-05<br />UCSRC = (1&lt;&lt;URSEL) | (1&lt;&lt;UCSZ1) | (1&lt;&lt;UCSZ0);//bitów danych: 8<br />//bity stopu:  1<br />//parzystość:  brak<br /> <br />//włącz nadajnik i odbiornik oraz ich przerwania odbiornika<br />//przerwania nadajnika włączamy w funkcji wyslij_dane()<br />UCSRB = (1&lt;&lt;TXEN) | (1&lt;&lt;RXEN) | (1&lt;&lt;RXCIE);<br />}<br /> <br /> <br />//--------------------------------------------------------------<br /> <br /> <br />ISR(USART_RXC_vect)<br />{<br />//przerwanie generowane po odebraniu bajtu za pomocą USART<br /> <br />//indeks tablicy odbiorczej<br />static int bufor_odb_ind = 0;<br /> <br />//zapamiętaj odebraną liczbę<br />bufor_odb &#91;bufor_odb_ind&#93; = UDR;   <br /> <br />//koniec komendy AT? (znak null, czyli \n, czyli zero)<br />if (bufor_odb &#91;bufor_odb_ind&#93; == 0x00) {<br /> <br />//tak, odebrano znak końca komendy<br />odb_flaga = 1; //ustaw flagę odbioru komendy - potrzebna dla main()<br />at_odebrano_znakow = bufor_odb_ind; //zapamiętaj ilość odebranych znaków<br />bufor_odb_ind = 0;//ustaw indeks na początek bufora odbiorczego<br /> <br />}else{<br /> <br />//nie, to nie jest ostatni bajt komendy<br />bufor_odb_ind++;//indeks bufora na następny wolny bajt<br /> <br />//czy przekroczono długość bufora?<br />if (bufor_odb_ind &gt;= AT_ILOSC_ZNAKOW){<br />//tak przekroczono, czyli tekst odebrany nie jest komendą<br />//zaczynamy więc od początku<br />bufor_odb_ind = 0;<br />}<br />}<br />}<br /> <br /> <br />//--------------------------------------------------------------<br /> <br /> <br />ISR(USART_UDRE_vect){<br /> <br />//przerwanie generowane, gdy bufor nadawania jest już pusty,<br />//odpowiedzialne za wysłanie wszystkich znaków z tablicy bufor_nad&#91;&#93;<br /> <br />//indeks bufora nadawania<br />static int bufor_nad_ind = 0;<br /> <br />//sprawdzamy, czy bajt do wysłania nie jest znakiem końca tekstu (czyli zerem)<br />//i czy nie dotarliśmy już do końca tablicy bufora nadawania<br />if((bufor_nad&#91;bufor_nad_ind&#93; != 0) &amp;&amp; (bufor_nad_ind &lt; BUFOR_NAD_IL_ZNAKOW)){<br /> <br />//są jeszcze znaki do wysłania<br /> <br />//załaduj znak do rejestru wysyłki i ustaw indeks na następny znak<br />UDR = bufor_nad&#91;bufor_nad_ind++&#93;;<br /> <br />}else{<br /> <br />//osiągnięto koniec napisu w tablicy bufor_nad&#91;&#93;<br />UCSRB &amp;= ~(1&lt;&lt;UDRIE); //wyłącz przerwania pustego bufora nadawania<br />  //co zakończy nadawanie<br /> <br />//zeruj indeks bufora nadawania<br />bufor_nad_ind = 0;<br />}<br />}<br /> <br /> <br />//--------------------------------------------------------------<br /> <br /> <br />void wyslij_dane(void){<br /><br /><br />//funkcja rozpoczyna inicjuje wysyłanie danych<br /> <br />//na wszelki wypadek upewnij się, że bufor nadawania USART jest pusty<br />while (!(UCSRA &amp; (1&lt;&lt;UDRE)));<br /> <br />//bufor jest pusty można wysłać<br /> <br />//włącz przerwania pustego bufora UDR, co rozpocznie transmisję<br />//aktualnej zawartości bufora<br />UCSRB |= (1&lt;&lt;UDRIE);<br /> <br />//Wysyłką danych zajmie się funkcja przerwania ISR(USART_UDRE_vect)<br /> <br />}<br /><br /> int getADC(char number)<br /> //number należy do &lt;0, 7&gt;, kod nie sprawdza szkoda pamięci FLASH<br /> {<br /> ADMUX &amp;= 0xf0; //zerowanie 4 młodszych bitów<br /> ADMUX |= number; //ustawianie numeru kanału<br /> <br /> ADCSRA |= 1&lt;&lt;ADSC; //zaczyna konwersję<br /> while(ADCSRA &amp; (1 &lt;&lt; ADIF));    //dopóki bit ADIF nie jest ustawiony nie jest gotowa konwersja<br /> ADCSRA &amp;= ~((1 &lt;&lt; ADSC) | (1 &lt;&lt; ADIF)); //zeruj flage konwersji i rozkaz rozpoczęcia<br /> return ADC;<br /> }<br /> <br />//--------------------------------------------------------------<br /> <br />void at_komenda_reakcja(unsigned char at_komenda_nr){<br /> <br />// Funkcja przełączająca reakcję na odebraną i rozpoznaną <br />// komendę AT wg kolejności w tablicy wzorcowej wzorce_komend&#91;&#93;<br /><br /> <br />switch(at_komenda_nr){<br /> <br />case 0: //AT+STAN<br />wyslij_dane();<br />break;<br /> <br />case 1: //AT+POMPA<br />PORTD|= (1&lt;&lt;PD2);<br />PORTD&amp;= ~(1&lt;&lt;PD3);<br />break;<br /> <br />case 2: //AT+SIEC<br />PORTD|= (1&lt;&lt;PD3);<br />PORTD&amp;= ~(1&lt;&lt;PD2);<br />break;<br /><br />case 3: //AT+PRZOD<br />PORTD|= (1&lt;&lt;PD4);<br />break;<br /><br />case 4: // AT+BOK<br />PORTD|= (1&lt;&lt;PD5);<br />break;<br /> <br />case 5: //AT+TYL<br />PORTD|= (1&lt;&lt;PD6);<br />break;<br /> <br />case 6: //AT+STOP<br />PORTD&amp;= ~( (1&lt;&lt;PD2) |  (1&lt;&lt;PD3) |  (1&lt;&lt;PD4) | (1&lt;&lt;PD5) | (1&lt;&lt;PD6) );<br /><br />//a jednego portu łączyć je, by skrócić ilość operacji do jednej najpierw sumując poszczególne bity za pomocą | , a następnie negując je wszystkie razem za pomocą ~<br />break;<br /> <br />// i tak dalej<br />}<br /> <br />}<br /> <br />//--------------------------------------------------------------<br /> <br />void at_komenda_sprawdz(void){<br /> <br />//zmienna pomocnicza<br />unsigned int nr_rozpoznanej_komendy;<br /> <br />//zgaś flagę odebrania komendy<br />odb_flaga = 0;<br /> <br />//Pętla przeszukująca tablicę wzorców komend i porównująca wzorzec<br />//z odebraną komendą. Komenda spoza tablicy wzorców jest ignorowana.<br /> <br />//Funkcja strncasecmp_P() porównuje ciąg znaków ASCII zawarty w tablicy<br />//bufor_odb&#91;&#93; umieszczoną w pamięci SRAM z wybranym wzorcem z tablicy<br />//wzorce_komend&#91;&#93; która znajduje się w pamięci FLASH.<br />//Funkcja strncasecmp_P() nie rozróżnia dużych i małych liter,<br />//w związku z czym ich wielkość nie ma znaczenia przy wydawaniu komend<br />//przez USART (Bluetooth), czyli smartfona.<br /> <br /> <br />//rozpoczynamy od początku tablicy wzorców<br />nr_rozpoznanej_komendy = 0;<br /> <br />//dla kolejnych komend z tablicy wzorców<br />do{<br />//sprawdź, czy zgadza się ilość znaków odebranej komendy z badanym wzorcem<br />if(at_odebrano_znakow == (strlen_P(wzorce_komend&#91;nr_rozpoznanej_komendy&#93;)-1)){//-1 ponieważ<br />//do porównania nie bierzemy znaku końca tekstu<br /> <br />//tak, ilość znaków zgodna<br />//sprawdź więc, czy rozpoznałeś właściwą komendę porównując znak po znaku<br />//odebrany tekst (umieszczony w buforze) z wybraną komendą wzorcową<br />if(!strncasecmp_P(bufor_odb, wzorce_komend&#91;nr_rozpoznanej_komendy&#93;, at_odebrano_znakow)){<br /> <br />//rozpoznano komendę AT<br />at_komenda_reakcja(nr_rozpoznanej_komendy);//reaguj na odebraną komendę <br /> <br />//przerwij wykonywanie pętli while ponieważ już rozpoznaliśmy<br />// odebraną komendę<br /><br /><br />break;<br />}<br />}<br /> <br />//przejdź do następnej komendy w tabeli wzorców komend<br />nr_rozpoznanej_komendy++; <br /> <br />}while(nr_rozpoznanej_komendy &lt; AT_ILOSC_WZORCOW);<br /> <br />}<br />void init()  //procedura inicjalizacji podstawowych funkcji<br />{<br /> /*INICJALIZACJA ADC */<br /> <br /> ADCSRA = (1&lt;&lt;ADEN) |(1&lt;&lt;ADPS0) | (1&lt;&lt;ADPS1) | (1&lt;&lt;ADPS2); //włączenie przetwornika adc oraz ustawienie prescalera na 128<br /> ADMUX  = (1&lt;&lt;REFS0) | (1&lt;&lt;MUX2) | (1&lt;&lt;MUX0);   //napięcie zasilania AVcc, jako napięcie odniesienia Vref. i ADC0<br /> DDRC &amp;=~ (1&lt;&lt;PC0);   //ADC0 jako wejście<br /><br /> //ustaw piny PD2-6 na wyjście<br /> DDRD|= ( (1&lt;&lt;PD2) |  (1&lt;&lt;PD3) |  (1&lt;&lt;PD4) | (1&lt;&lt;PD5) | (1&lt;&lt;PD6) );<br /> <br />//--------------------------------------------------------------<br />} <br /> <br /> <br />int main(void)<br />{<br /><br />init();  // inicjalizacja  <br /><br />//inicjuj moduł USART (RS-232)<br />usart_inicjuj(); <br /><br /> <br />//włącz przerwania globalne<br />sei();           <br /> <br />while(1){<br /><br />//Czekamy na informację o odebraniu danej nie blokując mikrokontrolera<br />//Jeżeli przerwanie poinformuje za pomocą ustawienia flago odb_flaga<br />//oznacza to, że odebrano komendę i należy ją rozpoznać<br /><br />if(odb_flaga){ at_komenda_sprawdz()}<br />_delay_ms(500);  <br /><br />i = getADC(0);<br />itoa(i,bufor_nad,10);<br /><br />if(i&lt;100)//jeśli wynik ADC mniejszy od 100 wyłącza programy<br />{<br />PORTD&amp;= ~( (1&lt;&lt;PD2) |  (1&lt;&lt;PD3) |  (1&lt;&lt;PD4) | (1&lt;&lt;PD5) | (1&lt;&lt;PD6) );<br />}<br />}<br />}<br />}[/syntax]<br /><br /> ADC:<br /><br />Main<br />[syntax=cpp]int main(void)<br />{<br /><br />init();  // inicjalizacja  <br /><br />//inicjuj moduł USART (RS-232)<br />usart_inicjuj(); <br /><br /> <br />//włącz przerwania globalne<br />sei();           <br /> <br />while(1){<br /><br />//Czekamy na informację o odebraniu danej nie blokując mikrokontrolera<br />//Jeżeli przerwanie poinformuje za pomocą ustawienia flago odb_flaga<br />//oznacza to, że odebrano komendę i należy ją rozpoznać<br /><br />if(odb_flaga){ at_komenda_sprawdz()}<br />_delay_ms(500);  <br /><br />i = getADC(0);<br />itoa(i,bufor_nad,10);<br /><br />if(i&lt;100)//jeśli wynik ADC mniejszy od 100 wyłącza programy<br />{<br />PORTD&amp;= ~( (1&lt;&lt;PD2) |  (1&lt;&lt;PD3) |  (1&lt;&lt;PD4) | (1&lt;&lt;PD5) | (1&lt;&lt;PD6) );<br />}<br />}<br />}<br />}[/syntax]<br /><br />reszta adc<br />[syntax=cpp]ISR(USART_UDRE_vect){<br /> <br />//przerwanie generowane, gdy bufor nadawania jest już pusty,<br />//odpowiedzialne za wysłanie wszystkich znaków z tablicy bufor_nad&#91;&#93;<br /> <br />//indeks bufora nadawania<br />static int bufor_nad_ind = 0;<br /> <br />//sprawdzamy, czy bajt do wysłania nie jest znakiem końca tekstu (czyli zerem)<br />//i czy nie dotarliśmy już do końca tablicy bufora nadawania<br />if((bufor_nad&#91;bufor_nad_ind&#93; != 0) &amp;&amp; (bufor_nad_ind &lt; BUFOR_NAD_IL_ZNAKOW)){<br /> <br />//są jeszcze znaki do wysłania<br /> <br />//załaduj znak do rejestru wysyłki i ustaw indeks na następny znak<br />UDR = bufor_nad&#91;bufor_nad_ind++&#93;;<br /> <br />}else{<br /> <br />//osiągnięto koniec napisu w tablicy bufor_nad&#91;&#93;<br />UCSRB &amp;= ~(1&lt;&lt;UDRIE); //wyłącz przerwania pustego bufora nadawania<br />  //co zakończy nadawanie<br /> <br />//zeruj indeks bufora nadawania<br />bufor_nad_ind = 0;<br />}<br />}<br /> <br /> <br />//--------------------------------------------------------------<br /> <br /> <br />void wyslij_dane(void){<br /><br /><br />//funkcja rozpoczyna inicjuje wysyłanie danych<br /> <br />//na wszelki wypadek upewnij się, że bufor nadawania USART jest pusty<br />while (!(UCSRA &amp; (1&lt;&lt;UDRE)));<br /> <br />//bufor jest pusty można wysłać<br /> <br />//włącz przerwania pustego bufora UDR, co rozpocznie transmisję<br />//aktualnej zawartości bufora<br />UCSRB |= (1&lt;&lt;UDRIE);<br /> <br />//Wysyłką danych zajmie się funkcja przerwania ISR(USART_UDRE_vect)<br /> <br />}<br /><br /> int getADC(char number)<br /> //number należy do &lt;0, 7&gt;, kod nie sprawdza szkoda pamięci FLASH<br /> {<br /> ADMUX &amp;= 0xf0; //zerowanie 4 młodszych bitów<br /> ADMUX |= number; //ustawianie numeru kanału<br /> <br /> ADCSRA |= 1&lt;&lt;ADSC; //zaczyna konwersję<br /> while(ADCSRA &amp; (1 &lt;&lt; ADIF));    //dopóki bit ADIF nie jest ustawiony nie jest gotowa konwersja<br /> ADCSRA &amp;= ~((1 &lt;&lt; ADSC) | (1 &lt;&lt; ADIF)); //zeruj flage konwersji i rozkaz rozpoczęcia<br /> return ADC;<br /> }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8413">macko333</a> — 15 lut 2015, o 15:54</p><hr />
]]></content>
</entry>
</feed>