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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-02-09T20:52:04+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=47&amp;t=14478&amp;mode</id>
<entry>
<author><name><![CDATA[DonPatus]]></name></author>
<updated>2016-02-09T20:52:04+01:00</updated>
<published>2016-02-09T20:52:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14478&amp;p=153196#p153196</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14478&amp;p=153196#p153196"/>
<title type="html"><![CDATA[Arduino uno, przerwania timer1 oraz expander PCF8574]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14478&amp;p=153196#p153196"><![CDATA[
Witam,<br />za pomocą Arduino uno tworze projekt zegara na wyświetlaczu 4x7segmentowy.<br /><br />Wyświetlacz jest ze wspólną anodą, a katody są podłączone przez expander PCF8574N za pomocą I2C do mikrokontrolera.<br /><br />Otóż mam taki problem, w obsłudze przerwania timer1 (1Hz), zapalam odpowiednią anodę, i chcę wysłać odpowiednią kombinację 8bitów do expandera jednak program się zatrzymuje. Dodatkowo z niewiadomych mi przyczyn program się zatrzymuje dokładnie 18 linijek wcześniej, przed poleceniem wysłania 8bitów do expandera.<br /><br />Załączam wycinek z obsługi przerwania, wcześniej w funkcji setup mam zainicjalizowany expander:   &quot;expander.begin(0x20);&quot; oraz na początku programu &quot;PCF8574 expander;&quot;. Gdy wrzucę komendę wysłania 8bitów do programu głównego to wszystko działa jak powinno<br />Serial.println dopisałem aby dowiedzieć się ile linijek wcześniej zatrzymuje się program<br />[syntax=cpp]ISR(TIMER1_COMPA_vect)<br />{ <br />  licznik++;<br />  if (licznik &gt;3) licznik=0;<br />  digitalWrite(tranzystor_anoda&#91;licznik&#93;, LOW);<br />  <br />  Serial.println(&quot;1&quot;);<br />  Serial.println(&quot;2&quot;);<br />  Serial.println(&quot;3&quot;);<br />  Serial.println(&quot;4&quot;); &lt;- po tej linii się zatrzymuje pogram<br />  Serial.println(&quot;5&quot;);<br />  Serial.println(&quot;6&quot;);<br />  Serial.println(&quot;7&quot;);<br />  Serial.println(&quot;8&quot;);<br />  Serial.println(&quot;9&quot;);<br />  Serial.println(&quot;10&quot;);<br />  Serial.println(&quot;11&quot;);<br />  Serial.println(&quot;12&quot;);<br />  Serial.println(&quot;13&quot;);<br />  Serial.println(&quot;14&quot;);<br />  Serial.println(&quot;15&quot;);<br />  Serial.println(&quot;16&quot;);<br />  Serial.println(&quot;17&quot;);<br />  Serial.println(&quot;18&quot;);<br />  Serial.println(&quot;19&quot;);<br />  Serial.println(&quot;20&quot;);<br />  Serial.println(&quot;21&quot;);<br />  expander.write(200);<br />}[/syntax]<br /><br />Proszę o pomoc z rozwiązaniem problemu, dlaczego nie mogę użyć odwołania do expandera w przerwaniu lub ewentualnie co robię źle i dlaczego program akurat wcześniej się zatrzymuje?<br /><br />Dorzucam jeszcze inicjalizacje timer1 gdyby była potrzebna:<br />[syntax=cpp]{<br />  cli(); // zatrzymaj wykonywanie jakichkolwiek przerwań  <br />  TCCR1B = 0;<br />  TCCR1A = 0;<br />  //ustawienie TIMER1<br />  TCCR1B |= (1&lt;&lt;WGM12); // ustawienie CTC<br />  TCCR1B |= ( (1&lt;&lt;CS12) | (0&lt;&lt;CS01) | (1&lt;&lt;CS10) ); //prescaler 1024<br />  OCR1AH = B00111101; // 15626 czyli 1Hz<br />  OCR1AL = B00001010;<br />  TIMSK1 |= (1&lt;&lt;OCIE1A); // wlaczenie porownania z OCR0A - zezwolenie na przerwanie Compare Match<br />  sei();<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12892">DonPatus</a> — 9 lut 2016, o 20:52</p><hr />
]]></content>
</entry>
</feed>