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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-02-15T19:54:12+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=14376&amp;mode</id>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2016-02-15T19:54:12+01:00</updated>
<published>2016-02-15T19:54:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=153725#p153725</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=153725#p153725"/>
<title type="html"><![CDATA[Re: [Atmega8A]LCD hd44780, RTC DS1307 - zawieszanie się prog]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=153725#p153725"><![CDATA[
Powodów &quot;zacinania&quot; się może być wiele.<br />Kod programu, który zamieściłeś w Twoim pierszym poście zawiera kilka błędów. <br /><br />Zobacz:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &quot;HD44780.c&quot;                     &#91;b&#93;//includuje się tylko pliki z rozszerzeniem *.h, a nie z *.c&#91;/b&#93;<br />#include &quot;DS1307.h&quot;<br />#include &quot;TWI/i2c_twi.c&quot;                 &#91;b&#93;//includuje się tylko pliki z rozszerzeniem *.h, a nie z *.c&#91;/b&#93;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;[/syntax]<br /><br />Powinno to wyglądać raczej tak:<br />plik main.c:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;HD44780.h&quot;<br />#include &quot;DS1307.h&quot;<br />#include &quot;TWI/i2c_twi.h&quot;<br /><br />#define cbi(sfr,bit) (_SFR_BYTE(sfr) &amp;= ~_BV(bit))<br />#define sbi(sfr,bit) ((_SFR_BYTE(sfr) |= _BV(bit)))<br /><br />uint8_t _ds1307_bcd_2_dec(uint8_t bcd);<br /><br />int main(void)<br />{<br />//PB1 dioda, PB0 przycisk<br />//DDRB = 0b11111011; //ustawienie jako wyjsc wszystkiego poza PB2 (on jest wejściem)<br /><br />char tekst1&#91;&#93;=&quot;          :  :  &quot;;<br />//char tekst2&#91;&#93;=&quot;tescik          &quot;;<br />//int zmienna=0, zmienna2=0;<br />uint8_t seconds, minutes, hours;<br /><br />DDRB  = 0b11111010;<br />PORTB = 0b00000101;<br /><br />i2cSetBitrate( 100 );               //prędkość I2C  100kHz dla DS1307<br /><br />LCD_Initalize();<br /><br />DS1307_init();<br />//SetTime(4,36,00);<br /><br /><br />sei();<br /><br />while(1){<br />_delay_ms(250);<br />DS1307_GetTime(&amp;hours,&amp;minutes,&amp;seconds);<br /><br />hours=_ds1307_bcd_2_dec(hours);<br />minutes=_ds1307_bcd_2_dec(minutes);<br />seconds=_ds1307_bcd_2_dec(seconds);<br /><br />if(seconds&lt;10)<br />{<br />tekst1&#91;15&#93; = seconds+48;<br />tekst1&#91;14&#93; = 48;<br />}<br /><br />if(seconds &gt;= 10)<br />{<br />tekst1&#91;14&#93; = (seconds/10)%10 +48;<br />tekst1&#91;15&#93; = seconds%10 +48;<br />}<br /><br />if(minutes&lt;10)<br />{<br />tekst1&#91;12&#93; = minutes+48;<br />tekst1&#91;11&#93; = 48;<br />}<br /><br />if(minutes &gt;= 10)<br />{<br />tekst1&#91;11&#93; = (minutes/10)%10 +48;<br />tekst1&#91;12&#93; = minutes%10 +48;<br />}<br />                    //<br />if(hours&lt;10)<br />{<br />tekst1&#91;9&#93; = hours+48;<br />tekst1&#91;8&#93; = 48;<br />}<br /><br />if(hours &gt;= 10)<br />{<br />tekst1&#91;8&#93; = (hours/10)%10 +48;<br />tekst1&#91;9&#93; = hours%10 +48;<br />}<br /><br />//LCD_GoTo(0,0);<br /><br />LCD_WriteText(tekst1);<br /><br />}<br /><br />if(PINB &amp; (0b00000001))<br />{<br />cbi(PORTB,7);<br />cbi(PORTB,1);<br />}<br />else<br />{<br />sbi(PORTB,7);<br />sbi(PORTB,1);<br />}<br /><br />return 0;<br />}<br /><br />uint8_t _ds1307_bcd_2_dec(uint8_t bcd)<br />{<br />//            uint8_t dec = 10 * (bcd&gt;&gt;4);<br />//            dec += bcd &amp; ~(0b11110000);<br />//            return dec;<br />return ((((bcd) &gt;&gt; 4) &amp; 0x0F) * 10) + ((bcd) &amp; 0x0F);<br />}[/syntax]<br /><br />plik DS1307.h:<br />[syntax=c]#ifndef DS1307_H_<br />#define DS1307_H_<br />                  <br />#include &lt;avr/io.h&gt;<br />#include &quot;TWI/i2c_twi.h&quot;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br />         <br />// ---------------------------------------------------------------------------<br />// DS1307 RTC ROUTINES<br />         <br />#define DS1307 0xD0 // I2C bus address of DS1307 RTC  0xD0<br />         <br />#define SECONDS_REGISTER 0x00<br />#define MINUTES_REGISTER 0x01<br />#define HOURS_REGISTER 0x02<br />#define DAYOFWK_REGISTER 0x03<br />#define DAYS_REGISTER 0x04<br />#define MONTHS_REGISTER 0x05<br />#define YEARS_REGISTER 0x06<br />#define CONTROL_REGISTER 0x07<br />#define RAM_BEGIN 0x08<br />#define RAM_END 0x3F<br />         <br />#define TW_NACK 0x84 // read data with NACK (last byte)<br />#define READ 1<br />#define TW_READY (TWCR &amp; 0x80) // ready when TWINT returns to logic 1.<br /><br /><br />void DS1307_GetTime(uint8_t *hours, uint8_t *minutes, uint8_t *seconds);<br />// returns hours, minutes, and seconds in BCD format<br />         <br />void DS1307_GetDate(uint8_t *months, uint8_t *days, uint8_t *years);<br />// returns months, days, and years in BCD format<br /><br />void SetTime(uint8_t set_hour, uint8_t set_minute, uint8_t set_second); //time set<br />     <br />void SetDate(uint8_t set_day, uint8_t set_month, uint8_t set_year);  //set date<br />              <br />void DS1307_init(void);<br />         <br />#endif /* DS1307_H_ */[/syntax]<br /><br />Plik DS1307.c:<br />[syntax=c]#include &lt;avr/io.h&gt;<br /><br />#include &quot;TWI/i2c_twi.h&quot;<br />#include &quot;DS1307.h&quot;<br />//#include &lt;string.h&gt;<br />//#include &lt;stdlib.h&gt;<br /><br />uint8_t I2C_ReadNACK(void) // reads a data byte from slave  ,dodano (void)<br />{<br />TWCR = TW_NACK; // nack = not reading more data<br />while (!TW_READY); // wait<br />return TWDR;<br />}<br /><br />void I2C_WriteRegister(uint8_t busAddr, uint8_t deviceRegister, uint8_t data)   //funkcja zapisu danych po I2C<br />{<br />TWI_start();  //start I2C<br />TWI_write(busAddr);  //wyslij adres DS1307<br />TWI_write(deviceRegister);<br />TWI_write(data);  //wysyłą 3 ardumenty funkcji I2C_WriteRegister<br />TWI_stop();   //stop I2C<br />}<br /><br />uint8_t I2C_ReadRegister(uint8_t busAddr, uint8_t deviceRegister)    //funkcja odczytu danych po I2C<br />{<br />uint8_t data = 0;<br /><br />TWI_start();  //start I2C<br />TWI_write(busAddr);  //wyslij adres DS1307<br />TWI_write(deviceRegister);<br />TWI_start();  // 2 start I2C ,musi być!!!<br />TWI_write(DS1307+READ);<br />data = I2C_ReadNACK(); // read the register data<br /><br />TWI_stop();   //stop I2C<br />return data;<br />}<br /><br />void DS1307_GetTime(uint8_t *hours, uint8_t *minutes, uint8_t *seconds)    // returns hours, minutes, and seconds in BCD format<br />    {<br />        *hours = I2C_ReadRegister(DS1307,HOURS_REGISTER);<br />        *minutes = I2C_ReadRegister(DS1307,MINUTES_REGISTER);<br />        *seconds = I2C_ReadRegister(DS1307,SECONDS_REGISTER);<br />        if (*hours &amp; 0x40) // 12hr mode:<br />        *hours &amp;= 0x1F; // use bottom 5 bits (pm bit = temp &amp; 0x20)<br />        else *hours &amp;= 0x3F; // 24hr mode: use bottom 6 bits<br />    }<br /><br />void DS1307_GetDate(uint8_t *months, uint8_t *days, uint8_t *years)    // returns months, days, and years in BCD format<br />{<br />        *months = I2C_ReadRegister(DS1307,MONTHS_REGISTER);<br />        *days = I2C_ReadRegister(DS1307,DAYS_REGISTER);<br />        *years = I2C_ReadRegister(DS1307,YEARS_REGISTER);<br />}<br /><br />void SetTime(uint8_t set_hour, uint8_t set_minute, uint8_t set_second)<br />{<br />        I2C_WriteRegister(DS1307,HOURS_REGISTER, set_hour); // add 0x40 for PM ,czyli -&gt; set_hour+0x40 ,dla PM<br />        I2C_WriteRegister(DS1307,MINUTES_REGISTER, set_minute);<br />        I2C_WriteRegister(DS1307,SECONDS_REGISTER, set_second);<br />}<br /><br />void SetDate(uint8_t set_day, uint8_t set_month, uint8_t set_year)<br />{<br />I2C_WriteRegister(DS1307,MONTHS_REGISTER, set_month);<br />I2C_WriteRegister(DS1307,DAYS_REGISTER, set_day);<br />I2C_WriteRegister(DS1307,YEARS_REGISTER, set_year);<br />}<br /><br />void DS1307_init(void)      // clear the CH bit  0b01111111;<br />{<br />TWI_start();  //start I2C<br />TWI_write(DS1307);  //wyslij adres DS1307<br />TWI_write(SECONDS_REGISTER);<br />TWI_write(0b01111111);  //      clear the CH bit ,starts clock<br />TWI_stop();   //stop I2C<br />}[/syntax]<br /><br />Odrazu mówię, że tego nie testowałem. Chcę Ci tylko pokazać, podstawowe błędy jakie robisz.<br /><br />Poza tym nie ma potrzeby w pętli głównej co 250ms odczytywać czas z DS'a. Przecież na jego nóżce nr7 możesz ustawić cześtotliwość oscylatora na 1Hz i podłączając ją do procka możesz wyzwalać przerwanie od INT0 np zoboczem opadającym.<br /><br />A jak? Temat pojawiający się pewnie dzięsiątki razy nawet na tym forum.<br />Choćby tutaj:<br /><a href="http://forum.atnel.pl/post110734.html?hilit=1307#p110734"  class="postlink">http://forum.atnel.pl/post110734.html?hilit=1307#p110734</a><br /><br />P.S.  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br />Gorąco polecam Ci też przeczytanie książki p. Mirka:<br /><a href="http://atnel.pl/mikrokontrolery-avr-jezyk-c.html"  class="postlink">http://atnel.pl/mikrokontrolery-avr-jezyk-c.html</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 15 lut 2016, o 19:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[lukhol]]></name></author>
<updated>2016-02-15T11:05:10+01:00</updated>
<published>2016-02-15T11:05:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=153694#p153694</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=153694#p153694"/>
<title type="html"><![CDATA[Re: [Atmega8A]LCD hd44780, RTC DS1307 - zawieszanie się prog]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=153694#p153694"><![CDATA[
Zmieniłem płytkę na nową ( w celu sprawdzenia czy gdzieś w układzie nie tracę styku ), ale nic to nie dało. Sam wyświetlacz bez obsługi RTC nie zacina się, jak dołączę obsługę RTC układ zacina się co losowy czas.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12509">lukhol</a> — 15 lut 2016, o 11:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-02-04T11:50:58+01:00</updated>
<published>2016-02-04T11:50:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=152619#p152619</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=152619#p152619"/>
<title type="html"><![CDATA[Re: [Atmega8A]LCD hd44780, RTC DS1307 - zawieszanie się prog]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=152619#p152619"><![CDATA[
Jak używasz LCD z obsługą R/W to musisz w bibliotece aby skończyć pętlę sprawdzającą gotowość wyświetlacza odczytać skasowaną flagę BF. Dopóki tak nie jest, to ona kręci się w kółko i czeka na wyzerowanie BF. <br />Dlatego stawiam, że masz problem z komunikacją z LCD i stajesz na sprawdzaniu flagi BF.<br />Aby to potwierdzić, to zmień konfigurację swojej biblioteki, by nie był używany pin R/W tylko zwykłe delay-e.<br /><br />-- <br />Pozdrawiam,<br />Robert<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 8 minutach ]</span></strong><br /><br />Możesz potestować samodzielnie wymuszanie zawieszania poprzez odłączenie linii idącej do sterownika dla LCD.<br />Powinieneś mieć taki sam efekt.<br /><br />Czy masz na pewno poprawnie zrobione zasilanie oraz na pewno dobrze stykające kable?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 4 lut 2016, o 11:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[lukhol]]></name></author>
<updated>2016-02-02T16:37:57+01:00</updated>
<published>2016-02-02T16:37:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=152457#p152457</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=152457#p152457"/>
<title type="html"><![CDATA[Re: [Atmega8A]LCD hd44780, RTC DS1307 - zawieszanie się prog]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=152457#p152457"><![CDATA[
Po dołożeniu przerwania migającego diodą miga ona w przypadku działania zegara jak i w przypadku jego zacięcia. W przypadku gdy zegar działa dioda miga szybko, a jak zegar się zatnie miga wolniej. Nie mam pojęcia co może być problemem.<br /><br />Aktualnie kod wygląda tak:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &quot;HD44780.c&quot;<br />#include &quot;DS1307.h&quot;<br />#include &quot;TWI/i2c_twi.c&quot;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;  <br /><br />#define cbi(sfr,bit) (_SFR_BYTE(sfr) &amp;= ~_BV(bit))<br />#define sbi(sfr,bit) ((_SFR_BYTE(sfr) |= _BV(bit)))<br /><br />uint8_t _ds1307_bcd_2_dec(uint8_t bcd);<br /><br />volatile uint8_t cnt=0, flaga = 0;<br /><br />int main(void){<br />//PB1 dioda, PB0 przycisk<br />//DDRB = 0b11111011; //ustawienie jako wyjsc wszystkiego poza PB2 (on jest wejściem)<br /><br />char tekst1&#91;&#93;=&quot;          :  :  &quot;;<br />//char tekst2&#91;&#93;=&quot;tescik          &quot;;<br />//int zmienna=0, zmienna2=0;<br />uint8_t seconds, minutes, hours;<br /><br /><br />DDRB  = 0b11111010;<br />PORTB = 0b00000101;<br /><br />i2cSetBitrate( 100 );               //prędkość I2C  100kHz dla DS1307<br /><br />LCD_Initalize();<br /><br />//DS1307_init();<br />//SetTime(4,36,00);<br /><br /> TIMSK |= (1&lt;&lt;TOIE0);           //Przerwanie overflow (przepełnienie timera)<br /> TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00); // źródłem CLK, preskaler 1024<br /> TCNT0 = 6;<br /><br />sei();<br /><br /><br />while(1){<br />//_delay_ms(250);<br />DS1307_GetTime(&amp;hours,&amp;minutes,&amp;seconds);<br /><br />if(flaga)<br />{<br />hours=_ds1307_bcd_2_dec(hours);<br />minutes=_ds1307_bcd_2_dec(minutes);<br />seconds=_ds1307_bcd_2_dec(seconds);<br />}<br /><br />//*******************************************<br />//sekundy:<br />if(seconds&lt;10)<br />{<br />tekst1&#91;15&#93; = seconds+48;<br />tekst1&#91;14&#93; = 48;<br />}<br /><br />if(seconds &gt;= 10)<br />{<br />tekst1&#91;14&#93; = (seconds/10)%10 +48;<br />tekst1&#91;15&#93; = seconds%10 +48;<br />}<br />//*******************************************<br />//minuty<br />if(minutes&lt;10)<br />{<br />tekst1&#91;12&#93; = minutes+48;<br />tekst1&#91;11&#93; = 48;<br />}<br /><br />if(minutes &gt;= 10)<br />{<br />tekst1&#91;11&#93; = (minutes/10)%10 +48;<br />tekst1&#91;12&#93; = minutes%10 +48;<br />}<br />//*******************************************<br />//godziny<br />if(hours&lt;10)<br />{<br />tekst1&#91;9&#93; = hours+48;<br />tekst1&#91;8&#93; = 48;<br />}<br /><br />if(hours &gt;= 10)<br />{<br />tekst1&#91;8&#93; = (hours/10)%10 +48;<br />tekst1&#91;9&#93; = hours%10 +48;<br />}<br /><br /><br />if(flaga)<br />{<br />LCD_GoTo(0,0);<br />LCD_WriteText(tekst1);<br />}<br /><br />if(PINB &amp; (0b00000001))<br />{<br />cbi(PORTB,1);<br />}<br />else<br />{<br />sbi(PORTB,1);<br />}<br /><br />}<br /><br /><br /><br />return 0;<br />}<br /><br />uint8_t _ds1307_bcd_2_dec(uint8_t bcd)<br />{<br />uint8_t dec = 10 * (bcd&gt;&gt;4);<br />dec += bcd &amp; ~(0b11110000);<br />return dec;<br />}<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />TCNT0 = 6;          //Początkowa wartość licznika<br /><br />cnt++;     //zwiększa zmienną licznik<br />if(cnt&gt;1)  //jeśli 4 przerwania (czyli ok 1 s)<br />{<br />flaga=!flaga;<br />if(flaga)<br />sbi(PORTB,1);<br />else <br />cbi(PORTB,1);<br />cnt=0;<br />}<br />}[/syntax]<br /><br /><span style="color: #FF0000">//Edit:</span><br />Szybkość migania diody był spowodowany kawałkiem kodu, który obsługiwał zapalenia i gaszenie diody przy aktywnym przycisku. Z tego wniosek program faktycznie wpada gdzieś w pętlę nieskończoną bo przerwania po zatrzymaniu zegara działają prawidłowo.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12509">lukhol</a> — 2 lut 2016, o 16:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[lukhol]]></name></author>
<updated>2016-02-02T10:16:57+01:00</updated>
<published>2016-02-02T10:16:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=152419#p152419</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=152419#p152419"/>
<title type="html"><![CDATA[Re: [Atmega8A]LCD hd44780, RTC DS1307 - zawieszanie się prog]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=152419#p152419"><![CDATA[
<div class="quotetitle">rskup napisał(a):</div><div class="quotecontent"><br />Stawiam, że coś przestaje łączyć na stykówce. A na przykład jak używasz przy LCD pinu R/W, to przy zakłóceniu komunikacji z LCD możesz wejść do nieskończonej pętli.<br />Wrzuć proste miganie na diodzie LED wykonywane z przerwania timera. Będzie wiadomo czy wiesza się Ci procesor, czy tylko zapętla się gdzieś program w pętli głównej<br /><br />-- <br />Pozdrawiam,<br />Robert<br /></div><br /> Wrzuciłem przerwanie,w którym migam diodą i w przypadku zawieszenia się zegara dioda przestaje migać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12509">lukhol</a> — 2 lut 2016, o 10:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-02-01T23:04:26+01:00</updated>
<published>2016-02-01T23:04:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=152377#p152377</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=152377#p152377"/>
<title type="html"><![CDATA[Re: [Atmega8A]LCD hd44780, RTC DS1307 - zawieszanie się prog]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=152377#p152377"><![CDATA[
Stawiam, że coś przestaje łączyć na stykówce. A na przykład jak używasz przy LCD pinu R/W, to przy zakłóceniu komunikacji z LCD możesz wejść do nieskończonej pętli.<br />Wrzuć proste miganie na diodzie LED wykonywane z przerwania timera. Będzie wiadomo czy wiesza się Ci procesor, czy tylko zapętla się gdzieś program w pętli głównej<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 1 lut 2016, o 23:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[lukhol]]></name></author>
<updated>2016-02-01T21:25:19+01:00</updated>
<published>2016-02-01T21:25:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=152361#p152361</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=152361#p152361"/>
<title type="html"><![CDATA[[Atmega8A]LCD hd44780, RTC DS1307 - zawieszanie się programu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14376&amp;p=152361#p152361"><![CDATA[
Witam, stworzyłem na płytce stykowej układ, gdzie podłączyłem przyciski, LCD hd47780, rtc ds1307 i buzzer. Korzystam z bibliotek do wyświetlacza od &quot;radzia&quot;, twi od p. Mirka oraz ze znalezionej na tym forum biblioteki do RTC. Napisałem szybki program, który wyświetla godzinę w formie hh:mm:ss na ostatnich polach pierwszej linii. Dodatkowo dodałem pod przycisk umieszczony PB0 funkcje zapalenia diody. Program poprawnie pokazuje godzinę, ale raz na jakiś czas (nieokreślony) zawiesza się. Godzina przestaje się odświeżać i dioda nie zapala się po wciśnięciu przycisku. Jaka może być tego przyczyna ? W załączeniu dołączam schemat układu (zgadza się wyświetlacz oraz rtc, przyciski podłączone są w innych miejscach).<br /> <br /><br /><br />Kod programu:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &quot;HD44780.c&quot;<br />#include &quot;DS1307.h&quot;<br />#include &quot;TWI/i2c_twi.c&quot;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;  <br /><br />#define cbi(sfr,bit) (_SFR_BYTE(sfr) &amp;= ~_BV(bit))<br />#define sbi(sfr,bit) ((_SFR_BYTE(sfr) |= _BV(bit)))<br /><br />uint8_t _ds1307_bcd_2_dec(uint8_t bcd);<br /><br />int main(void){<br />//PB1 dioda, PB0 przycisk<br />//DDRB = 0b11111011; //ustawienie jako wyjsc wszystkiego poza PB2 (on jest wejściem)<br /><br />char tekst1&#91;&#93;=&quot;          :  :  &quot;;<br />//char tekst2&#91;&#93;=&quot;tescik          &quot;;<br />//int zmienna=0, zmienna2=0;<br />uint8_t seconds, minutes, hours;<br /><br /><br />DDRB  = 0b11111010;<br />PORTB = 0b00000101;<br /><br />i2cSetBitrate( 100 );               //prędkość I2C  100kHz dla DS1307<br /><br />LCD_Initalize();<br /><br />//DS1307_init();<br />//SetTime(4,36,00);<br /><br />sei();<br /><br /><br />while(1){<br />_delay_ms(250);<br />DS1307_GetTime(&amp;hours,&amp;minutes,&amp;seconds);<br /><br />hours=_ds1307_bcd_2_dec(hours);<br />minutes=_ds1307_bcd_2_dec(minutes);<br />seconds=_ds1307_bcd_2_dec(seconds);<br /><br /><br />if(seconds&lt;10)<br />{<br />tekst1&#91;15&#93; = seconds+48;<br />tekst1&#91;14&#93; = 48;<br />}<br /><br />if(seconds &gt;= 10)<br />{<br />tekst1&#91;14&#93; = (seconds/10)%10 +48;<br />tekst1&#91;15&#93; = seconds%10 +48;<br />}<br />//<br />if(minutes&lt;10)<br />{<br />tekst1&#91;12&#93; = minutes+48;<br />tekst1&#91;11&#93; = 48;<br />}<br /><br />if(minutes &gt;= 10)<br />{<br />tekst1&#91;11&#93; = (minutes/10)%10 +48;<br />tekst1&#91;12&#93; = minutes%10 +48;<br />}<br />//<br />if(hours&lt;10)<br />{<br />tekst1&#91;9&#93; = hours+48;<br />tekst1&#91;8&#93; = 48;<br />}<br /><br />if(hours &gt;= 10)<br />{<br />tekst1&#91;8&#93; = (hours/10)%10 +48;<br />tekst1&#91;9&#93; = hours%10 +48;<br />}<br /><br />//LCD_GoTo(0,0);<br /><br />LCD_WriteText(tekst1);<br /><br /><br /><br />}<br /><br />if(PINB &amp; (0b00000001))<br />{<br />cbi(PORTB,7);<br />cbi(PORTB,1);<br />}<br />else<br />{<br />sbi(PORTB,7);<br />sbi(PORTB,1);<br />}<br /><br />return 0;<br />}<br /><br />uint8_t _ds1307_bcd_2_dec(uint8_t bcd)<br />{<br />uint8_t dec = 10 * (bcd&gt;&gt;4);<br />dec += bcd &amp; ~(0b11110000);<br />return dec;<br />}[/syntax]<br /><br />Kod do biblioteki RTC ds1307<br /><br />[syntax=c]#ifndef DS1307_H_<br />    #define DS1307_H_<br />     <br />     <br />    #include &lt;avr/io.h&gt;<br />    #include &quot;TWI/i2c_twi.h&quot;<br />    #include &lt;string.h&gt;<br />    #include &lt;stdlib.h&gt;<br />     <br />    // ---------------------------------------------------------------------------<br />    // DS1307 RTC ROUTINES<br />     <br />    #define DS1307 0xD0 // I2C bus address of DS1307 RTC  0xD0<br />     <br />    #define SECONDS_REGISTER 0x00<br />    #define MINUTES_REGISTER 0x01<br />    #define HOURS_REGISTER 0x02<br />    #define DAYOFWK_REGISTER 0x03<br />    #define DAYS_REGISTER 0x04<br />    #define MONTHS_REGISTER 0x05<br />    #define YEARS_REGISTER 0x06<br />    #define CONTROL_REGISTER 0x07<br />    #define RAM_BEGIN 0x08<br />    #define RAM_END 0x3F<br />     <br />    #define TW_NACK 0x84 // read data with NACK (last byte)<br />    #define READ 1<br />    #define TW_READY (TWCR &amp; 0x80) // ready when TWINT returns to logic 1.<br />     <br />     <br />     <br />    void DS1307_GetTime(uint8_t *hours, uint8_t *minutes, uint8_t *seconds);<br />    // returns hours, minutes, and seconds in BCD format<br />     <br />    void DS1307_GetDate(uint8_t *months, uint8_t *days, uint8_t *years);<br />    // returns months, days, and years in BCD format<br />     <br />    void SetTime(uint8_t set_hour, uint8_t set_minute, uint8_t set_second); //time set<br />     <br />    void SetDate(uint8_t set_day, uint8_t set_month, uint8_t set_year);  //set date<br />     <br />     <br />    void DS1307_init(void);<br />     <br />    //######################################################################################################################<br />     <br />    uint8_t I2C_ReadNACK(void) // reads a data byte from slave  ,dodano (void)<br />    {<br />    TWCR = TW_NACK; // nack = not reading more data<br />    while (!TW_READY); // wait<br />    return TWDR;<br />    }<br />     <br />     <br />     <br />     <br />     <br />    void I2C_WriteRegister(uint8_t busAddr, uint8_t deviceRegister, uint8_t data){   //funkcja zapisu danych po I2C<br />     <br />            TWI_start();  //start I2C<br />            TWI_write(busAddr);  //wyslij adres DS1307<br />            TWI_write(deviceRegister);<br />            TWI_write(data);  //wysyłą 3 ardumenty funkcji I2C_WriteRegister<br />            TWI_stop();   //stop I2C<br />     <br />    }<br />     <br />     <br />     <br />     <br />    uint8_t I2C_ReadRegister(uint8_t busAddr, uint8_t deviceRegister){     //funkcja odczytu danych po I2C<br />     <br />            uint8_t data = 0;<br />     <br />            TWI_start();  //start I2C<br />            TWI_write(busAddr);  //wyslij adres DS1307<br />            TWI_write(deviceRegister);<br />            TWI_start();  // 2 start I2C ,musi być!!!<br />            TWI_write(DS1307+READ);<br />            data = I2C_ReadNACK(); // read the register data<br />     <br />            TWI_stop();   //stop I2C<br />     <br />            return data;<br />    }<br />     <br />    //#######################################################################################################################<br />     <br />     <br />     <br />    void DS1307_GetTime(uint8_t *hours, uint8_t *minutes, uint8_t *seconds)<br />    // returns hours, minutes, and seconds in BCD format<br />    {<br />    *hours = I2C_ReadRegister(DS1307,HOURS_REGISTER);<br />    *minutes = I2C_ReadRegister(DS1307,MINUTES_REGISTER);<br />    *seconds = I2C_ReadRegister(DS1307,SECONDS_REGISTER);<br />    if (*hours &amp; 0x40) // 12hr mode:<br />    *hours &amp;= 0x1F; // use bottom 5 bits (pm bit = temp &amp; 0x20)<br />    else *hours &amp;= 0x3F; // 24hr mode: use bottom 6 bits<br />    }<br />    void DS1307_GetDate(uint8_t *months, uint8_t *days, uint8_t *years)<br />    // returns months, days, and years in BCD format<br />    {<br />    *months = I2C_ReadRegister(DS1307,MONTHS_REGISTER);<br />    *days = I2C_ReadRegister(DS1307,DAYS_REGISTER);<br />    *years = I2C_ReadRegister(DS1307,YEARS_REGISTER);<br />    }<br />    void SetTime(uint8_t set_hour, uint8_t set_minute, uint8_t set_second)<br />     <br />    {<br />     <br />    I2C_WriteRegister(DS1307,HOURS_REGISTER, set_hour); // add 0x40 for PM ,czyli -&gt; set_hour+0x40 ,dla PM<br />    I2C_WriteRegister(DS1307,MINUTES_REGISTER, set_minute);<br />    I2C_WriteRegister(DS1307,SECONDS_REGISTER, set_second);<br />    }<br />     <br />     <br />    void SetDate(uint8_t set_day, uint8_t set_month, uint8_t set_year){<br />     <br />            I2C_WriteRegister(DS1307,MONTHS_REGISTER, set_month);<br />            I2C_WriteRegister(DS1307,DAYS_REGISTER, set_day);<br />            I2C_WriteRegister(DS1307,YEARS_REGISTER, set_year);<br />     <br />     <br />    }<br />     <br />     <br />     <br />    // ---------------------------------------------------------------------------<br />     <br />     <br />    void DS1307_init(void){<br />                 // clear the CH bit  0b01111111;<br />            TWI_start();  //start I2C<br />                    TWI_write(DS1307);  //wyslij adres DS1307<br />                    TWI_write(SECONDS_REGISTER);<br />                    TWI_write(0b01111111);  //      clear the CH bit ,starts clock<br />                    TWI_stop();   //stop I2C<br />     <br />    }<br />     <br />    #endif /* DS1307_H_ */[/syntax]<br /><br />Biblioteka do wyświetlacza oczywiście edytowane porty pod mój układ pobrałem ze strony radzio.dxp.pl - Sterowanie w trybie 4-bitowym z odczytem flagi zajętości z dowolnym przypisaniem linii sterujących.<br /><br />Biblioteki do TWI pobrane ze strony p.Mirka w dziale uaktualnienia do DVD.<br /><br /><a href="https://obrazkiforum.atnel.pl/12509/0bdbf8ba3e8dd06fc6bb296ad9afbe05.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/12509/0bdbf8ba3e8dd06fc6bb296ad9afbe05.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12509">lukhol</a> — 1 lut 2016, o 21:25</p><hr />
]]></content>
</entry>
</feed>