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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-03-03T16:03:57+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=10853&amp;mode</id>
<entry>
<author><name><![CDATA[macko333]]></name></author>
<updated>2015-03-03T16:03:57+01:00</updated>
<published>2015-03-03T16:03:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10853&amp;p=121754#p121754</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10853&amp;p=121754#p121754"/>
<title type="html"><![CDATA[Re: problem z kodem - adc + usart]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10853&amp;p=121754#p121754"><![CDATA[
Nie mogę przetestować jeszcze kodu a właśnie spodziewam się &quot;kwiatków&quot; wynikających przede wszystkim z braku mojego doświadczenia w tym temacie. W kodzie wzorowałem sie na innych projektach.<br />Troszkę zmieniłem funkcję odczytu adc, mam nadzieję ,że teraz hula. <br />W skrócie: wysyłam komendy z aplikacji na androidzie przez bluetooth typu :&quot;AT+POMPA0&quot; gdzie zero to koniec komendy. Atmega sprawdza komendę i wykonuje odpowiednie czynności - w większości jest to zmiana stanu pinów które włączają/wyłączają odpowiednie przekaźniki.<br />Po wykryciu komendy stanu, dokonać ma się pomiar przez czujnik analogowy i wysłanie jego wyniku w formie 0-1024 przez bluetooth do aplikacji.<br />Cały kod:<br />[syntax=cpp]#include &lt;avr/io.h&gt;         //Inicjacja dodatkowych bibliotek <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 /> <br />volatile unsigned char odb_flaga = 0; //Inicjacji flagi globalej informującej o odebraniu komeny <br /><br />#define AT_ILOSC_ZNAKOW10//Definicja maksymalnej długości komendy wraz ze znakiem \n (0)<br /> <br />const char wzorce_komend&#91;&#93;&#91;AT_ILOSC_ZNAKOW&#93; PROGMEM = {&quot;AT+STAN\n&quot;,  //Powstanie tablicy wzorcowej komend<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 />#define AT_ILOSC_WZORCOW(sizeof(wzorce_komend)/AT_ILOSC_ZNAKOW) //Zdefiniowanie ilości wprowadzonych wzorców komend<br /> <br />char bufor_odb&#91;AT_ILOSC_ZNAKOW + 1&#93;;//Inicjacja bufor'a odebranych komend<br />volatile char at_odebrano_znakow = 0;//indeks znaku w tablicy bufora<br />                <br />void usart_inicjuj(void)<br />{<br />#define BAUD 9600         //Wybór prędkości transmisji modułu HC-05<br />#include &lt;util/setbaud.h&gt; //Definiowanie parametrów transmisju za pomocą pliku setbaud.h<br /> <br />UBRRH = UBRRH_VALUE; //Definicja rejestru danych zapisy<br />UBRRL = UBRRL_VALUE; //Definicja rejestru danych odczytu<br />UCSRA |=  (1&lt;&lt;U2X); //Ustawienie podwójnej prędkości transmifji<br /><br />UCSRC = (1&lt;&lt;URSEL) | (1&lt;&lt;UCSZ1) | (1&lt;&lt;UCSZ0);//Określenie standardowych parametrów transmisji modulu:<br />//bitów danych: 8<br />//bity stopu:  1<br />//parzystość:  brak<br /> <br />UCSRB = (1&lt;&lt;TXEN) | (1&lt;&lt;RXEN) | (1&lt;&lt;RXCIE); //Włączenie nadajnika, wlączenie odbiornika, włączenie przerwać odbiornika<br />}<br /> <br />ISR(USART_RXC_vect)<br />{<br />//przerwanie generowane po odebraniu bajtu za pomocą USART<br /> <br />static int bufor_odb_ind = 0;     //indeks tablicy odbiorczej<br /><br />bufor_odb &#91;bufor_odb_ind&#93; = UDR;  //zapamiętanie odebranej liczby<br /> <br />if (bufor_odb &#91;bufor_odb_ind&#93; == 0x00) {    //funkcja sprawdzająca koniec komendy jeśli pojawi się znak 0<br /> <br />//Jeśli odebrano znak końca komendy:<br />odb_flaga = 1; //ustawienie flagi odbioru komendy - (potrzebna dla main())<br />at_odebrano_znakow = bufor_odb_ind; //zapamiętanie ilości odebranych znaków<br />bufor_odb_ind = 0;//ustawienie indekus na początek bufora odbiorczego<br /> <br />}else{<br /> <br />//Jeśli nie odebrano znaku końca komendy:<br />bufor_odb_ind++;//zmiana indeksu bufora na następny wolny bajt<br /> <br />if (bufor_odb_ind &gt;= AT_ILOSC_ZNAKOW){        //sprawdzenie czy przekroczono ilość znaków<br /><br />bufor_odb_ind = 0; //jeśli przekroczona oznacza to iż tekst odebrany nie jest komendą i następije zerowanie indeksu bufora.<br />}<br />}<br />}<br /><br />int getADC(char number) //definicja funkcji dokonującej pomiar<br /><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 ADCW;<br />}<br /><br /> void USART_Transmit( unsigned char data )<br /> {<br /> /* Wait for empty transmit buffer */<br /> while ( !( UCSRA &amp; (1&lt;&lt;UDRE)) )<br /> ;<br /> /* Put data into buffer, sends the data */<br /> UDR = data;<br /> }<br /> <br />  void USART_WYSLIJ_NAPIS(char *napis)<br />  {<br />  int8_t dlugosc;<br />  int8_t k=0;<br />  dlugosc=strlen(napis);<br />  for(k=0;k&lt;dlugosc;k++)<br />  {<br />  USART_Transmit(napis&#91;k&#93;);<br />  }<br />  <br /><br />void wyslij_dane(void)<br />{<br /> int i;<br /> char bufor&#91;16&#93;;<br /> i = getADC(0);<br /> itoa(i,bufor,10);<br /> USART_WYSLIJ_NAPIS(bufor);<br />}<br /><br /> <br />void at_komenda_reakcja(unsigned char at_komenda_nr)<br />{<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 />if (PIND &amp; (1&lt;&lt;PD2)) //Sprawdzenie czy stan wysoki<br />{<br />PORTD&amp;= ~(1&lt;&lt;PD2); //Jeśli tak to wyłączenie<br />}<br />else<br />{<br />PORTD|= (1&lt;&lt;PD2); //jeśli nie to załączenie<br />}<br />break;<br /> <br />case 2: //AT+SIEC<br />if (PIND &amp; (1&lt;&lt;PD3)) //sprawdzenie czy stan wysoki<br />{<br />PORTD&amp;= ~(1&lt;&lt;PD3);<br />}<br />else<br />{<br />PORTD|= (1&lt;&lt;PD3);<br />}<br />break;<br />break;<br /><br />case 3: //AT+PRZOD<br />if (PIND &amp; (1&lt;&lt;PD4)) //sprawdzenie czy stan wysoki<br />{<br />PORTD&amp;= ~(1&lt;&lt;PD4);<br />}<br />else<br />{<br />PORTD|= (1&lt;&lt;PD4);<br />}<br />break;<br /><br />case 4: // AT+BOK<br />if (PIND &amp; (1&lt;&lt;PD5)) //sprawdzenie czy stan wysoki<br />{<br />PORTD&amp;= ~(1&lt;&lt;PD5);<br />}<br />else<br />{<br />PORTD|= (1&lt;&lt;PD5);<br />}<br />break;<br /> <br />case 5: //AT+TYL<br />if (PIND &amp; (1&lt;&lt;PD6)) //sprawdzenie czy stan wysoki<br />{<br />PORTD&amp;= ~(1&lt;&lt;PD6);<br />}<br />else<br />{<br />PORTD|= (1&lt;&lt;PD6);<br />}<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) );//Wyłączenie wyjść.<br /><br />break;<br /> <br />}<br /> <br />}<br /> <br />//--------------------------------------------------------------<br /> <br />void at_komenda_sprawdz(void){<br /> <br />unsigned int nr_rozpoznanej_komendy; //zmienna pomocnicza<br /> <br />odb_flaga = 0; //Zgaszenie flagi odebrania komendy<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;ADPS1) | (1&lt;&lt;ADPS2); //włączenie przetwornika adc oraz ustawienie prescalera na 64<br /> ADMUX  = (1&lt;&lt;REFS0);       //napięcie odniesienia równe zasilaniu mikrokontrolera. <br />   //napięcie zasilania AVcc, jako napięcie odniesienia Vref. i ADC0<br /> DDRC &amp;=~ (1&lt;&lt;PC0);   //Ustawienie ADC0 jako wejście<br /><br /> DDRD|= ( (1&lt;&lt;PD2) |  (1&lt;&lt;PD3) |  (1&lt;&lt;PD4) | (1&lt;&lt;PD5) | (1&lt;&lt;PD6) ); //Ustawienie pinów PD2-PD6 jako wyjście<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 flagi odb_flaga<br />//oznacza to, że odebrano komendę i należy ją rozpoznać<br /><br />if(odb_flaga) at_komenda_sprawdz();<br /><br />}<br />}[/syntax]<br />Jest to cały kod programu.<br />Byłbym wdzięczny za jakąkolwiek pomoc.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8413">macko333</a> — 3 mar 2015, o 16:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2015-02-28T22:32:33+01:00</updated>
<published>2015-02-28T22:32:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10853&amp;p=121403#p121403</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10853&amp;p=121403#p121403"/>
<title type="html"><![CDATA[Re: problem z kodem - adc + usart]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10853&amp;p=121403#p121403"><![CDATA[
Napisz coś więcej o problemie. <br />Bo stwierdzenie<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />coś mi nie wychodzi <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /></div>nie mówi zbyt wiele.<br /><br />A poza tym to wpakowałeś definicję funkcji bufor_nad wewnątrz funkcji wyslij_dane. Bo wg mnie coś takiego<br />[syntax=c]int bufor_nad(char number) //deklaracja zmiennej<br />         <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]<br />to definicja funkcji dokonującej pomiaru ADC a nie deklaracja zmiennej jak napisałeś w komentarzu. Z tego co wiem to nie definiuje się jednej funkcji wewnątrz innej funkcji.<br /><br />A tutaj<br />[syntax=c]//Załadowanie znaku do rejestru wysyłki i ustawienie indeks'u na następny znak<br />UDR = bufor_nad&#91;bufor_nad_ind++&#93;;[/syntax]<br />wpisujesz do rejestru UDR wynik pomiaru z kolejnych kanałów ADC. <br /><br />Jak dla mnie to pomieszanie z poplątaniem.<br /><br />Pokaż może cały kod programu bo coś mi się wydaje, że będzie tam więcej takich kwiatków.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 28 lut 2015, o 22:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[macko333]]></name></author>
<updated>2015-02-28T09:34:34+01:00</updated>
<published>2015-02-28T09:34:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10853&amp;p=121292#p121292</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10853&amp;p=121292#p121292"/>
<title type="html"><![CDATA[problem z kodem - adc + usart]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10853&amp;p=121292#p121292"><![CDATA[
Witam, próbuję się uporać z pomiarem adc czujnika analogowego i coś mi nie wychodzi <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />AtMega 8, kwarc 11.059, prescaler 64, zakres pomiaru 10 bit.<br /><br />Do komunikacji uzywam buforów oraz komend. Po odebraniu komendy następuje inicjacja funkcji &quot;wyślij_dane()&quot;, pomiar, załadowanie do buforu nadawczego i wysłanie w formie 0-1024 przez bluetooth do android. <br /><br />[syntax=cpp]void wyslij_dane(void){<br />  <br />  int bufor_nad(char number) //deklaracja zmiennej<br />  <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 /> //włączenie przerwań nadajnika<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 />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 />static int bufor_nad_ind = 0; //index bufora nadawania<br /> <br />//sprawdzenie 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 />//Jeśli są jeszcze znaki do wysłania:<br />//Załadowanie znaku do rejestru wysyłki i ustawienie indeks'u na następny znak<br />UDR = bufor_nad&#91;bufor_nad_ind++&#93;;<br /> <br />}else{<br /><br />//W przeciwnym wypadku<br />//osiągnięto koniec napisu w tablicy bufor_nad&#91;&#93;<br /><br />UCSRB &amp;= ~(1&lt;&lt;UDRIE); //wyłączenie przerwania pustego bufora nadawania - koniec nadawania.  <br /><br />bufor_nad_ind = 0; //zerowanie indeksu bufora nadawania<br />}<br />}<br /><br />void init()  //procedura inicjalizacji podstawowych funkcji<br />{<br /> /*INICJALIZACJA ADC */<br /> <br /> ADCSRA = (1&lt;&lt;ADEN) | (1&lt;&lt;ADPS1) | (1&lt;&lt;ADPS2); //włączenie przetwornika adc oraz ustawienie prescalera na 64<br /> ADMUX  = (1&lt;&lt;REFS0);       //napięcie odniesienia równe zasilaniu mikrokontrolera. <br />   //napięcie zasilania AVcc, jako napięcie odniesienia Vref. i ADC0<br /> DDRC &amp;=~ (1&lt;&lt;PC0);   //Ustawienie ADC0 jako wejście<br /> <br />//--------------------------------------------------------------<br />}[/syntax]<br /><br />Z góry jestem wdzięczny za pomoc.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8413">macko333</a> — 28 lut 2015, o 09:34</p><hr />
]]></content>
</entry>
</feed>