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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-05-03T17:18:34+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=18312&amp;mode</id>
<entry>
<author><name><![CDATA[Rethie]]></name></author>
<updated>2017-05-03T17:18:34+01:00</updated>
<published>2017-05-03T17:18:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18312&amp;p=188334#p188334</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18312&amp;p=188334#p188334"/>
<title type="html"><![CDATA[Re: Symulacja USART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18312&amp;p=188334#p188334"><![CDATA[
Generalnie odpowiem od końca <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br />Nie wiem czego kod w poście wyżej był ucięty, gdyż prawidłowo inicjacja usarta wygląda tak:<br />[syntax=c]void usart_init()<br />{<br /><br />UCSRB |= (1&lt;&lt;RXCIE) | (1 &lt;&lt; RXEN) | (1 &lt;&lt; TXEN);<br />UCSRC |= (1 &lt;&lt; URSEL) | (1 &lt;&lt; UCSZ0) | (1 &lt;&lt; UCSZ1);<br /><br />UBRRL = BAUD_PRESCALE;<br />UBRRH = (BAUD_PRESCALE &gt;&gt; 8);<br />}[/syntax]<br /><br />Zdecydowałem się na użycie przerwania generowanego timerem. Udało mi się uruchomić timer który po jakimś czasie zmienia stan diody na przeciwny. Niestety zadam następne pytanie, niestety prawdopodobnie bardzo głupie. Jak wpakować do bufora ten znak w tym przerwaniu?Bo szczerze mówiąc nie mam pojęcia, jak to zaimplementować kodem.<br /><br />Kod który mam do generowania przerwania timerem:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />//definicja LED1 (do którego pinu podłączony LED1)<br />#define LED1 PB0<br /><br />//definicja LED2 (do którego pinu podłączony LED2)<br />#define LED2 PB1<br />volatile uint8_t cnt=0;<br /><br />void main(void)<br />{<br /> //########### I/O ###########<br /> DDRB  |= (1&lt;&lt;LED1) | (1&lt;&lt;LED2); //Ustawienie pinów sterujących diodami<br />                                                 // jako wyjścia<br /> PORTB |= (1&lt;&lt;LED1); //Ustawienie stanu wysokiego na wyjściu sterującym LED1<br />                                  //(stan początkowy)<br /> //##########################<br /><br /> //######## konfiguracja timera ##############<br /> TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00); <br /> TIMSK |= (1&lt;&lt;TOIE0);           //Przerwanie overflow (przepełnienie timera)<br /> //###########################################<br /><br /> sei(); //Globalne uruchomienie przerwań<br /><br /> while(1); //główna pętla programu<br /><br />}<br /><br /><br />//############ Procedura obsługi przerwania od przepełnienia timera ############<br />ISR(TIMER0_OVF_vect)<br />{<br />cnt++;<br />if(cnt&gt;100)<br />{<br /> PORTB ^=(1&lt;&lt;LED1); //suma modulo 2 (XOR) stanu poprzedniego na porcie<br />                              //czyli zmiana stanu pinu LED1 na przeciwny<br /><br /> PORTB ^=(1&lt;&lt;LED2); //suma modulo 2 (XOR) stanu poprzedniego na porcie<br />cnt=0;}                        //czyli zmiana stanu pinu LED2 na przeciwny<br />}<br />//##############################################################################[/syntax]<br /><br /><br /><br /><br />============== <br />EDIT:<br /><br />Bez obsługi seriala wszystko śmiga, nie ma żadnych problemów, wraz z dołączeniem do projektu przerwania generowanego timerem serial wariuje, nie nie chodzi tu o sławne drgania styków <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> nie reaguje na podawany ciąg znaków, lub też reaguje w taki sposób, że resetuje się i wyświetla to co było zdefiniowane przed pętlą główną programu.<br /><br />tutaj kod tego, co działa bez obsługi seriala, już powoli zaczynam się załamywać, gdyż siedzę nad tym już dobrych kilka godzin i nie potrafię sobie poradzić... Z tym serialem dzieje się po tym jak uruchamia się globalne obsługiwanie przerwań. <br />Generalnie od tego, jak będzie wariować decyduje gdzie umieści się sei(); po tym jak umieści się go tuż przed while(1) jest ten reset.<br /><br />[syntax=c]#define F_OSC 11059200<br />#include &lt;stdio.h&gt;<br />#include&lt;avr/io.h&gt;<br />#include&lt;util/delay.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br /><br /><br />#define KEY_PIN (1&lt;&lt;PD7) //definicja pinu do którego jest podpięty klawisz<br />#define KEY_DOWN !(PIND &amp; KEY_PIN) //makro sprawdzajace czy jest STAN NISKI<br /><br />#define SPEAKER_PIN (1&lt;&lt;PD6) //definicja pinu do którego jest podpiety buzzer<br />#define BUZZER_ON PORTD |= SPEAKER_PIN //makro wlaczanie buzzera (STANEM WYSOKIM)<br />#define BUZZER_OFF PORTD &amp;= ~SPEAKER_PIN // makro dla stanu niskiego na pinie do buzzera<br />volatile uint8_t cnt=0;<br />int przycisk;<br />uint8_t klawisz_wcisniety(void);<br />void main(void)<br />{<br /> //########### I/O ###########<br /><br /> DDRD &amp;= ~KEY_PIN; //kierunek pinu PD7 - wejsciowy<br />        PORTD |= KEY_PIN; //podciagniecie pinu PD7 do VCC                           //(stan początkowy)<br /> //##########################<br /><br /> //######## konfiguracja timera ##############<br /> TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);<br /> TIMSK |= (1&lt;&lt;TOIE0);           //Przerwanie overflow (przepełnienie timera)<br /> //###########################################<br /><br /> sei(); //Globalne uruchomienie przerwań<br /><br /> while(1); //główna pętla programu<br /><br />}<br /><br /><br />//############ Procedura obsługi przerwania od przepełnienia timera ############<br />ISR(TIMER0_OVF_vect)<br />{<br />        cnt++;<br />        if(cnt&gt;100)<br />        {<br />         if(klawisz_wcisniety())<br />                {przycisk=1;<br /><br />                }<br /><br />                if(przycisk==1)<br />                {<br />                BUZZER_ON;<br /><br /><br /><br />                __builtin_avr_delay_cycles(11520000);<br />                przycisk=0;<br />                }<br />                if(przycisk==0)<br />                {<br />                BUZZER_OFF;<br />                }<br />        }<br />}<br />//##############################################################################<br />uint8_t klawisz_wcisniety(void)<br />        {<br />                if (KEY_DOWN)<br />                {<br />                        _delay_ms(100);<br />                        if(KEY_DOWN) return 1;<br />                }<br />                return 0;<br />        }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16462">Rethie</a> — 3 maja 2017, o 17:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jaglarz]]></name></author>
<updated>2017-05-02T21:21:42+01:00</updated>
<published>2017-05-02T21:21:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18312&amp;p=188280#p188280</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18312&amp;p=188280#p188280"/>
<title type="html"><![CDATA[Re: Symulacja USART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18312&amp;p=188280#p188280"><![CDATA[
<!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic7402.html" >topic7402.html</a><!-- l --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=471">Jaglarz</a> — 2 maja 2017, o 21:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rethie]]></name></author>
<updated>2017-05-03T02:07:26+01:00</updated>
<published>2017-05-02T21:01:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18312&amp;p=188277#p188277</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18312&amp;p=188277#p188277"/>
<title type="html"><![CDATA[Re: Symulacja USART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18312&amp;p=188277#p188277"><![CDATA[
Generalnie symulacje USART chodziło mi, że programowo oszukać, że coś przyszło na serial, jakiś losowy znak. Bo w docelowym urządzeniu układ ma sam działać, w tym momencie mam FTDI i sam jestem w stanie &quot;z palca&quot; poprzez terminal wysłać jakiś znak, lecz jeżeli patrząc przyszłościowo chciałbym, żeby to było autonomiczne <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Generalnie tak jak mówiłem, układ ma reagować na jakiś ciąg znaków(nie przypadkowych, tak jak w kodzie poniżej np ciąg &quot;AB&quot; ) i wykonywać określone instrukcje w zależności od przychodzącego ciągu znaków. Poniżej zamieszczam kod, oraz screen z terminala, co uzyskuję na wyjściu. Niestety tak jak pisałem, żeby była jakaś reakcja na naciśnięcie przycisku muszę wysłać z komputera chociaż pusty enter.  I siedząc kilka godzin nad tak błahą zapewne sprawą, zaczynam wątpić czy powinienem zaczynać robić coś praktycznie, czy powinienem wrócić do lektury książek.<br /><br />[syntax=C]#define F_OSC 11059200<br />#include &lt;stdio.h&gt;<br />#include&lt;avr/io.h&gt;<br />#include&lt;util/delay.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#define USART_BAUDRATE 115200<br />#define BAUD_PRESCALE (((F_OSC / (USART_BAUDRATE * 16UL))) - 1)<br />#define SPEAKER_PIN (1&lt;&lt;PD6) //definicja pinu do którego jest podpiety buzzer<br />#define BUZZER_ON PORTD |= SPEAKER_PIN //makro wlaczanie buzzera (STANEM WYSOKIM)<br />#define BUZZER_OFF PORTD &amp;= ~SPEAKER_PIN // makro dla stanu niskiego na pinie do buzzera<br />#define KEY_PIN (1&lt;&lt;PD7) //definicja pinu do którego jest podpięty klawisz<br />#define KEY_DOWN !(PIND &amp; KEY_PIN) //makro sprawdzajace czy jest STAN NISKI<br /><br /><br />void USART_Transmit( unsigned char data );<br />void SendString(char mydata&#91;20&#93;);<br />void usart_init();<br />unsigned int usart_getch();<br />uint8_t klawisz_wcisniety(void);<br />int przycisk;<br /><br /><br />int main (void)<br />{<br />        ////------------INICJALIZACJA-----------------<br />        DDRD |= SPEAKER_PIN; //kierunek pinu PD6 - wyjsciowy<br />        PORTD |= SPEAKER_PIN; //wlaczenie buzzera<br />        DDRD &amp;= ~KEY_PIN; //kierunek pinu PD7 - wejsciowy<br />        PORTD |= KEY_PIN; //podciagniecie pinu PD7 do VCC<br />        usart_init(); // initialization of USART<br />        SendString(&quot;Dzień dobry&quot;);<br />        while(1)<br />        { //reakcja na przycisk  <br />  if(klawisz_wcisniety())<br />        {przycisk=1;<br /><br />        }<br /><br />        if(przycisk==1)<br />        {<br />        BUZZER_ON;<br /><br />        SendString(&quot;Przycisk Działa&quot;);<br />        USART_Transmit(13);<br />        __builtin_avr_delay_cycles(11520000);<br />        przycisk=0;<br />        }<br />        if(przycisk==0)<br />        {<br />        BUZZER_OFF;<br />        }<br /><br />//// Sprawdzanie ciągu znaków przychodzących<br />                value=usart_getch();<br />                if(value=='A')<br />                {<br />                value=usart_getch();<br />                if(value=='B')<br />                {/// i tak dalej...<br />                SendString(&quot;TEST&quot;);<br />                //jakieś zadania...<br />                }<br />                }<br /><br /><br /><br />        }<br />}<br /><br />uint8_t klawisz_wcisniety(void)<br />        {<br />                if (KEY_DOWN)<br />                {<br />                        _delay_ms(100);<br />                        if(KEY_DOWN) return 1;<br />                }<br />                return 0;<br />        }<br /><br /><br /><br />void usart_init()<br />{<br /><br />UCSRB |= (1&lt;&lt;RXCIE) | (1 &lt;&lt; RXEN) | (1 &lt;&lt; TXEN);<br />UCSRC |= (1 &lt;&lt; URSEL) | (1 &lt;&lt; UCSZ0) | (1 &lt;&lt; UCSZ1);<br /><br />UBRRL = BAUD_PRESCALE;<br />UBRRH = (BAUD_PRESCALE &gt;&gt; 8);<br />}<br /><br /><br />unsigned int usart_getch()<br />{<br /><br />while ((UCSRA &amp; (1 &lt;&lt; RXC)) == 0);<br />return(UDR);<br />}<br /><br /><br /><br />void USART_Transmit( unsigned char data )<br />{<br /><br />   while ( !( UCSRA &amp; (1&lt;&lt;UDRE)) );<br /><br />   UDR = data;<br />}<br /><br />void SendString(char mydata&#91;20&#93;)<br />{<br />  int i;<br />   for(i=0;i&lt;strlen(mydata);i++)<br />   {<br />     USART_Transmit(mydata&#91;i&#93;);<br />   }<br />}[/syntax]<br /><br />Generalnie, może ktoś wie jak sobie poradzić by przycisk współdziałał z odbiorem danych z RS <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />?<br /><br /><a href="https://obrazkiforum.atnel.pl/16462/0714b4b4373dcdf9168843d60ba9cb24.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16462/0714b4b4373dcdf9168843d60ba9cb24.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16462">Rethie</a> — 2 maja 2017, o 21:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2017-05-02T20:00:59+01:00</updated>
<published>2017-05-02T20:00:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18312&amp;p=188269#p188269</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18312&amp;p=188269#p188269"/>
<title type="html"><![CDATA[Re: Symulacja USART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18312&amp;p=188269#p188269"><![CDATA[
wstaw kod (na początek ten najprostszy), który Ci nie działa.<br /><br />Nie wiem czy dobrze Cie zrozumiałem, ale żeby zasymulować transmisję, najlepiej jest użyć przejściówki USB i sygnały cyfrowe TX/RX podpiąć<br />do RX/TX (przeplot).<br />Ustawiasz sobie w terminalu parametry transmisji i wysyłasz. Jak chcesz wysyłać coś okresowo, to możesz użyć np. Realterm'a (notabene<br />ciekawy terminal o dużych możliwościach).<br /><br />Polecam darmowy program <a href="http://atnel.pl/atnel-video-player.html"  class="postlink">Atnel Video Player</a> w którym znajdziesz zestawienie<br />poradników Mirka - polecam te o RS232 dla początkujących.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 2 maja 2017, o 20:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rethie]]></name></author>
<updated>2017-05-02T19:48:03+01:00</updated>
<published>2017-05-02T19:48:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18312&amp;p=188266#p188266</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18312&amp;p=188266#p188266"/>
<title type="html"><![CDATA[Symulacja USART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18312&amp;p=188266#p188266"><![CDATA[
Witam,<br />Mam pytanie, czy da się jakoś &quot;oszukać&quot; procek, że coś przyszło na USART? Generalnie chodzi mi o to, że w pętli głównej programu mam funkcje, które czytają znak po znaku co przychodzi z RS-a( i w zależności na jakiś ciąg znaków mają określoną reakcję). Chciałbym dodać funkcjonalne działanie przycisku, że na przykład jak go przycisnę to na serial jest podawany jakiś ciąg znaków, czy też na przykład jakaś dioda się zapala. I tutaj zaczynają się schody, gdyż próbowałem już bawić się z przerwaniami(zewnętrzne poprzez INT0) to albo działała mi funkcja główna a funkcja w przerwaniu nie wywoływała się, albo na odwrót funkcja w przerwaniu działała wyśmienicie, lecz funkcja główna nie dawała znaków życia. Pojawiało się też takie coś, że jakby procek ciągle wracał na początek, widać to było poprzez ciągłe pojawianie się ciągu znaków który miał się pojawiać przy starcie procka na RS. Odpuszczając sobie przerwania napisałem prostą funkcję która sprawdza stan na pinie który ustawiłem jako wejście i podpiąłem przez pullup do 5V. Teraz reakcja na przycisk pojawia się tylko wtedy gdy przytrzymuję go a jednocześnie poprzez RS-a wysyłam znaki na procek. I stąd moje pytanie czy  jest jakiś sposób na &quot;oszukanie&quot; procka, że jakiś znak pojawił się na RS ? Dziękuję za pomoc i pozdrawiam.<br /><br /><br />--Edit:<br />Chciałbym dodać, że kod ten pracuje prawidłowo, gdy nie próbuję łapać znak po znaku na USART. Ale niestety muszę pogodzić te dwie rzeczy i musi działać zarówno odbieranie poprzez USART i reakcja na przycisk.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16462">Rethie</a> — 2 maja 2017, o 19:48</p><hr />
]]></content>
</entry>
</feed>