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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-04-22T17:36:00+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=18223&amp;mode</id>
<entry>
<author><name><![CDATA[karl9955]]></name></author>
<updated>2017-04-22T17:36:00+01:00</updated>
<published>2017-04-22T17:36:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18223&amp;p=187655#p187655</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18223&amp;p=187655#p187655"/>
<title type="html"><![CDATA[Problem z powrotem z przerwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18223&amp;p=187655#p187655"><![CDATA[
Witam,<br />mam pewien problem.. Program po wejściu w przerwanie nie chce wrócić do głównej pętli programu. W pliku main inicjalizuję podzespoły (RTC i LCD) oraz ustawiam wszystko by umożliwić przerwania INT0. Pin ustawiony jako wejście, podciągnięty sprzętowo do VCC oraz odpowiednie rejestry są ustawione by reagował na zmianę stanu (&quot;oba zbocza&quot;). W obsłudze przerwania jest prosty kod który ma za zadanie wyświetlić na LCD jaki obecnie stan się znajduje na pinie PD2 ( 0 lub 1). Po odpaleniu programu zegarek tyka (tak jak wcześniej, wszystko OK) a po wejściu w przerwanie poprawnie wyświetla się wartość na pinie lecz zegar się zatrzymuje :C Kolejne generowanie przerwań skutkuje zmianami wyświetlanych wartości pinu lecz zegar cały czas jest zamrożony. Dodam że zarówno RTC jak i LCD są połączone poprzez I2C. Proszę o pomoc.<br />Pozdrawiam.<br /><br />[syntax=cpp]\* ======== MAIN.C =========== */<br /><br />int main(void) {<br /><br />lcd_init();<br />RTC_init();<br />dcf77_init();<br /><br />while (1) {<br />display_time();<br />display_date();<br />}<br /><br />}<br /><br />\* ======== DCF77.C =========== */<br /><br />void dcf77_init(){<br /><br />EICRA |= (1&lt;&lt;ISC00);        // Set interrupt mode on any change.<br />EIMSK |= (1&lt;&lt;INT0);// Enable interrupts on Int0.<br />PORTD |= (1&lt;&lt;PD2);// Set internal pull-up resistor to PD2 (Int0) .<br />sei();// Enable global interrupts .<br /><br />}<br /><br /><br />ISR ( INT0_vect ){<br /><br />lcd_locate(0, 0);<br /><br />if( !( PIND &amp; (1&lt;&lt;PD2) ) ){<br />lcd_int(1);<br />}<br />if( ( PIND &amp; (1&lt;&lt;PD2) ) ){<br />lcd_int(0);<br />}<br />}[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 16 minutach ]</span></strong><br /><br />Problem rozwiązany, okazało się że czas potrzebny na wyświetlenie czegoś na wyświetlaczu jest zbyt długi by umieszczać go w przerwaniu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12052">karl9955</a> — 22 kwi 2017, o 17:36</p><hr />
]]></content>
</entry>
</feed>