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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-08-30T23:49:24+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=8323&amp;mode</id>
<entry>
<author><name><![CDATA[Sebus]]></name></author>
<updated>2014-08-30T23:49:24+01:00</updated>
<published>2014-08-30T23:49:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8323&amp;p=93572#p93572</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8323&amp;p=93572#p93572"/>
<title type="html"><![CDATA[Re: Odbiór paczki danych UART = reset procesora]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8323&amp;p=93572#p93572"><![CDATA[
<div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />Dobrze byłoby wiedzieć co jest źródłem resetu. Wypróbuj lekko zmodyfikowany kod<br /></div><br /><br />W terminalu wypisuje mi:<br /><a href="http://forum.atnel.pl/_obrazki/o/5505/c9334f861b2f887ec0563ae5dfe3af5a.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/5505/c9334f861b2f887ec0563ae5dfe3af5a.png" alt="Obrazek" /></a><br /><br />Czyli, jakby wylądował znikąd na początku programu. (?!)<br /><br /><span style="font-size: 85%; line-height: normal">[edit]</span><br /><br />Wymieniłem procesor na inną M644, wgrałem program i tylko raz wyrzuca wartość 10 po włączeniu zasilania.<br />Wychodzi na to, że procesor jest uszkodzony - z czymś takim jeszcze się nie spotkałem. (I raczej bym nie podejrzewał)<br /><br />Dziękuje Krauser za pomoc.<br />Temat do zamknięcia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5505">Sebus</a> — 30 sie 2014, o 23:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-08-30T20:42:11+01:00</updated>
<published>2014-08-30T20:42:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8323&amp;p=93529#p93529</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8323&amp;p=93529#p93529"/>
<title type="html"><![CDATA[Re: Odbiór paczki danych UART = reset procesora]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8323&amp;p=93529#p93529"><![CDATA[
Dobrze byłoby wiedzieć co jest źródłem resetu. Wypróbuj lekko zmodyfikowany kod:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#define UART_BAUD 115200<br />#define __UBRR ( F_CPU / 16.0 / UART_BAUD - 0.5 )<br /><br />volatile char Buffer&#91;256&#93;; // bufor uart<br />volatile uint8_t BufferlastByte=0; // licznik bajtow w tablicy<br /><br />void IOpins(void);<br />void USART_Init( uint16_t baud );<br />void USART_putc( char c );<br />void USART_puts( char * s );<br /><br />uint8_t mcusr_mirror __attribute__ ((section (&quot;.noinit&quot;))); //zmienna nie zerowana<br /><br />void get_mcusr(void) \<br />__attribute__((naked)) \<br />__attribute__((section(&quot;.init3&quot;)));<br />void get_mcusr(void)<br />{<br />mcusr_mirror = MCUSR; //zapisanie źródła resetu<br />MCUSR = 0;<br />}<br /><br /><br />int main(void)<br />{<br />char buf&#91;9&#93;;<br /><br />        cli();<br />        _delay_ms(3000); // opoznienie zalaczania<br />        IOpins(); // ustawianie we/wy<br /><br />        USART_Init(__UBRR); // inicjalizacja uart<br />        USART_puts(&quot;RESET\r\n&quot;);<br />        itoa(mcusr_mirror, buf, 2);<br />        USART_puts(buf); //wysłanie źródła resetu na USART<br />        USART_puts(&quot;\r\n&quot;);<br /><br />        sei(); // przerwania zezwolone<br />        while (1)<br />{<br />if (BufferlastByte &gt;200)<br />{<br />PORTA^=(1&lt;&lt;PA7);<br />BufferlastByte=0;<br />}<br />}<br />}<br /><br /><br />void USART_Init( uint16_t baud )<br />{<br />/* Ustawienie prędkości */<br />UBRR0H = (uint8_t)(baud&gt;&gt;8);<br />UBRR0L = (uint8_t)baud;<br />UCSR0B |= (1&lt;&lt;RXEN0)|(1&lt;&lt;TXEN0)|(1&lt;&lt;RXCIE0);<br />}<br /><br />void IOpins(void)<br />{<br />        DDRA |= (1&lt;&lt;PA7); // wyjscie dla LED<br />}<br /><br />ISR(USART0_RX_vect)<br />{<br />        Buffer&#91;BufferlastByte&#93;=UDR0;<br />        if (BufferlastByte &lt;254) BufferlastByte++; // nie pozwol przekroczyc wartosci bufora!<br />}<br /><br />void USART_putc( char c )<br />{<br />while ( !( UCSR0A &amp; (1&lt;&lt;UDRE0)) )<br />;<br />UDR0 = c;<br />}<br /><br />void USART_puts( char * s )<br />{<br />while(*s)<br />USART_putc(*s++);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 30 sie 2014, o 20:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sebus]]></name></author>
<updated>2014-08-30T17:33:39+01:00</updated>
<published>2014-08-30T17:33:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8323&amp;p=93503#p93503</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8323&amp;p=93503#p93503"/>
<title type="html"><![CDATA[Re: Odbiór paczki danych UART = reset procesora]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8323&amp;p=93503#p93503"><![CDATA[
Dobra, trochę inaczej...<br /><span style="font-size: 85%; line-height: normal">Za pisanie post pod postem pewnie mi się oberwie.</span><br /><br />Napisałem programik testowy:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />//<br />volatile char Buffer&#91;256&#93;; // bufor uart<br />volatile uint8_t BufferlastByte=0; // licznik bajtow w tablicy<br />//<br />//<br />//<br />void serial_init(void);<br />void IOpins(void);<br />//<br />//<br />//<br />int main(void)<br />{<br />cli();<br />_delay_ms(3000); // opoznienie zalaczania<br />IOpins(); // ustawianie we/wy<br />serial_init(); // inicjalizacja uart<br />sei(); // przerwania zezwolone<br />while (1)<br />    {<br />if (BufferlastByte &gt;200)<br />{<br />PORTA^=(1&lt;&lt;PA7);<br />BufferlastByte=0;<br />}<br />    }<br />}<br /><br /><br />void serial_init(void)<br />{<br />UBRR0H=0; // raczej niepotrzebne<br />UBRR0L=11; // (115200 @ 22,1184MHz)<br />UCSR0B|=(1&lt;&lt;RXEN0)|(1&lt;&lt;TXEN0)|(1&lt;&lt;RXCIE0); // tx/rx + zezwolenie przerwania na odbior<br />}<br /><br />void IOpins(void)<br />{<br />DDRA |= (1&lt;&lt;PA7); // wyjscie dla LED<br />}<br /><br />ISR(USART0_RX_vect)<br />{<br />Buffer&#91;BufferlastByte&#93;=UDR0;<br />if (BufferlastByte &lt;254) BufferlastByte++; // nie pozwol przekroczyc wartosci bufora!<br />}[/syntax]<br /><br />Kod jest raczej bez sensu. Odbieram bajty, uzupełniam tablicę, a w pętli głównej mam warunek, który sprawdza, czy jest odebrane ponad 200 bajtów - jeśli tak, to zmienia stan pinu PA7 i resetuje zmienną.<br />W przerwaniu także warunek, który nie dopuszcza do pisania poza zakres tablicy i jest on o 1 element mniejszy, niż sama tablica.<br /><br />W Br@y terminal puszczam 32 bajty z opóźnieniem co 100ms - przez kilka sekund dioda migocze, po czym następuje reset procesora (widać to po tym, że dioda raz świeci ciągłym światłem przez 3s lub nie świeci przez ten sam okres czasu)<br /><br />Zmieniłem kwarc na 2x wolniejszy, ustawiłem rejestr UBRRL, zmieniłem dyrektywę f_cpu w opcjach projektu Atmel Studio 6.2 i dalej to samo <img src="https://forum.atnel.pl/images/smilies/icon_cry.gif" alt=":cry:" title="Płacze" /><br /><br />O co tu chodzi? Bo ja już nie wiem...<br /><br />Pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5505">Sebus</a> — 30 sie 2014, o 17:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sebus]]></name></author>
<updated>2014-08-28T20:16:11+01:00</updated>
<published>2014-08-28T20:16:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8323&amp;p=93303#p93303</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8323&amp;p=93303#p93303"/>
<title type="html"><![CDATA[Odbiór paczki danych UART = reset procesora]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8323&amp;p=93303#p93303"><![CDATA[
Witam wszystkich serdecznie.<br /><br />To są moje (jakby to powiedzieć) pierwsze kroki z pisaniem w C.<br /><br />Nabazgrałem sobie niby prosty program, który powinien odebrać paczkę danych, sprawdzić, czy jest jej koniec oraz wysłać zawartość bufora na PORT C + ustawianie sygnałów sterujących na PORT A - Pomijam kwestie, typu timeout - to zostawiam na później do oprogramowania.<br />Długość paczki danych jest zmienna i zawiera się (na razie) w przedziale od 3 do ok. 32 bajtów.<br />Generalnie, jest to strumień danych dla układu PSG AY-3-8913 który wysyłam z komputera.<br />W skrócie - µP odbiera bajty; sprawdza, czy jest koniec (znaki eb w buforze); odczekuje odpowiednią ilość przerwań; wysyła dane do PSG, wysyła znak 'n' poprzez UART i cykl powinien się powtarzać...<br />Niestety, program na µP wysypuje się czasami na pierwszym wysłanym znaku poprzez port szeregowy, czasami można wysłać około 11kB - muzyka wydobywa się z układu, dopóki procesor się nie zawiesi/nie zresetuje.<br /><br />Od strony technicznej -&gt; Płytka uniwersalna UM-17, ATMEGA644 w podstawce, kilkanaście kondensatorów blokujących 100nF na linii zasilania, jak i przy samym procku + kilka szt elektrolitów 10..47uF na linii zasilania, /RESET podciągnięty rezystorem 3k9 + dodatkowo kondensator 2,2nF; kwarc 22,1184MHz z przylutowaną obudową do masy oraz kondensatorami 33pF (niestety tylko takie miałem w szufladzie); układ dźwiękowy jest na zwykłej stykówce - także tutaj mnóstwo kondensatorów 100nF oraz 10uF i kabelki podpinanie przez goldpiny. Zasilanie biorę z zasilacza laboratoryjnego.<br /><br />Podobny kod (o dziwo) śmiga mi na attiny2313V@28,224MHz - ale tam odbieram na sztywno ramkę 4 bajtów i ustawiam preskaler/rejestr OCR w celu wygenerowania częstotliwości 1,764MHz dla PSG oraz odpada mi przerwanie timer'a - wykorzystuje sprzętowe zmienianie stanu pinu na przeciwny (tryb CTC + toggle OC0B)<br /><br />Podejrzewam, że najprawdopodobniej dochodzi do kolizji przy przerwaniach, ale nie mogę tego rozgryźć. Gdzie popełniłem błąd?<br /><br />Mogę dać mini bibliotekę do obsługi hd44780 (lcd595.h/lcd595.c pisaną dawno temu) ale wątpię, by tam występował problem, gdyż tylko raz wysyłam ciąg znaków do LCD, poza tym dotychczas nie było z nią problemów w innych zastosowaniach.<br /><br /><span style="font-size: 85%; line-height: normal">Przepraszam za te gryzmoły poniżej - stare nawyki z TASM/Pascal/Basic, rozdzielczości 80x25 znaków itp... Musze się ogarnąć :/</span><br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/sleep.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;lcd595.h&gt;<br />//<br />uint8_t Buffer&#91;40&#93;; // bufor uart<br />volatile uint8_t BufferlastByte=0; // licznik bajtow/index tablicy<br />volatile uint8_t delay=0;<br />uint8_t CREG0=0; // zamiast struktury... ekhm...<br />uint8_t intcount=0; // licznik przerwan;<br />#define PLAYBACK 7<br />#define PBACK CREG0|=(1&lt;&lt;PLAYBACK)<br />#define PSTOP CREG0&amp;=~(1&lt;&lt;PLAYBACK)<br /><br />#define REGISTER PORTA|=(1&lt;&lt;PA7)<br />#define PSGDATA PORTA&amp;=~(1&lt;&lt;PA7)<br />#define RESET_H PORTA|=(1&lt;&lt;PA6)<br />#define RESET_L PORTA&amp;=~(1&lt;&lt;PA6)<br /><br />void serial_init(void)<br />{<br />UBRR0H=0;<br />UBRR0L=47; // (57600 @ 22,1184MHz)<br />UCSR0A|=(1&lt;&lt;U2X0); // ...<br />UCSR0B|=(1&lt;&lt;RXEN0)|(1&lt;&lt;TXEN0)|(1&lt;&lt;RXCIE0); // tx/rx + zezwolenie przerwania na odbior<br />//UCSR0C|=(1&lt;&lt;UCSZ01)|(1&lt;&lt;UCSZ00); // 8n1<br />}<br /><br />void serial_tx(char data) // zerzniete z PDF'a<br />{<br />while(!(UCSR0A &amp; (1&lt;&lt;UDRE0)));<br />UDR0 = data;<br />}<br /><br />void IOpins(void)<br />{<br />DDRA |= (1&lt;&lt;PA7)|(1&lt;&lt;PA6); // Data/Register + RESET<br />DDRD = 0xFC;<br />//PORTD = 0x00;<br />DDRC=0xFF;<br />//PORTC = 0x00;<br />}<br /><br />void timer0_init(void)<br />{<br />TCCR0A|=(1&lt;&lt;WGM01); // CTC<br />OCR0A=107; // 5ms @ 22,1184MHz<br />TIMSK0|=(1&lt;&lt;OCIE0A); // zezwolenie na przerwanie<br />TCCR0B|=(1&lt;&lt;CS02)|(1&lt;&lt;CS00); // preskaler -&gt; 1024<br />}<br /><br />void Check_data (void)<br />{<br />if (Buffer&#91;BufferlastByte-1&#93; == 'b' &amp;&amp; Buffer&#91;BufferlastByte-2&#93; == 'e') // paczka konczy sie znakami &quot;eb&quot;<br />{<br />if (Buffer&#91;BufferlastByte-3&#93; == 0xFF) {intcount=3; BufferlastByte-=4;} // jesli Bufferlastbyte-3 zawiera 0xFF, ustawiamy delay na 20ms i zmniejszamy wartosc ostatnio odebranego bajtu<br />if (Buffer&#91;BufferlastByte-4&#93; == 0xFE) {intcount=((Buffer&#91;BufferlastByte-3&#93;+1)*3); BufferlastByte-=5;} // jesli Bufferlastbyte-4 zawiera 0xFE ustawiamy delay na odpowiednia ilosc (n przerwan) i zmniejszamy wartosc ostatnio odebranego bajtu<br />PBACK; // zalaczamy mozliwosc wejscia do procedury odtwarzania<br />}<br />}<br /><br />void send_psg (void)<br />{<br />PSTOP; // wylaczamy mozliwosc wejscia do tej procedury, dopoki nie nadejdze pelna paczka danych<br />uint8_t i=1;<br />while (delay&lt;=intcount); // oczekuj na odpowiednia ilosc przerwan<br />while (i &lt;= BufferlastByte)<br />{<br />REGISTER;<br />PORTC=Buffer&#91;i&#93;;<br />i++;<br />PSGDATA;<br />PORTC=Buffer&#91;i&#93;;<br />i++;<br />}<br />intcount=0;<br /> BufferlastByte=0;<br />delay=0;<br />serial_tx('n'); // wyslij znak do programu na pc w celu wyslania nowej paczki danych<br />}<br /><br />int main(void)<br />{<br />cli();<br />_delay_ms(1000); // opoznienie zalaczania<br />IOpins();<br />serial_init();<br />lcd_init();<br />timer0_init();<br />set_sleep_mode(SLEEP_MODE_IDLE);<br />sleep_enable();<br />RESET_L;<br />REGISTER;<br />lcd_addr(0);<br />lcd_write_text(&quot;Waiting for data&quot;); // marnujemy troche SRAM na napis...<br />        RESET_H;<br />sei();<br />while (1)<br />    {<br />Check_data();<br />if (CREG0 &amp; (1&lt;&lt;PLAYBACK)) {send_psg();}<br />//sleep_cpu(); // dobranoc<br />    }<br />}<br /><br />ISR(USART0_RX_vect)<br />{<br />Buffer&#91;BufferlastByte&#93;=UDR0;<br />if (BufferlastByte &lt; 40) {BufferlastByte++;} // nie pozwol przekroczyc wartosci<br />//UDR0=Buffer; // echo<br />}<br /><br />ISR(TIMER0_COMPA_vect)<br />{<br />delay++;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5505">Sebus</a> — 28 sie 2014, o 20:16</p><hr />
]]></content>
</entry>
</feed>