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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-09-26T12:12:47+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=24&amp;t=16304&amp;mode</id>
<entry>
<author><name><![CDATA[wchpikus]]></name></author>
<updated>2016-09-26T12:12:47+01:00</updated>
<published>2016-09-26T12:12:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16304&amp;p=169642#p169642</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16304&amp;p=169642#p169642"/>
<title type="html"><![CDATA[spi i komunikacja slave w przerwaniu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16304&amp;p=169642#p169642"><![CDATA[
Witam<br />mam maly problem z komunikacja uc z urządzeniem, w trybie slave i przerwaniu.<br />Dwa przerwania, jedno INT0 ze zboczem opadającym, drugie SPI.<br />Komunikacja powinna wygladac tak:<br /><br />Master     slave<br />0x5a        0xf7 pierwszy bajt<br />xxxx         0xDB odbieram bajt z urzadzenia<br />xxxx         0xDB odbieram bajt z urzadzenia<br />xxxx         0xDB odbieram bajt z urzadzenia<br />xxxx         0xDB odbieram bajt z urzadzenia<br />xxxx         0xDB odbieram bajt z urzadzenia<br />xxxx         0xDB odbieram bajt z urzadzenia<br /><br />NIestety nie chce to poprawnie dzialac.<br />Wartosci przechowuje w tablicy.<br />Wpisanie ręcznie SRDP = xxx działa poprawnie, niestety wyciągniecie z tablicy juz nie.<br /><br />Linia MTS wymusza pojawienie sie zmiany stanu na linii STM i tym samym wejscie w przerwanie INT0..<br /><br />[syntax=c]#define INT0_ENABLE (EIMSK = (1&lt;&lt;INT0))<br />#define INT0_DISABLE (EIMSK &amp;= ~(1&lt;&lt;INT0))<br /><br />uint8_t sendArray&#91;7&#93; = {247, 219, 219, 219, 219, 219, 219};<br />uint8_t recvArray&#91;7&#93;;<br />uint8_t *ptrSendArr = sendArray;<br />uint8_t *ptrRecvArray = recvArray;<br />uint8_t currentSendArrayCounter = 0;<br />uint8_t currentRecvArrayCounter = 0;<br />uint8_t sendArraySize = sizeof sendArray;<br />uint8_t recvArraySize = sizeof recvArray;<br />uint8_t count;<br />uint8_t check_data;<br /><br />//zewnetrzne przerwanie INT0<br />ISR(INT0_vect){<br />//jesli dojdziemy do ostatniego elementu to wracamy na początek tablicy<br />//tui też trzeba będzie obsłuzyć ładowanie paczki danych do wysłania z EEPROM<br />if(currentSendArrayCounter &gt;= sendArraySize){<br />currentSendArrayCounter = 0;<br />}<br />//wstawiamy wartoś elementu currentSendArrayCounter do rrejestru SPI<br />SPDR = *(ptrSendArr + currentSendArrayCounter);<br />//SPDR = sendArray&#91;currentSendArrayCounter&#93;;<br />//wysyła wartośc na uart<br />USART_SendStr(&quot;table= &quot;); uart_putnr(currentSendArrayCounter);USART_SendStr(&quot; &quot;);<br />USART_SendStr(&quot;send= &quot;); uart_putnrhex(*(ptrSendArr + currentSendArrayCounter));USART_SendStr(&quot; &quot;);<br />SPI_ENABLE;<br />SPI_INT_ENABLE;<br />CLEARBIT(PORTB, PINB1);<br />}<br /><br /><br />//przerwanie zakończenia transmiski SPI<br />ISR(SPI_STC_vect){<br />//jak licznik po buforze odbiorczym dojdzie do konca<br />//to zeruje licznik<br />if(currentRecvArrayCounter &gt;= recvArraySize){<br />currentRecvArrayCounter = 0;<br />}<br />//zapis wartości bufora po SPI po odczycie do tablicy<br />*(ptrRecvArray + currentRecvArrayCounter)  = SPDR;<br />check_data = *(ptrRecvArray + currentRecvArrayCounter);<br />///wysłanie na uart wartości<br />USART_SendStr(&quot;recive= &quot;);uart_putnrhex(*(ptrRecvArray + currentRecvArrayCounter));USART_SendStr(&quot;\r\n&quot;);<br />//incrementacja licznika tablicy odbiorczej<br /><br />if (currentSendArrayCounter &gt; 0 ){<br />currentRecvArrayCounter++;<br />currentSendArrayCounter++;<br /><br />}<br />if (check_data == 0x5A &amp;&amp; currentSendArrayCounter == 0){<br />currentRecvArrayCounter++;<br />currentSendArrayCounter++;<br /><br />}<br />SPI_DISABLE;<br />SPI_INT_DISABLE;<br />SETBIT(PORTB, PINB1);<br />}<br /><br />int main(void)<br />{//Inicjalizacja SPI jako slave<br />SPI_InitSlave();<br /><br />//Inicjalizacja UART, konfiguracja w USART.h<br />USART_Init();<br /><br />//Monit że układ ruszył<br />USART_SendStr(&quot;INIT&quot;);USART_SendStr(&quot;\r\n&quot;);<br /><br />//D2 jako wejście, to jest linia STM<br />SET_PINPORT_AS_IN(DDRD, PIND2);<br />//Pullup<br />SETBIT(PORTD, PIND2); <br />//przerwanie inicjuje zbocze opadające<br />EICRA = (1&lt;&lt;ISC01);<br /><br />//wyłączenie przerwania na SPI<br />SPI_INT_DISABLE;<br />//włączenie przerwania na INT0<br />INT0_ENABLE;<br /><br />//global interrupts on<br />sei();<br /><br />    while (1) <br />    {<br /><br />    PORTD = (1&lt;&lt;PIND7);//led on<br />    PORTB = (0&lt;&lt;PINB1); //MTS down wymuszam odpowiedz na pinie od przerwan.<br />    _delay_ms(50);<br />    PORTB = (1&lt;&lt;PINB1);//MTS up<br />    PORTD = (0&lt;&lt;PIND7);//led off<br />    _delay_ms(670);<br />    }<br />    <br /><br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3859">wchpikus</a> — 26 wrz 2016, o 12:12</p><hr />
]]></content>
</entry>
</feed>