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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-11-25T21:59:22+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=9426&amp;mode</id>
<entry>
<author><name><![CDATA[jacul22]]></name></author>
<updated>2014-11-25T21:59:22+01:00</updated>
<published>2014-11-25T21:59:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9426&amp;p=105977#p105977</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9426&amp;p=105977#p105977"/>
<title type="html"><![CDATA[Re: Problem z odczytem TWI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9426&amp;p=105977#p105977"><![CDATA[
Masz rację ,ale to było dołożone później żeby cokolwiek się działo na wyśietlaczu.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br />Prawdopodobnie problem jest w montażu, po zmianie zasilacza(dotąd było zasilanie z USB z komputera) chodzi &quot;nawet&quot; 7 minut<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6797">jacul22</a> — 25 lis 2014, o 21:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Nefarious19]]></name></author>
<updated>2014-11-25T21:51:14+01:00</updated>
<published>2014-11-25T21:51:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9426&amp;p=105971#p105971</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9426&amp;p=105971#p105971"/>
<title type="html"><![CDATA[Re: Problem z odczytem TWI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9426&amp;p=105971#p105971"><![CDATA[
<div class="quotetitle">jacul22 napisał(a):</div><div class="quotecontent"><br />To wyświetlanie na LCD było wstawione żeby sprawdzić czy procesor nadal chodzi<br /></div><br /><br />Kod w przerwaniach ma się wykonywać błyskawicznie. Nie może być tamzadnych delayów ani funkcji wprowadzające spore opóźnienia. Czasem Kod może działać dobrze nawet z takim babolem ale takie nawyki mogą się później zemścić. Lepiej poświęcić jeden bajt ramu na zmienną flagową którą ustawiasz w przerwaniu a w pętli głównej sprawdzasz czy została ustawiona i jeżeli tak to wykonujesz jakiś kawałek kodu. <br /><br />Naprawdę nie warto takich baboli robic bo później to w krew wchodzi człowiekowi <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2500">Nefarious19</a> — 25 lis 2014, o 21:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacul22]]></name></author>
<updated>2014-11-25T21:41:43+01:00</updated>
<published>2014-11-25T21:41:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9426&amp;p=105969#p105969</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9426&amp;p=105969#p105969"/>
<title type="html"><![CDATA[Re: Problem z odczytem TWI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9426&amp;p=105969#p105969"><![CDATA[
To wyświetlanie na LCD  było wstawione żeby sprawdzić czy procesor nadal chodzi, a zliczanie sekund żeby sprawdzić czy to nie błąd w przerwaniu od zegarka.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6797">jacul22</a> — 25 lis 2014, o 21:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirkoT]]></name></author>
<updated>2014-11-25T21:23:34+01:00</updated>
<published>2014-11-25T21:23:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9426&amp;p=105965#p105965</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9426&amp;p=105965#p105965"/>
<title type="html"><![CDATA[Re: Problem z odczytem TWI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9426&amp;p=105965#p105965"><![CDATA[
Tak na szybko tylko zerknąłem i takie drobne uwagi mi się nasunęły...<br /><br />Powiedz mi po co Ci ten delay w pętli głównej?<br />Dlaczego w przerwaniu od CTC robisz obsługę LCD?<br />Po co tam zliczasz sekundy skoro masz przerwanie co sekundę o RTC?<br />Jak ma ci zliczać te setne ms skoro zakomentowałeś zmienną statyczną w przerwaniu?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=189">MirkoT</a> — 25 lis 2014, o 21:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacul22]]></name></author>
<updated>2014-11-25T21:15:27+01:00</updated>
<published>2014-11-25T21:15:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9426&amp;p=105961#p105961</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9426&amp;p=105961#p105961"/>
<title type="html"><![CDATA[Problem z odczytem TWI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9426&amp;p=105961#p105961"><![CDATA[
Witam wszystkich, mam problem z zegarkiem DS1307, czytam BB i postanowiłem sprawdzić w praktyce co i jak.<br />Układ zmontowany na płytce stykowej, i właściwie to działa, ale tylko przez kilka, kilkanaście sekund potem przestaje i nie wiem ale właściwie tak jakby nie był spełniony warunek &quot;if (int0_flag )&quot; . Po resecie rusza znowu, zegar idzie dalej. Do portu INT0 (PD2) podłączyłem diodę - cały czas miga, więc nie wiem w czym problem. Próbowałem różnych ustawień taktowania procesora i i2cSetBitrate (od 50 do 100, według PDF 0-100 ) i zawsze działa tak samo.<br />Z góry dziękuję za wszelkie sugestie.<br /><br />[syntax=c]&#91;syntax=cpp&#93;#include &lt;avr/io.h&gt;<br />#include &lt;avr/wdt.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />//#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br /><br /><br />#include &quot;common.h&quot;<br />#define DS1307_ADDR 0xD0<br />#define LCDLED_PIN (1&lt;&lt;PA7)<br />#define LCDLED_DIR DDRA<br />#define LCDLED_PORT PORTA<br />#define LCDLED_TOG LCDLED_PORT ^= LCDLED_PIN<br /><br /><br />volatile uint8_t s1_flag;/* flaga tyknięcia timera co 1 sekundę */<br />volatile uint8_t licznik;/* licznik sekund 0-59 */<br />volatile uint8_t int0_flag=1,cnt=0;<br />//double t1,t2;<br /><br />uint8_t subzero, cel, cel_fract_bits;<br /><br />// procedura obsługi przerwania INT 0<br />ISR( INT0_vect ) {<br />int0_flag = 1;<br />//LCDLED_TOG;<br />}<br /><br />// konwersja liczby dziesiętnej na BCD<br />uint8_t dec2bcd(uint8_t dec) {<br />return ((dec / 10)&lt;&lt;4) | (dec % 10);<br />}<br />// konwersja liczby BCD na dziesiętną<br />uint8_t bcd2dec(uint8_t bcd) {<br />    return ((((bcd) &gt;&gt; 4) &amp; 0x0F) * 10) + ((bcd) &amp; 0x0F);<br />}<br /><br />int main(void) {<br /><br />DDRA |= (1&lt;&lt;PA7);<br />PORTA |= (1&lt;&lt;PA7); /* podświetlenie wyświetlacza LCD */<br />LCDLED_DIR |= LCDLED_PIN;<br /><br /><br /><br /><br />// Przerwanie INT0<br />    MCUCR |= (1&lt;&lt;ISC01);// wyzwalanie zboczem opadającym<br />GICR |= (1&lt;&lt;INT0);// odblokowanie przerwania<br />PORTD |= (1&lt;&lt;PD2);// podciągnięcie pinu INT0 do VCC<br /><br />//ir_init();<br />/* ustawienie TIMER0 dla F_CPU=11,0592MHz */<br />TCCR0 |= (1&lt;&lt;WGM01);/* tryb CTC */<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);/* preskaler = 1024 */<br />OCR0 = F_CPU/1024UL/100UL;// przerwanie porównania co 10ms (100Hz)<br />TIMSK |= (1&lt;&lt;OCIE0);/* zezwolenie na przerwanie CompareMatch */<br /><br />// definiujemy sobie dla polepszenia czytelności programu typ wyliczeniowy<br />// wskazujący nam później na odpowiednie indeksy w tablicy (buforze)<br />enum {ss=1, mm, hh, dt,dm,mn,rk};<br />uint8_t czas&#91;8&#93;;// rezerwacja bufora 8 bajtOw<br />uint8_t sekundy, minuty, godziny, dzient, dzienm, miesiac, rok;<br /><br />lcd_init();/* inicjalizacja LCD */<br /><br />i2cSetBitrate(100);<br /><br />// Ustawianie czasu na godzinę: 18:34:27<br /><br />czas&#91;0&#93; = dec2bcd(00);// sekundy<br />czas&#91;1&#93; = dec2bcd(07);// minuty<br />czas&#91;2&#93; = dec2bcd(19);// godziny<br />czas&#91;3&#93; = dec2bcd(2); // dzień tygodnia<br />czas&#91;4&#93; = dec2bcd(25); // dzień miesiąca<br />czas&#91;5&#93; = dec2bcd(11); // miesiąc<br />czas&#91;6&#93; = dec2bcd(14); // rok<br />czas&#91;7&#93; = 0x90;//<br />// zapis 1 bajta ustawień na adres 0x07 w pamięci RAM naszego RTC<br />//TWI_write_buf( DS1307_ADDR, 0x07, 1, set );<br />//TWI_write_buf( DS1307_ADDR, 0x00, 8, czas );<br /><br /><br />//wdt_enable(WDTO_2S);<br />sei();/* włączamy globalne przerwania */<br /><br /><br />/* pętla nieskończona */<br />while(1) {<br /><br /><br /><br />if ( int0_flag ) {<br />//odczyt 4 bajtów do bufora od adresu 0x01 z pamięci RAM naszego RTC<br />TWI_read_buf( DS1307_ADDR, 0x00, 4, czas );<br /><br />sekundy = bcd2dec( czas&#91;0&#93; );<br />minuty = bcd2dec( czas&#91;1&#93; );<br />godziny = bcd2dec( czas&#91;2&#93; );<br />//dzient = bcd2dec( czas&#91;3&#93; );<br />//dzienm = bcd2dec( czas&#91;4&#93; );<br />//miesiac = bcd2dec( czas&#91;5&#93; );<br />//rok = bcd2dec( czas&#91;6&#93; );<br /><br />// wyświetlenie czasu na LCD<br />lcd_locate(0,0);<br />if( godziny &lt; 10 ) lcd_str(&quot;0&quot;);<br />lcd_int(godziny);<br />lcd_str(&quot;:&quot;);<br />if( minuty &lt; 10 ) lcd_str(&quot;0&quot;);<br />lcd_int(minuty);<br />lcd_str(&quot;:&quot;);<br />if( sekundy &lt; 10 ) lcd_str(&quot;0&quot;);<br />lcd_int(sekundy);<br /><br />lcd_locate(0,12);<br />lcd_int(licznik);<br />int0_flag=0;<br />wdt_reset();<br />}<br /><br />_delay_us(300);<br /><br />} /* koniec pętli nieskończonej */<br />}<br /><br /><br /><br />/* ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH */<br />/* pełni funkcję timera programowego wyznaczającego podstawę czasu = 1s */<br />ISR(TIMER0_COMP_vect){<br />//static uint8_t cnt=0;/* statyczna zmienna cnt do odliczania setnych ms */<br /><br />cnt++;<br /><br />if(cnt&gt;99)<br />{/* gdy licznik ms &gt; 99 (minęła 1 sekunda) */<br />LCDLED_TOG ;<br />lcd_locate(1,12);<br />if( licznik &lt; 10 ) lcd_str(&quot;0&quot;);<br />lcd_int(licznik);<br />licznik++;/* zwiększ licznik sekund */<br />if(licznik&gt;59) licznik=0; /* jeśli ilość sekund &gt; 59 - wyzeruj */<br />cnt=0;/* wyzeru licznik setnych ms */<br />}<br />}[/syntax][/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6797">jacul22</a> — 25 lis 2014, o 21:15</p><hr />
]]></content>
</entry>
</feed>