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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=8051&amp;mode</id>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-08-24T20:54:50+01:00</updated>
<published>2014-08-24T20:54:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=92749#p92749</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=92749#p92749"/>
<title type="html"><![CDATA[Re: Moduł GSM + AVR - niespodziewany reset modemu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=92749#p92749"><![CDATA[
1. Bray Terminal pozwala na podpięcie pod przycisk złożonej komendy i możesz to wykorzystać do debugowania zamiast wysyłać do modułu GSM<br />2. Wszędzie gdzie się da możesz wysyłać wartości zmiennych na terminal, ale dobrze by było jakbyś użył buforowanej transmisji jak w przykładach z książki, bo twój USART_Transmit popsuje działanie ISR(USART1_RX_vect ) jakbyś chciał coś tam wysłać<br />3. Można sobie kupić pakiet SMSów. Porównaj oferty na kartę<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 24 sie 2014, o 20:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[maxxxior]]></name></author>
<updated>2014-08-22T18:42:24+01:00</updated>
<published>2014-08-22T18:42:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=92479#p92479</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=92479#p92479"/>
<title type="html"><![CDATA[Re: Moduł GSM + AVR - niespodziewany reset modemu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=92479#p92479"><![CDATA[
Ale to, że odblokuję przerwania od nadawania UARTu nie znaczy chyba że muszę później mieć funkcję definiującą przerwanie od TX? Czy musi być? Aktualnie posiadam taki kod: <br />[syntax=cpp]#include &lt;avr/io.h&gt;<br />#include &lt;inttypes.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/sleep.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdbool.h&gt;<br />#include &lt;math.h&gt;<br /><br />#define FOSC 8000000// Clock Speed<br />#define BAUD 9600<br />#define BAUD2 250000<br />#define MYUBRR FOSC/16/BAUD-1<br />#define MYUBRR2 FOSC/16/BAUD2-1<br /><br />#define Response_UNKNOWN       0<br />#define Response_OK            1<br />#define Response_ERROR         2<br />#define Response_CSQ           3<br />#define Response_CPIN_READY    4<br />#define Response_CPIN_NOT_INS  5<br />#define Response_Call_Ready    6<br />#define Response_CUNF          7<br />#define Response_CMT           8<br />#define Response_CLIP          9<br />#define Response_SMS_CONTINUE  10<br /><br />volatile char RX_Buffer&#91;256&#93;; //Bufor UARTa<br />volatile uint8_t RX_Buf_Pos; //Ilosc danych w buforze UARTa<br /><br />volatile uint8_t Response&#91;16&#93;; //Bufor odpowiedzi<br />volatile uint8_t Response_WR; //Wskaźnik zapisu bufora<br />volatile uint8_t Response_RD; //Wskaźnik odczytu bufora<br /><br />using namespace std;<br /><br />void USART_Init(unsigned int ubrr) {<br />/*<br /> Set baud rate<br /> */<br />UBRR0H = (unsigned char) (ubrr &gt;&gt; 8);<br />UBRR0L = (unsigned char) ubrr;<br />/*<br /> Enable receiver and transmitter<br /> */<br />UCSR0B = (1 &lt;&lt; RXEN) | (1 &lt;&lt; TXEN);<br />/*<br /> Set frame format: 8data, 2stop bit<br /> */<br />UCSR0C = (1 &lt;&lt; USBS) | (3 &lt;&lt; UCSZ0);<br />}<br /><br />void USART_Transmit(unsigned char data) {<br />/*<br /> Wait for empty transmit buffer<br /> */<br />while (!(UCSR0A &amp; (1 &lt;&lt; UDRE)))<br />;<br />/*<br /> Put data into buffer, sends the data<br /> */<br />UDR0 = data;<br />}<br />unsigned char USART_Receive() {<br /><br />while (!(UCSR0A &amp; (1 &lt;&lt; RXC0)))<br />;<br />return UDR0;<br />}<br /><br />void USART1_Init(unsigned int ubrr1) {<br /><br />UBRR1H = (uint8_t) (ubrr1 &gt;&gt; 8);<br />UBRR1L = (uint8_t) ubrr1;<br /><br />UCSR1B = (1 &lt;&lt; RXEN1) | (1 &lt;&lt; TXEN1) | (1 &lt;&lt; RXCIE1) | (1 &lt;&lt; RXCIE1);<br /><br />UCSR1C = (3 &lt;&lt; UCSZ10);<br />}<br /><br />unsigned char USART1_Receive(void) {<br />/*<br /> Wait for data to be received<br /> */<br />while (!(UCSR1A &amp; (1 &lt;&lt; RXC1)))<br />;<br />return UDR1;<br />}<br /><br />void USART1_Transmit(unsigned char data) {<br />// czekaj az bufor nadawczy bedzie pusty<br />while (!(UCSR1A &amp; (1 &lt;&lt; UDRE1)))<br />;<br />// wrzuc dane do bufora nadawczego, start transmisji<br />UDR1 = data;<br />}<br />unsigned char uart_is_data(void) {<br />return (UCSR1A &amp; (1 &lt;&lt; RXC1));<br />}<br />void wyslij_slowo_UART1(const char *s) {<br />while (*s)<br />USART1_Transmit(*s++);<br />}<br />void wyslij_slowo_UART(const char *s) {<br />while (*s)<br />USART_Transmit(*s++);<br />}<br /><br />int main(void) {<br />char bufor&#91;10&#93;;<br />//sei();<br />//reset modemu podłączony do PF0- deklaracja<br />DDRF |= (1 &lt;&lt; PF0);<br />PORTF |= (1 &lt;&lt; PF0);<br /><br />//POWERKEY podłączony do PC0 - deklaracja<br />DDRC |= (1 &lt;&lt; PC0);<br />PORTC |= (1 &lt;&lt; PC0);<br /><br />USART_Init(MYUBRR);<br />USART1_Init(MYUBRR);<br /><br />sei();<br />//zresetowanie modemu<br />PORTF &amp;= ~(1 &lt;&lt; PF0);<br />_delay_ms(1000);<br />PORTF |= (1 &lt;&lt; PF0);<br />_delay_ms(1000);<br /><br />//włączenie modemu (zwarcie POWERKEY na 3s)<br />PORTC &amp;= ~(1 &lt;&lt; PC0);<br />_delay_ms(3000);<br />PORTC |= (1 &lt;&lt; PC0);<br />_delay_ms(10000);<br />wyslij_slowo_UART1(&quot;AT+CMGF=1\x0D&quot;);<br />_delay_ms(2000);<br />wyslij_slowo_UART1(&quot;ATE0\x0D&quot;);<br />_delay_ms(1000);<br /><br />while (1) {<br />wyslij_slowo_UART1(&quot;AT+CMGR=6\x0d&quot;);<br />_delay_ms(1500);<br /><br />if (Response_WR != Response_RD) {<br />if (Response&#91;Response_RD &amp; 0x0F&#93; == Response_OK) {<br /><br /><br /><br />// kasowanie sms'a<br />wyslij_slowo_UART1(&quot;AT+CMGD=6\x0D&quot;);<br />_delay_ms(4000);<br /><br />//wyslanie sms<br />wyslij_slowo_UART1(&quot;AT+CMGS=&quot;);<br />USART1_Transmit('&quot;');<br />wyslij_slowo_UART1(&quot;+48663xxxxxx&quot;);<br />USART1_Transmit('&quot;');<br />wyslij_slowo_UART1(&quot;\r\n&quot;);<br />_delay_ms(1000);<br />wyslij_slowo_UART1(&quot;sms2\x1A&quot;);<br />_delay_ms(1000);<br />}<br /><br />if (Response&#91;Response_RD &amp; 0x0F&#93; == Response_ERROR) {<br />wyslij_slowo_UART1(&quot;AT+CMGD=6\x0D&quot;);<br />_delay_ms(2000);<br />}<br /><br />Response_RD++;<br />}<br />}<br />}<br /><br />ISR(USART1_RX_vect )<br />{<br /><br />RX_Buffer&#91;RX_Buf_Pos&#93; = UDR1;<br />RX_Buf_Pos++;<br /><br />if (RX_Buf_Pos &gt;= 2) //Przechodzi jak jest wystarczająco danych w buforze<br />{<br />if (RX_Buffer&#91;RX_Buf_Pos - 1&#93; == 10) //Czekanie na Enter<br />{<br />Response&#91;Response_WR &amp; 0x0F&#93; = Response_UNKNOWN;<br /><br />if (memcmp((const void*) RX_Buffer, &quot;pozycja&quot;, 7) == 0)<br />Response&#91;Response_WR &amp; 0x0F&#93; = Response_OK;<br />if (memcmp((const void*) RX_Buffer, &quot;pozycja&quot;, 7) != 0)<br />Response&#91;Response_WR &amp; 0x0F&#93; = Response_ERROR;<br /><br />Response_WR++;<br /><br />RX_Buf_Pos = 0;<br />}<br />}<br />}[/syntax]<br /><br />kod działa w połowie dobrze. Modem się uruchamia, ustawia tryb textowy, odbiera wiadomość ode mnie z tel. i następnie jąkasuje (tak jak to widać w kodzie). Jeśli wiadomość jest o treści &quot;pozycja&quot;, to ok, odsyła mi wiadomość o treści &quot;sms2&quot;. Ale jeśli wyśle wiadomość o innej treści, to nie odsyła (i tak powinno być), ale jak po tej &quot;błędnej&quot; wiadomości jeszcze raz wyślę mu wiadomość o treści &quot;pozycja&quot; to już nie odsyła :/ czemu??? już zmarnowałem chyba z 5zł na to całe testowanie podczas prób poprawiania kodu i nic :/<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2546">maxxxior</a> — 22 sie 2014, o 18:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-08-12T21:33:49+01:00</updated>
<published>2014-08-12T21:33:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=91293#p91293</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=91293#p91293"/>
<title type="html"><![CDATA[Re: Moduł GSM + AVR - niespodziewany reset modemu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=91293#p91293"><![CDATA[
To wtedy nie włączasz przerwania od nadawania:<br />[syntax=c]UCSR1B = (1 &lt;&lt; RXEN1) | (1 &lt;&lt; TXEN1) | (1 &lt;&lt; RXCIE1);[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 12 sie 2014, o 21:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[maxxxior]]></name></author>
<updated>2014-08-08T17:01:58+01:00</updated>
<published>2014-08-08T17:01:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=90732#p90732</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=90732#p90732"/>
<title type="html"><![CDATA[Re: Moduł GSM + AVR - niespodziewany reset modemu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=90732#p90732"><![CDATA[
ok, a jak nie chcę wysyłać danych w przerwaniu, tylko normalnie? a tylko odbierać je w przerwaniu?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2546">maxxxior</a> — 8 sie 2014, o 17:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-08-08T16:16:59+01:00</updated>
<published>2014-08-08T16:16:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=90729#p90729</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=90729#p90729"/>
<title type="html"><![CDATA[Re: Moduł GSM + AVR - niespodziewany reset modemu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=90729#p90729"><![CDATA[
<div class="quotetitle">maxxxior napisał(a):</div><div class="quotecontent"><br />[syntax=c]UCSR1B = (1 &lt;&lt; RXEN1) | (1 &lt;&lt; TXEN1) | (1 &lt;&lt; RXCIE1) | (1 &lt;&lt; TXCIE1);[/syntax]<br /></div><br />Odblokowałeś 2 przerwania, a masz tylko jedną funkcję obsługi przerwania. Oprócz:<br />[syntax=c]ISR(USART1_RX_vect )<br />{<br />//...<br />}[/syntax]<br />potrzeba jeszcze:<br />[syntax=c]ISR(USART1_TX_vect )<br />{<br />//...<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 8 sie 2014, o 16:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[maxxxior]]></name></author>
<updated>2014-08-08T15:49:47+01:00</updated>
<published>2014-08-08T15:49:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=90727#p90727</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=90727#p90727"/>
<title type="html"><![CDATA[Re: Moduł GSM + AVR - niespodziewany reset modemu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=90727#p90727"><![CDATA[
no muszę chyba stwierdzić że sei() jest konieczne. Z doświadczenia i z testu który zrobiłem przed chwilą. Po usunięciu sei(); program w ogóle nie wywołuje przerwania. Oczywiście w poprzednim poście nie wrzuciłem całege kodu z ciałem przerwania tylko szkielet. Oto kompletny kod:<br />[syntax=cpp]#include &lt;avr/io.h&gt;<br />#include &lt;inttypes.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/sleep.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdbool.h&gt;<br />#include &lt;math.h&gt;<br /><br />#define FOSC 8000000// Clock Speed<br />#define BAUD 9600<br />#define BAUD2 250000<br />#define MYUBRR FOSC/16/BAUD-1<br />#define MYUBRR2 FOSC/16/BAUD2-1<br /><br />#define Response_UNKNOWN       0<br />#define Response_OK            1<br />#define Response_ERROR         2<br />#define Response_CSQ           3<br />#define Response_CPIN_READY    4<br />#define Response_CPIN_NOT_INS  5<br />#define Response_Call_Ready    6<br />#define Response_CUNF          7<br />#define Response_CMT           8<br />#define Response_CLIP          9<br />#define Response_SMS_CONTINUE  10<br /><br />volatile char RX_Buffer&#91;256&#93;; //Bufor UARTa<br />volatile uint8_t RX_Buf_Pos; //Ilosc danych w buforze UARTa<br /><br />volatile uint8_t Response&#91;16&#93;; //Bufor odpowiedzi<br />volatile uint8_t Response_WR; //Wskaźnik zapisu bufora<br />volatile uint8_t Response_RD; //Wskaźnik odczytu bufora<br /><br />using namespace std;<br /><br />void USART_Init(unsigned int ubrr) {<br />/*<br /> Set baud rate<br /> */<br />UBRR0H = (unsigned char) (ubrr &gt;&gt; 8);<br />UBRR0L = (unsigned char) ubrr;<br />/*<br /> Enable receiver and transmitter<br /> */<br />UCSR0B = (1 &lt;&lt; RXEN) | (1 &lt;&lt; TXEN);<br />/*<br /> Set frame format: 8data, 2stop bit<br /> */<br />UCSR0C = (1 &lt;&lt; USBS) | (3 &lt;&lt; UCSZ0);<br />}<br /><br />void USART_Transmit(unsigned char data) {<br />/*<br /> Wait for empty transmit buffer<br /> */<br />while (!(UCSR0A &amp; (1 &lt;&lt; UDRE)))<br />;<br />/*<br /> Put data into buffer, sends the data<br /> */<br />UDR0 = data;<br />}<br />unsigned char USART_Receive() {<br /><br />while (!(UCSR0A &amp; (1 &lt;&lt; RXC0)))<br />;<br />return UDR0;<br />}<br /><br />void USART1_Init(unsigned int ubrr1) {<br /><br />UBRR1H = (uint8_t) (ubrr1 &gt;&gt; 8);<br />UBRR1L = (uint8_t) ubrr1;<br /><br />UCSR1B = (1 &lt;&lt; RXEN1) | (1 &lt;&lt; TXEN1) | (1 &lt;&lt; RXCIE1) | (1 &lt;&lt; TXCIE1);<br /><br />UCSR1C = (3 &lt;&lt; UCSZ10);<br />}<br /><br />unsigned char USART1_Receive(void) {<br />/*<br /> Wait for data to be received<br /> */<br />while (!(UCSR1A &amp; (1 &lt;&lt; RXC1)))<br />;<br />return UDR1;<br />}<br /><br />void USART1_Transmit(unsigned char data) {<br />// czekaj az bufor nadawczy bedzie pusty<br />while (!(UCSR1A &amp; (1 &lt;&lt; UDRE1)))<br />;<br />// wrzuc dane do bufora nadawczego, start transmisji<br />UDR1 = data;<br />}<br />unsigned char uart_is_data(void) {<br />return (UCSR1A &amp; (1 &lt;&lt; RXC1));<br />}<br />void wyslij_slowo_UART1(const char *s) {<br />while (*s)<br />USART1_Transmit(*s++);<br />}<br />void wyslij_slowo_UART(const char *s) {<br />while (*s)<br />USART_Transmit(*s++);<br />}<br /><br />int main(void) {<br /><br />reset modemu podłączony do PF0- deklaracja<br />DDRF |= (1 &lt;&lt; PF0);<br />PORTF |= (1 &lt;&lt; PF0);<br /><br />POWERKEY podłączony do PC0 - deklaracja<br />DDRC |= (1 &lt;&lt; PC0);<br />PORTC |= (1 &lt;&lt; PC0);<br /><br />USART_Init(MYUBRR2);<br />USART1_Init(MYUBRR);<br /><br />sei();<br /><br />        //zresetowanie modemu<br />PORTF &amp;= ~(1 &lt;&lt; PF0);<br />_delay_ms(1000);<br />PORTF |= (1 &lt;&lt; PF0);<br />_delay_ms(1000);<br /><br />włączenie modemu (zwarcie POWERKEY na 3s)<br />PORTC &amp;= ~(1 &lt;&lt; PC0);<br />_delay_ms(3000);<br />PORTC |= (1 &lt;&lt; PC0);<br />_delay_ms(10000);<br /><br />while (1) {<br />wyslij_slowo_UART1(&quot;AT+CMGF=1\x0D&quot;);<br />//_delay_ms(1000);<br />wyslij_slowo_UART1(&quot;AT+CMGR=9\x0d&quot;);<br />//_delay_ms(1000); <br /><br />if (Response_WR != Response_RD) {<br />if (Response&#91;Response_RD &amp; 0x0F&#93; == Response_OK) {<br />wyslij_slowo_UART(&quot;odebranoSMS&quot;);<br /><br />if (Response&#91;Response_RD &amp; 0x0F&#93; == Response_ERROR)<br />wyslij_slowo_UART(&quot;brak SMS&quot;);<br /><br />Response_RD++;<br />}<br /><br />}<br />}<br />}<br /><br />ISR(USART1_RX_vect )<br />{<br /><br />RX_Buffer&#91;RX_Buf_Pos&#93; = UDR1;<br />RX_Buf_Pos++;<br /><br />if (RX_Buf_Pos &gt;= 2) //Przechodzi jak jest wystarczająco danych w buforze<br />{<br />if (RX_Buffer&#91;RX_Buf_Pos - 1&#93; == 10) //Czekanie na Enter<br />{<br />Response&#91;Response_WR &amp; 0x0F&#93; = Response_UNKNOWN;<br /><br />if (memcmp((const void*) RX_Buffer, &quot;OK\r\n&quot;, 4) == 0)<br />Response&#91;Response_WR &amp; 0x0F&#93; = Response_OK;<br />if (memcmp((const void*) RX_Buffer, &quot;ERROR\r\n&quot;, 7) == 0)<br />Response&#91;Response_WR &amp; 0x0F&#93; = Response_ERROR;<br /><br />Response_WR++;<br /><br />RX_Buf_Pos = 0;<br />}<br />}<br />}[/syntax]<br /><br />i tak jak pisałem. jak jest sei() i cokolwiek wysyłające coś do UART1 po sekwencji włączania modemu, to modem się resetuje. Jak wywale sei to modem sie uruchamia ale nie wchodzi w przerwanie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2546">maxxxior</a> — 8 sie 2014, o 15:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-08-07T20:22:57+01:00</updated>
<published>2014-08-07T20:22:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=90606#p90606</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=90606#p90606"/>
<title type="html"><![CDATA[Re: Moduł GSM + AVR - niespodziewany reset modemu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=90606#p90606"><![CDATA[
<div class="quotetitle">maxxxior napisał(a):</div><div class="quotecontent"><br />[syntax=c]USART_Init(MYUBRR2);<br />USART1_Init(MYUBRR);[/syntax]<br /></div><br />Jedna z tych funkcji jest w tym kodzie a gdzie druga? Ale to szczegół.<br /><br />sei() odblkowuje wszystkie przerwania, a to są funkcje, które wywołuje sprzęt jak coś się stanie. Takie funkcje nie są wywoływane w funkcji main jak np. USART1_Init czy _delay_ms. Funkcje przerwania masz na końcu i zaczyna się ona od ISR, a w nawiasie jest nazwa informująca o tym jakiego sprzętu dotyczy. USART1_RX_vect oznacza, że odebranie jakiegoś znaku przez port szeregowy 1 wywoła tą funkcję. Ty w swoim kodzie nie potrzebujesz tego robić i sei() nie jest potrzebne. To co się dzieje to reset procesora. Program zaczyn a się na nowo i resetuje moduł GSM. Reset procesora to wynik złej konfiguracji sprzętu. Nie widzę tego w powyższym kodzie, ale jak masz dwie funkcje o których wspomniałem na początku to pewnie w drugiej masz odblokowane przerwanie, ale już dotyczące konkretnego sprzętu w procesorze. Rzecz w tym, że jak to zrobisz, a nie ma zdefiniowanej funkcji obsługi tego właśnie przerwania to masz reset procka.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 7 sie 2014, o 20:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[maxxxior]]></name></author>
<updated>2014-08-07T15:50:34+01:00</updated>
<published>2014-08-07T15:50:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=90552#p90552</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=90552#p90552"/>
<title type="html"><![CDATA[Moduł GSM + AVR - niespodziewany reset modemu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8051&amp;p=90552#p90552"><![CDATA[
Witam<br />Posiadam taki układ. Moduł GSM MG2639V. Podłączony za pomocą lini UART do mikrokontrolera Atmega64. Oczywiście na tych liniach jest zrobiona konwersja napięć na 2.8V. Komunikacja z modemem za pomocą terminala na PC działa prawidłowo. Wcześniej, jak resetowałem oraz włączałem modem &quot;z palca&quot; czyli przytykałem kabelek POWERKEY do masy to i z AVR działał dobrze. Problemy pojawiły się, jak chciałem resetować modem oraz włączać go za pomocą AVR. Oto kod:<br />[syntax=cpp]#include &lt;avr/io.h&gt;<br />#include &lt;inttypes.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/sleep.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/signal.h&gt;<br />#include &lt;stdbool.h&gt;<br />#include&lt;math.h&gt;<br /> <br />#define FOSC 2000000// Clock Speed<br />#define BAUD 9600<br />#define MYUBRR FOSC/16/BAUD-1<br />using namespace std;<br /> <br />void USART1_Init(unsigned int ubrr1) {<br />// wyliczenie UBRR dla trybu asynchronicznego (U2X=0)<br />//uint16_t _ubr = 0x0006;<br />//uint16_t _ubr_UART1 = (F_CPU / 16 / baud1 - 1);<br />// ustawienie prÓdkoŁci<br />UBRR1H = (uint8_t) (ubrr1 &gt;&gt; 8);<br />UBRR1L = (uint8_t) ubrr1;<br />// za-Žczenie nadajnika i odbiornika<br />//UCSR1B = (1&lt;&lt;RXEN1)|(1&lt;&lt;TXEN1)|(1&lt;&lt;RXCIE1); //z przerwaniami<br />UCSR1B = (1 &lt;&lt; RXEN1) | (1 &lt;&lt; TXEN1);<br />// ustawienie formatu ramki: 8 bitíw danych, 1 bit stopu<br />//UCSR1C = 0;<br />UCSR1C = (3 &lt;&lt; UCSZ10);<br />}<br /> <br />unsigned char USART1_Receive(void) {<br />/*<br /> Wait for data to be received<br /> */<br />while (!(UCSR1A &amp; (1 &lt;&lt; RXC1)))<br />;<br />return UDR1;<br />}<br /> <br />void USART1_Transmit(unsigned char data) {<br />// czekaj az bufor nadawczy bedzie pusty<br />while (!(UCSR1A &amp; (1 &lt;&lt; UDRE1)))<br />;<br />// wrzuc dane do bufora nadawczego, start transmisji<br />UDR1 = data;<br />}<br /> <br />void wyslij_slowo_UART1(const char *s) {<br />while (*s)<br />USART1_Transmit(*s++);<br />}<br /> <br />int main(void) {<br /> <br />//reset modemu podłączony do PF0- deklaracja<br />DDRF |= (1 &lt;&lt; PF0);<br />PORTF |= (1 &lt;&lt; PF0);<br /> <br />//POWERKEY podłączony do PC0 - deklaracja<br />DDRC |= (1 &lt;&lt; PC0);<br />PORTC |= (1 &lt;&lt; PC0);<br /> <br />USART_Init(MYUBRR2);<br />USART1_Init(MYUBRR);<br />sei();<br /> <br />//zresetowanie modemu<br />PORTF &amp;= ~(1 &lt;&lt; PF0);<br />_delay_ms(1000);<br />PORTF |= (1 &lt;&lt; PF0);<br />_delay_ms(1000);<br /> <br />//włączenie modemu (zwarcie POWERKEY na 3s)<br />PORTC &amp;= ~(1 &lt;&lt; PC0);<br />_delay_ms(3000);<br />PORTC |= (1 &lt;&lt; PC0);<br /> <br />//czekanie az modem się włączy (max 10s)<br />_delay_ms(10000);<br />         // tutaj jak odkomentuje ta linie to modem sie resetuje<br />//wyslij_slowo_UART1(&quot;AT\x0D&quot;);<br /> <br />while (1) {<br /> <br />}<br />}<br /><br />ISR(USART1_RX_vect )<br />{<br />}[/syntax]<br /><br />I teraz tak. Jak jest linijka sei(); a po linijce w której włączam modem pinem POWERKEY nie ma nic, to modem się normalnie uruachamia. Natomiast jak np chcę wysłać po włączeniu komendę AT, to modem się jak by resetuje.Tzn dioda mignie raz, chwila przerwy i znowu mignie raz. Dla mnie wygląda to na reset modemu.  Natomiast jak zakomentuję sei(); a odkomentuję komendę wysyłającą AT, to modem też się włącza. Czyli, albo to albo to. Co jest nie tak w tym kodzie? Ten kod co teraz wrzuciłem chyba powinien mi po prostu uruchomić modem co nie? Nie kapuję o co chodzi z tym sei() i z wysłaniem AT, tzn wiem o co chodzi ale nie wiem czemu jednocześnie nie mogą być te dwie linijki w programie. Problem dzieje się nawet wtedy jak odepnę linie RxD i Txd pomiędzy AVR-Modem a zostawię sei() w programie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2546">maxxxior</a> — 7 sie 2014, o 15:50</p><hr />
]]></content>
</entry>
</feed>