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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=5375&amp;mode</id>
<entry>
<author><name><![CDATA[Paweł_1985]]></name></author>
<updated>2014-01-01T23:14:56+01:00</updated>
<published>2014-01-01T23:14:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5375&amp;p=63287#p63287</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5375&amp;p=63287#p63287"/>
<title type="html"><![CDATA[SPI błąd przy przesyłaniu danych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5375&amp;p=63287#p63287"><![CDATA[
Przygotowałem komunikację pomiędzy dwoma mikrokontrolerami Atmega16 za pomocą SPI pomiędzy sterownikiem, a robotem mobilnym. Komunikacja zrealizowana jest w taki sposób, że:<br />dla mastera:<br />- nadaje najpierw sygnał CS = 0;<br />- następnie wysyłane są parametry z tablicy o ilości elementów = 3;<br />- po zakończonej transmisji CS = 1;<br />dla slave'a:<br />- zmiana CS z 1 na 0 powoduje uaktywnienie przerwania zewnętrznego INT2, które zeruje SPI_rec_no;<br />- odebranie każdej danej uaktywnia przerwanie i powoduje zapisanie zawartości SPDR do odpowiedniej komórki tablicy.<br /><br />Program dla mastera:<br />main.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;hd44780.h&quot;//funkcje sterujące wyświetlaczem LCD<br />#include &quot;display.h&quot;//wyświetlanie na LCD<br />#include &quot;keyboard.h&quot;//odczyt z klawiatury<br />#include &quot;I2C.h&quot;//komunikacja I2C<br />#include &quot;SPI_com.h&quot;//komunikacja SPI <br />#include &quot;RS232.h&quot;//komunikacja RS232<br />#include &quot;all.h&quot;//parametry <br /><br />void SPI_Transmit (uint8_t *buf);<br /><br />int main (void)<br />{<br />sei();<br />LCD_Initalize();//inicjalizacja wyświetlacza<br />I2C_Init(); //inicjalizacja I2C<br />SPI_init ();//inicjalizacja SPI<br />USART_init(__UBRR);//inicjalizacja RS232<br /><br />bufor_send&#91;controll&#93; = 0;<br /><br />for (;;)  <br />{<br />bufor_send&#91;PWM&#93; = (w_source ? bufor_I2C_rec&#91;PWM&#93; : bufor_RS_rec&#91;PWM&#93;);<br />bufor_send&#91;direct&#93; = (w_source ? bufor_I2C_rec&#91;direct&#93; : bufor_RS_rec&#91;direct&#93;);<br />bufor_send&#91;controll&#93; = (((w_source ? bufor_I2C_rec&#91;controll&#93; : bufor_RS_rec&#91;controll&#93;)&amp;0x02)|(bufor_send&#91;controll&#93;&amp;0x01));<br /><br />source_choice (keyboard(), bufor_send);<br /><br /><br />I2C_read (I2C_read_addres, sizeof(bufor_I2C_rec), bufor_I2C_rec);<br />I2C_send (I2C_write_addres, sizeof(bufor_send), bufor_send);<br /><br />Display_LCD(bufor_send);<br /><br />SPI_Transmit(bufor_send);<br /><br />USART_rec (bufor_RS_rec);<br />USART_send (sizeof(bufor_send), bufor_send);<br />}<br />}<br />void SPI_Transmit (uint8_t *buf)<br />{<br />uint8_t i=0;<br />uint8_t tt&#91;3&#93;={1,0,0};<br /> <br /><br />SPI_start();<br />for (i=0; i&lt;3; i++)<br />{<br />SPI_transmission(tt&#91;i&#93;);<br />}<br />SPI_stop();<br />}[/syntax]<br /><br />SPI_com.c<br />[syntax=c]#include &quot;SPI_com.h&quot;<br /><br />#define SCK PB7<br />#define MOSI PB5<br />#define SS PB4 <br /><br />void SPI_init (void) //inicjalizacja SPI<br />{<br />DDRB |= ((1&lt;&lt;MOSI)|(1&lt;&lt;SCK)|(1&lt;&lt;SS)); //SS, MOSI, SCK - jako wyjścia<br />PORTB|=(1&lt;&lt;SS); // wyjście SS - w stanie wysokim<br /><br />SPCR = (1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(1&lt;&lt;SPR1)|(1&lt;&lt;SPR0); // załączenie SPI, wybór trybu master, zegar SPI = Fosc/4<br /><br />}<br /><br />uint8_t SPI_transmission (uint8_t dane)<br />{<br />SPDR = dane;<br />while (!(SPSR &amp; (1&lt;&lt;SPIF)));<br /><br />return SPDR;<br />}<br /><br />void SPI_start(void)<br />{<br />PORTB &amp;=~(1&lt;&lt;SS);<br />}<br /><br />void SPI_stop(void)<br />{<br />PORTB |=(1&lt;&lt;SS);<br />}[/syntax]<br /><br />SPI_com.h<br />[syntax=c]#include &lt;avr/io.h&gt;<br /><br />void SPI_init (void);<br />uint8_t SPI_transmission (uint8_t dane);<br />void SPI_start(void);<br />void SPI_stop(void);[/syntax]<br /><br />Program dla slave'a:<br />main.c<br />[syntax=c]#include &quot;all.h&quot;<br />int main (void)<br />{<br />//SPI_rec_no=1;<br />bufor_receive&#91;PWM&#93; = 90; //parametr do testów<br />sei();<br />//ADC_init();<br />PWM_init();<br />in_out_init();<br />SPI_init();<br /><br />PWM_set_value(bufor_receive&#91;PWM&#93;);<br /><br />for(;;)<br /><br />{<br />set_battery_level (battery_voltage);<br />lights (bufor_receive&#91;controll&#93;);<br /><br />#if demo_drive == 1<br />demo (); //do testów<br />#endif<br /><br />#if demo_drive == 0<br />drive(bufor_receive&#91;direct&#93;);<br />#endif<br />}<br />}[/syntax]<br /><br />SPI_slave.c<br />[syntax=c]#include &quot;all.h&quot;<br />#define MISO PB6<br />volatile uint8_t SPI_rec_no=0;<br />void SPI_init (void)<br />{<br />DDRB |= (1&lt;&lt;MISO); // MISO - jako wyjście<br />SPCR = (1&lt;&lt;SPE)|(1&lt;&lt;SPIE); //włączony SPI, odblokowane przerwania<br />GICR |= (1&lt;&lt;INT2);<br />}<br /><br />ISR (SPI_STC_vect)<br />{<br />//bufor_receive&#91;direct&#93; = SPDR;<br />switch (SPI_rec_no)<br />{<br />case 0: bufor_receive&#91;PWM&#93; = SPDR; break;<br />case 1: bufor_receive&#91;direct&#93; = SPDR; break;<br />case 2: bufor_receive&#91;controll&#93; = SPDR; break;<br />}<br />SPI_rec_no++;<br /><br />}<br /><br />ISR (INT2_vect)<br />{ <br />SPI_rec_no = 0;<br />}[/syntax]<br /><br />Jeżeli przesyłany jest tylko jeden parametr (tablica o wielkości  1) wszystko działa poprawnie. Natomiast jeżeli przesyłanych jest więcej parametrów wtedy nie sa odbierane poprawnie, robot zamiast jechać do przodu załącza światło, albo jedzie w złym kierunku, jeżeli ma załączyć światło to wtedy zaczyna jechać i światła mrugają. Czy może ktoś spotkał się z podobnym problemem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1009">Paweł_1985</a> — 1 sty 2014, o 23:14</p><hr />
]]></content>
</entry>
</feed>