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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2012-08-01T11:33:40+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=1338&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-08-01T11:33:40+01:00</updated>
<published>2012-08-01T11:33:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11452#p11452</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11452#p11452"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11452#p11452"><![CDATA[
<div class="quotetitle">arko_go napisał(a):</div><div class="quotecontent"><br />BTW - kiedy rusza szkolenie online?<br /></div><br /><br />Oj na to to nie jestem na razie w stanie odpowiedzieć.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 1 sie 2012, o 11:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[developer85]]></name></author>
<updated>2012-08-01T11:25:22+01:00</updated>
<published>2012-08-01T11:25:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11450#p11450</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11450#p11450"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11450#p11450"><![CDATA[
Mirku, nie obrażam się na pewno. Cenię sobie każdą twoją radę i wiem że chcesz aby każdy kto zaczyna naukę w C podchodził to problemu profesjonalnie i uczył się dobrych nawyków programowania:).<br />A następny razem jak będę potrzebował coś na szybcika to na pewno zapodam temat do działu rybnego:) <br /><br />BTW - kiedy rusza szkolenie online?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=390">developer85</a> — 1 sie 2012, o 11:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Malutki_27]]></name></author>
<updated>2012-07-31T22:43:37+01:00</updated>
<published>2012-07-31T22:43:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11430#p11430</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11430#p11430"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11430#p11430"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Np kolega Malutki_27 jest normalnie na razie naszym mistrzem &quot;rybołóstwa&quot; czyli tak na prawdę szaleje jeśli chodzi o rozdawanie ryb, ale ile sam na tym korzysta <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /></div><br /><br /><br />Hmmm, ja tam nic  o tym nie wiem  <img src="https://forum.atnel.pl/images/smilies/icon_rolleyes.gif" alt=":roll:" title="Udaje, że to nie on" /> , ale muszę przyznać że to bardzo fajna zabawa takie łowienie rybek i musze przyznać że daje bardzo dużo satysfakcji <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br /><br />@arko_go Dawaj co tam masz, nawet jak nie będziesz chciał wykorzystać kodów proponowanych w <span style="color: #40BF40">RYBNYM</span> , to przynajmniej będziesz miał unikatową mozliwość poznania np innego sposobu podejścia do tego samego problemu, a to juz jest bezcenne, wręcz porównywalne z przykładem dobrze opisanego kodu <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=225">Malutki_27</a> — 31 lip 2012, o 22:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-31T17:39:16+01:00</updated>
<published>2012-07-31T17:39:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11404#p11404</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11404#p11404"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11404#p11404"><![CDATA[
<div class="quotetitle">arko_go napisał(a):</div><div class="quotecontent"><br />Dzięki za podpowiedzi. Nigdy nie pisałem, że potrzebuje gotowca,<br /></div><br /><br />Tak ale nie urażaj się za tą propozycję, bo zobacz że na naszym forum wymyśliliśmy tu niejako wspólnie w pewnej dyskusji w jednym z wątków taką formułę , która pozwala nie to że dostać gotowca - ale za to osoby chętne się pouczyć na prawdziwych zadaniach - a Ty takie masz - mogą popróbować swoich sił - i już nawet teraz jakbyś tam zajrzał wychodzą fajne rzeczy.... Np kolega Malutki_27 jest normalnie na razie naszym mistrzem &quot;rybołóstwa&quot; czyli tak na prawdę szaleje jeśli chodzi o rozdawanie ryb, ale ile sam na tym korzysta <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... więc na przyszłość pamiętaj o tym bo wyszła z tego fajna rzecz.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 31 lip 2012, o 17:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[developer85]]></name></author>
<updated>2012-07-31T17:34:01+01:00</updated>
<published>2012-07-31T17:34:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11403#p11403</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11403#p11403"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11403#p11403"><![CDATA[
Nie Pan mi tu proszę tylko kolego:)<br />Rozwiązania doszedłem już sam:)<br />Dzięki za podpowiedzi. Nigdy nie pisałem, że potrzebuje gotowca, tylko pytałem bardziej doświadczonych kolegów o pomoc i wskazówki.<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=390">developer85</a> — 31 lip 2012, o 17:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-31T13:49:06+01:00</updated>
<published>2012-07-31T13:49:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11382#p11382</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11382#p11382"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11382#p11382"><![CDATA[
No to wrzuć Pan zadanie do &quot;działu RYBNEGO&quot; - a nóż znajdzie się ktoś kto zechce ci gotowe rozwiązanie napisać w ramach praktyk <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> po to jest ten nasz dziwny dział <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 31 lip 2012, o 13:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[developer85]]></name></author>
<updated>2012-07-31T11:17:17+01:00</updated>
<published>2012-07-31T11:17:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11366#p11366</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11366#p11366"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11366#p11366"><![CDATA[
Wróciłem do starej koncepcji projektu. Jak dodam inicjalizacje UART w tedy brak pwm-a i brak reakcji na sterowanie silnika z przycisków.<br />To że mam funkcje _delay wsadzone w while() to na razie nie istotne. Chodzi głównie czego Uart psuje wszystko.<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2012-07-31<br /> *       Autor: Arkadiusz Golec<br /> */<br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />//#include &quot;LCD/lcd44780.h&quot;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#include &quot;MKUART/mkuart.h&quot;<br /><br />/* przydatne definicje pinów sterujących */<br />#define WE_A PD1 // piny sterujące L293DNE<br />#define WE_B PD0<br />#define KEY1 (1&lt;&lt;PB0) //def klawisz 1<br />#define KEY2 (1&lt;&lt;PB1) //def klawisza 2<br />#define KEY_DOWN1 !(PINB &amp; KEY1) //sprawdzanie stanu niskiego na KEY1<br />#define KEY_DOWN2 !(PINB &amp; KEY2) //sprawdzanie stanu niskiego na KEY2<br />/* definicje poleceń sterujących pracą silnika */<br />#define DC_LEWO PORTD &amp;= ~(1&lt;&lt;WE_A); PORTD |= (1&lt;&lt;WE_B) // obrót prawo<br />#define DC_PRAWO PORTD |= (1&lt;&lt;WE_A); PORTD &amp;= ~(1&lt;&lt;WE_B)// obrót lewo<br />#define DC_STOP PORTD &amp;= ~(1&lt;&lt;WE_A); PORTD &amp;= ~(1&lt;&lt;WE_B)//stop<br /><br />// definicja pinów enkodera<br />#define PHASE_A         (PINA &amp; 1&lt;&lt;PA1) // piny enkodera Channel A<br />#define PHASE_B         (PINA &amp; 1&lt;&lt;PA2)//piny enkodera Channel B<br />#define LED_PIN  (1&lt;&lt;PD7) //diodka<br />#define LED_ON PORTD |= LED_PIN;<br /><br />volatile int8_t enc_delta;                      // -128 ... 127<br />static int8_t last;<br /><br /><br />//PWM<br />volatile uint8_t pwm1;<br /><br />uint16_t pomiar(uint8_t kanal);<br /><br />void encode_init( void )<br />{<br />  int8_t new;<br /><br />  new = 0;<br />  if( PHASE_A ==0)<br />    new = 3;<br />  if( PHASE_B ==0)<br />    new ^= 1;<br />  last = new;<br />  enc_delta = 0;<br />  TCCR2 |= (1&lt;&lt;WGM21);             // CTC<br />  TCCR2 |=  (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);  //1024         //(1&lt;&lt;CS22);    //64<br />  OCR2 = 18;<br />  TIMSK |= (1&lt;&lt;OCIE2);<br />}<br /><br /><br />ISR( TIMER2_COMP_vect)<br />{<br />  int8_t new, diff;<br />  new = 0;<br />  if( PHASE_A ==0)<br />    new = 3;<br />  if( PHASE_B ==0)<br />    new ^= 1;                                   // konwersja do binarki<br />  diff = last - new;<br />  if( diff &amp; 1 ){                                       // bit 0 = value (1)<br />    last = new;                                 // zapamiętanie nowej wartości w  next last<br />    enc_delta += (diff &amp; 2) - 1;                // bit 1 = direction (+/-)<br />  }<br /><br /><br />}<br /><br />int8_t encode_read1( void )                     // odczyt co krok<br />{<br />  int8_t val;<br /><br />  cli();<br />  val = enc_delta;<br />  enc_delta = 0;<br />  sei();<br />  return val;<br />}<br /><br /><br />int8_t encode_read2( void )                     // odczyt co 2 kroki<br />{<br />  int8_t val;<br /><br />  cli();<br />  val = enc_delta;<br />  enc_delta = val &amp; 1;<br />  sei();<br />  return val &gt;&gt; 1;<br />}<br /><br /><br />int8_t encode_read4( void )                     // odczyt co 4 kroki<br />{<br />  int8_t val;<br /><br />  cli();<br />  val = enc_delta;<br />  enc_delta = val &amp; 3;<br />  sei();<br />  return val &gt;&gt; 2;<br />}<br /><br />int8_t encode_read8( void )                     // odczyt co 8 kroki<br />{<br />  int8_t val;<br /><br />  cli();<br />  val = enc_delta;<br />  enc_delta = val &amp; 4;<br />  sei();<br />  return val &gt;&gt; 3;<br />}<br />int8_t encode_read16( void )                     // odczyt co 16 kroki<br />{<br />  int8_t val;<br /><br />  cli();<br />  val = enc_delta;<br />  enc_delta = val &amp; 8;<br />  sei();<br />  return val &gt;&gt; 4;<br />}<br /><br />int main(void) {<br /><br /><br />USART_Init( __UBRR );// inicjalizacja UART<br /><br />DDRA |=(1&lt;&lt;PA7);<br />PORTA |= (1&lt;&lt;PA7);<br /><br />//lcd_init();<br /><br />int32_t val = 0;<br />DDRD |= LED_PIN;<br /><br />encode_init();<br /><br /><br /><br />/* ustawiamy piny sterujące L293D jako wyjścia */<br />DDRD |= (1&lt;&lt;WE_A)|(1&lt;&lt;WE_B); // ustawienie pinów sterujących L293DNE jako wyjścia<br />DDRB &amp;=~  (KEY1| KEY2);      // wejście KEY1 KEY2<br />PORTB |=( KEY1 | KEY2);// podciągnięcie KEY1 KEY2 do VCC<br /><br />//PWM<br />//***** SPRZĘTOWY PWM - 1 KANAŁ OC0 (PB3) *******<br />// ustawienie końcówki OC0 (PB3) sprzętowy PWM jako WYJŚCIE<br />DDRB |= (1&lt;&lt;PB3);<br />// ustawienia TIMER0 w Fast PWM<br />TCCR0 |= (1&lt;&lt;WGM01)|(1&lt;&lt;WGM00);// tryb Fast PWM<br />TCCR0 |= (1&lt;&lt;COM01)|(1&lt;&lt;COM00);// clear at TOP<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);// preskaler = 1<br />OCR0=pomiar(5);//PWM<br /><br /><br /><br />ADMUX |= (1&lt;&lt;REFS0)|(1&lt;&lt;ADLAR);// wybór napięcia odniesienia w postaci VCC<br />ADCSRA |= (1&lt;&lt;ADEN)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0); // włączenie modułu ADC oraz ustawienie preskalera 64<br /><br /><br />sei();<br /><br />while(1)<br />{<br />//lcd_cls();<br />//lcd_locate(0,0);<br />//lcd_str(&quot;PWM&quot;);<br />//lcd_locate(1,0);<br />//lcd_int(pomiar (5));<br />/*<br />lcd_locate(0,5);<br />lcd_str(&quot;ENCODER&quot;);<br />lcd_locate(1,5);<br />lcd_int(val);<br />_delay_ms(100);<br />*/<br /><br />val += encode_read4();<br /><br /><br />//uart_puts(&quot;ENCODER= &quot;);// wyślij tekst<br />//uart_putint(val, 10);// wyślij liczbę<br />//uart_puts(&quot;    cm&quot;);<br />//uart_putc('\r');// wyślij znak CR (enter)<br />//uart_putc('\n');<br />//_delay_ms(1000);<br /><br /><br /><br /><br /><br />if( KEY_DOWN1 ) {<br />_delay_ms(80); //czas drgania styków<br /><br />OCR0=pomiar(5);<br />_delay_ms(1);<br /><br />DC_PRAWO;<br />} else if ( KEY_DOWN2 ) {<br />_delay_ms(80);<br /><br />OCR0=pomiar(5);<br />_delay_ms(1);<br /><br />   DC_LEWO;<br />} else {<br />DC_STOP;<br />}<br /><br /><br />}<br /><br /><br />}<br /><br /><br /><br />uint16_t pomiar (uint8_t kanal)<br />{<br />ADMUX = (ADMUX &amp; 0xF8)| kanal; //       PA5   //ustawienie wybranego kanalu w rejestrze ADMUX<br />ADCSRA |= (1&lt;&lt;ADSC);  //start pomiaru przez ustawienie bitu ADSC w rejestrze ADCSRA<br />while (ADCSRA &amp; (1&lt;&lt;ADSC)); //oczekiwanie na koniec pomiaru (dopóki bit ADSC =1)<br />// po zakończeniu pomiaru, gdy bit ADSC=0, zwrócenie wyniku w postaci<br />// 16-to bitowej wartości z rejestrów ADCH i ADCL<br />return (ADCW&gt;&gt;8);<br />}<br /><br />[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=390">developer85</a> — 31 lip 2012, o 11:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-31T09:17:10+01:00</updated>
<published>2012-07-31T09:17:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11354#p11354</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11354#p11354"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11354#p11354"><![CDATA[
No tu kolega strasznie (tak mi się wydaje poplątał) .... to samo co robi SuperDebounce za chwile w zwykłych if'ach w timerze2 programowym - o co tu chodzi ????<br /><br />Ja bym tak nie stawiał pytania - że wrzucam cały swój kod i proszę o podpowiedź co tu jest źle, bo kto ma wiedzieć jak nie ty. Trzeba lepiej precyzować pytania żeby się szybciej czegoś dowiedzieć....<br /><br />Czy kolega w ogóle najpierw potrenował sobie używanie timerów programowych z diodami LED ? zrozumiał dokładnie o co chodzi ??? bo niestety wydaje mi się że na razie nie <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> .... a tymczasem próbuje je kolega na oślep używać i stąd pewnie efekt że coś tam nie działa albo wszystko nie działa<br /><br />Najpierw trzeba zrozumieć JEDNO<br /><br />1. wszystko co dzieje się w pętli while(1) - jest wykonywane miliony raz na sekundę, więc po co np umieszczać wyświetlanie na LCD tak szybko ??? co kolega zrobił właśnie w tej pętli - toż to już jest nieporozumienie i to mocne. Bo nie dość że nie potrzeba tak często to jeszcze to wyświetlanie tak często zapuszczane blokuje tylko niepotrzebnie czas całej aplikacji<br /><br />2. timer programowy jest po to żeby np takie wyświetlanie odpalać sobie np raz na sekundę albo jak się uprzesz to i 10 no 20 razy max na sekundę. Bo przecież większego odświeżania i tak nigdy nie zobaczysz gołym okiem na LCD<br /><br />3. funkcja SuperDebounce już sama pięknie korzysta z timerów programowych więc po co w dalszej części znowu robić IFy dla klawiszy ????  Toż do tej funkcji podłączasz swoje własne, które mają coś zrobić gdy klawisz np wciśnięty czy zwolniony i to w nich piszesz reakcję na obsługę każdego klawisza<br /><br />więcej nie powiem bo niestety nie mam tyle czasu żeby całe kody analizować i to jeszcze bez wyjaśnień co jest konkretnym problemem <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> - postaraj się jak pisałem wyżej najpierw poćwiczyć timery programowe a nie od razu wszystko zaprzęgnąć do projektu który robisz - napisać cały program - a potem się zastanawiać co tu nie działa.<br /><br />Trzeba się nauczyć pisać program etapami<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 31 lip 2012, o 09:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[developer85]]></name></author>
<updated>2012-07-31T09:04:06+01:00</updated>
<published>2012-07-31T09:04:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11353#p11353</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11353#p11353"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11353#p11353"><![CDATA[
Przerobiłem trochę kod. Wrzuciłem część funkcji która odpowiada za enkoder do oddzielnego pliku.<br /> Wstawiłem diodkę w przerwanie w ISR(TIMER1_COMPA_vect) - timery programowe i tutaj coś zatrzymało. Nie działa PWM teraz:/ i sterowanie prawo lewo silnikami.<br />Hilfe!<br /><br />main.c<br />[syntax=c]<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &lt;avr/interrupt.h&gt;<br /><br /><br />#include &quot;encoder/encoder.h&quot;<br />#include &quot;MKUART/mkuart.h&quot;<br /><br />/* przydatne definicje pinów sterujących */<br />#define WE_A PD1 // piny sterujące L293DNE<br />#define WE_B PD0<br />#define KEY1 (1&lt;&lt;PB0) //def klawisz 1<br />#define KEY2 (1&lt;&lt;PB1) //def klawisza 2<br />#define KEY_DOWN1 !(PINB &amp; KEY1) //sprawdzanie stanu niskiego na KEY1<br />#define KEY_DOWN2 !(PINB &amp; KEY2) //sprawdzanie stanu niskiego na KEY2<br /><br />/* definicje poleceń sterujących pracą silnika */<br />#define DC_LEWO PORTD &amp;= ~(1&lt;&lt;WE_A); PORTD |= (1&lt;&lt;WE_B) // obrót prawo<br />#define DC_PRAWO PORTD |= (1&lt;&lt;WE_A); PORTD &amp;= ~(1&lt;&lt;WE_B)// obrót lewo<br />#define DC_STOP PORTD &amp;= ~(1&lt;&lt;WE_A); PORTD &amp;= ~(1&lt;&lt;WE_B)//stop<br /><br /><br /><br />/************** funkcja SuperDebounce do obsługi pojedynczych klawiszy ***************/<br />void SuperDebounce( volatile uint8_t *KPIN,<br />uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait,<br />void (*push_proc)(void), void (*rep_proc)(void) );<br /><br />void kl1_press(void);<br />void kl1_rep(void);<br />void kl2_press(void);<br />void kl2_rep(void);<br /><br />volatile uint16_t Timer1, Timer2, Timer3, Timer4;/* timery programowe 100Hz */<br /><br />//PWM<br />volatile uint8_t pwm1;<br /><br />uint16_t pomiar(uint8_t kanal);<br /><br /><br />int main(void) {<br /><br /><br /><br />/* ustawiamy piny sterujące L293D jako wyjścia */<br />DDRD |= (1&lt;&lt;WE_A)|(1&lt;&lt;WE_B); // ustawienie pinów sterujących L293DNE jako wyjścia<br />DDRB &amp;=~  (KEY1| KEY2);      // wejście KEY1 KEY2<br />PORTB |=( KEY1 | KEY2);// podciągnięcie KEY1 KEY2 do VCC<br /><br />DDRA |=(1&lt;&lt;PA7);<br />PORTA |= (1&lt;&lt;PA7); //podświetlenie LCD<br /><br />/* Timer1 – inicjalizacja przerwania co 10ms */<br />TCCR1A |= (1&lt;&lt;WGM12);// tryb pracy CTC<br />TCCR1A |= (1&lt;&lt;CS12)|(1&lt;&lt;CS10);// preskaler = 1024<br />OCR1A = 108;// przerwanie porównania co 10ms (100Hz)<br />TIMSK = (1&lt;&lt;OCIE1A );// Odblokowanie przerwania CompareMatch<br /><br />lcd_init();<br /><br />int32_t val = 0;<br /><br /><br />encode_init();<br /><br />//USART_Init( __UBRR );// inicjalizacja UART<br /><br /><br /><br />//PWM<br />//***** SPRZĘTOWY PWM - 1 KANAŁ OC0 (PB3) *******<br />// ustawienie końcówki OC0 (PB3) sprzętowy PWM jako WYJŚCIE<br /><br />DDRB |= (1&lt;&lt;PB3);<br /><br />// ustawienia TIMER0 w Fast PWM<br />TCCR0 |= (1&lt;&lt;WGM01)|(1&lt;&lt;WGM00);// tryb Fast PWM<br />TCCR0 |= (1&lt;&lt;COM01)|(1&lt;&lt;COM00);// clear at TOP<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);// preskaler = 1<br />OCR0=pomiar(5);//PWM<br /><br />//ADC<br /><br />ADMUX |= (1&lt;&lt;REFS0)|(1&lt;&lt;ADLAR);// wybór napięcia odniesienia w postaci VCC<br />ADCSRA |= (1&lt;&lt;ADEN)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0); // włączenie modułu ADC oraz ustawienie preskalera 64<br /><br />sei();<br /><br />while(1)<br />{<br />SuperDebounce(&amp;PINB, KEY_DOWN1, 80, 100, kl1_press, 0 );<br />SuperDebounce(&amp;PINB, KEY_DOWN2, 80, 100, kl2_press, 0 );<br /><br /><br />lcd_cls();<br />lcd_locate(0,0);<br />lcd_str(&quot;PWM&quot;);<br />lcd_locate(1,0);<br />lcd_int(pomiar (5));<br />_delay_ms(100);<br /><br />/*<br />lcd_locate(0,5);<br />lcd_str(&quot;ENCODER&quot;);<br />lcd_locate(1,5);<br />lcd_int(val);<br /><br />*/<br /><br />val += encode_read4();<br /><br /><br />//uart_puts(&quot;ENCODER= &quot;);// wyślij tekst<br />//uart_putint(val, 10);// wyślij liczbę<br />//uart_puts(&quot;    cm&quot;);<br />//uart_putc('\r');// wyślij znak CR (enter)<br />//uart_putc('\n');<br />//_delay_ms(100);<br /><br /><br /><br /><br /><br />if( !Timer2 ) {<br />Timer2=80;<br />if(KEY_DOWN1)<br />kl1_press();<br /><br />} else if ( !Timer2) {<br />Timer2=80;<br />if(KEY_DOWN2)<br />kl2_press();<br /><br />} else {<br />DC_STOP;<br />}<br /><br /><br />}<br /><br /><br />}<br /><br />ISR(TIMER1_COMPA_vect)<br />{<br />uint16_t n;<br /><br />n = Timer1;/* 100Hz Timer1 */<br />if (n) Timer1 = --n;<br />n = Timer2;/* 100Hz Timer2 */<br />if (n) Timer2 = --n;<br />n = Timer3;/* 100Hz Timer3 */<br />if (n) Timer3 = --n;<br />n = Timer4;/* 100Hz Timer4 */<br />if (n) Timer4 = --n;<br /><br />}<br /><br />uint16_t pomiar (uint8_t kanal)<br />{<br />ADMUX = (ADMUX &amp; 0xF8)| kanal; //       PA5   //ustawienie wybranego kanalu w rejestrze ADMUX<br />ADCSRA |= (1&lt;&lt;ADSC);  //start pomiaru przez ustawienie bitu ADSC w rejestrze ADCSRA<br />while (ADCSRA &amp; (1&lt;&lt;ADSC)); //oczekiwanie na koniec pomiaru (dopóki bit ADSC =1)<br />// po zakończeniu pomiaru, gdy bit ADSC=0, zwrócenie wyniku w postaci<br />// 16-to bitowej wartości z rejestrów ADCH i ADCL<br />return (ADCW&gt;&gt;8);<br />}<br /><br />void SuperDebounce(volatile uint8_t *KPIN,<br />uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait,<br />void (*push_proc)(void), void (*rep_proc)(void) ) {<br /><br />enum KS {idle, debounce, go_rep, wait_rep, rep};<br /><br />static enum KS key_state;<br />static uint8_t last_key;<br />uint8_t key_press;<br /><br />// zabezpieczenie przed wykonywaniem tej samej funkcji dla<br />// dwóch klawiszy wciskanych jednocześnie (zawsze będzie<br />// wykonywana odpowiednia akcja dla tego, który został<br />// wciśnięty jako pierwszy<br />if( last_key &amp;&amp; last_key != key_mask ) return;<br /><br />key_press = !(*KPIN &amp; key_mask);<br /><br />if( key_press &amp;&amp; !key_state ) {<br />key_state = debounce;<br />Timer1 = 5;<br />} else<br />if( key_state  ) {<br />if( key_press &amp;&amp; debounce==key_state &amp;&amp; !Timer1 ) {<br />key_state = go_rep;<br />Timer1=3;<br />last_key = key_mask;<br />} else<br />if( !key_press &amp;&amp; key_state&gt;debounce &amp;&amp; key_state&lt;rep ) {<br />if(push_proc) push_proc();/* KEY_UP */<br />key_state=idle;<br />last_key = 0;<br />} else<br />if( key_press &amp;&amp; go_rep==key_state &amp;&amp; !Timer1 ) {<br />if(!rep_time) rep_time=20;<br />if(!rep_wait) rep_wait=150;<br />key_state = wait_rep;<br />Timer1=rep_wait;<br />} else<br />if( key_press &amp;&amp; wait_rep==key_state &amp;&amp; !Timer1 ) {<br />key_state = rep;<br />} else<br />if( key_press &amp;&amp; rep==key_state &amp;&amp; !Timer1 ) {<br />Timer1 = rep_time;<br />if(rep_proc) rep_proc();/* KEY_REP */<br />}<br />}<br /><br />if( key_state&gt;=wait_rep &amp;&amp; !key_press ) {<br />key_state = idle;<br />last_key = 0;<br />}<br />}<br /><br /><br /><br />void kl1_press(void) {<br />OCR0=pomiar(5);<br />DC_PRAWO;<br />}<br /><br />void kl1_rep(void) {<br /><br />}<br /><br />void kl2_press(void) {<br />OCR0=pomiar(5);<br />    DC_LEWO;<br />}<br /><br />void kl2_rep(void) {<br />//lcd_locate(0,0);<br />//lcd_str_P(PSTR(&quot;cnt &quot;));<br />//lcd_int(lcd_cnt++);<br />//lcd_str_P(PSTR(&quot;  &quot;));<br />}<br /> [/syntax]<br /><br />enkoder.h<br />[syntax=c]<br />#ifndef ENCODER_H_<br />#define ENCODER_H_<br /><br />#define PHASE_A         (PINA &amp; 1&lt;&lt;PA1) // piny enkodera Channel A<br />#define PHASE_B         (PINA &amp; 1&lt;&lt;PA2)//piny enkodera Channel B<br /><br />extern volatile int8_t enc_delta;                      // -128 ... 127<br />//static int8_t last;<br /><br />void encode_init( void );<br /><br />#endif /* ENCODER_H_ */<br />[/syntax]<br /><br />enkoder.c<br />[syntax=c]<br />#include &lt;avr/io.h&gt;// dołączenie głównego systemowego  pliku nagłówkowego<br />#include &lt;avr/interrupt.h&gt;<br /><br />#include &quot;encoder.h&quot;<br /><br />volatile int8_t enc_delta;                      // -128 ... 127<br />static int8_t last;<br /><br />void encode_init( void )<br />{<br />  int8_t new;<br /><br />  new = 0;<br />  if( PHASE_A ==0)<br />    new = 3;<br />  if( PHASE_B ==0)<br />    new ^= 1;<br />  last = new;<br />  enc_delta = 0;<br />  TCCR2 |= (1&lt;&lt;WGM21);             // CTC<br />  TCCR2 |=  (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);  //1024         //(1&lt;&lt;CS22);    //64<br />  OCR2 = 18;<br />  TIMSK |= (1&lt;&lt;OCIE2);<br />}<br /><br /><br />ISR( TIMER2_COMP_vect)<br />{<br />  int8_t new, diff;<br />  new = 0;<br />  if( PHASE_A ==0)<br />    new = 3;<br />  if( PHASE_B ==0)<br />    new ^= 1;                                   // konwersja do binarki<br />  diff = last - new;<br />  if( diff &amp; 1 ){                                       // bit 0 = value (1)<br />    last = new;                                 // zapamiętanie nowej wartości w  next last<br />    enc_delta += (diff &amp; 2) - 1;                // bit 1 = direction (+/-)<br />  }<br /><br /><br />}<br /><br />int8_t encode_read1( void )                     // odczyt co krok<br />{<br />  int8_t val;<br /><br />  cli();<br />  val = enc_delta;<br />  enc_delta = 0;<br />  sei();<br />  return val;<br />}<br /><br /><br />int8_t encode_read2( void )                     // odczyt co 2 kroki<br />{<br />  int8_t val;<br /><br />  cli();<br />  val = enc_delta;<br />  enc_delta = val &amp; 1;<br />  sei();<br />  return val &gt;&gt; 1;<br />}<br /><br /><br />int8_t encode_read4( void )                     // odczyt co 4 kroki<br />{<br />  int8_t val;<br /><br />  cli();<br />  val = enc_delta;<br />  enc_delta = val &amp; 3;<br />  sei();<br />  return val &gt;&gt; 2;<br />}<br /><br />int8_t encode_read8( void )                     // odczyt co 8 kroki<br />{<br />  int8_t val;<br /><br />  cli();<br />  val = enc_delta;<br />  enc_delta = val &amp; 4;<br />  sei();<br />  return val &gt;&gt; 3;<br />}<br />int8_t encode_read16( void )                     // odczyt co 16 kroki<br />{<br />  int8_t val;<br /><br />  cli();<br />  val = enc_delta;<br />  enc_delta = val &amp; 8;<br />  sei();<br />  return val &gt;&gt; 4;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=390">developer85</a> — 31 lip 2012, o 09:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[developer85]]></name></author>
<updated>2012-07-30T20:12:47+01:00</updated>
<published>2012-07-30T20:12:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11334#p11334</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11334#p11334"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11334#p11334"><![CDATA[
Dzięki.<br />Za rozwianie moich wątpliwości.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=390">developer85</a> — 30 lip 2012, o 20:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-30T19:50:45+01:00</updated>
<published>2012-07-30T19:50:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11333#p11333</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11333#p11333"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11333#p11333"><![CDATA[
<div class="quotetitle">arko_go napisał(a):</div><div class="quotecontent"><br />Mam kilka niejasności tylko mnie od razu nie zlinczujcie za głupie pytania.<br /></div> <br />A tam zaraz <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> najwyżej trafiłbyś do naszych Lochów....<br /><br /><br /><div class="quotetitle">arko_go napisał(a):</div><div class="quotecontent"><br />1. Żeby zrealizować opóźnienia nie stosować funkcji typu _delay? tylko timery programowe? - akurat wykorzystuje dwa przyciski do sterowania silnikiem!<br /></div><br />No i co ? myślisz że aby stosować timery programowe to się opłaca dopiero od momentu gdy w programie zastosujesz 425 przycisków ??? A jak dwa do _delay ??? <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> .... no toż przecież cała idea prostej wielowątkowości polega na stosowaniu prostego mechanizmu timerów programowych, które działają sobie w oparciu o jeden dowolny timer sprzętowy. Opłaca się je panie kolego używać nawet jakbyś miał tylko pół przycisku <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><br /><div class="quotetitle">arko_go napisał(a):</div><div class="quotecontent"><br />2. Aby projekt był pseudo-wątkowy jak to autor ujął to jest do tego potrzebny RTC? nie mogę tego w żaden sposób pojąć.<br /></div><br /><br />No tu coś ci się zacięło <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... akurat w tym projekcie ( i masz to wyraźnie napisane w książce ) .... RTC jest kolejnym dodatkowym modułem zewnętrznym niezależnie obsługiwanym w systemie wielowątkowym. Wcale nie musi być wykorzystany - chociaż czasem może ponieważ sam potrafi ładnie generować sprzętowo przerwanka co 1Hz<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 30 lip 2012, o 19:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[developer85]]></name></author>
<updated>2012-07-30T19:32:39+01:00</updated>
<published>2012-07-30T19:32:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11328#p11328</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11328#p11328"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11328#p11328"><![CDATA[
Czytałem w książce 3 razy na temat wstępu do systemu czasu rzeczywistego. Dodam, że projekt, który realizuje właśnie jest projektem wielozadaniowym, a utknąłem jak wyżej pisałem na inicjalizacji uarta. Mam kilka niejasności tylko mnie od razu nie zlinczujcie za głupie pytania.<br />1. Żeby zrealizować opóźnienia nie stosować funkcji typu _delay? tylko timery programowe? - akurat wykorzystuje dwa przyciski do sterowania silnikiem!<br />2. Aby projekt był pseudo-wątkowy jak to autor ujął to jest do tego potrzebny RTC? nie mogę tego w żaden sposób pojąć.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=390">developer85</a> — 30 lip 2012, o 19:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[developer85]]></name></author>
<updated>2012-07-27T17:58:21+01:00</updated>
<published>2012-07-27T17:58:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11033#p11033</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11033#p11033"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11033#p11033"><![CDATA[
Dzięki za podpowiedz. Jak przetestuje i wprowadzę programowe timery to dam znać co i jak.<br />Też tak myślałem że może się PWM zakłóca, ale usunąłem cały wpis odnośnie PWM-a i dalej to samo.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=390">developer85</a> — 27 lip 2012, o 17:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[IUVOit]]></name></author>
<updated>2012-07-27T15:58:16+01:00</updated>
<published>2012-07-27T15:58:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11026#p11026</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11026#p11026"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=11026#p11026"><![CDATA[
Może funkcje UART i PWM pracują na tym samym timerze i się zakłócają - tak sobie gdybam?  Jeżeli PWM Ci dobrze chodził  a zrobiłeś jedynie inicjalizacje  UART i program źle CI zaczął chodzić.<br /><br />Polecam przeczytanie ostatniego rozdziału z pierwszej książki p. Mirka - jest tam opisany system czasu rzeczywistego. Kilka procesów działa równocześnie. U ciebie jest coś podobnego regulacja PWM + wysyłanie informacji przez UART. <br /><br />Są tam opisane również timery programowe, które moim zdaniem w Twoim programie powinny być zastosowane.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 7 minutach ]</span></strong><br /><br />Rozumiem, że testowałeś ten program który dałeś w ostatnim załączniku. Czyli oprócz inicjalizacji UART wykonywałęś funkcje wysyłające dane na UART.<br /><br />Usuń ten fragment programu i zobacz czy wszystko będzie Ci chodziło:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">                uart_puts(&quot;ENCODER= &quot;); // wyślij tekst<br />                uart_putint(val, 10);// wyślij liczbę<br />                uart_puts(&quot;    cm&quot;);<br />                uart_putc('\r');                        // wyślij znak CR (enter)<br />                uart_putc('\n');<br />                _delay_ms(1000);<br /></div><br /><br />Jeżeli będzie Ci chodził program, to musisz wprowadzić timer programowy który będzie Ci sterował wysyłaniem znaków na UART.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=94">IUVOit</a> — 27 lip 2012, o 15:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[developer85]]></name></author>
<updated>2012-07-27T10:33:30+01:00</updated>
<published>2012-07-27T10:33:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10990#p10990</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10990#p10990"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10990#p10990"><![CDATA[
Tak robię tylko się źle wyraziłem.<br />Ale teraz generalnie chodzi o sam UART, bo jak go zainicjalizuje to  PWM niedziała do sterowania silnikiem i możliwość sterowania prawo lewo.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 41 minutach ]</span></strong><br /><br />To niema ktoś pomysłu na ten UART czego on nie działa?<br /><br />Zamieszczam kompletny kod programu może będzie lepiej widać co jest.[syntax=c]<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />//#include &quot;LCD/lcd44780.h&quot;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#include &quot;MKUART/mkuart.h&quot;<br /><br />/* przydatne definicje pinów sterujących */<br />#define WE_A PD1 // piny sterujące L293DNE<br />#define WE_B PD0<br />#define KEY1 (1&lt;&lt;PB0) //def klawisz 1<br />#define KEY2 (1&lt;&lt;PB1) //def klawisza 2<br />#define KEY_DOWN1 !(PINB &amp; KEY1) //sprawdzanie stanu niskiego na KEY1<br />#define KEY_DOWN2 !(PINB &amp; KEY2) //sprawdzanie stanu niskiego na KEY2<br />/* definicje poleceń sterujących pracą silnika */<br />#define DC_LEWO PORTD &amp;= ~(1&lt;&lt;WE_A); PORTD |= (1&lt;&lt;WE_B) // obrót prawo<br />#define DC_PRAWO PORTD |= (1&lt;&lt;WE_A); PORTD &amp;= ~(1&lt;&lt;WE_B)// obrót lewo<br />#define DC_STOP PORTD &amp;= ~(1&lt;&lt;WE_A); PORTD &amp;= ~(1&lt;&lt;WE_B)//stop<br /><br />// definicja pinów enkodera<br />#define PHASE_A         (PINA &amp; 1&lt;&lt;PA1) // piny enkodera Channel A<br />#define PHASE_B         (PINA &amp; 1&lt;&lt;PA2)//piny enkodera Channel B<br />#define LED_PIN  (1&lt;&lt;PD7) //diodka<br />#define LED_ON PORTD |= LED_PIN;<br /><br />volatile int8_t enc_delta;                      // -128 ... 127<br />static int8_t last;<br /><br /><br />//PWM<br />volatile uint8_t pwm1;<br /><br />uint16_t pomiar(uint8_t kanal);<br /><br />void encode_init( void )<br />{<br />  int8_t new;<br /><br />  new = 0;<br />  if( PHASE_A ==0)<br />    new = 3;<br />  if( PHASE_B ==0)<br />    new ^= 1;<br />  last = new;<br />  enc_delta = 0;<br />  TCCR2 |= (1&lt;&lt;WGM21);             // CTC<br />  TCCR2 |=  (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);  //1024         //(1&lt;&lt;CS22);    //64<br />  OCR2 = 18;<br />  TIMSK |= (1&lt;&lt;OCIE2);<br />}<br /><br /><br />ISR( TIMER2_COMP_vect)<br />{<br />  int8_t new, diff;<br />  new = 0;<br />  if( PHASE_A ==0)<br />    new = 3;<br />  if( PHASE_B ==0)<br />    new ^= 1;                                   // konwersja do binarki<br />  diff = last - new;<br />  if( diff &amp; 1 ){                                       // bit 0 = value (1)<br />    last = new;                                 // zapamiętanie nowej wartości w  next last<br />    enc_delta += (diff &amp; 2) - 1;                // bit 1 = direction (+/-)<br />  }<br /><br /><br />}<br /><br />int8_t encode_read1( void )                     // odczyt co krok<br />{<br />  int8_t val;<br /><br />  cli();<br />  val = enc_delta;<br />  enc_delta = 0;<br />  sei();<br />  return val;<br />}<br /><br /><br />int8_t encode_read2( void )                     // odczyt co 2 kroki<br />{<br />  int8_t val;<br /><br />  cli();<br />  val = enc_delta;<br />  enc_delta = val &amp; 1;<br />  sei();<br />  return val &gt;&gt; 1;<br />}<br /><br /><br />int8_t encode_read4( void )                     // odczyt co 4 kroki<br />{<br />  int8_t val;<br /><br />  cli();<br />  val = enc_delta;<br />  enc_delta = val &amp; 3;<br />  sei();<br />  return val &gt;&gt; 2;<br />}<br /><br />int8_t encode_read8( void )                     // odczyt co 8 kroki<br />{<br />  int8_t val;<br /><br />  cli();<br />  val = enc_delta;<br />  enc_delta = val &amp; 4;<br />  sei();<br />  return val &gt;&gt; 3;<br />}<br />int8_t encode_read16( void )                     // odczyt co 16 kroki<br />{<br />  int8_t val;<br /><br />  cli();<br />  val = enc_delta;<br />  enc_delta = val &amp; 8;<br />  sei();<br />  return val &gt;&gt; 4;<br />}<br /><br />int main(void) {<br /><br /><br />USART_Init( __UBRR );// inicjalizacja UART<br />sei();<br />//DDRA |=(1&lt;&lt;PA7);<br />//PORTA |= (1&lt;&lt;PA7);<br /><br />//lcd_init();<br /><br />int32_t val = 0;<br />DDRD |= LED_PIN;<br /><br />encode_init();<br />sei();<br /><br /><br />/* ustawiamy piny sterujące L293D jako wyjścia */<br />DDRD |= (1&lt;&lt;WE_A)|(1&lt;&lt;WE_B); // ustawienie pinów sterujących L293DNE jako wyjścia<br />DDRB &amp;=~  (KEY1| KEY2);      // wejście KEY1 KEY2<br />PORTB |=( KEY1 | KEY2);// podciągnięcie KEY1 KEY2 do VCC<br /><br />//PWM<br />//***** SPRZĘTOWY PWM - 1 KANAŁ OC0 (PB3) *******<br />// ustawienie końcówki OC0 (PB3) sprzętowy PWM jako WYJŚCIE<br />DDRB |= (1&lt;&lt;PB3);<br />// ustawienia TIMER0 w Fast PWM<br />TCCR0 |= (1&lt;&lt;WGM01)|(1&lt;&lt;WGM00);// tryb Fast PWM<br />TCCR0 |= (1&lt;&lt;COM01)|(1&lt;&lt;COM00);// clear at TOP<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);// preskaler = 1<br />OCR0=pomiar(5);//PWM<br /><br /><br /><br />ADMUX |= (1&lt;&lt;REFS0)|(1&lt;&lt;ADLAR);// wybór napięcia odniesienia w postaci VCC<br />ADCSRA |= (1&lt;&lt;ADEN)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0); // włączenie modułu ADC oraz ustawienie preskalera 64<br /><br /><br /><br /><br />while(1)<br />{<br />//lcd_cls();<br />//lcd_locate(0,0);<br />//lcd_str(&quot;PWM&quot;);<br />//lcd_locate(1,0);<br />//lcd_int(pomiar (5));<br />/*<br />lcd_locate(0,5);<br />lcd_str(&quot;ENCODER&quot;);<br />lcd_locate(1,5);<br />lcd_int(val);<br />_delay_ms(100);<br />*/<br /><br />val += encode_read4();<br /><br /><br />uart_puts(&quot;ENCODER= &quot;);// wyślij tekst<br />uart_putint(val, 10);// wyślij liczbę<br />uart_puts(&quot;    cm&quot;);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');<br />_delay_ms(1000);<br /><br />                      <br /><br /><br /><br />if( KEY_DOWN1 ) {<br />_delay_ms(80); //czas drgania styków<br /><br />OCR0=pomiar(5);<br />_delay_ms(1);<br /><br />DC_PRAWO;<br />} else if ( KEY_DOWN2 ) {<br />_delay_ms(80);<br /><br />OCR0=pomiar(5);<br />_delay_ms(1);<br /><br />   DC_LEWO;<br />} else {<br />DC_STOP;<br />}<br /><br /><br />}<br /><br /><br />}<br /><br /><br /><br />uint16_t pomiar (uint8_t kanal)<br />{<br />ADMUX = (ADMUX &amp; 0xF8)| kanal; //       PA5   //ustawienie wybranego kanalu w rejestrze ADMUX<br />ADCSRA |= (1&lt;&lt;ADSC);  //start pomiaru przez ustawienie bitu ADSC w rejestrze ADCSRA<br />while (ADCSRA &amp; (1&lt;&lt;ADSC)); //oczekiwanie na koniec pomiaru (dopóki bit ADSC =1)<br />// po zakończeniu pomiaru, gdy bit ADSC=0, zwrócenie wyniku w postaci<br />// 16-to bitowej wartości z rejestrów ADCH i ADCL<br />return (ADCW&gt;&gt;8);<br />}<br /><br />[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=390">developer85</a> — 27 lip 2012, o 10:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2012-07-27T10:11:28+01:00</updated>
<published>2012-07-27T10:11:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10988#p10988</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10988#p10988"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10988#p10988"><![CDATA[
czekaj ty chcesz ilość impulsów ładować na uarta ?? <br />nie proście by ci było timerem zliczać impulsy , potem je przeliczać na obroty i wyswietlać wynik co 1 sek z dkładnością do np 10 obr<br />??<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 27 lip 2012, o 10:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[developer85]]></name></author>
<updated>2012-07-27T09:53:41+01:00</updated>
<published>2012-07-27T09:53:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10987#p10987</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10987#p10987"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10987#p10987"><![CDATA[
Dokładnie tak. Tylko jak dam inicjalizację Uart-a to tak się dzieje. W tedy PWM nie działa i sterowanie silnikiem też nie. Jedynie co to tak dziwnie się kręci jak by &quot;przerwania&quot; dostawał - przerywa. <br /><br />Chciałem wyniki z enkodera który ładuje 250 impulsów na obrót wyświetlić w terminalu - stąd to opóźnienie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=390">developer85</a> — 27 lip 2012, o 09:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[IUVOit]]></name></author>
<updated>2012-07-27T09:48:32+01:00</updated>
<published>2012-07-27T09:48:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10985#p10985</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10985#p10985"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10985#p10985"><![CDATA[
Ale opóźnienie powinno być- tylko nie za pomocą funkcji delay, a za pomocą Timerów programowych. <br /><br />... jak dodajesz tylko linijkę USART_Init(__UBRR) i nic więcej to program zaczyna CI &quot;siadać&quot;?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=94">IUVOit</a> — 27 lip 2012, o 09:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[developer85]]></name></author>
<updated>2012-07-27T09:25:57+01:00</updated>
<published>2012-07-27T09:25:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10984#p10984</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10984#p10984"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10984#p10984"><![CDATA[
Wyrzuciłem linijkę opóźnienia.<br />Chodzi mi o to że przed inicjalizacją UART wszystko działało sterowanie silnikiem, PWM. Gdy włącze<br />USART_Init( __UBRR );<br />w tedy silnik kręci się w jedną stronę i nie reaguej na przyciski.<br /><br />Myślę, że coś jest nie za bardzo z przerwaniami.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=390">developer85</a> — 27 lip 2012, o 09:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[IUVOit]]></name></author>
<updated>2012-07-27T09:17:36+01:00</updated>
<published>2012-07-27T09:17:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10983#p10983</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10983#p10983"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10983#p10983"><![CDATA[
@Mirek - jeszcze przed Twoim wpisem się &quot;naprostowałem&quot; - procesor za bardzo jest obciążony wysyłaniem znaków, odświeżaniem wyświetlacza.<br /><br />Jak program działał wcześniej to bym proponował wprowadzenie Timerów programowych i wszystko powinno ruszyć. Np wysyłanie do UART co 1 sekundę, wysyłanie na LCD np co pół sekundy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=94">IUVOit</a> — 27 lip 2012, o 09:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-27T09:10:12+01:00</updated>
<published>2012-07-27T09:10:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10982#p10982</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10982#p10982"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10982#p10982"><![CDATA[
<div class="quotetitle">IUVOit napisał(a):</div><div class="quotecontent"><br />Do czego służy _delay_ms(1)? Chyba nie potrzebna linijka, która nie potrzebnie zatrzymuje program?<br /></div><br /><br />No tu bym jednak uważał bo już pchanie tylu danych w uart co 1ms to przesada a jak się skasuje tą linijkę to procesor nic w zasadzie nie będzie robił tylko wciąż zajmował obsługą przerwania żeby wysyłać do uarta - a komu potrzebne jest to żeby w terminalu oglądać 1000 razy na skundę napis i te wartości ????? albo po skasowaniu linijki będzie to może 10 tys !!! razy na sekundę <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />tu trzeba się zastanowić - jak prezentować wyniki dla oka, zresztą to samo się tyczy wywoływania napisów na LCD  - po co miliony razy na sekundę ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 27 lip 2012, o 09:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[IUVOit]]></name></author>
<updated>2012-07-27T09:06:39+01:00</updated>
<published>2012-07-27T09:06:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10981#p10981</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10981#p10981"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10981#p10981"><![CDATA[
Dodałeś te linijki kodu:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">                uart_puts(&quot;ENCODER= &quot;); // wyślij tekst<br />                uart_putint(val, 10);// wyślij liczbę<br />                uart_puts(&quot;    cm&quot;);<br />                uart_putc('\r');                        // wyślij znak CR (enter)<br />                uart_putc('\n');<br />                _delay_ms(1);<br /></div><br /><br />...i program zaczął Ci źle chodzić? Do czego służy _delay_ms(1)? Chyba nie potrzebna linijka, która nie potrzebnie zatrzymuje program?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br />Lepiej chyba dodać timer programowy co np 1 sekundę wysyła info. @Mirek, _delay_ms(1) no własnie też się zastanawiałem nad tak dużym odświeżaniem i jego sensem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=94">IUVOit</a> — 27 lip 2012, o 09:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-27T09:04:32+01:00</updated>
<published>2012-07-27T09:04:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10980#p10980</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10980#p10980"/>
<title type="html"><![CDATA[Re: UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10980#p10980"><![CDATA[
Jak kolega napisze precyzyjniej pytanie to ja może pomogę, bo na określenia że coś tam &quot;klęka&quot; to ja nie potrafię zareagować <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> <br /><br />z drugiej strony pchanie w uart danych co 1ms to przypadkiem nie jakaś przesada ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> czemu ma to niby służyć?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 27 lip 2012, o 09:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[developer85]]></name></author>
<updated>2012-07-27T08:24:44+01:00</updated>
<published>2012-07-27T08:24:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10979#p10979</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10979#p10979"/>
<title type="html"><![CDATA[UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1338&amp;p=10979#p10979"><![CDATA[
Witam!<br />Realizuje sterowanie silnikiem za pomocą PWM (sprzętowym). PWM podglądam na LCD. Odczytuje impulsy z enkodera przy silniku.<br />I chciałbym impulsy przesłać przez UART na terminal. Po inicjalizacji UART sterowanie klęka. Nic nie działa. Proszę o wskazówki co robię źle.<br /><br />Odczyt z enkodera - Przerwania<br /> [syntax=c]void encode_init( void )<br />{<br />  int8_t new;<br /><br />  new = 0;<br />  if( PHASE_A ==0)<br />    new = 3;<br />  if( PHASE_B ==0)<br />    new ^= 1;<br />  last = new;<br />  enc_delta = 0;<br />  TCCR2 |= (1&lt;&lt;WGM21);             // CTC<br />  TCCR2 |=  (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);  //1024         //(1&lt;&lt;CS22);    //64<br />  OCR2 = 18;<br />  TIMSK |= (1&lt;&lt;OCIE2);<br />}<br /><br /><br />ISR( TIMER2_COMP_vect)<br />{<br />  int8_t new, diff;<br />  new = 0;<br />  if( PHASE_A ==0)<br />    new = 3;<br />  if( PHASE_B ==0)<br />    new ^= 1;                                   // konwersja do binarki<br />  diff = last - new;<br />  if( diff &amp; 1 ){                                       // bit 0 = value (1)<br />    last = new;                                 // zapamiętanie nowej wartości w  next last<br />    enc_delta += (diff &amp; 2) - 1;                // bit 1 = direction (+/-)<br />  }[/syntax]<br /><br />main()<br />[syntax=c]int main(void) {<br /><br /><br />USART_Init( __UBRR );// inicjalizacja UART<br /><br />DDRA |=(1&lt;&lt;PA7);<br />PORTA |= (1&lt;&lt;PA7);<br /><br />lcd_init();<br /><br />int32_t val = 0;<br />DDRD |= LED_PIN;<br /><br />encode_init();<br />sei();<br /><br /><br />/* ustawiamy piny sterujące L293D jako wyjścia */<br />DDRD |= (1&lt;&lt;WE_A)|(1&lt;&lt;WE_B); // ustawienie pinów sterujących L293DNE jako wyjścia<br />DDRB &amp;=~  (KEY1| KEY2);      // wejście KEY1 KEY2<br />PORTB |=( KEY1 | KEY2);// podciągnięcie KEY1 KEY2 do VCC<br /><br />//PWM<br />//***** SPRZĘTOWY PWM - 1 KANAŁ OC0 (PB3) *******<br />// ustawienie końcówki OC0 (PB3) sprzętowy PWM jako WYJŚCIE<br />DDRB |= (1&lt;&lt;PB3);<br />// ustawienia TIMER2 w Fast PWM<br />TCCR0 |= (1&lt;&lt;WGM01)|(1&lt;&lt;WGM00);// tryb Fast PWM<br />TCCR0 |= (1&lt;&lt;COM01)|(1&lt;&lt;COM00);// clear at TOP<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);// preskaler = 1<br />OCR0=pomiar(5);//PWM<br /><br /><br /><br />ADMUX |= (1&lt;&lt;REFS0)|(1&lt;&lt;ADLAR);// wybór napięcia odniesienia w postaci VCC<br />ADCSRA |= (1&lt;&lt;ADEN)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0); // włączenie modułu ADC oraz ustawienie preskalera 64<br /><br /><br /><br /><br />while(1)<br />{<br />lcd_cls();<br />lcd_locate(0,0);<br />lcd_str(&quot;PWM&quot;);<br />lcd_locate(1,0);<br />lcd_int(pomiar (5));<br />/*<br />lcd_locate(0,5);<br />lcd_str(&quot;ENCODER&quot;);<br />lcd_locate(1,5);<br />lcd_int(val);<br />_delay_ms(100);<br />*/<br /><br />val += encode_read4();<br /><br /><br />uart_puts(&quot;ENCODER= &quot;);// wyślij tekst<br />uart_putint(val, 10);// wyślij liczbę<br />uart_puts(&quot;    cm&quot;);<br />uart_putc('\r');// wyślij znak CR (enter)<br />uart_putc('\n');<br />_delay_ms(1);<br /><br />                      // odczyt jednego kroku<br /><br /><br /><br />if( KEY_DOWN1 ) {<br />_delay_ms(80); //czas drgania styków<br /><br />OCR0=pomiar(5);<br />_delay_ms(1);<br /><br />DC_PRAWO;<br />} else if ( KEY_DOWN2 ) {<br />_delay_ms(80);<br /><br />OCR0=pomiar(5);<br />_delay_ms(1);<br /><br />   DC_LEWO;<br />} else {<br />DC_STOP;<br />}<br /><br /><br />}<br /><br /><br />}<br /><br /><br /><br />uint16_t pomiar (uint8_t kanal)<br />{<br />ADMUX = (ADMUX &amp; 0xF8)| kanal; //       PA5   //ustawienie wybranego kanalu w rejestrze ADMUX<br />ADCSRA |= (1&lt;&lt;ADSC);  //start pomiaru przez ustawienie bitu ADSC w rejestrze ADCSRA<br />while (ADCSRA &amp; (1&lt;&lt;ADSC)); //oczekiwanie na koniec pomiaru (dopóki bit ADSC =1)<br />// po zakończeniu pomiaru, gdy bit ADSC=0, zwrócenie wyniku w postaci<br />// 16-to bitowej wartości z rejestrów ADCH i ADCL<br />return (ADCW&gt;&gt;8);<br />}<br />[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=390">developer85</a> — 27 lip 2012, o 08:24</p><hr />
]]></content>
</entry>
</feed>