<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[forum.rcl-radio.ru &mdash; Простые часы на ИВЛ1-7/ 5]]></title>
		<link>http://forum.rcl-radio.ru/viewtopic.php?id=458</link>
		<atom:link href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=458&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Простые часы на ИВЛ1-7/ 5».]]></description>
		<lastBuildDate>Sat, 12 Oct 2024 02:38:19 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Простые часы на ИВЛ1-7/ 5]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=10885#p10885</link>
			<description><![CDATA[<p>555 обеспечивает обратную связь, тем самым стабилизирует напряжение на уровне 27 В, если использовать просто ШИМ для накачки напряжения, получить стабильные 27 В будет сложно.</p>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Sat, 12 Oct 2024 02:38:19 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=10885#p10885</guid>
		</item>
		<item>
			<title><![CDATA[Re: Простые часы на ИВЛ1-7/ 5]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=10883#p10883</link>
			<description><![CDATA[<p>Доброго времени. Подскажите, пожалуйста, вместо 555 микры можно ведь использовать саму Ардуинку, дописав код? Смотрел ваши разработки по часам с газоразрядными индикаторами, там по сути так и сделано, но напряжение на выходе конечно другое.</p>]]></description>
			<author><![CDATA[null@example.com (MORO-1986)]]></author>
			<pubDate>Fri, 11 Oct 2024 19:13:44 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=10883#p10883</guid>
		</item>
		<item>
			<title><![CDATA[Простые часы на ИВЛ1-7/ 5]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=5490#p5490</link>
			<description><![CDATA[<p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/02/d04ada24b9bbbe175ae5312336cda803.gif" alt="http://forum.rcl-radio.ru/uploads/images/2022/02/d04ada24b9bbbe175ae5312336cda803.gif" /></span> </p><br /><div class="codebox"><pre><code>// ATMEGA8 12MHz
#define G0_D       PD6
#define G1_B       PB1
#define G2_B       PB2
#define G3_B       PB5
#define DP_C       PC1 //PD SETKA  

#define E_B        PB3
#define G_B        PB4
#define B_B        PB0
#define F_D        PD7
#define A_D        PD5
#define D_C        PC2
#define C_C        PC3

#define SET        PD0
#define UP         PD1
#define DOWN       PD2

#include &lt;avr/io.h&gt;
#include &lt;util/delay.h&gt;

#define ADDR_DS1307    0b1101000
#define CPU_F          12000000 // Clock Speed 
#define SCL_F          100000 // // I2C Speed

byte a[4],an,segm,i;
int msec,sec,min,hour,set;
int set_sec,set_min,set_hour;
 
int main() {
  TWBR = (((CPU_F)/(SCL_F)-16 )/2) ;
  TWSR = 0;
 // set_time(22,7,2,26,13,10,0);// год 00-99, ДН 1-7 (1=ВС), месяц 1-12, дата 1-31, час 0-23, минуты 0-59, секунды 0-59
  cli();
// (12000000/((18749+1)x64))=10 Hz
  OCR1A = 18749;
  TCCR1B |= (1 &lt;&lt; WGM12);
// Prescaler 64
  TCCR1B |= (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10);
  TIMSK |= (1 &lt;&lt; OCIE1A);
// (12000000/((155+1)x256))=300.48076923077 Hz
  OCR2 = 155;
  TCCR2 |= (1 &lt;&lt; WGM21); 
// Prescaler 256
  TCCR2 |= (1 &lt;&lt; CS22) | (1 &lt;&lt; CS21);
  TIMSK |= (1 &lt;&lt; OCIE2);
  sei();
  DDRB|=(1&lt;&lt;G1_B)|(1&lt;&lt;G2_B)|(1&lt;&lt;G3_B)|(1&lt;&lt;E_B)|(1&lt;&lt;G_B)|(1&lt;&lt;B_B);
  DDRC|=(1&lt;&lt;D_C)|(1&lt;&lt;C_C)|(1&lt;&lt;DP_C);
  DDRD|=(1&lt;&lt;G0_D)|(1&lt;&lt;F_D)|(1&lt;&lt;A_D);
  PORTD|=(1&lt;&lt;SET)|(1&lt;&lt;UP)|(1&lt;&lt;DOWN);
 
 
while(1) {
   sec =  (i2c_read_1bit(ADDR_DS1307,0) &amp; 0x0F) + (((i2c_read_1bit(ADDR_DS1307,0) &amp; 0x70) &gt;&gt; 4) * 10);
   min =  (i2c_read_1bit(ADDR_DS1307,1) &amp; 0x0F) + (((i2c_read_1bit(ADDR_DS1307,1) &amp; 0x70) &gt;&gt; 4) * 10);
   hour = ((i2c_read_1bit(ADDR_DS1307,2) &amp; 0x0F) + ((i2c_read_1bit(ADDR_DS1307,2) &amp; 0x70) &gt;&gt; 4) * 10);   

   if(((PIND &gt;&gt; SET) &amp; 1) == 0){set++;if(set&gt;3){set=0;}_delay_ms(300);}
   
   set_sec=sec;
   set_min=min;
   set_hour=hour;
   
   if(((PIND &gt;&gt; UP) &amp; 1) == 0 &amp;&amp; set==1){set_hour++;if(set_hour&gt;23){set_hour=23;}_delay_ms(300);set_time(255,255,255,255,set_hour,255,255);}
   if(((PIND &gt;&gt; DOWN) &amp; 1) == 0 &amp;&amp; set==1){set_hour--;if(set_hour&lt;0){set_hour=0;}_delay_ms(300);set_time(255,255,255,255,set_hour,255,255);}

   if(((PIND &gt;&gt; UP) &amp; 1) == 0 &amp;&amp; set==2){set_min++;if(set_min&gt;59){set_min=59;}_delay_ms(300);set_time(255,255,255,255,255,set_min,255);}
   if(((PIND &gt;&gt; DOWN) &amp; 1) == 0 &amp;&amp; set==2){set_min--;if(set_min&lt;0){set_min=0;}_delay_ms(300);set_time(255,255,255,255,255,set_min,255);}

   if(((PIND &gt;&gt; UP) &amp; 1) == 0 &amp;&amp; set==3){set_sec=0;_delay_ms(300);set_time(255,255,255,255,255,255,set_sec);}
   if(((PIND &gt;&gt; DOWN) &amp; 1) == 0 &amp;&amp; set==3){set_sec=0;_delay_ms(300);set_time(255,255,255,255,255,255,set_sec);}

if(set==0){    
   a[3]=hour/10;
   a[2]=hour%10;
   a[1]=min/10;
   a[0]=min%10;
}
   if(set==1&amp;&amp;(msec==0||msec==5)){a[3]=10;}else{a[3]=hour/10;}
   if(set==1&amp;&amp;(msec==0||msec==5)){a[2]=10;}else{a[2]=hour%10;}
   if(set==2&amp;&amp;(msec==0||msec==5)){a[1]=10;}else{a[1]=min/10;}
   if(set==2&amp;&amp;(msec==0||msec==5)){a[0]=10;}else{a[0]=min%10;}
if(set==3){
   if(msec==0||msec==5){a[1]=10;a[3]=10;a[2]=10;}else{a[3]=10;a[2]=10;a[1]=sec/10;}
   if(msec==0||msec==5){a[0]=10;a[3]=10;a[2]=10;}else{a[3]=10;a[2]=10;a[0]=sec%10;}
}
   if(msec&lt;5){PORTC |=(1&lt;&lt;DP_C);}
   if(msec&gt;=5){PORTC &amp;=~(1&lt;&lt;DP_C);}

 _delay_ms(100);
}}
 
ISR(TIMER2_COMP_vect){
    switch(i){
    case 0:  segm=a[0];  an=0;  anod();segment(); break;
    case 1:  segm=a[1];  an=1;  anod();segment(); break;
    case 2:  segm=a[2];  an=2;  anod();segment(); break;
    case 3:  segm=a[3];  an=3;  anod();segment(); break;
    }i++;if(i&gt;3){i=0;}}
 
void segment(){                                                                
   switch(segm){                                                                 
    case 0: PORTD &amp;=~(1&lt;&lt;A_D);PORTB &amp;=~(1&lt;&lt;B_B);PORTC &amp;=~(1&lt;&lt;C_C);PORTC &amp;=~(1&lt;&lt;D_C);PORTB &amp;=~(1&lt;&lt;E_B);PORTD &amp;=~(1&lt;&lt;F_D);PORTB |=(1&lt;&lt;G_B);break;
    case 1: PORTD |=(1&lt;&lt;A_D);PORTB &amp;=~(1&lt;&lt;B_B);PORTC &amp;=~(1&lt;&lt;C_C);PORTC |=(1&lt;&lt;D_C);PORTB |=(1&lt;&lt;E_B);PORTD |=(1&lt;&lt;F_D);PORTB |=(1&lt;&lt;G_B);break; 
    case 2: PORTD &amp;=~(1&lt;&lt;A_D);PORTB &amp;=~(1&lt;&lt;B_B);PORTC |=(1&lt;&lt;C_C);PORTC &amp;=~(1&lt;&lt;D_C);PORTB &amp;=~(1&lt;&lt;E_B);PORTD |=(1&lt;&lt;F_D);PORTB &amp;=~(1&lt;&lt;G_B);break;
    case 3: PORTD &amp;=~(1&lt;&lt;A_D);PORTB &amp;=~(1&lt;&lt;B_B);PORTC &amp;=~(1&lt;&lt;C_C);PORTC &amp;=~(1&lt;&lt;D_C);PORTB |=(1&lt;&lt;E_B);PORTD |=(1&lt;&lt;F_D);PORTB &amp;=~(1&lt;&lt;G_B);break;
    case 4: PORTD |=(1&lt;&lt;A_D);PORTB &amp;=~(1&lt;&lt;B_B);PORTC &amp;=~(1&lt;&lt;C_C);PORTC |=(1&lt;&lt;D_C);PORTB |=(1&lt;&lt;E_B);PORTD &amp;=~(1&lt;&lt;F_D);PORTB &amp;=~(1&lt;&lt;G_B);break;   
    case 5: PORTD &amp;=~(1&lt;&lt;A_D);PORTB |=(1&lt;&lt;B_B);PORTC &amp;=~(1&lt;&lt;C_C);PORTC &amp;=~(1&lt;&lt;D_C);PORTB |=(1&lt;&lt;E_B);PORTD &amp;=~(1&lt;&lt;F_D);PORTB &amp;=~(1&lt;&lt;G_B);break;
    case 6: PORTD &amp;=~(1&lt;&lt;A_D);PORTB |=(1&lt;&lt;B_B);PORTC &amp;=~(1&lt;&lt;C_C);PORTC &amp;=~(1&lt;&lt;D_C);PORTB &amp;=~(1&lt;&lt;E_B);PORTD &amp;=~(1&lt;&lt;F_D);PORTB &amp;=~(1&lt;&lt;G_B);break;
    case 7: PORTD &amp;=~(1&lt;&lt;A_D);PORTB &amp;=~(1&lt;&lt;B_B);PORTC &amp;=~(1&lt;&lt;C_C);PORTC |=(1&lt;&lt;D_C);PORTB |=(1&lt;&lt;E_B);PORTD |=(1&lt;&lt;F_D);PORTB |=(1&lt;&lt;G_B);break;
    case 8: PORTD &amp;=~(1&lt;&lt;A_D);PORTB &amp;=~(1&lt;&lt;B_B);PORTC &amp;=~(1&lt;&lt;C_C);PORTC &amp;=~(1&lt;&lt;D_C);PORTB &amp;=~(1&lt;&lt;E_B);PORTD &amp;=~(1&lt;&lt;F_D);PORTB &amp;=~(1&lt;&lt;G_B);break; 
    case 9: PORTD &amp;=~(1&lt;&lt;A_D);PORTB &amp;=~(1&lt;&lt;B_B);PORTC &amp;=~(1&lt;&lt;C_C);PORTC &amp;=~(1&lt;&lt;D_C);PORTB |=(1&lt;&lt;E_B);PORTD &amp;=~(1&lt;&lt;F_D);PORTB &amp;=~(1&lt;&lt;G_B);break;
    case 10: PORTD |=(1&lt;&lt;A_D);PORTB |=(1&lt;&lt;B_B);PORTC |=(1&lt;&lt;C_C);PORTC |=(1&lt;&lt;D_C);PORTB |=(1&lt;&lt;E_B);PORTD |=(1&lt;&lt;F_D);PORTB |=(1&lt;&lt;G_B);break;
    }}
 
void anod(){
 switch(an){                                                             
    case 0: PORTB |=(1&lt;&lt;G3_B);PORTD &amp;=~(1&lt;&lt;G0_D);break;
    case 1: PORTD |=(1&lt;&lt;G0_D);PORTB &amp;=~(1&lt;&lt;G1_B);break; 
    case 2: PORTB |=(1&lt;&lt;G1_B);PORTB &amp;=~(1&lt;&lt;G2_B);break; 
    case 3: PORTB |=(1&lt;&lt;G2_B);PORTB &amp;=~(1&lt;&lt;G3_B);break;                                                     
    }}   
 
ISR(TIMER1_COMPA_vect){msec++;if(msec&gt;9){msec=0;}}

void set_time(byte years, byte days, byte monts, byte datas, byte hours ,byte minute, byte second){
    if(second &lt; 255){i2c_write(ADDR_DS1307,0x00,(second/10&lt;&lt;4)+second%10);}
    if(minute &lt; 255){i2c_write(ADDR_DS1307,0x01,(minute/10&lt;&lt;4)+minute%10);} 
    if(hours &lt; 255){i2c_write(ADDR_DS1307,0x02,(hours/10&lt;&lt;4)+hours%10);}
    if(days &lt; 255){i2c_write(ADDR_DS1307,0x03,days);}
    if(datas &lt; 255){i2c_write(ADDR_DS1307,0x04,(datas/10&lt;&lt;4)+datas%10);}
    if(monts &lt; 255){i2c_write(ADDR_DS1307,0x05,(monts/10&lt;&lt;4)+monts%10);}
    if(years &lt; 255){i2c_write(ADDR_DS1307,0x06,(years/10&lt;&lt;4)+years%10);}
    }    

void i2c_write(byte i2c_addr, byte i2c_reg, byte i2c_dat){
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_addr &lt;&lt; 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_reg;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_dat;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO); // СТОП
  } 
  
int i2c_read_1bit(byte i2c_addr, byte i2c_reg){
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_addr &lt;&lt; 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_reg;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
 
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT))); 
   TWDR = (i2c_addr &lt;&lt; 1) | 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
 
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWEA); 
  while(~TWCR&amp;(1&lt;&lt;TWINT));
    byte i2c_data = TWDR; 
  TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
 
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO); // СТОП
  return i2c_data;
  }  </code></pre></div><div class="quotebox"><blockquote><p>Скетч использует 2126 байт (25%) памяти устройства. Всего доступно 8192 байт.<br />Глобальные переменные используют 23 байт (2%) динамической памяти, оставляя 1001 байт для локальных переменных. Максимум: 1024 байт.</p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Thu, 24 Feb 2022 07:09:19 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=5490#p5490</guid>
		</item>
	</channel>
</rss>
