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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-09-02T22:21:54+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=8376&amp;mode</id>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2014-09-02T22:21:54+01:00</updated>
<published>2014-09-02T22:21:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=94066#p94066</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=94066#p94066"/>
<title type="html"><![CDATA[Re: PCF8583 zegar stoi w miescu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=94066#p94066"><![CDATA[
Witam,<br /><br />Sorry, faktycznie miało być 0x00 - późno już było... <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />. Masz podpięte przyciski do PD6 i PD7 ? W takim razie:<br /><br />[syntax=c]DDRD = DDRD | (1&lt;&lt;PD7)|(1&lt;&lt;PD6);[/syntax] <br /><br />po co ustawiasz te linie jako wyjścia ??? Klawiatura Ci pewnie przez to działa bez sensu - nie wiadomo, co czytasz. przestaw DDR tak, aby PD6 i PD7 były wejściami.<br /><br />Pozdrawiam, QuadMan.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 2 wrz 2014, o 22:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sheep]]></name></author>
<updated>2014-09-02T20:37:09+01:00</updated>
<published>2014-09-02T20:37:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=94054#p94054</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=94054#p94054"/>
<title type="html"><![CDATA[Re: PCF8583 zegar stoi w miescu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=94054#p94054"><![CDATA[
To ja też bym spróbował je wyświetlić i zobaczyć jak się RTC zachowuje <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Ale zwykle, jeśli masz problem, staraj się rozbić go na mniejsze podproblemy, potem złączysz je w całosć i rozwiażesz problem.<br />Chodzi mi o to, byś zakomentował funkcję ustawiania czasu(pomińmy póki co jaka godzina jest ustawiona - na pewno jakaś jest) i obsługi przycisków. DOdatkowo wyłączył bym póki co przerwanie i w while'u z delayem odczytywałbym czas i wrzucał go na LCD. Wtedy jeśli to ruszy, dopiero dodawaj przyciski( po jednym), potem przerwanie. Po drodze na pewno problem się sam odnajdzie. <br /><br />Wstaw proszę w nowym poście kod po mojej radzie (jeśli uważasz ją za słuszną oczywiście <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> )<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=542">Sheep</a> — 2 wrz 2014, o 20:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[look-ashek]]></name></author>
<updated>2014-09-02T20:31:41+01:00</updated>
<published>2014-09-02T20:31:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=94052#p94052</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=94052#p94052"/>
<title type="html"><![CDATA[Re: PCF8583 zegar stoi w miescu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=94052#p94052"><![CDATA[
<div class="quotetitle">Sheep napisał(a):</div><div class="quotecontent"><br />A czy tutaj, nie powinieneś podać kolejnych numerów do odpowiedniego wskazania indeksu tablicy?<br />[syntax=c]// wskazujący nam później na odpowiednie indeksy w tablicy (buforze)<br /><br />        enum {ss=1, mm=2, hh=3};[/syntax]<br />No i dlaczego nie numerujesz od zera?<br /></div><br /><br /><br />Zmieniłem na <br />[syntax=c]enum {ss=1, mm=2, hh=3};[/syntax]<br />A później dla pewności na <br />[syntax=c]sekundy = bcd2dec( bufor&#91;1&#93; );<br />minuty = bcd2dec( bufor&#91;2&#93; );<br />godziny = bcd2dec( bufor&#91;3&#93; );[/syntax]<br /><strong>Ale jest bez zmian.</strong><br /><br />Nie numeruje od zera bo pod indeksem zero są zwracane setne sekundy, których nie wyświetlam na LCD.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5411">look-ashek</a> — 2 wrz 2014, o 20:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sheep]]></name></author>
<updated>2014-09-02T20:18:01+01:00</updated>
<published>2014-09-02T20:18:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=94049#p94049</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=94049#p94049"/>
<title type="html"><![CDATA[Re: PCF8583 zegar stoi w miescu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=94049#p94049"><![CDATA[
A czy tutaj, nie powinieneś podać kolejnych numerów do odpowiedniego wskazania indeksu tablicy?<br />[syntax=c]// wskazujący nam później na odpowiednie indeksy w tablicy (buforze)<br /><br />        enum {ss=1, mm=2, hh=3};[/syntax]<br />No i dlaczego nie numerujesz od zera?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=542">Sheep</a> — 2 wrz 2014, o 20:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[look-ashek]]></name></author>
<updated>2014-09-02T20:04:12+01:00</updated>
<published>2014-09-02T20:04:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=94045#p94045</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=94045#p94045"/>
<title type="html"><![CDATA[Re: PCF8583 zegar stoi w miescu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=94045#p94045"><![CDATA[
Niestety nie pomogło.<br /><br />1) Skopiowałem kod z Erraty<br />2) Odpiąłem EEPRON, przez wyciągniecie zworki J13<br />3) Zmieniłem funkcje konwertujące (za radą sheep)<br />4) Zresetowałem rejestr konfiguracyjny (za radą QuadMan). Z tym, ze wywołałem funkcję TWI_write_buf( PCF8583_ADDR, <span style="color: #FF0000">0x00</span>, 1, bufor ),  czyli od adresu 0x00 a nie tak jak napisał QuadMan<br />5) Dla pewności do ustawiania czasu zrezygnowałem z funkcji konwertujących i wpisuje bezpośrednio wartości binarne<br /><br />Reset i ustawienie czasu przeniosłem do funkcji wywoływanych po wciśnięciu  przycisków (PD6 i PD7)<br /><br />Teraz sytuacja wygląda tak.<br />W zależnosći od tego jaki czas uwawie to zegar tyka lub nie. Ale jak tyka to wartosci są losowe. Np.<br />12:12:12<br />12:12:10<br />12:12:00<br />12:12:10<br /><br /><strong>I uwaga ciekawostka.<br />Jak wcisnę przycisk który wywołuje funkcję reset_zegara() i trzymam go wcisnięty to pojawia się &quot;prawidłowa&quot; godzina i zegar tyka poprawnie.</strong><br /><br />Ktoś ma pomysł co się dzieje.<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2010-09-07<br /> *       Autor: Mirosław Kardaś<br /> *<br /> *       Program korzysta ze sprzętowej obsługi I2C/TWI<br /> *       Umożliwia zapis danych do RTC oraz EEPROM a także<br /> *       oczyt z tych urządzeń<br /> *<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><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 />#define PCF8583_ADDR 0xA2<br /><br /><br />#define WCISNIETY_PRZYCISK1_1 (1&lt;&lt;PD6)<br />#define WCISNIETY_PRZYCISK1_2 (1&lt;&lt;PD7)<br />#define LED_PIN (1&lt;&lt;PC7)// definicja pinu do którego podłączona jest dioda<br />#define LED_TOG PORTC ^= LED_PIN// makrodefinicja – zmiana stanu diody<br /><br /><br /><br /><br /><br />// utworzenie typu u08, odpowiednika uint8_t aby kod był bardziej czytelny<br />typedef unsigned char  u08;<br />typedef unsigned short u16;<br /><br /><br /><br />volatile uint8_t int0_flag=1;// flaga zmieniana w przerwaniu i sprawdzana w pętli głównej<br /><br />// konwersja liczby dziesiętnej na BCD<br />uint8_t dec2bcd(uint8_t dec);<br />// konwersja liczby BCD na dziesiętną<br />uint8_t bcd2dec(uint8_t bcd);<br /><br />uint8_t przycisk_wcisniety(uint8_t klawisz);<br />void reset_zegara(void);<br />void ustaw_czas(void);<br /><br /><br /><br /><br /><br />int main(void) {<br /><br /><br /><br />DDRC |= LED_PIN;// kierunek pinu PC7 – wyjściowy<br />PORTC |= LED_PIN;// wyłączenie diody LED<br /><br />DDRD = DDRD | (1&lt;&lt;PD7)|(1&lt;&lt;PD6);<br />PORTD = PORTD | (1&lt;&lt;PD7)|(1&lt;&lt;PD6);<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 /><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};<br />uint8_t bufor&#91;4&#93;;// rezerwacja bufora 4 bajty<br /><br />uint8_t war_resetu&#91;1&#93;;// rezerwacja bufora 4 bajty<br /><br />uint8_t sekundy, minuty, godziny;<br /><br /><br />lcd_init();<br /><br />i2cSetBitrate(100);<br /><br />sei();<br /><br /><br /><br /><br />while(1) {<br /><br />if ( int0_flag ) {<br /><br />//odczyt 4 bajtów do bufora od adresu 0x01 z pamięci RAM naszego RTC<br />TWI_read_buf( PCF8583_ADDR, 0x01, 4, bufor );<br /><br />sekundy = bcd2dec( bufor&#91;ss&#93; );<br />minuty = bcd2dec( bufor&#91;mm&#93; );<br />godziny = bcd2dec( bufor&#91;hh&#93; );<br /><br />// wyświetlenie czasu na LCD<br />lcd_locate(1,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 /><br />TWI_read_buf( PCF8583_ADDR, 0x00, 1, war_resetu );<br />lcd_locate(0,0);<br />lcd_int(war_resetu&#91;0&#93;);<br /><br />LED_TOG;// diida do debugowania wskazuje czy jest przerwania<br />int0_flag=0;<br />}<br /><br />if (     przycisk_wcisniety(WCISNIETY_PRZYCISK1_1) ) reset_zegara();<br />if (     przycisk_wcisniety(WCISNIETY_PRZYCISK1_2) ) ustaw_czas();<br /><br /><br />}<br />}<br /><br /><br />// procedura obsługi przerwania INT 0<br />ISR( INT0_vect ) {<br />int0_flag = 1;<br />}<br /><br /><br />// konwersja liczby dziesiętnej na BCD<br />uint8_t bcd2dec(uint8_t c)<br />{<br />        return ((c/16)*10)+(c%16);<br />}<br />uint8_t dec2bcd(uint8_t num)<br />{<br />  return ((num/10 * 16) + (num % 10));<br />}<br /><br /><br /><br /><br /><br /><br />uint8_t przycisk_wcisniety(uint8_t klawisz)<br />{<br />if (!(PIND &amp; klawisz))<br />{<br />_delay_ms(80);<br />if (!(PIND &amp; klawisz))  return 1;<br />}<br /><br />return 0;<br />}<br /><br />void reset_zegara(void)<br />{<br />uint8_t bufor&#91;4&#93;;<br />bufor&#91;0&#93; = 0;<br />TWI_write_buf( PCF8583_ADDR, 0x00, 1, bufor );<br /><br />}<br />void ustaw_czas(void)<br />{<br />uint8_t bufor&#91;5&#93;;<br />bufor&#91;0&#93; = 0;        // reset zegara<br />bufor&#91;1&#93; = 0;// setne części sekundy<br />bufor&#91;2&#93; = 0b0010010;// sekundy liczba 12 w formacie BCD<br />bufor&#91;3&#93; = 0b0010010;// minutyliczba 12 w formacie BCD<br />bufor&#91;4&#93; = 0b0010010;// godzinyliczba 12 w  formacie BCD<br />// zapis 5 bajtów z bufora pod adres 0x01 w pamięci RAM naszego RTC<br />TWI_write_buf( PCF8583_ADDR, 0x00, 5, bufor );<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5411">look-ashek</a> — 2 wrz 2014, o 20:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[majster]]></name></author>
<updated>2014-09-02T06:10:43+01:00</updated>
<published>2014-09-02T06:10:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=93938#p93938</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=93938#p93938"/>
<title type="html"><![CDATA[Re: PCF8583 zegar stoi w miescu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=93938#p93938"><![CDATA[
Widzę że definiujesz też eeprom. Rozumię że działasz na ATB. Kiedyś miałem podobny przypadek. Zanim coś pozmieniasz to zobacz tak czy ci zadziała RTC.<br /><br />Wyłącz zasilanie.<br />Wypnij eeprom.<br />Włącz zasilanie. <br /><br />Jak RTC rudzy to może zworka przy eeprom źle ustawiona lub eeprom nie ten albo padnięty.<br /><br />Namazane ze smarta.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1628">majster</a> — 2 wrz 2014, o 06:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2014-09-02T00:53:25+01:00</updated>
<published>2014-09-02T00:53:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=93935#p93935</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=93935#p93935"/>
<title type="html"><![CDATA[Re: PCF8583 zegar stoi w miescu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=93935#p93935"><![CDATA[
Witam,<br /><br />Najprawdopodobniej coś przy ustawianiu czasu poszło nie tak i niechcący coś wpisałeś do rejestru konfiguracyjnego PCF8583, wystarczy jesli wpiszesz 0x00 i zegar ruszy <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" />. Poniżej masz kod:<br />[syntax=c]bufor&#91;0&#93; = 0;//  dlaczego zero ?? - odsyłam do PDF-a<br />// zapis 1 bajtu  z bufora pod adres 0x00 - to jest właśnie ten rejestr w pamięci RAM naszego RTC<br />TWI_write_buf( PCF8583_ADDR, 0x01, 1, bufor );[/syntax]<br /><br />Umieść to przed wejściem do pętli głównej,  zaraz po sei();. W zasadzie możesz to zostawić na stałe - jeśli coś znów pójdzie nie tak, to zegar się odblokuje <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" />.<br /><br />Pozdrawiam, QuadMan.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 2 wrz 2014, o 00:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sheep]]></name></author>
<updated>2014-09-02T00:18:07+01:00</updated>
<published>2014-09-02T00:18:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=93933#p93933</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=93933#p93933"/>
<title type="html"><![CDATA[Re: PCF8583 zegar stoi w miescu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=93933#p93933"><![CDATA[
Hej,<br /><br />Zobacz proszę, czy działa Tobie Twój kod, ale z tymi funkcjami konwertującymi:<br />[syntax=c]uint8_t bcd2dec(uint8_t c)<br />{<br />return ((c/16)*10)+(c%16);<br />}<br />uint8_t dec2bcd(uint8_t num)<br />{<br />  return ((num/10 * 16) + (num % 10));<br />}[/syntax]<br /><br />@@EDIT<br /><br /><div class="quotetitle">look-ashek napisał(a):</div><div class="quotecontent"><br /><strong>ale zegar stoi w miejscu</strong><br /></div><br /><br />Nie ma czegoś takiego, jak zegar, który się zatrzymał. Nie wiem jak jest w przypadku PCF'a, ale z tego co na szybko wyczytałem też jest bateria zewnętrzna jako podtrzymanie zastosowana, mi się wydaję, że zegar cały czas tyka (możesz to sprawdzić?), tylko kwestia z odbiorem tych danych po I2C. <br /><br />Jesteś w stanie wrócić do kodu, w którym jest sam odbiór i wyświetlenie tego na LCD?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=542">Sheep</a> — 2 wrz 2014, o 00:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Nondzu]]></name></author>
<updated>2014-09-01T22:18:51+01:00</updated>
<published>2014-09-01T22:18:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=93921#p93921</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=93921#p93921"/>
<title type="html"><![CDATA[Re: PCF8583 zegar stoi w miescu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=93921#p93921"><![CDATA[
podałeś kod gdzie nie zmieniasz już ustawiania godziny. Na tym kodzie rtc też nie działa ? skopiuj dokładnie kod z erraty do BB i spróbuj odpalić nic nie grzebiąc w kodzie, czasami można coś przeoczyć albo niechcący usunąć. Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1672">Nondzu</a> — 1 wrz 2014, o 22:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[look-ashek]]></name></author>
<updated>2014-09-01T20:21:32+01:00</updated>
<published>2014-09-01T20:21:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=93885#p93885</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=93885#p93885"/>
<title type="html"><![CDATA[PCF8583 zegar stoi w miescu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8376&amp;p=93885#p93885"><![CDATA[
Witam serdecznie.<br /><br />Mam problem z prawidłowym działaniem układu RTC. (Kodz niebieskiej książki dla rozdziału4.10.1 RTC - sprzętowa obsługa I2C)<br />Używam zestawu ATB 1.04<br /><br /><strong>Problem polega na tym że cały czas na LCD wyświetla się ta sama godzina.</strong><br /><br />A tera jak do tego doszło.<br />1)Najpierw lekko zmodyfikowałem i wgrałem kod z książki(z DVD)<br />Program zadział i na LCD wyświetlił się godzina zmieniając się co sekundę.<br /><br />2)Ale godzina był nieprawidłowa, więc postanowiłem ją zmienić. W kodzie był za komentowany fragment kodu do ustawiania czasu.<br />Odkomentowałem go, wpisałem nowe wartości i wysłalem do AVR.<br />Następnie od razu zakomentowalem ten fragment i wgrałem poprzedni kod (ten który tylko odczytuje czas)<br />Czas się zmienił na prawidłowy, ale zaczął się dziwnie zmieniać. Sekundy zmieniały się od 0 do 7 i z powrotem 0 .. Minuty w ogóle się nie zmieniały.<br /><br />3) Dzisiaj postanowiłem zmienić tak kod, żeby po naciśnięciu przycisku godzina zmieniła się na 20:00:00.<br />kod wgrałem godzina się zmieniła, <strong>ale zegar stoi w miejscu</strong><br /><br />Sprawdziłem, że przerywania się wykonują.<br /><br />Załączam kod, który jest aktualnie wgany<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2010-09-07<br /> *       Autor: Mirosław Kardaś<br /> *<br /> *       Program korzysta ze sprzętowej obsługi I2C/TWI<br /> *       Umożliwia zapis danych do RTC oraz EEPROM a także<br /> *       oczyt z tych urządzeń<br /> *<br /> *       UWAGA!!! programowa wersja dla F_CPU = 8 MHz<br /> *       jeli zmienione zostanie taktowanie na np: 16 MHz<br /> *       wtedy trzeba sobie przerobić opóźnienia w bibliotece<br /> *<br /> */<br />#include &lt;avr/io.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 />// **** UWAGA - wybierz właciwy adres jak niżej **************<br />//#define PCF8583_ADDR 0xA0// gdy A1 --&gt; GND<br />#define PCF8583_ADDR 0xA2// gdy A1 --&gt; VCC<br /><br />#define _24C04_ADDR 0xA8<br /><br />// dioda LED<br />#define LED_PIN (1&lt;&lt;PC7)// definicja pinu do którego podłączona jest dioda<br />#define LED_TOG PORTC ^= LED_PIN// makrodefinicja – zmiana stanu diody<br /><br />// utworzenie typu u08, odpowiednika uint8_t aby kod był bardziej czytelny<br />typedef unsigned char  u08;<br />typedef unsigned short u16;<br /><br /><br /><br /><br /><br /><br />volatile uint8_t int0_flag=1;// flaga zmieniana w przerwaniu i sprawdzana w pętli głównej<br /><br />// konwersja liczby dziesiętnej na BCD<br />uint8_t dec2bcd(uint8_t dec);<br />// konwersja liczby BCD na dziesiętną<br />uint8_t bcd2dec(uint8_t bcd);<br /><br /><br />int main(void) {<br /><br />DDRC |= LED_PIN;// kierunek pinu PC7 – wyjściowy<br />PORTC |= LED_PIN;// wyłączenie diody LED<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 /><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};<br />uint8_t bufor&#91;4&#93;;// rezerwacja bufora 4 bajty<br />uint8_t sekundy, minuty, godziny;<br /><br /><br />lcd_init();<br /><br />i2cSetBitrate( 100 ); // USTAWIAMY prędkość 100 kHz na magistrali I2C<br /><br />sei();<br /><br /><br />while(1) {<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( PCF8583_ADDR, 0x01, 4, bufor );<br /><br />sekundy = bcd2dec( bufor&#91;ss&#93; );<br />minuty = bcd2dec( bufor&#91;mm&#93; );<br />godziny = bcd2dec( bufor&#91;hh&#93; );<br /><br />// wyświetlenie czasu na LCD<br />lcd_locate(1,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 /> LED_TOG;// zmień stan diody na przeciwny<br /><br /><br />int0_flag=0;<br />}<br /><br /><br /><br />}<br />}<br /><br /><br />// procedura obsługi przerwania INT 0<br />ISR( INT0_vect ) {<br />int0_flag = 1;<br />}<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 /><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 />}[/syntax]<br /><br /><strong>Czy macie pomysł co moglem zrobić źle?</strong><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5411">look-ashek</a> — 1 wrz 2014, o 20:21</p><hr />
]]></content>
</entry>
</feed>