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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-12-26T11:29:29+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=5271&amp;mode</id>
<entry>
<author><name><![CDATA[filip]]></name></author>
<updated>2013-12-26T11:29:29+01:00</updated>
<published>2013-12-26T11:29:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5271&amp;p=62326#p62326</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5271&amp;p=62326#p62326"/>
<title type="html"><![CDATA[Problem z SPI po inicjalizacji wyświetlacza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5271&amp;p=62326#p62326"><![CDATA[
Witam wszystkich forumowiczów i życzę wesołych świąt <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Od pewnego czasu jestem w trakcie wykonywania projektu manipulatora na bazie dwóch procesorów atmega32 - oba taktowane kwarcem 16MHz. Do pewnego momentu wszystko szło dobrze, dopóki nie zabrałem się za transmisję SPI. Problem polega na tym, że przesyłanie danych działa (wszystkie połączenia są poprawne, sprawdzone jak wykonywane były tylko funkcje do transmisji SPI), ale tylko wtedy gdy wyłączona jest obsługa wyświetlacza ( biblioteki pochodzą z bluebook'a (niezmieniona) - wyświetlacz podłączony do portu C ).<br />Ma ktoś jakiś pomysł, dlaczego występuje konflikt między SPI a wyświetlaczem?<br />Kody:<br />SPI.h:<br />[syntax=c]#ifndef SPI_H_<br />#define SPI_H_<br /><br />#define CS PB4<br />#define MOSI PB5<br />#define MISO PB6<br />#define SCK PB7<br /><br />void InitSpiSlave(void);<br />void InitSpiMaster(void);<br /><br />uint8_t ReceiveSpi(void);<br />void SendSpi(uint8_t bajt);<br />uint8_t TransferSpi(uint8_t bajt);<br /><br />#endif[/syntax]<br /><br />SPI.c:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &quot;SPI.h&quot;<br /><br />void InitSpiMaster(){<br />DDRB |= (1&lt;&lt;MOSI)|(1&lt;&lt;SCK)|(1&lt;&lt;CS);<br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(1&lt;&lt;SPR1)|(1&lt;&lt;SPR0);<br />}<br /><br />void InitSpiSlave(){<br />DDRB |= (1&lt;&lt;MISO);<br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;SPIE);<br />}<br /><br />void SendSpi(uint8_t bajt){<br />SPDR=bajt;<br />while( !(SPSR &amp; (1&lt;&lt;SPIF)));<br />}<br /><br />uint8_t ReceiveSpi(void){<br />while( !(SPSR &amp; (1&lt;&lt;SPIF)));<br />return SPDR;<br />}<br /><br />uint8_t TransferSpi(uint8_t bajt){<br />SPDR=bajt;<br />while( !(SPSR &amp; (1&lt;&lt;SPIF)));<br />return SPDR;<br />}[/syntax]<br /><br />main.c - master:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;SPI\SPI.h&quot;<br />#include &quot;LCD\lcd44780.h&quot;<br />#include &quot;ADC\ADC.h&quot;<br />#include &quot;manipulator.h&quot;<br /><br />int16_t x , y , z , teta;<br />int16_t *wsk_x=&amp;x , *wsk_y=&amp;y , *wsk_z=&amp;z , *wsk_teta=&amp;teta;<br />int16_t pozycja&#91;5&#93; , *poz=&amp;pozycja&#91;0&#93;;<br /><br />int main()<br />{<br />InitSpiMaster();<br />InitADC();<br />lcd_init();<br /><br />x=300;<br />y=0;<br />z=100;<br />teta=0;<br /><br />while(1){<br />odczytaj_pozycje(wsk_x,wsk_y,wsk_z,wsk_teta);<br />wylicz(x,y,z,teta,poz);<br />wyswietl(poz,wsk_x,wsk_y,wsk_z,wsk_teta);<br />SendSpi(pomiar(kanal_x)/4);<br />_delay_ms(50);<br />lcd_cls();<br />};<br /><br />}[/syntax]<br /><br />Domyślnie obróbka danych odebranych z SPI będzie w przerwaniu.<br />main.c - slave:<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 &quot;pwm\pwmserwo.h&quot;<br />#include &quot;SPI\SPI.h&quot;<br />#include &quot;LCD\lcd44780.h&quot;<br /><br />int16_t pwm&#91;7&#93;;<br /><br />int main()<br />{<br />sei();<br />Serwos_Init();<br />Timer2_Init();<br />InitSpiSlave();<br />lcd_init();<br />while(1){<br />lcd_locate(0,0);<br />lcd_str(&quot;odbior&quot;);<br />lcd_locate(1,0);<br />lcd_int(ReceiveSpi());<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1548">filip</a> — 26 gru 2013, o 11:29</p><hr />
]]></content>
</entry>
</feed>