1

Тема: Часы на игп-17 (разработка)

http://forum.rcl-radio.ru/uploads/images/2022/01/1d7a5299318e59cd701fccfa1ccbf07c.png
http://forum.rcl-radio.ru/uploads/images/2022/01/e20e454bcb92fd5b263e6148f7b0354b.png
http://forum.rcl-radio.ru/uploads/images/2022/01/b959b173e66e9ae120ff414bc511618b.png
http://forum.rcl-radio.ru/uploads/images/2022/01/7456b04b80d44ac95d0b7b75412ca9a9.png

Цифровой многоразрядный газоразрядный индикатор игп-17 предназначен
для отображения информации в виде цифр от0 до9 (и десятичного знака) в
каждом из 16 цифровых разрядов и дополнительной информации в служебном
разряде в средствах отображения информации индивидуального и группового пользования.
Корпус плоский, стеклянный. Масса не более 150 г.

Основные технические данные:

Яркость свечения---> 100 кд/м2
Номинальная яркость свечения при максимальном токе---170 кд/м2
Горизонтальный угол обзора при расстоянии наблюдения0,6-0,8 м---> 120°
Напряжение источника питания вспомогательных катодов(постоянное)---> 190 В
Напряжение возникновения разряда(амплитуда импульса)---< 190 В
Напряжение поддержания разряда(амплитуда импульса)---< 170 В
Напряжение смещения на сегментах относительно анодов(постоянное)---< 120 В
Ток индикации(среднее значение):
одного сегмента---< 25 мкА
десятичной точки---< 18 мкА
Интервал времени между импульсами,
подаваемыми на электроды двух соседних знакомест---> 35 мкс
Время готовности при освещенности40 лк---< 1 с
Минимальная наработка---5000 ч
Параметры, изменяющиеся в течение минимальной наработки
импульсное напряжение возникновения разряда---< 190 В
средний ток индикации:
одного сегмента---< 30 мкА
десятичной точки---< 21 мкА
яркость индикатора---> 90 кд/м2
Срок хранения---не менее 8 лет
Вибрационные нагрузки(1—2000 Гц)---< 5g
Многократные ударные нагрузки(длительность удара2-15 мс)---< 15g
Одиночные ударные нагрузки(длительность удара2-6 мс)---< 75g
Температура окружающей среды:
при эксплуатации---+1...+50°С
при транспортировке---/-60…+50°С
Относительная влажность воздуха---не более98%
Пониженное атмосферное давление---400 мм рт. ст.

Предельно допустимый электрический режим:

Наименьшее импульсное напряжение источника питания---190 В
Наименьшее постоянное напряжение источника питания
вспомогательных катодов---190 В
Наибольшее постоянное напряжение смещения на сегментах
относительно анодов---120 В
Рабочий ток одного сегмента:
средний---25…40 мкА
импульсный---300…700 мкА
Рабочий ток десятичной точки:
средний---13…20 мкА
импульсный---200…400 мкА
Рабочий ток вспомогательного катода---7…15 мкА
Наименьшая длительность импульса напряжения источника питания---200 мкс

2

Re: Часы на игп-17 (разработка)

http://forum.rcl-radio.ru/uploads/images/2022/02/16ccb5030629d93a9d970d664e65eeb0.gif
http://forum.rcl-radio.ru/uploads/images/2022/02/faa2a8da1e4ab4febde73ebd22f8ece8.png
http://forum.rcl-radio.ru/uploads/images/2022/02/75eda4bf4f3464f1ab49bfafa28612b2.png
http://forum.rcl-radio.ru/uploads/images/2022/02/d0759f3487a01417f283df9ae74d1f99.png
http://forum.rcl-radio.ru/uploads/images/2022/02/2e7a70b9dd16a6579aa21c3941598772.png
http://forum.rcl-radio.ru/uploads/images/2022/02/8f6ae6a1a0eef8581cdc9b3456ca275a.png

// ATMEGA8535 16 MHZ
#define ADDR    0x68
#define CPU_F   16000000 // Clock Speed
#define SCL_F   400000 // // I2C Speed
#define TEMP_KORR 20 // -2гр.Цельсия

#include <avr/io.h>
#include <util/delay.h>

byte a[16],an,segm,i;
bool w=1,w1;
byte sec,min,hour,datat,mont,year;
int temper,sett,times;
int set_hour,set_min,set_sec,set_datat,set_mont,set_year;


int main(){
  DDRA = 0xFF;
  DDRB = 0xFF;
  DDRC = 0xFF;
  DDRD |= (1 << PD6)|(1 << PD7);
  PORTD |= (1 << PD2)|(1 << PD3)|(1 << PD4);
  TWBR = (((CPU_F)/(SCL_F)-16 )/2) ;
  TWSR = 0;
  DDRD |= (1 << PD5); // PWM +180V TIMER_1
  cli();
// TIMER_2  F = 16000000/128/100=1250 Hz (800 uS)
  OCR2 = 100;
  TCCR2 |= (1 << WGM21);
  TCCR2 |= (1 << CS22) | (1 << CS20);
  TIMSK |= (1 << OCIE2);
// TIMER_1  F = 16000000/1024/1/1=15625 Hz
  TCCR1A |= (1 << COM1A1);
  TCCR1B |= (1 << WGM12);
  TCCR1A |= (1 << WGM11) | (1 << WGM10);
  TCCR1B |= (1 << CS10); 
  ICR1 = 1023; 
  OCR1A = 350; 
  sei();
 // set_time(22,2,2,4,22,23,0);// год 00-99, ДН 1-7 (1=ВС), месяц 1-12, дата 1-31, час 0-23, минуты 0-59, секунды 0-59
  _delay_ms(200); 
   

while(1) { 
  datat = ((i2c_read(ADDR,4) & 0x0F) + ((i2c_read(ADDR,4) & 0x70) >> 4) * 10);
  mont = ((i2c_read(ADDR,5) & 0x0F) + ((i2c_read(ADDR,5) & 0x70) >> 4) * 10);
  year = ((i2c_read(ADDR,6) & 0x0F) + ((i2c_read(ADDR,6) & 0x70) >> 4) * 10); 
  hour = (i2c_read(ADDR,2) & 0x0F) + (((i2c_read(ADDR,2) & 0x70) >> 4) * 10);
  min =  (i2c_read(ADDR,1) & 0x0F) + (((i2c_read(ADDR,1) & 0x70) >> 4) * 10);
  if(sec==10||sec==40) temper = (((i2c_read(ADDR,0x11)&0b01111111)*10 + ((i2c_read(ADDR,0x12) & 0b11000000) >> 6)*2.5))-TEMP_KORR ;
  sec =  (i2c_read(ADDR,0) & 0x0F) + (((i2c_read(ADDR,0) & 0x70) >> 4) * 10);
  set_year = year;set_mont = mont;set_datat = datat;set_hour = hour;set_min = min;set_sec = sec;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/// BUTTON /////////////  
  if(((PIND >> PD2) & 1) == 0){sett++;times=0;if(sett>6){sett=0;}wr();_delay_ms(300);}
  
  if(((PIND >> PD3) & 1) == 0 && sett==1){set_hour++;w1=1; if(set_hour>23){set_hour=23;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==1){set_hour--;w1=1; if(set_hour<0){set_hour=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==2){set_min++;w1=1; if(set_mont>59){set_min=59;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==2){set_min--;w1=1; if(set_mont<0){set_min=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==3){set_sec=0;w1=1; set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==3){set_sec=0;w1=1; set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==4){set_datat++;w1=1; if(set_datat>31){set_datat=31;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==4){set_datat--;w1=1; if(set_datat<0){set_datat=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==5){set_mont++;w1=1; if(set_mont>12){set_mont=12;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==5){set_mont--;w1=1; if(set_mont<0){set_mont=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);} 

  if(((PIND >> PD3) & 1) == 0 && sett==6){set_year++;w1=1; if(set_year>50){set_year=50;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==6){set_year--;w1=1; if(set_year<22){set_year=22;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}      
 
 if(sett==0){
 if(min==30&&sec<10){a[0]=sec%10+20;a[1]=sec%10+20;a[2]=sec%10+20;a[3]=sec%10+20;a[4]=sec%10+20;a[5]=sec%10+20;a[6]=sec%10+20;a[7]=sec%10+20;
  a[8]=sec%10+20;a[9]=sec%10+20;a[10]=sec%10+20;a[11]=sec%10+20;a[12]=sec%10+20;a[13]=sec%10+20;a[14]=sec%10+20;a[15]=sec%10+20;}
 else{ 
  if((sec>=10&&sec<=20)||(sec>=40&&sec<=50)){
  a[0]=14;
  a[1]=13;
  a[2]=temper%10;
  a[3]=temper/10%10+20;
  a[4]=temper/100;
  a[5]=10;
  a[6]=12;  
  }
  else{
  a[0]=10;
  a[1]=year%10;
  a[2]=year/10;
  a[3]=mont%10+20;
  a[4]=mont/10;
  a[5]=datat%10+20;
  a[6]=datat/10;
  }
  a[7]=10;
  a[8]=sec%10;
  a[9]=sec/10;
  a[10]=11;
  a[11]=min%10;
  a[12]=min/10;
  a[13]=11;
  a[14]=hour%10;
  a[15]=hour/10;
}
}// sett=0

 if(sett>0){
  a[0]=10;
  if(sett==6){if(times<=500||w1==1){w1=0;a[1]=year%10+20;a[2]=year/10;}else{a[1]=11;a[2]=11;}}
  if(sett==5){if(times<=500||w1==1){w1=0;a[3]=mont%10+20;a[4]=mont/10;}else{a[3]=11;a[4]=11;}}
  if(sett==4){if(times<=500||w1==1){w1=0;a[5]=datat%10+20;a[6]=datat/10;}else{a[5]=11;a[6]=11;}}
  a[7]=10;
  if(sett==3){if(times<=500||w1==1){w1=0;a[8]=sec%10;a[9]=sec/10;}else{a[8]=11;a[9]=11;}}
  a[10]=11;
  if(sett==2){if(times<=500||w1==1){w1=0;a[11]=min%10;a[12]=min/10;}else{a[11]=11;a[12]=11;}}
  a[13]=11;
  if(sett==1){if(times<=500||w1==1){w1=0;a[14]=hour%10;a[15]=hour/10;}else{a[14]=11;a[15]=11;}}
  if(sett!=3){a[8]=sec%10;a[9]=sec/10;}
}// sett>0

if(sett==0){_delay_ms(100);}
 }}

void wr(){a[0]=10;a[1]=year%10; a[2]=year/10;a[3]=mont%10+20;a[4]=mont/10;a[5]=datat%10+20;a[6]=datat/10;a[7]=10;a[8]=sec%10;
a[9]=sec/10;a[10]=11;a[11]=min%10;a[12]=min/10;a[13]=11;a[14]=hour%10;a[15]=hour/10;}


ISR(TIMER2_COMP_vect){
  switch(i){
    case 0:  segm=a[0];  an=16;  anod(); _delay_us(600); segment(); if(a[0]==10)an=16;else an=0;  anod(); break;
    case 1:  segm=a[1];  an=16;  anod(); _delay_us(600); segment(); if(a[1]==10)an=16;else an=1;  anod(); break;
    case 2:  segm=a[2];  an=16;  anod(); _delay_us(600); segment(); if(a[2]==10)an=16;else an=2;  anod(); break;
    case 3:  segm=a[3];  an=16;  anod(); _delay_us(600); segment(); if(a[3]==10)an=16;else an=3;  anod(); break;
    case 4:  segm=a[4];  an=16;  anod(); _delay_us(600); segment(); if(a[4]==10)an=16;else an=4;  anod(); break;
    case 5:  segm=a[5];  an=16;  anod(); _delay_us(600); segment(); if(a[5]==10)an=16;else an=5;  anod(); break;
    case 6:  segm=a[6];  an=16;  anod(); _delay_us(600); segment(); if(a[6]==10)an=16;else an=6;  anod(); break;
    case 7:  segm=a[7];  an=16;  anod(); _delay_us(600); segment(); if(a[7]==10)an=16;else an=7;  anod(); break;
    case 8:  segm=a[8];  an=16;  anod(); _delay_us(400); segment(); an=8;  anod(); break;
    case 9:  segm=a[9];  an=16;  anod(); _delay_us(400); segment(); an=9;  anod(); break;
   case 10:  segm=a[10]; an=16;  anod(); _delay_us(400); segment(); an=10; anod(); break;
   case 11:  segm=a[11]; an=16;  anod(); _delay_us(400); segment(); an=11; anod(); break;
   case 12:  segm=a[12]; an=16;  anod(); _delay_us(400); segment(); an=12; anod(); break;
   case 13:  segm=a[13]; an=16;  anod(); _delay_us(400); segment(); an=13; anod(); break;
   case 14:  segm=a[14]; an=16;  anod(); _delay_us(400); segment(); an=14; anod(); break;
   case 15:  segm=a[15]; an=16;  anod(); _delay_us(400); segment(); an=15; anod(); break;
    }i++;if(i>15){i=0;}times++;if(times>600){times=0;}}

void segment(){                                                                
   switch(segm){                                                                 
             //       GECDXBFA
    case 0: PORTA = 0b01110111;break; 
    case 1: PORTA = 0b00100100;break; 
    case 2: PORTA = 0b11010101;break; 
    case 3: PORTA = 0b10110101;break; 
    case 4: PORTA = 0b10100110;break; 
    case 5: PORTA = 0b10110011;break; 
    case 6: PORTA = 0b11110011;break; 
    case 7: PORTA = 0b00100101;break; 
    case 8: PORTA = 0b11110111;break;          
    case 9: PORTA = 0b10110111;break;
              //       GECDXBFA
    case 20: PORTA = 0b01111111;break; 
    case 21: PORTA = 0b00101100;break; 
    case 22: PORTA = 0b11011101;break; 
    case 23: PORTA = 0b10111101;break; 
    case 24: PORTA = 0b10101110;break; 
    case 25: PORTA = 0b10111011;break; 
    case 26: PORTA = 0b11111011;break; 
    case 27: PORTA = 0b00101101;break; 
    case 28: PORTA = 0b11111111;break;          
    case 29: PORTA = 0b10111111;break;
              //       GECDXBFA
    case 10: PORTA = 0b00000000;break; // пусто 
    case 11: PORTA = 0b10000000;break; // -
    case 12: PORTA = 0b11010010;break; // t
    case 13: PORTA = 0b10000111;break; // гр
    case 14: PORTA = 0b01010011;break; // C
  }}
    

void anod(){
 switch(an){                                                             
    case 0: PORTC &=~(1<<PC7);PORTB |=(1<<PB0);break;
    case 1: PORTB &=~(1<<PB0);PORTB |=(1<<PB1);break; 
    case 2: PORTB &=~(1<<PB1);PORTB |=(1<<PB2);break; 
    case 3: PORTB &=~(1<<PB2);PORTB |=(1<<PB3);break; 
    case 4: PORTB &=~(1<<PB3);PORTB |=(1<<PB4);break; 
    case 5: PORTB &=~(1<<PB4);PORTB |=(1<<PB5);break; 
    case 6: PORTB &=~(1<<PB5);PORTB |=(1<<PB6);break; 
    case 7: PORTB &=~(1<<PB6);PORTB |=(1<<PB7);break;  
    case 8: PORTB &=~(1<<PB7);PORTD |=(1<<PD6);break;
    case 9: PORTD &=~(1<<PD6);PORTD |=(1<<PD7);break; 
   case 10: PORTD &=~(1<<PD7);PORTC |=(1<<PC2);break; 
   case 11: PORTC &=~(1<<PC2);PORTC |=(1<<PC3);break; 
   case 12: PORTC &=~(1<<PC3);PORTC |=(1<<PC4);break; 
   case 13: PORTC &=~(1<<PC4);PORTC |=(1<<PC5);break; 
   case 14: PORTC &=~(1<<PC5);PORTC |=(1<<PC6);break; 
   case 15: PORTC &=~(1<<PC6);PORTC |=(1<<PC7);break;       
   case 16: PORTB &=~(1<<PB0);PORTB &=~(1<<PB1);PORTB &=~(1<<PB2);PORTB &=~(1<<PB3);PORTB &=~(1<<PB4);PORTB &=~(1<<PB5);PORTB &=~(1<<PB6);PORTB &=~(1<<PB7);
   PORTD &=~(1<<PD6);PORTD &=~(1<<PD7);PORTC &=~(1<<PC2);PORTC &=~(1<<PC3);PORTC &=~(1<<PC4);PORTC &=~(1<<PC5);PORTC &=~(1<<PC6);PORTC &=~(1<<PC7);break;                                                     
  }} 

byte i2c_read(byte i2c_addr, byte i2c_reg){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_addr << 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_reg;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT))); 
   TWDR = (i2c_addr << 1) | 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   byte i2c_data = TWDR;  
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); // СТОП
   return i2c_data;
  }

void i2c_write(byte i2c_addr, byte i2c_reg, byte i2c_dat){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_addr << 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_reg;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_dat;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); // СТОП
  }  

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

3

Re: Часы на игп-17 (разработка)

4

Re: Часы на игп-17 (разработка)

Примечание:

  • Вместо высоковольтных транзисторов MPSA44 в собранной мною конструкции применены BC547

5

Re: Часы на игп-17 (разработка)

http://forum.rcl-radio.ru/uploads/images/2022/02/2be2beb066628742109e7e796090c59d.png
http://forum.rcl-radio.ru/uploads/images/2022/02/2efcaf38bbfff4ba9be049ed8d583c03.png
http://forum.rcl-radio.ru/uploads/images/2022/02/a8fb80fedbfb9d316d340027a94cdfed.png
http://forum.rcl-radio.ru/uploads/images/2022/02/f09842ef06ab9ae08383a9cfec56be38.png

6

Re: Часы на игп-17 (разработка)

Доработка - добавление датчика температуры и влажности HTU21D

Так как датчик температуры в DS3231 не очень точный, то было принято решение о добавлении отдельного датчика измерения температуры HTU21D. Так как датчик HTU21D измеряет еще и влажность, то одновременно с датой, температурой выводится и показания влажности.

с 50 по 0 и с 0 до 10 секунд показывается дата, месяц, год
с 10 по 30 секунду температура
с 30 по 50 секунду влажность

Измерение температуры и влажности происходит 1 раз в минуту.

http://forum.rcl-radio.ru/uploads/images/2022/02/09ab45b696052f2dd1e8464b7d7f312b.png

http://forum.rcl-radio.ru/uploads/images/2022/02/7f7f7e80ac3263f7dfebf45c7eb0d488.png

Цифровой датчик датчик HTU21D предназначен для точного измерения температуры и влажности, связь датчика с микроконтроллером осуществляется при помощи шины I2C.

http://rcl-radio.ru/wp-content/uploads/2021/12/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0-%D0%BE%D1%82-2021-12-11-125922.png

http://forum.rcl-radio.ru/uploads/images/2022/02/41b014adaec5d756d0033ff795d820c6.gif

Данный контент доступен только зарегистрированным пользователям.

// ATMEGA8535 16 MHZ
#define ADDR_HTU21D  0x40
#define ADDR    0x68
#define CPU_F   16000000 // Clock Speed
#define SCL_F   400000 // // I2C Speed

#include <avr/io.h>
#include <util/delay.h>

byte a[16],an,segm,i;
bool w=1,w1,w2,w3,f2,f3;
byte sec,min,hour,datat,mont,year;
int temper,sett,times,humidity;
int set_hour,set_min,set_sec,set_datat,set_mont,set_year;


int main(){
  DDRA = 0xFF;
  DDRB = 0xFF;
  DDRC = 0xFF;
  DDRD |= (1 << PD6)|(1 << PD7);
  PORTD |= (1 << PD2)|(1 << PD3)|(1 << PD4);
  TWBR = (((CPU_F)/(SCL_F)-16 )/2) ;
  TWSR = 0;
  DDRD |= (1 << PD5); // PWM +180V TIMER_1
  cli();
// TIMER_2  F = 16000000/128/100=1250 Hz (800 uS)
  OCR2 = 100;
  TCCR2 |= (1 << WGM21);
  TCCR2 |= (1 << CS22) | (1 << CS20);
  TIMSK |= (1 << OCIE2);
// TIMER_1  F = 16000000/1024/1/1=15625 Hz
  TCCR1A |= (1 << COM1A1);
  TCCR1B |= (1 << WGM12);
  TCCR1A |= (1 << WGM11) | (1 << WGM10);
  TCCR1B |= (1 << CS10); 
  ICR1 = 1023; 
  OCR1A = 350; 
  sei();
 // set_time(22,2,2,4,22,23,0);// год 00-99, ДН 1-7 (1=ВС), месяц 1-12, дата 1-31, час 0-23, минуты 0-59, секунды 0-59
  i2c_write(ADDR_HTU21D,0xE6,0b10000001); // 11 bit
  _delay_ms(200); 
   

while(1) { 
  hour = (i2c_read(ADDR,2) & 0x0F) + (((i2c_read(ADDR,2) & 0x70) >> 4) * 10);
  min =  (i2c_read(ADDR,1) & 0x0F) + (((i2c_read(ADDR,1) & 0x70) >> 4) * 10);
  
  datat = ((i2c_read(ADDR,4) & 0x0F) + ((i2c_read(ADDR,4) & 0x70) >> 4) * 10);
  mont = ((i2c_read(ADDR,5) & 0x0F) + ((i2c_read(ADDR,5) & 0x70) >> 4) * 10);
  year = ((i2c_read(ADDR,6) & 0x0F) + ((i2c_read(ADDR,6) & 0x70) >> 4) * 10);

  sec =  (i2c_read(ADDR,0) & 0x0F) + (((i2c_read(ADDR,0) & 0x70) >> 4) * 10);
  set_year = year;set_mont = mont;set_datat = datat;set_hour = hour;set_min = min;set_sec = sec;
  
  if(sec==10&&f2==0){f2=1;w2=1;}if(sec>10){f2=0;}
  if(sec==20&&f3==0){f3=1;w3=1;}if(sec>20){f3=0;}
  if(w2==1) {w2=0;temper = (-46.85+175.72*(i2c_read_2byte(ADDR_HTU21D,0xE3)/65536.00))*10;}
  if(w3==1) {w3=0;humidity = (-6+125*(i2c_read_2byte(ADDR_HTU21D,0xE5)/65536.00))*10;}
  
  
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/// BUTTON /////////////  
  if(((PIND >> PD2) & 1) == 0){sett++;times=0;if(sett>6){sett=0;}wr();_delay_ms(300);}
  
  if(((PIND >> PD3) & 1) == 0 && sett==1){set_hour++;w1=1; if(set_hour>23){set_hour=23;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==1){set_hour--;w1=1; if(set_hour<0){set_hour=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==2){set_min++;w1=1; if(set_mont>59){set_min=59;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==2){set_min--;w1=1; if(set_mont<0){set_min=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==3){set_sec=0;w1=1; set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==3){set_sec=0;w1=1; set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==4){set_datat++;w1=1; if(set_datat>31){set_datat=31;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==4){set_datat--;w1=1; if(set_datat<0){set_datat=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==5){set_mont++;w1=1; if(set_mont>12){set_mont=12;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==5){set_mont--;w1=1; if(set_mont<0){set_mont=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);} 

  if(((PIND >> PD3) & 1) == 0 && sett==6){set_year++;w1=1; if(set_year>50){set_year=50;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==6){set_year--;w1=1; if(set_year<22){set_year=22;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}      
 
 if(sett==0){
 if(min==30&&sec<10){a[0]=sec%10+20;a[1]=sec%10+20;a[2]=sec%10+20;a[3]=sec%10+20;a[4]=sec%10+20;a[5]=sec%10+20;a[6]=sec%10+20;a[7]=sec%10+20;
  a[8]=sec%10+20;a[9]=sec%10+20;a[10]=sec%10+20;a[11]=sec%10+20;a[12]=sec%10+20;a[13]=sec%10+20;a[14]=sec%10+20;a[15]=sec%10+20;}
 else{ 
  if(sec>=10&&sec<=30){
  a[0]=14;
  a[1]=13;
  a[2]=temper%10;
  a[3]=temper/10%10+20;
  a[4]=temper/100;
  a[5]=10;
  a[6]=12;  
  }
  else if(sec>=30&&sec<=50){
  a[0]=16;
  a[1]=13;
  a[2]=humidity%10;
  a[3]=humidity/10%10+20;
  a[4]=humidity/100;
  a[5]=10;
  a[6]=15;  
  }
  else{
  a[0]=10;
  a[1]=year%10;
  a[2]=year/10;
  a[3]=mont%10+20;
  a[4]=mont/10;
  a[5]=datat%10+20;
  a[6]=datat/10;
  }
  a[7]=10;
  a[8]=sec%10;
  a[9]=sec/10;
  a[10]=11;
  a[11]=min%10;
  a[12]=min/10;
  a[13]=11;
  a[14]=hour%10;
  a[15]=hour/10;
}
}// sett=0

 if(sett>0){
  a[0]=10;
  if(sett==6){if(times<=500||w1==1){w1=0;a[1]=year%10+20;a[2]=year/10;}else{a[1]=11;a[2]=11;}}
  if(sett==5){if(times<=500||w1==1){w1=0;a[3]=mont%10+20;a[4]=mont/10;}else{a[3]=11;a[4]=11;}}
  if(sett==4){if(times<=500||w1==1){w1=0;a[5]=datat%10+20;a[6]=datat/10;}else{a[5]=11;a[6]=11;}}
  a[7]=10;
  if(sett==3){if(times<=500||w1==1){w1=0;a[8]=sec%10;a[9]=sec/10;}else{a[8]=11;a[9]=11;}}
  a[10]=11;
  if(sett==2){if(times<=500||w1==1){w1=0;a[11]=min%10;a[12]=min/10;}else{a[11]=11;a[12]=11;}}
  a[13]=11;
  if(sett==1){if(times<=500||w1==1){w1=0;a[14]=hour%10;a[15]=hour/10;}else{a[14]=11;a[15]=11;}}
  if(sett!=3){a[8]=sec%10;a[9]=sec/10;}
}// sett>0

if(sett==0){_delay_ms(100);}
 }}

void wr(){a[0]=10;a[1]=year%10; a[2]=year/10;a[3]=mont%10+20;a[4]=mont/10;a[5]=datat%10+20;a[6]=datat/10;a[7]=10;a[8]=sec%10;
a[9]=sec/10;a[10]=11;a[11]=min%10;a[12]=min/10;a[13]=11;a[14]=hour%10;a[15]=hour/10;}


ISR(TIMER2_COMP_vect){
  switch(i){
    case 0:  segm=a[0];  an=16;  anod(); _delay_us(600); segment(); if(a[0]==10)an=16;else an=0;  anod(); break;
    case 1:  segm=a[1];  an=16;  anod(); _delay_us(600); segment(); if(a[1]==10)an=16;else an=1;  anod(); break;
    case 2:  segm=a[2];  an=16;  anod(); _delay_us(600); segment(); if(a[2]==10)an=16;else an=2;  anod(); break;
    case 3:  segm=a[3];  an=16;  anod(); _delay_us(600); segment(); if(a[3]==10)an=16;else an=3;  anod(); break;
    case 4:  segm=a[4];  an=16;  anod(); _delay_us(600); segment(); if(a[4]==10)an=16;else an=4;  anod(); break;
    case 5:  segm=a[5];  an=16;  anod(); _delay_us(600); segment(); if(a[5]==10)an=16;else an=5;  anod(); break;
    case 6:  segm=a[6];  an=16;  anod(); _delay_us(600); segment(); if(a[6]==10)an=16;else an=6;  anod(); break;
    case 7:  segm=a[7];  an=16;  anod(); _delay_us(600); segment(); if(a[7]==10)an=16;else an=7;  anod(); break;
    case 8:  segm=a[8];  an=16;  anod(); _delay_us(400); segment(); an=8;  anod(); break;
    case 9:  segm=a[9];  an=16;  anod(); _delay_us(400); segment(); an=9;  anod(); break;
   case 10:  segm=a[10]; an=16;  anod(); _delay_us(400); segment(); an=10; anod(); break;
   case 11:  segm=a[11]; an=16;  anod(); _delay_us(400); segment(); an=11; anod(); break;
   case 12:  segm=a[12]; an=16;  anod(); _delay_us(400); segment(); an=12; anod(); break;
   case 13:  segm=a[13]; an=16;  anod(); _delay_us(400); segment(); an=13; anod(); break;
   case 14:  segm=a[14]; an=16;  anod(); _delay_us(400); segment(); an=14; anod(); break;
   case 15:  segm=a[15]; an=16;  anod(); _delay_us(400); segment(); an=15; anod(); break;
    }i++;if(i>15){i=0;}times++;if(times>600){times=0;}}

void segment(){                                                                
   switch(segm){                                                                 
             //       GECDXBFA
    case 0: PORTA = 0b01110111;break; 
    case 1: PORTA = 0b00100100;break; 
    case 2: PORTA = 0b11010101;break; 
    case 3: PORTA = 0b10110101;break; 
    case 4: PORTA = 0b10100110;break; 
    case 5: PORTA = 0b10110011;break; 
    case 6: PORTA = 0b11110011;break; 
    case 7: PORTA = 0b00100101;break; 
    case 8: PORTA = 0b11110111;break;          
    case 9: PORTA = 0b10110111;break;
              //       GECDXBFA
    case 20: PORTA = 0b01111111;break; 
    case 21: PORTA = 0b00101100;break; 
    case 22: PORTA = 0b11011101;break; 
    case 23: PORTA = 0b10111101;break; 
    case 24: PORTA = 0b10101110;break; 
    case 25: PORTA = 0b10111011;break; 
    case 26: PORTA = 0b11111011;break; 
    case 27: PORTA = 0b00101101;break; 
    case 28: PORTA = 0b11111111;break;          
    case 29: PORTA = 0b10111111;break;
              //       GECDXBFA
    case 10: PORTA = 0b00000000;break; // пусто 
    case 11: PORTA = 0b10000000;break; // -
    case 12: PORTA = 0b11010010;break; // t
    case 13: PORTA = 0b10000111;break; // гр
    case 14: PORTA = 0b01010011;break; // C
    case 15: PORTA = 0b11100110;break; // H
    case 16: PORTA = 0b11110000;break; // o
  }}
    

void anod(){
 switch(an){                                                             
    case 0: PORTC &=~(1<<PC7);PORTB |=(1<<PB0);break;
    case 1: PORTB &=~(1<<PB0);PORTB |=(1<<PB1);break; 
    case 2: PORTB &=~(1<<PB1);PORTB |=(1<<PB2);break; 
    case 3: PORTB &=~(1<<PB2);PORTB |=(1<<PB3);break; 
    case 4: PORTB &=~(1<<PB3);PORTB |=(1<<PB4);break; 
    case 5: PORTB &=~(1<<PB4);PORTB |=(1<<PB5);break; 
    case 6: PORTB &=~(1<<PB5);PORTB |=(1<<PB6);break; 
    case 7: PORTB &=~(1<<PB6);PORTB |=(1<<PB7);break;  
    case 8: PORTB &=~(1<<PB7);PORTD |=(1<<PD6);break;
    case 9: PORTD &=~(1<<PD6);PORTD |=(1<<PD7);break; 
   case 10: PORTD &=~(1<<PD7);PORTC |=(1<<PC2);break; 
   case 11: PORTC &=~(1<<PC2);PORTC |=(1<<PC3);break; 
   case 12: PORTC &=~(1<<PC3);PORTC |=(1<<PC4);break; 
   case 13: PORTC &=~(1<<PC4);PORTC |=(1<<PC5);break; 
   case 14: PORTC &=~(1<<PC5);PORTC |=(1<<PC6);break; 
   case 15: PORTC &=~(1<<PC6);PORTC |=(1<<PC7);break;       
   case 16: PORTB &=~(1<<PB0);PORTB &=~(1<<PB1);PORTB &=~(1<<PB2);PORTB &=~(1<<PB3);PORTB &=~(1<<PB4);PORTB &=~(1<<PB5);PORTB &=~(1<<PB6);PORTB &=~(1<<PB7);
   PORTD &=~(1<<PD6);PORTD &=~(1<<PD7);PORTC &=~(1<<PC2);PORTC &=~(1<<PC3);PORTC &=~(1<<PC4);PORTC &=~(1<<PC5);PORTC &=~(1<<PC6);PORTC &=~(1<<PC7);break;                                                     
  }} 

int i2c_read_2byte(byte i2c_addr, byte i2c_reg){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_addr << 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_reg;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT))); 
   TWDR = (i2c_addr << 1) | 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA); 
  while(~TWCR&(1<<TWINT));
   int i2c_data0 = TWDR; 
   TWCR = (1<<TWINT) | (1<<TWEN);
  while(~TWCR&(1<<TWINT));
  int i2c_data1 = TWDR; 
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); // СТОП
  int i2c_data = (i2c_data0<<8)+i2c_data1;
  return i2c_data;
  }  

byte i2c_read(byte i2c_addr, byte i2c_reg){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_addr << 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_reg;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT))); 
   TWDR = (i2c_addr << 1) | 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   byte i2c_data = TWDR;  
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); // СТОП
   return i2c_data;
  }

void i2c_write(byte i2c_addr, byte i2c_reg, byte i2c_dat){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_addr << 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_reg;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_dat;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); // СТОП
  }  

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

Скетч использует 5448 байт (70%) памяти устройства. Всего доступно 7680 байт.
Глобальные переменные используют 50 байт (9%) динамической памяти, оставляя 462 байт для локальных переменных. Максимум: 512 байт.

7

Re: Часы на игп-17 (разработка)

Изменено время показа даты, температуры и влажности

с 0 по 20 сек дата
с 20 по 40 сек температура
с 40 по 59 сек влажность

// ATMEGA8535 16 MHZ
#define ADDR_HTU21D  0x40
#define ADDR    0x68
#define CPU_F   16000000 // Clock Speed
#define SCL_F   100000 // // I2C Speed

#include <avr/io.h>
#include <util/delay.h>

byte a[16],an,segm,i;
bool w=1,w1,w2,w3,f2,f3;
byte sec,min,hour,datat,mont,year;
int temper,sett,times,humidity;
int set_hour,set_min,set_sec,set_datat,set_mont,set_year;


int main(){
  DDRA = 0xFF;
  DDRB = 0xFF;
  DDRC = 0xFF;
  DDRD |= (1 << PD6)|(1 << PD7);
  PORTD |= (1 << PD2)|(1 << PD3)|(1 << PD4);
  TWBR = (((CPU_F)/(SCL_F)-16 )/2) ;
  TWSR = 0;
  DDRD |= (1 << PD5); // PWM +180V TIMER_1
  cli();
// TIMER_2  F = 16000000/128/100=1250 Hz (800 uS)
  OCR2 = 100;
  TCCR2 |= (1 << WGM21);
  TCCR2 |= (1 << CS22) | (1 << CS20);
  TIMSK |= (1 << OCIE2);
// TIMER_1  F = 16000000/1024/1/1=15625 Hz
  TCCR1A |= (1 << COM1A1);
  TCCR1B |= (1 << WGM12);
  TCCR1A |= (1 << WGM11) | (1 << WGM10);
  TCCR1B |= (1 << CS10); 
  ICR1 = 1023; 
  OCR1A = 350; 
  sei();
 // set_time(22,2,2,4,22,23,0);// год 00-99, ДН 1-7 (1=ВС), месяц 1-12, дата 1-31, час 0-23, минуты 0-59, секунды 0-59
  i2c_write(ADDR_HTU21D,0xE6,0b10000001); // 11 bit
  _delay_ms(200); 
   

while(1) { 
  hour = (i2c_read(ADDR,2) & 0x0F) + (((i2c_read(ADDR,2) & 0x70) >> 4) * 10);
  min =  (i2c_read(ADDR,1) & 0x0F) + (((i2c_read(ADDR,1) & 0x70) >> 4) * 10); 
  datat = ((i2c_read(ADDR,4) & 0x0F) + ((i2c_read(ADDR,4) & 0x70) >> 4) * 10);
  mont = ((i2c_read(ADDR,5) & 0x0F) + ((i2c_read(ADDR,5) & 0x70) >> 4) * 10);
  year = ((i2c_read(ADDR,6) & 0x0F) + ((i2c_read(ADDR,6) & 0x70) >> 4) * 10);

  sec =  (i2c_read(ADDR,0) & 0x0F) + (((i2c_read(ADDR,0) & 0x70) >> 4) * 10);
  set_year = year;set_mont = mont;set_datat = datat;set_hour = hour;set_min = min;set_sec = sec;
  
  if(sec==10&&f2==0){f2=1;w2=1;}if(sec>10){f2=0;}
  if(sec==20&&f3==0){f3=1;w3=1;}if(sec>20){f3=0;}
  if(w2==1) {w2=0;temper = (-46.85+175.72*(i2c_read_2byte(ADDR_HTU21D,0xE3)/65536.00))*10;}
  if(w3==1) {w3=0;humidity = (-6+125*(i2c_read_2byte(ADDR_HTU21D,0xE5)/65536.00))*10;}
  
  
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/// BUTTON /////////////  
  if(((PIND >> PD2) & 1) == 0){sett++;times=0;if(sett>6){sett=0;}wr();_delay_ms(300);}
  
  if(((PIND >> PD3) & 1) == 0 && sett==1){set_hour++;w1=1; if(set_hour>23){set_hour=23;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==1){set_hour--;w1=1; if(set_hour<0){set_hour=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==2){set_min++;w1=1; if(set_mont>59){set_min=59;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==2){set_min--;w1=1; if(set_mont<0){set_min=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==3){set_sec=0;w1=1; set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==3){set_sec=0;w1=1; set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==4){set_datat++;w1=1; if(set_datat>31){set_datat=31;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==4){set_datat--;w1=1; if(set_datat<0){set_datat=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==5){set_mont++;w1=1; if(set_mont>12){set_mont=12;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==5){set_mont--;w1=1; if(set_mont<0){set_mont=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);} 

  if(((PIND >> PD3) & 1) == 0 && sett==6){set_year++;w1=1; if(set_year>50){set_year=50;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==6){set_year--;w1=1; if(set_year<22){set_year=22;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}      
 
 if(sett==0){
 if(min==30&&sec<10){a[0]=sec%10+20;a[1]=sec%10+20;a[2]=sec%10+20;a[3]=sec%10+20;a[4]=sec%10+20;a[5]=sec%10+20;a[6]=sec%10+20;a[7]=sec%10+20;
  a[8]=sec%10+20;a[9]=sec%10+20;a[10]=sec%10+20;a[11]=sec%10+20;a[12]=sec%10+20;a[13]=sec%10+20;a[14]=sec%10+20;a[15]=sec%10+20;}
 else{ 
  if(sec>=20&&sec<40){
  a[0]=14;
  a[1]=13;
  a[2]=temper%10;
  a[3]=temper/10%10+20;
  a[4]=temper/100;
  a[5]=10;
  a[6]=12;  
  }
  else if(sec>=40&&sec<59){
  a[0]=16;
  a[1]=13;
  a[2]=humidity%10;
  a[3]=humidity/10%10+20;
  a[4]=humidity/100;
  a[5]=10;
  a[6]=15;  
  }
  else{
  a[0]=10;
  a[1]=year%10;
  a[2]=year/10;
  a[3]=mont%10+20;
  a[4]=mont/10;
  a[5]=datat%10+20;
  a[6]=datat/10;
  }
  a[7]=10;
  a[8]=sec%10;
  a[9]=sec/10;
  a[10]=11;
  a[11]=min%10;
  a[12]=min/10;
  a[13]=11;
  a[14]=hour%10;
  a[15]=hour/10;
}
}// sett=0

 if(sett>0){
  a[0]=10;
  if(sett==6){if(times<=500||w1==1){w1=0;a[1]=year%10+20;a[2]=year/10;}else{a[1]=10;a[2]=10;}}
  if(sett==5){if(times<=500||w1==1){w1=0;a[3]=mont%10+20;a[4]=mont/10;}else{a[3]=10;a[4]=10;}}
  if(sett==4){if(times<=500||w1==1){w1=0;a[5]=datat%10+20;a[6]=datat/10;}else{a[5]=10;a[6]=10;}}
  a[7]=10;
  if(sett==3){if(times<=500||w1==1){w1=0;a[8]=sec%10;a[9]=sec/10;}else{a[8]=10;a[9]=10;}}
  a[10]=11;
  if(sett==2){if(times<=500||w1==1){w1=0;a[11]=min%10;a[12]=min/10;}else{a[11]=10;a[12]=10;}}
  a[13]=11;
  if(sett==1){if(times<=500||w1==1){w1=0;a[14]=hour%10;a[15]=hour/10;}else{a[14]=10;a[15]=10;}}
  if(sett!=3){a[8]=sec%10;a[9]=sec/10;}
}// sett>0

 }}

void wr(){a[0]=10;a[1]=year%10; a[2]=year/10;a[3]=mont%10+20;a[4]=mont/10;a[5]=datat%10+20;a[6]=datat/10;a[7]=10;a[8]=sec%10;
a[9]=sec/10;a[10]=11;a[11]=min%10;a[12]=min/10;a[13]=11;a[14]=hour%10;a[15]=hour/10;}


ISR(TIMER2_COMP_vect){
  switch(i){
    case 0:  segm=a[0];  an=16;  anod(); _delay_us(600); segment(); if(a[0]==10)an=16;else an=0;  anod(); break;
    case 1:  segm=a[1];  an=16;  anod(); _delay_us(600); segment(); if(a[1]==10)an=16;else an=1;  anod(); break;
    case 2:  segm=a[2];  an=16;  anod(); _delay_us(600); segment(); if(a[2]==10)an=16;else an=2;  anod(); break;
    case 3:  segm=a[3];  an=16;  anod(); _delay_us(600); segment(); if(a[3]==10)an=16;else an=3;  anod(); break;
    case 4:  segm=a[4];  an=16;  anod(); _delay_us(600); segment(); if(a[4]==10)an=16;else an=4;  anod(); break;
    case 5:  segm=a[5];  an=16;  anod(); _delay_us(600); segment(); if(a[5]==10)an=16;else an=5;  anod(); break;
    case 6:  segm=a[6];  an=16;  anod(); _delay_us(600); segment(); if(a[6]==10)an=16;else an=6;  anod(); break;
    case 7:  segm=a[7];  an=16;  anod(); _delay_us(600); segment(); if(a[7]==10)an=16;else an=7;  anod(); break;
    case 8:  segm=a[8];  an=16;  anod(); _delay_us(400); segment(); if(a[8]==10)an=16;else an=8;  anod(); break;
    case 9:  segm=a[9];  an=16;  anod(); _delay_us(600); segment(); if(a[9]==10)an=16;else an=9;  anod(); break;
   case 10:  segm=a[10]; an=16;  anod(); _delay_us(600); segment(); if(a[10]==10)an=16;else an=10; anod(); break;
   case 11:  segm=a[11]; an=16;  anod(); _delay_us(600); segment(); if(a[11]==10)an=16;else an=11; anod(); break;
   case 12:  segm=a[12]; an=16;  anod(); _delay_us(600); segment(); if(a[12]==10)an=16;else an=12; anod(); break;
   case 13:  segm=a[13]; an=16;  anod(); _delay_us(600); segment(); if(a[13]==10)an=16;else an=13; anod(); break;
   case 14:  segm=a[14]; an=16;  anod(); _delay_us(600); segment(); if(a[14]==10)an=16;else an=14; anod(); break;
   case 15:  segm=a[15]; an=16;  anod(); _delay_us(600); segment(); if(a[15]==10)an=16;else an=15; anod(); break;
    }i++;if(i>15){i=0;}times++;if(times>600){times=0;}}

void segment(){                                                                
   switch(segm){                                                                 
             //       GECDXBFA
    case 0: PORTA = 0b01110111;break; 
    case 1: PORTA = 0b00100100;break; 
    case 2: PORTA = 0b11010101;break; 
    case 3: PORTA = 0b10110101;break; 
    case 4: PORTA = 0b10100110;break; 
    case 5: PORTA = 0b10110011;break; 
    case 6: PORTA = 0b11110011;break; 
    case 7: PORTA = 0b00100101;break; 
    case 8: PORTA = 0b11110111;break;          
    case 9: PORTA = 0b10110111;break;
              //       GECDXBFA
    case 20: PORTA = 0b01111111;break; 
    case 21: PORTA = 0b00101100;break; 
    case 22: PORTA = 0b11011101;break; 
    case 23: PORTA = 0b10111101;break; 
    case 24: PORTA = 0b10101110;break; 
    case 25: PORTA = 0b10111011;break; 
    case 26: PORTA = 0b11111011;break; 
    case 27: PORTA = 0b00101101;break; 
    case 28: PORTA = 0b11111111;break;          
    case 29: PORTA = 0b10111111;break;
              //       GECDXBFA
    case 10: PORTA = 0b00000000;break; // пусто 
    case 11: PORTA = 0b10000000;break; // -
    case 12: PORTA = 0b11010010;break; // t
    case 13: PORTA = 0b10000111;break; // гр
    case 14: PORTA = 0b01010011;break; // C
    case 15: PORTA = 0b11100110;break; // H
    case 16: PORTA = 0b11110000;break; // o
  }}
    

void anod(){
 switch(an){                                                             
    case 0: PORTC &=~(1<<PC7);PORTB |=(1<<PB0);break;
    case 1: PORTB &=~(1<<PB0);PORTB |=(1<<PB1);break; 
    case 2: PORTB &=~(1<<PB1);PORTB |=(1<<PB2);break; 
    case 3: PORTB &=~(1<<PB2);PORTB |=(1<<PB3);break; 
    case 4: PORTB &=~(1<<PB3);PORTB |=(1<<PB4);break; 
    case 5: PORTB &=~(1<<PB4);PORTB |=(1<<PB5);break; 
    case 6: PORTB &=~(1<<PB5);PORTB |=(1<<PB6);break; 
    case 7: PORTB &=~(1<<PB6);PORTB |=(1<<PB7);break;  
    case 8: PORTB &=~(1<<PB7);PORTD |=(1<<PD6);break;
    case 9: PORTD &=~(1<<PD6);PORTD |=(1<<PD7);break; 
   case 10: PORTD &=~(1<<PD7);PORTC |=(1<<PC2);break; 
   case 11: PORTC &=~(1<<PC2);PORTC |=(1<<PC3);break; 
   case 12: PORTC &=~(1<<PC3);PORTC |=(1<<PC4);break; 
   case 13: PORTC &=~(1<<PC4);PORTC |=(1<<PC5);break; 
   case 14: PORTC &=~(1<<PC5);PORTC |=(1<<PC6);break; 
   case 15: PORTC &=~(1<<PC6);PORTC |=(1<<PC7);break;       
   case 16: PORTB &=~(1<<PB0);PORTB &=~(1<<PB1);PORTB &=~(1<<PB2);PORTB &=~(1<<PB3);PORTB &=~(1<<PB4);PORTB &=~(1<<PB5);PORTB &=~(1<<PB6);PORTB &=~(1<<PB7);
   PORTD &=~(1<<PD6);PORTD &=~(1<<PD7);PORTC &=~(1<<PC2);PORTC &=~(1<<PC3);PORTC &=~(1<<PC4);PORTC &=~(1<<PC5);PORTC &=~(1<<PC6);PORTC &=~(1<<PC7);break;                                                     
  }} 

int i2c_read_2byte(byte i2c_addr, byte i2c_reg){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_addr << 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_reg;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT))); 
   TWDR = (i2c_addr << 1) | 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA); 
  while(~TWCR&(1<<TWINT));
   int i2c_data0 = TWDR; 
   TWCR = (1<<TWINT) | (1<<TWEN);
  while(~TWCR&(1<<TWINT));
  int i2c_data1 = TWDR; 
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); // СТОП
  int i2c_data = (i2c_data0<<8)+i2c_data1;
  return i2c_data;
  }  

byte i2c_read(byte i2c_addr, byte i2c_reg){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_addr << 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_reg;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT))); 
   TWDR = (i2c_addr << 1) | 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   byte i2c_data = TWDR;  
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); // СТОП
   return i2c_data;
  }

void i2c_write(byte i2c_addr, byte i2c_reg, byte i2c_dat){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_addr << 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_reg;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_dat;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); // СТОП
  }  

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

8

Re: Часы на игп-17 (разработка)

Добрый! Собрал Ваши часы. Синие разряды между сегментами внутри колбы. напряжение с преобразователя - 196 вольт, на оптопаре 184. Пробовал увеличивать сопротивление R1(1 кОм 0.5w) толку - нет. Подскажите где копать?
Заранее спасибо.

9

Re: Часы на игп-17 (разработка)

Уточню. В статике с отключенной DS3231 горят все нули без всякой засветки, при подключении - разряды.

10

Re: Часы на игп-17 (разработка)

Уменьшите значение:
OCR1A = 350;

11 (2023-03-27 23:53:21 отредактировано kinolog-69)

Re: Часы на игп-17 (разработка)

Установил: OCR1A = 300 без изменений. Какое минимальное значение? Напряжение - 290 вольт. Уменьшение значения повышение напряжения? Спасибо.

12

Re: Часы на игп-17 (разработка)

Установите 400, посмотрите что изменится.

13

Re: Часы на игп-17 (разработка)

Уменьшать нужно. Это я тупанул резистор R1 стоял 10кОм отсюда и и такое высокое напряжение. При значении 210 - не запустился ( мерцание индикатора ) оставил - 220. Есть не большая засветка точек (сегмент dp ) остальное все работает нормально. Спасибо

14

Re: Часы на игп-17 (разработка)

Добрый день. Решил повторить конструкцию, вопрос: возможно ли внести измерение в программу МК таким образом, чтобы вместо указанного датчика температуры/влажности использовать DS18B20? Он компактный и его возможно использовать вне платы, таким образом он не нагревается при работе часов. Внутренний датчик DS3231 очень точный , кстати, но всегда будет завышать значение температуры из-за дополнительного нагрева микросхемы внутри корпуса часов

15

Re: Часы на игп-17 (разработка)

Опубликуйте код скетча который Вы используете.

16

Re: Часы на игп-17 (разработка)

пытаюсь загрузить скетч из статьи через программатор или скомпилировать хекс - выдает ошибку:
C:\Users\User\AppData\Local\Temp\.arduinoIDE-unsaved20231130-5288-c6z2k8.bj0bf\sketch_dec30a\sketch_dec30a.ino:12:10: error: 'byte min' redeclared as different kind of symbol
byte sec,min,hour,datat,mont,year;
          ^~~
In file included from C:\Users\User\AppData\Local\Temp\arduino\sketches\9095297D34BD3201B5E3777BF37B7B26\sketch\sketch_dec30a.ino.cpp:1:0:
C:\Users\User\AppData\Local\Arduino15\packages\MightyCore\hardware\avr\3.0.0\cores\MCUdude_corefiles/Arduino.h:314:7: note: previous declaration 'template<class T, class L> decltype (((b < a) ? b :  a)) min(const T&, const L&)'
  auto min(const T& a, const L& b) -> decltype((b < a) ? b : a) {
       ^~~
C:\Users\User\AppData\Local\Temp\.arduinoIDE-unsaved20231130-5288-c6z2k8.bj0bf\sketch_dec30a\sketch_dec30a.ino: In function 'int main()':
C:\Users\User\AppData\Local\Temp\.arduinoIDE-unsaved20231130-5288-c6z2k8.bj0bf\sketch_dec30a\sketch_dec30a.ino:49:76: error: overloaded function with no contextual type information
   min =  (i2c_read(ADDR,1) & 0x0F) + (((i2c_read(ADDR,1) & 0x70) >> 4) * 10);
                                                                            ^
C:\Users\User\AppData\Local\Temp\.arduinoIDE-unsaved20231130-5288-c6z2k8.bj0bf\sketch_dec30a\sketch_dec30a.ino:52:79: error: cannot resolve overloaded function 'min' based on conversion to type 'int'
   set_year = year;set_mont = mont;set_datat = datat;set_hour = hour;set_min = min;set_sec = sec;
                                                                               ^~~
C:\Users\User\AppData\Local\Temp\.arduinoIDE-unsaved20231130-5288-c6z2k8.bj0bf\sketch_dec30a\sketch_dec30a.ino:77:8: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator=='
  if(min==30&&sec<10){a[0]=sec%10+20;a[1]=sec%10+20;a[2]=sec%10+20;a[3]=sec%10+20;a[4]=sec%10+20;a[5]=sec%10+20;a[6]=sec%10+20;a[7]=sec%10+20;
     ~~~^~~~
C:\Users\User\AppData\Local\Temp\.arduinoIDE-unsaved20231130-5288-c6z2k8.bj0bf\sketch_dec30a\sketch_dec30a.ino:102:12: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator%'
   a[11]=min%10;
         ~~~^~~
C:\Users\User\AppData\Local\Temp\.arduinoIDE-unsaved20231130-5288-c6z2k8.bj0bf\sketch_dec30a\sketch_dec30a.ino:103:12: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator/'
   a[12]=min/10;
         ~~~^~~
C:\Users\User\AppData\Local\Temp\.arduinoIDE-unsaved20231130-5288-c6z2k8.bj0bf\sketch_dec30a\sketch_dec30a.ino:118:51: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator%'
   if(sett==2){if(times<=500||w1==1){w1=0;a[11]=min%10;a[12]=min/10;}else{a[11]=11;a[12]=11;}}
                                                ~~~^~~
C:\Users\User\AppData\Local\Temp\.arduinoIDE-unsaved20231130-5288-c6z2k8.bj0bf\sketch_dec30a\sketch_dec30a.ino:118:64: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator/'
   if(sett==2){if(times<=500||w1==1){w1=0;a[11]=min%10;a[12]=min/10;}else{a[11]=11;a[12]=11;}}
                                                             ~~~^~~
C:\Users\User\AppData\Local\Temp\.arduinoIDE-unsaved20231130-5288-c6z2k8.bj0bf\sketch_dec30a\sketch_dec30a.ino: In function 'void wr()':
C:\Users\User\AppData\Local\Temp\.arduinoIDE-unsaved20231130-5288-c6z2k8.bj0bf\sketch_dec30a\sketch_dec30a.ino:128:31: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator%'
a[9]=sec/10;a[10]=11;a[11]=min%10;a[12]=min/10;a[13]=11;a[14]=hour%10;a[15]=hour/10;}
                            ~~~^~~
C:\Users\User\AppData\Local\Temp\.arduinoIDE-unsaved20231130-5288-c6z2k8.bj0bf\sketch_dec30a\sketch_dec30a.ino:128:44: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator/'
a[9]=sec/10;a[10]=11;a[11]=min%10;a[12]=min/10;a[13]=11;a[14]=hour%10;a[15]=hour/10;}
                                         ~~~^~~

exit status 1

Compilation error: 'byte min' redeclared as different kind of symbol

17 (2023-12-30 04:09:16 отредактировано aprdetali)

Re: Часы на игп-17 (разработка)

Я использую скетч, выложенный в форуме. Для часов без платы датчика, самый первый

18

Re: Часы на игп-17 (разработка)

вот этот:
// ATMEGA8535 16 MHZ
#define ADDR    0x68
#define CPU_F   16000000 // Clock Speed
#define SCL_F   400000 // // I2C Speed
#define TEMP_KORR 20 // -2гр.Цельсия

#include <avr/io.h>
#include <util/delay.h>

byte a[16],an,segm,i;
bool w=1,w1;
byte sec,min,hour,datat,mont,year;
int temper,sett,times;
int set_hour,set_min,set_sec,set_datat,set_mont,set_year;


int main(){
  DDRA = 0xFF;
  DDRB = 0xFF;
  DDRC = 0xFF;
  DDRD |= (1 << PD6)|(1 << PD7);
  PORTD |= (1 << PD2)|(1 << PD3)|(1 << PD4);
  TWBR = (((CPU_F)/(SCL_F)-16 )/2) ;
  TWSR = 0;
  DDRD |= (1 << PD5); // PWM +180V TIMER_1
  cli();
// TIMER_2  F = 16000000/128/100=1250 Hz (800 uS)
  OCR2 = 100;
  TCCR2 |= (1 << WGM21);
  TCCR2 |= (1 << CS22) | (1 << CS20);
  TIMSK |= (1 << OCIE2);
// TIMER_1  F = 16000000/1024/1/1=15625 Hz
  TCCR1A |= (1 << COM1A1);
  TCCR1B |= (1 << WGM12);
  TCCR1A |= (1 << WGM11) | (1 << WGM10);
  TCCR1B |= (1 << CS10);
  ICR1 = 1023;
  OCR1A = 350;
  sei();
// set_time(22,2,2,4,22,23,0);// год 00-99, ДН 1-7 (1=ВС), месяц 1-12, дата 1-31, час 0-23, минуты 0-59, секунды 0-59
  _delay_ms(200);
   

while(1) {
  datat = ((i2c_read(ADDR,4) & 0x0F) + ((i2c_read(ADDR,4) & 0x70) >> 4) * 10);
  mont = ((i2c_read(ADDR,5) & 0x0F) + ((i2c_read(ADDR,5) & 0x70) >> 4) * 10);
  year = ((i2c_read(ADDR,6) & 0x0F) + ((i2c_read(ADDR,6) & 0x70) >> 4) * 10);
  hour = (i2c_read(ADDR,2) & 0x0F) + (((i2c_read(ADDR,2) & 0x70) >> 4) * 10);
  min =  (i2c_read(ADDR,1) & 0x0F) + (((i2c_read(ADDR,1) & 0x70) >> 4) * 10);
  if(sec==10||sec==40) temper = (((i2c_read(ADDR,0x11)&0b01111111)*10 + ((i2c_read(ADDR,0x12) & 0b11000000) >> 6)*2.5))-TEMP_KORR ;
  sec =  (i2c_read(ADDR,0) & 0x0F) + (((i2c_read(ADDR,0) & 0x70) >> 4) * 10);
  set_year = year;set_mont = mont;set_datat = datat;set_hour = hour;set_min = min;set_sec = sec;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/// BUTTON ///////////// 
  if(((PIND >> PD2) & 1) == 0){sett++;times=0;if(sett>6){sett=0;}wr();_delay_ms(300);}
 
  if(((PIND >> PD3) & 1) == 0 && sett==1){set_hour++;w1=1; if(set_hour>23){set_hour=23;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==1){set_hour--;w1=1; if(set_hour<0){set_hour=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==2){set_min++;w1=1; if(set_mont>59){set_min=59;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==2){set_min--;w1=1; if(set_mont<0){set_min=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==3){set_sec=0;w1=1; set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==3){set_sec=0;w1=1; set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==4){set_datat++;w1=1; if(set_datat>31){set_datat=31;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==4){set_datat--;w1=1; if(set_datat<0){set_datat=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==5){set_mont++;w1=1; if(set_mont>12){set_mont=12;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==5){set_mont--;w1=1; if(set_mont<0){set_mont=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==6){set_year++;w1=1; if(set_year>50){set_year=50;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==6){set_year--;w1=1; if(set_year<22){set_year=22;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}     

if(sett==0){
if(min==30&&sec<10){a[0]=sec%10+20;a[1]=sec%10+20;a[2]=sec%10+20;a[3]=sec%10+20;a[4]=sec%10+20;a[5]=sec%10+20;a[6]=sec%10+20;a[7]=sec%10+20;
  a[8]=sec%10+20;a[9]=sec%10+20;a[10]=sec%10+20;a[11]=sec%10+20;a[12]=sec%10+20;a[13]=sec%10+20;a[14]=sec%10+20;a[15]=sec%10+20;}
else{
  if((sec>=10&&sec<=20)||(sec>=40&&sec<=50)){
  a[0]=14;
  a[1]=13;
  a[2]=temper%10;
  a[3]=temper/10%10+20;
  a[4]=temper/100;
  a[5]=10;
  a[6]=12; 
  }
  else{
  a[0]=10;
  a[1]=year%10;
  a[2]=year/10;
  a[3]=mont%10+20;
  a[4]=mont/10;
  a[5]=datat%10+20;
  a[6]=datat/10;
  }
  a[7]=10;
  a[8]=sec%10;
  a[9]=sec/10;
  a[10]=11;
  a[11]=min%10;
  a[12]=min/10;
  a[13]=11;
  a[14]=hour%10;
  a[15]=hour/10;
}
}// sett=0

if(sett>0){
  a[0]=10;
  if(sett==6){if(times<=500||w1==1){w1=0;a[1]=year%10+20;a[2]=year/10;}else{a[1]=11;a[2]=11;}}
  if(sett==5){if(times<=500||w1==1){w1=0;a[3]=mont%10+20;a[4]=mont/10;}else{a[3]=11;a[4]=11;}}
  if(sett==4){if(times<=500||w1==1){w1=0;a[5]=datat%10+20;a[6]=datat/10;}else{a[5]=11;a[6]=11;}}
  a[7]=10;
  if(sett==3){if(times<=500||w1==1){w1=0;a[8]=sec%10;a[9]=sec/10;}else{a[8]=11;a[9]=11;}}
  a[10]=11;
  if(sett==2){if(times<=500||w1==1){w1=0;a[11]=min%10;a[12]=min/10;}else{a[11]=11;a[12]=11;}}
  a[13]=11;
  if(sett==1){if(times<=500||w1==1){w1=0;a[14]=hour%10;a[15]=hour/10;}else{a[14]=11;a[15]=11;}}
  if(sett!=3){a[8]=sec%10;a[9]=sec/10;}
}// sett>0

if(sett==0){_delay_ms(100);}
}}

void wr(){a[0]=10;a[1]=year%10; a[2]=year/10;a[3]=mont%10+20;a[4]=mont/10;a[5]=datat%10+20;a[6]=datat/10;a[7]=10;a[8]=sec%10;
a[9]=sec/10;a[10]=11;a[11]=min%10;a[12]=min/10;a[13]=11;a[14]=hour%10;a[15]=hour/10;}


ISR(TIMER2_COMP_vect){
  switch(i){
    case 0:  segm=a[0];  an=16;  anod(); _delay_us(600); segment(); if(a[0]==10)an=16;else an=0;  anod(); break;
    case 1:  segm=a[1];  an=16;  anod(); _delay_us(600); segment(); if(a[1]==10)an=16;else an=1;  anod(); break;
    case 2:  segm=a[2];  an=16;  anod(); _delay_us(600); segment(); if(a[2]==10)an=16;else an=2;  anod(); break;
    case 3:  segm=a[3];  an=16;  anod(); _delay_us(600); segment(); if(a[3]==10)an=16;else an=3;  anod(); break;
    case 4:  segm=a[4];  an=16;  anod(); _delay_us(600); segment(); if(a[4]==10)an=16;else an=4;  anod(); break;
    case 5:  segm=a[5];  an=16;  anod(); _delay_us(600); segment(); if(a[5]==10)an=16;else an=5;  anod(); break;
    case 6:  segm=a[6];  an=16;  anod(); _delay_us(600); segment(); if(a[6]==10)an=16;else an=6;  anod(); break;
    case 7:  segm=a[7];  an=16;  anod(); _delay_us(600); segment(); if(a[7]==10)an=16;else an=7;  anod(); break;
    case 8:  segm=a[8];  an=16;  anod(); _delay_us(400); segment(); an=8;  anod(); break;
    case 9:  segm=a[9];  an=16;  anod(); _delay_us(400); segment(); an=9;  anod(); break;
   case 10:  segm=a[10]; an=16;  anod(); _delay_us(400); segment(); an=10; anod(); break;
   case 11:  segm=a[11]; an=16;  anod(); _delay_us(400); segment(); an=11; anod(); break;
   case 12:  segm=a[12]; an=16;  anod(); _delay_us(400); segment(); an=12; anod(); break;
   case 13:  segm=a[13]; an=16;  anod(); _delay_us(400); segment(); an=13; anod(); break;
   case 14:  segm=a[14]; an=16;  anod(); _delay_us(400); segment(); an=14; anod(); break;
   case 15:  segm=a[15]; an=16;  anod(); _delay_us(400); segment(); an=15; anod(); break;
    }i++;if(i>15){i=0;}times++;if(times>600){times=0;}}

void segment(){                                                               
   switch(segm){                                                                 
             //       GECDXBFA
    case 0: PORTA = 0b01110111;break;
    case 1: PORTA = 0b00100100;break;
    case 2: PORTA = 0b11010101;break;
    case 3: PORTA = 0b10110101;break;
    case 4: PORTA = 0b10100110;break;
    case 5: PORTA = 0b10110011;break;
    case 6: PORTA = 0b11110011;break;
    case 7: PORTA = 0b00100101;break;
    case 8: PORTA = 0b11110111;break;         
    case 9: PORTA = 0b10110111;break;
              //       GECDXBFA
    case 20: PORTA = 0b01111111;break;
    case 21: PORTA = 0b00101100;break;
    case 22: PORTA = 0b11011101;break;
    case 23: PORTA = 0b10111101;break;
    case 24: PORTA = 0b10101110;break;
    case 25: PORTA = 0b10111011;break;
    case 26: PORTA = 0b11111011;break;
    case 27: PORTA = 0b00101101;break;
    case 28: PORTA = 0b11111111;break;         
    case 29: PORTA = 0b10111111;break;
              //       GECDXBFA
    case 10: PORTA = 0b00000000;break; // пусто
    case 11: PORTA = 0b10000000;break; // -
    case 12: PORTA = 0b11010010;break; // t
    case 13: PORTA = 0b10000111;break; // гр
    case 14: PORTA = 0b01010011;break; // C
  }}
   

void anod(){
switch(an){                                                             
    case 0: PORTC &=~(1<<PC7);PORTB |=(1<<PB0);break;
    case 1: PORTB &=~(1<<PB0);PORTB |=(1<<PB1);break;
    case 2: PORTB &=~(1<<PB1);PORTB |=(1<<PB2);break;
    case 3: PORTB &=~(1<<PB2);PORTB |=(1<<PB3);break;
    case 4: PORTB &=~(1<<PB3);PORTB |=(1<<PB4);break;
    case 5: PORTB &=~(1<<PB4);PORTB |=(1<<PB5);break;
    case 6: PORTB &=~(1<<PB5);PORTB |=(1<<PB6);break;
    case 7: PORTB &=~(1<<PB6);PORTB |=(1<<PB7);break; 
    case 8: PORTB &=~(1<<PB7);PORTD |=(1<<PD6);break;
    case 9: PORTD &=~(1<<PD6);PORTD |=(1<<PD7);break;
   case 10: PORTD &=~(1<<PD7);PORTC |=(1<<PC2);break;
   case 11: PORTC &=~(1<<PC2);PORTC |=(1<<PC3);break;
   case 12: PORTC &=~(1<<PC3);PORTC |=(1<<PC4);break;
   case 13: PORTC &=~(1<<PC4);PORTC |=(1<<PC5);break;
   case 14: PORTC &=~(1<<PC5);PORTC |=(1<<PC6);break;
   case 15: PORTC &=~(1<<PC6);PORTC |=(1<<PC7);break;       
   case 16: PORTB &=~(1<<PB0);PORTB &=~(1<<PB1);PORTB &=~(1<<PB2);PORTB &=~(1<<PB3);PORTB &=~(1<<PB4);PORTB &=~(1<<PB5);PORTB &=~(1<<PB6);PORTB &=~(1<<PB7);
   PORTD &=~(1<<PD6);PORTD &=~(1<<PD7);PORTC &=~(1<<PC2);PORTC &=~(1<<PC3);PORTC &=~(1<<PC4);PORTC &=~(1<<PC5);PORTC &=~(1<<PC6);PORTC &=~(1<<PC7);break;                                                     
  }}

byte i2c_read(byte i2c_addr, byte i2c_reg){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_addr << 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_reg;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT)));
   TWDR = (i2c_addr << 1) | 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   byte i2c_data = TWDR; 
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); // СТОП
   return i2c_data;
  }

void i2c_write(byte i2c_addr, byte i2c_reg, byte i2c_dat){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_addr << 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_reg;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_dat;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); // СТОП
  } 

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

19

Re: Часы на игп-17 (разработка)

// ATMEGA8535 16 MHZ
#define ADDR    0x68
#define CPU_F   16000000 // Clock Speed
#define SCL_F   400000 // // I2C Speed
#define TEMP_KORR 20 // -2гр.Цельсия

#include <avr/io.h>
#include <util/delay.h>

byte a[16],an,segm,i;
bool w=1,w1;
byte sec,min_,hour,datat,mont,year;
int temper,sett,times;
int set_hour,set_min,set_sec,set_datat,set_mont,set_year;


int main(){
  DDRA = 0xFF;
  DDRB = 0xFF;
  DDRC = 0xFF;
  DDRD |= (1 << PD6)|(1 << PD7);
  PORTD |= (1 << PD2)|(1 << PD3)|(1 << PD4);
  TWBR = (((CPU_F)/(SCL_F)-16 )/2) ;
  TWSR = 0;
  DDRD |= (1 << PD5); // PWM +180V TIMER_1
  cli();
// TIMER_2  F = 16000000/128/100=1250 Hz (800 uS)
  OCR2 = 100;
  TCCR2 |= (1 << WGM21);
  TCCR2 |= (1 << CS22) | (1 << CS20);
  TIMSK |= (1 << OCIE2);
// TIMER_1  F = 16000000/1024/1/1=15625 Hz
  TCCR1A |= (1 << COM1A1);
  TCCR1B |= (1 << WGM12);
  TCCR1A |= (1 << WGM11) | (1 << WGM10);
  TCCR1B |= (1 << CS10); 
  ICR1 = 1023; 
  OCR1A = 350; 
  sei();
 // set_time(22,2,2,4,22,23,0);// год 00-99, ДН 1-7 (1=ВС), месяц 1-12, дата 1-31, час 0-23, минуты 0-59, секунды 0-59
  _delay_ms(200); 
   

while(1) { 
  datat = ((i2c_read(ADDR,4) & 0x0F) + ((i2c_read(ADDR,4) & 0x70) >> 4) * 10);
  mont = ((i2c_read(ADDR,5) & 0x0F) + ((i2c_read(ADDR,5) & 0x70) >> 4) * 10);
  year = ((i2c_read(ADDR,6) & 0x0F) + ((i2c_read(ADDR,6) & 0x70) >> 4) * 10); 
  hour = (i2c_read(ADDR,2) & 0x0F) + (((i2c_read(ADDR,2) & 0x70) >> 4) * 10);
  min_ =  (i2c_read(ADDR,1) & 0x0F) + (((i2c_read(ADDR,1) & 0x70) >> 4) * 10);
  if(sec==10||sec==40) temper = (((i2c_read(ADDR,0x11)&0b01111111)*10 + ((i2c_read(ADDR,0x12) & 0b11000000) >> 6)*2.5))-TEMP_KORR ;
  sec =  (i2c_read(ADDR,0) & 0x0F) + (((i2c_read(ADDR,0) & 0x70) >> 4) * 10);
  set_year = year;set_mont = mont;set_datat = datat;set_hour = hour;set_min = min_;set_sec = sec;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/// BUTTON /////////////  
  if(((PIND >> PD2) & 1) == 0){sett++;times=0;if(sett>6){sett=0;}wr();_delay_ms(300);}
  
  if(((PIND >> PD3) & 1) == 0 && sett==1){set_hour++;w1=1; if(set_hour>23){set_hour=23;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==1){set_hour--;w1=1; if(set_hour<0){set_hour=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==2){set_min++;w1=1; if(set_mont>59){set_min=59;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==2){set_min--;w1=1; if(set_mont<0){set_min=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==3){set_sec=0;w1=1; set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==3){set_sec=0;w1=1; set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==4){set_datat++;w1=1; if(set_datat>31){set_datat=31;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==4){set_datat--;w1=1; if(set_datat<0){set_datat=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==5){set_mont++;w1=1; if(set_mont>12){set_mont=12;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==5){set_mont--;w1=1; if(set_mont<0){set_mont=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);} 

  if(((PIND >> PD3) & 1) == 0 && sett==6){set_year++;w1=1; if(set_year>50){set_year=50;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==6){set_year--;w1=1; if(set_year<22){set_year=22;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}      
 
 if(sett==0){
 if(min_==30&&sec<10){a[0]=sec%10+20;a[1]=sec%10+20;a[2]=sec%10+20;a[3]=sec%10+20;a[4]=sec%10+20;a[5]=sec%10+20;a[6]=sec%10+20;a[7]=sec%10+20;
  a[8]=sec%10+20;a[9]=sec%10+20;a[10]=sec%10+20;a[11]=sec%10+20;a[12]=sec%10+20;a[13]=sec%10+20;a[14]=sec%10+20;a[15]=sec%10+20;}
 else{ 
  if((sec>=10&&sec<=20)||(sec>=40&&sec<=50)){
  a[0]=14;
  a[1]=13;
  a[2]=temper%10;
  a[3]=temper/10%10+20;
  a[4]=temper/100;
  a[5]=10;
  a[6]=12;  
  }
  else{
  a[0]=10;
  a[1]=year%10;
  a[2]=year/10;
  a[3]=mont%10+20;
  a[4]=mont/10;
  a[5]=datat%10+20;
  a[6]=datat/10;
  }
  a[7]=10;
  a[8]=sec%10;
  a[9]=sec/10;
  a[10]=11;
  a[11]=min_%10;
  a[12]=min_/10;
  a[13]=11;
  a[14]=hour%10;
  a[15]=hour/10;
}
}// sett=0

 if(sett>0){
  a[0]=10;
  if(sett==6){if(times<=500||w1==1){w1=0;a[1]=year%10+20;a[2]=year/10;}else{a[1]=11;a[2]=11;}}
  if(sett==5){if(times<=500||w1==1){w1=0;a[3]=mont%10+20;a[4]=mont/10;}else{a[3]=11;a[4]=11;}}
  if(sett==4){if(times<=500||w1==1){w1=0;a[5]=datat%10+20;a[6]=datat/10;}else{a[5]=11;a[6]=11;}}
  a[7]=10;
  if(sett==3){if(times<=500||w1==1){w1=0;a[8]=sec%10;a[9]=sec/10;}else{a[8]=11;a[9]=11;}}
  a[10]=11;
  if(sett==2){if(times<=500||w1==1){w1=0;a[11]=min_%10;a[12]=min_/10;}else{a[11]=11;a[12]=11;}}
  a[13]=11;
  if(sett==1){if(times<=500||w1==1){w1=0;a[14]=hour%10;a[15]=hour/10;}else{a[14]=11;a[15]=11;}}
  if(sett!=3){a[8]=sec%10;a[9]=sec/10;}
}// sett>0

if(sett==0){_delay_ms(100);}
 }}

void wr(){a[0]=10;a[1]=year%10; a[2]=year/10;a[3]=mont%10+20;a[4]=mont/10;a[5]=datat%10+20;a[6]=datat/10;a[7]=10;a[8]=sec%10;
a[9]=sec/10;a[10]=11;a[11]=min_%10;a[12]=min_/10;a[13]=11;a[14]=hour%10;a[15]=hour/10;}


ISR(TIMER2_COMP_vect){
  switch(i){
    case 0:  segm=a[0];  an=16;  anod(); _delay_us(600); segment(); if(a[0]==10)an=16;else an=0;  anod(); break;
    case 1:  segm=a[1];  an=16;  anod(); _delay_us(600); segment(); if(a[1]==10)an=16;else an=1;  anod(); break;
    case 2:  segm=a[2];  an=16;  anod(); _delay_us(600); segment(); if(a[2]==10)an=16;else an=2;  anod(); break;
    case 3:  segm=a[3];  an=16;  anod(); _delay_us(600); segment(); if(a[3]==10)an=16;else an=3;  anod(); break;
    case 4:  segm=a[4];  an=16;  anod(); _delay_us(600); segment(); if(a[4]==10)an=16;else an=4;  anod(); break;
    case 5:  segm=a[5];  an=16;  anod(); _delay_us(600); segment(); if(a[5]==10)an=16;else an=5;  anod(); break;
    case 6:  segm=a[6];  an=16;  anod(); _delay_us(600); segment(); if(a[6]==10)an=16;else an=6;  anod(); break;
    case 7:  segm=a[7];  an=16;  anod(); _delay_us(600); segment(); if(a[7]==10)an=16;else an=7;  anod(); break;
    case 8:  segm=a[8];  an=16;  anod(); _delay_us(400); segment(); an=8;  anod(); break;
    case 9:  segm=a[9];  an=16;  anod(); _delay_us(400); segment(); an=9;  anod(); break;
   case 10:  segm=a[10]; an=16;  anod(); _delay_us(400); segment(); an=10; anod(); break;
   case 11:  segm=a[11]; an=16;  anod(); _delay_us(400); segment(); an=11; anod(); break;
   case 12:  segm=a[12]; an=16;  anod(); _delay_us(400); segment(); an=12; anod(); break;
   case 13:  segm=a[13]; an=16;  anod(); _delay_us(400); segment(); an=13; anod(); break;
   case 14:  segm=a[14]; an=16;  anod(); _delay_us(400); segment(); an=14; anod(); break;
   case 15:  segm=a[15]; an=16;  anod(); _delay_us(400); segment(); an=15; anod(); break;
    }i++;if(i>15){i=0;}times++;if(times>600){times=0;}}

void segment(){                                                                
   switch(segm){                                                                 
             //       GECDXBFA
    case 0: PORTA = 0b01110111;break; 
    case 1: PORTA = 0b00100100;break; 
    case 2: PORTA = 0b11010101;break; 
    case 3: PORTA = 0b10110101;break; 
    case 4: PORTA = 0b10100110;break; 
    case 5: PORTA = 0b10110011;break; 
    case 6: PORTA = 0b11110011;break; 
    case 7: PORTA = 0b00100101;break; 
    case 8: PORTA = 0b11110111;break;          
    case 9: PORTA = 0b10110111;break;
              //       GECDXBFA
    case 20: PORTA = 0b01111111;break; 
    case 21: PORTA = 0b00101100;break; 
    case 22: PORTA = 0b11011101;break; 
    case 23: PORTA = 0b10111101;break; 
    case 24: PORTA = 0b10101110;break; 
    case 25: PORTA = 0b10111011;break; 
    case 26: PORTA = 0b11111011;break; 
    case 27: PORTA = 0b00101101;break; 
    case 28: PORTA = 0b11111111;break;          
    case 29: PORTA = 0b10111111;break;
              //       GECDXBFA
    case 10: PORTA = 0b00000000;break; // пусто 
    case 11: PORTA = 0b10000000;break; // -
    case 12: PORTA = 0b11010010;break; // t
    case 13: PORTA = 0b10000111;break; // гр
    case 14: PORTA = 0b01010011;break; // C
  }}
    

void anod(){
 switch(an){                                                             
    case 0: PORTC &=~(1<<PC7);PORTB |=(1<<PB0);break;
    case 1: PORTB &=~(1<<PB0);PORTB |=(1<<PB1);break; 
    case 2: PORTB &=~(1<<PB1);PORTB |=(1<<PB2);break; 
    case 3: PORTB &=~(1<<PB2);PORTB |=(1<<PB3);break; 
    case 4: PORTB &=~(1<<PB3);PORTB |=(1<<PB4);break; 
    case 5: PORTB &=~(1<<PB4);PORTB |=(1<<PB5);break; 
    case 6: PORTB &=~(1<<PB5);PORTB |=(1<<PB6);break; 
    case 7: PORTB &=~(1<<PB6);PORTB |=(1<<PB7);break;  
    case 8: PORTB &=~(1<<PB7);PORTD |=(1<<PD6);break;
    case 9: PORTD &=~(1<<PD6);PORTD |=(1<<PD7);break; 
   case 10: PORTD &=~(1<<PD7);PORTC |=(1<<PC2);break; 
   case 11: PORTC &=~(1<<PC2);PORTC |=(1<<PC3);break; 
   case 12: PORTC &=~(1<<PC3);PORTC |=(1<<PC4);break; 
   case 13: PORTC &=~(1<<PC4);PORTC |=(1<<PC5);break; 
   case 14: PORTC &=~(1<<PC5);PORTC |=(1<<PC6);break; 
   case 15: PORTC &=~(1<<PC6);PORTC |=(1<<PC7);break;       
   case 16: PORTB &=~(1<<PB0);PORTB &=~(1<<PB1);PORTB &=~(1<<PB2);PORTB &=~(1<<PB3);PORTB &=~(1<<PB4);PORTB &=~(1<<PB5);PORTB &=~(1<<PB6);PORTB &=~(1<<PB7);
   PORTD &=~(1<<PD6);PORTD &=~(1<<PD7);PORTC &=~(1<<PC2);PORTC &=~(1<<PC3);PORTC &=~(1<<PC4);PORTC &=~(1<<PC5);PORTC &=~(1<<PC6);PORTC &=~(1<<PC7);break;                                                     
  }} 

byte i2c_read(byte i2c_addr, byte i2c_reg){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_addr << 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_reg;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT))); 
   TWDR = (i2c_addr << 1) | 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   byte i2c_data = TWDR;  
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); // СТОП
   return i2c_data;
  }

void i2c_write(byte i2c_addr, byte i2c_reg, byte i2c_dat){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_addr << 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_reg;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_dat;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); // СТОП
  }  

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

20

Re: Часы на игп-17 (разработка)

Спасибо. Получилось загрузить прошивку в МК. Но когда пытаюсь экспортировать хекс, компиляция проходит , а затем выдает ошибку:

Скетч использует 5046 байт (64%) памяти устройства. Всего доступно 7808 байт.
Глобальные переменные используют 44 байт (8%) динамической памяти, оставляя 468 байт для локальных переменных. Максимум: 512 байт.
�⪠���� � ����㯥.
exit status 1

Compilation error: exit status 1

21

Re: Часы на игп-17 (разработка)

У меня нет таких проблем - Данный контент доступен только зарегистрированным пользователям.

22 (2024-01-15 02:10:00 отредактировано aprdetali)

Re: Часы на игп-17 (разработка)

Добрый день. Спасибо за файлы прошивок. Собрал часы на макетной плате, работают. Возвращаюсь к своей просьбе - возможно ли  доработка программы мк для использования датчика температуры DS18B20?

23

Re: Часы на игп-17 (разработка)

В железе не проверял, компиляция проходит. Вход PD0 или пин 14 для DS18b20

http://forum.rcl-radio.ru/uploads/images/2024/01/b7d6757c1da08f488f8014c1f82068dd.png


// ATMEGA8535 16 MHZ
#define ADDR    0x68
#define CPU_F   16000000 // Clock Speed
#define SCL_F   400000 // // I2C Speed
#define TEMP_KORR 20 // -2гр.Цельсия

#include <OneWire.h>            // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
#include <avr/io.h>
#include <util/delay.h>
OneWire  ds(8); // Вход датчика 18b20  PD8 PIN_14

byte a[16],an,segm,i;
bool w=1,w1;
byte sec,min_,hour,datat,mont,year;
int temper,sett,times;
int set_hour,set_min,set_sec,set_datat,set_mont,set_year;


int main(){
  DDRA = 0xFF;
  DDRB = 0xFF;
  DDRC = 0xFF;
  DDRD |= (1 << PD6)|(1 << PD7);
  PORTD |= (1 << PD2)|(1 << PD3)|(1 << PD4);
  TWBR = (((CPU_F)/(SCL_F)-16 )/2) ;
  TWSR = 0;
  DDRD |= (1 << PD5); // PWM +180V TIMER_1
  cli();
// TIMER_2  F = 16000000/128/100=1250 Hz (800 uS)
  OCR2 = 100;
  TCCR2 |= (1 << WGM21);
  TCCR2 |= (1 << CS22) | (1 << CS20);
  TIMSK |= (1 << OCIE2);
// TIMER_1  F = 16000000/1024/1/1=15625 Hz
  TCCR1A |= (1 << COM1A1);
  TCCR1B |= (1 << WGM12);
  TCCR1A |= (1 << WGM11) | (1 << WGM10);
  TCCR1B |= (1 << CS10); 
  ICR1 = 1023; 
  OCR1A = 350; 
  sei();
 // set_time(22,2,2,4,22,23,0);// год 00-99, ДН 1-7 (1=ВС), месяц 1-12, дата 1-31, час 0-23, минуты 0-59, секунды 0-59
  _delay_ms(200); 
   

while(1) { 
  datat = ((i2c_read(ADDR,4) & 0x0F) + ((i2c_read(ADDR,4) & 0x70) >> 4) * 10);
  mont = ((i2c_read(ADDR,5) & 0x0F) + ((i2c_read(ADDR,5) & 0x70) >> 4) * 10);
  year = ((i2c_read(ADDR,6) & 0x0F) + ((i2c_read(ADDR,6) & 0x70) >> 4) * 10); 
  hour = (i2c_read(ADDR,2) & 0x0F) + (((i2c_read(ADDR,2) & 0x70) >> 4) * 10);
  min_ =  (i2c_read(ADDR,1) & 0x0F) + (((i2c_read(ADDR,1) & 0x70) >> 4) * 10);
  if(sec==10||sec==40) temper = dsRead(0)-TEMP_KORR ;
  sec =  (i2c_read(ADDR,0) & 0x0F) + (((i2c_read(ADDR,0) & 0x70) >> 4) * 10);
  set_year = year;set_mont = mont;set_datat = datat;set_hour = hour;set_min = min_;set_sec = sec;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/// BUTTON /////////////  
  if(((PIND >> PD2) & 1) == 0){sett++;times=0;if(sett>6){sett=0;}wr();_delay_ms(300);}
  
  if(((PIND >> PD3) & 1) == 0 && sett==1){set_hour++;w1=1; if(set_hour>23){set_hour=23;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==1){set_hour--;w1=1; if(set_hour<0){set_hour=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==2){set_min++;w1=1; if(set_mont>59){set_min=59;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==2){set_min--;w1=1; if(set_mont<0){set_min=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==3){set_sec=0;w1=1; set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==3){set_sec=0;w1=1; set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==4){set_datat++;w1=1; if(set_datat>31){set_datat=31;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==4){set_datat--;w1=1; if(set_datat<0){set_datat=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}

  if(((PIND >> PD3) & 1) == 0 && sett==5){set_mont++;w1=1; if(set_mont>12){set_mont=12;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==5){set_mont--;w1=1; if(set_mont<0){set_mont=0;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);} 

  if(((PIND >> PD3) & 1) == 0 && sett==6){set_year++;w1=1; if(set_year>50){set_year=50;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}
  if(((PIND >> PD4) & 1) == 0 && sett==6){set_year--;w1=1; if(set_year<22){set_year=22;} set_time(set_year,0,set_mont,set_datat,set_hour,set_min,set_sec);wr();_delay_ms(300);}      
 
 if(sett==0){
 if(min_==30&&sec<10){a[0]=sec%10+20;a[1]=sec%10+20;a[2]=sec%10+20;a[3]=sec%10+20;a[4]=sec%10+20;a[5]=sec%10+20;a[6]=sec%10+20;a[7]=sec%10+20;
  a[8]=sec%10+20;a[9]=sec%10+20;a[10]=sec%10+20;a[11]=sec%10+20;a[12]=sec%10+20;a[13]=sec%10+20;a[14]=sec%10+20;a[15]=sec%10+20;}
 else{ 
  if((sec>=10&&sec<=20)||(sec>=40&&sec<=50)){
  a[0]=14;
  a[1]=13;
  a[2]=temper%10;
  a[3]=temper/10%10+20;
  a[4]=temper/100;
  a[5]=10;
  a[6]=12;  
  }
  else{
  a[0]=10;
  a[1]=year%10;
  a[2]=year/10;
  a[3]=mont%10+20;
  a[4]=mont/10;
  a[5]=datat%10+20;
  a[6]=datat/10;
  }
  a[7]=10;
  a[8]=sec%10;
  a[9]=sec/10;
  a[10]=11;
  a[11]=min_%10;
  a[12]=min_/10;
  a[13]=11;
  a[14]=hour%10;
  a[15]=hour/10;
}
}// sett=0

 if(sett>0){
  a[0]=10;
  if(sett==6){if(times<=500||w1==1){w1=0;a[1]=year%10+20;a[2]=year/10;}else{a[1]=11;a[2]=11;}}
  if(sett==5){if(times<=500||w1==1){w1=0;a[3]=mont%10+20;a[4]=mont/10;}else{a[3]=11;a[4]=11;}}
  if(sett==4){if(times<=500||w1==1){w1=0;a[5]=datat%10+20;a[6]=datat/10;}else{a[5]=11;a[6]=11;}}
  a[7]=10;
  if(sett==3){if(times<=500||w1==1){w1=0;a[8]=sec%10;a[9]=sec/10;}else{a[8]=11;a[9]=11;}}
  a[10]=11;
  if(sett==2){if(times<=500||w1==1){w1=0;a[11]=min_%10;a[12]=min_/10;}else{a[11]=11;a[12]=11;}}
  a[13]=11;
  if(sett==1){if(times<=500||w1==1){w1=0;a[14]=hour%10;a[15]=hour/10;}else{a[14]=11;a[15]=11;}}
  if(sett!=3){a[8]=sec%10;a[9]=sec/10;}
}// sett>0

if(sett==0){_delay_ms(100);}
 }}

void wr(){a[0]=10;a[1]=year%10; a[2]=year/10;a[3]=mont%10+20;a[4]=mont/10;a[5]=datat%10+20;a[6]=datat/10;a[7]=10;a[8]=sec%10;
a[9]=sec/10;a[10]=11;a[11]=min_%10;a[12]=min_/10;a[13]=11;a[14]=hour%10;a[15]=hour/10;}


ISR(TIMER2_COMP_vect){
  switch(i){
    case 0:  segm=a[0];  an=16;  anod(); _delay_us(600); segment(); if(a[0]==10)an=16;else an=0;  anod(); break;
    case 1:  segm=a[1];  an=16;  anod(); _delay_us(600); segment(); if(a[1]==10)an=16;else an=1;  anod(); break;
    case 2:  segm=a[2];  an=16;  anod(); _delay_us(600); segment(); if(a[2]==10)an=16;else an=2;  anod(); break;
    case 3:  segm=a[3];  an=16;  anod(); _delay_us(600); segment(); if(a[3]==10)an=16;else an=3;  anod(); break;
    case 4:  segm=a[4];  an=16;  anod(); _delay_us(600); segment(); if(a[4]==10)an=16;else an=4;  anod(); break;
    case 5:  segm=a[5];  an=16;  anod(); _delay_us(600); segment(); if(a[5]==10)an=16;else an=5;  anod(); break;
    case 6:  segm=a[6];  an=16;  anod(); _delay_us(600); segment(); if(a[6]==10)an=16;else an=6;  anod(); break;
    case 7:  segm=a[7];  an=16;  anod(); _delay_us(600); segment(); if(a[7]==10)an=16;else an=7;  anod(); break;
    case 8:  segm=a[8];  an=16;  anod(); _delay_us(400); segment(); an=8;  anod(); break;
    case 9:  segm=a[9];  an=16;  anod(); _delay_us(400); segment(); an=9;  anod(); break;
   case 10:  segm=a[10]; an=16;  anod(); _delay_us(400); segment(); an=10; anod(); break;
   case 11:  segm=a[11]; an=16;  anod(); _delay_us(400); segment(); an=11; anod(); break;
   case 12:  segm=a[12]; an=16;  anod(); _delay_us(400); segment(); an=12; anod(); break;
   case 13:  segm=a[13]; an=16;  anod(); _delay_us(400); segment(); an=13; anod(); break;
   case 14:  segm=a[14]; an=16;  anod(); _delay_us(400); segment(); an=14; anod(); break;
   case 15:  segm=a[15]; an=16;  anod(); _delay_us(400); segment(); an=15; anod(); break;
    }i++;if(i>15){i=0;}times++;if(times>600){times=0;}}

void segment(){                                                                
   switch(segm){                                                                 
             //       GECDXBFA
    case 0: PORTA = 0b01110111;break; 
    case 1: PORTA = 0b00100100;break; 
    case 2: PORTA = 0b11010101;break; 
    case 3: PORTA = 0b10110101;break; 
    case 4: PORTA = 0b10100110;break; 
    case 5: PORTA = 0b10110011;break; 
    case 6: PORTA = 0b11110011;break; 
    case 7: PORTA = 0b00100101;break; 
    case 8: PORTA = 0b11110111;break;          
    case 9: PORTA = 0b10110111;break;
              //       GECDXBFA
    case 20: PORTA = 0b01111111;break; 
    case 21: PORTA = 0b00101100;break; 
    case 22: PORTA = 0b11011101;break; 
    case 23: PORTA = 0b10111101;break; 
    case 24: PORTA = 0b10101110;break; 
    case 25: PORTA = 0b10111011;break; 
    case 26: PORTA = 0b11111011;break; 
    case 27: PORTA = 0b00101101;break; 
    case 28: PORTA = 0b11111111;break;          
    case 29: PORTA = 0b10111111;break;
              //       GECDXBFA
    case 10: PORTA = 0b00000000;break; // пусто 
    case 11: PORTA = 0b10000000;break; // -
    case 12: PORTA = 0b11010010;break; // t
    case 13: PORTA = 0b10000111;break; // гр
    case 14: PORTA = 0b01010011;break; // C
  }}
    

void anod(){
 switch(an){                                                             
    case 0: PORTC &=~(1<<PC7);PORTB |=(1<<PB0);break;
    case 1: PORTB &=~(1<<PB0);PORTB |=(1<<PB1);break; 
    case 2: PORTB &=~(1<<PB1);PORTB |=(1<<PB2);break; 
    case 3: PORTB &=~(1<<PB2);PORTB |=(1<<PB3);break; 
    case 4: PORTB &=~(1<<PB3);PORTB |=(1<<PB4);break; 
    case 5: PORTB &=~(1<<PB4);PORTB |=(1<<PB5);break; 
    case 6: PORTB &=~(1<<PB5);PORTB |=(1<<PB6);break; 
    case 7: PORTB &=~(1<<PB6);PORTB |=(1<<PB7);break;  
    case 8: PORTB &=~(1<<PB7);PORTD |=(1<<PD6);break;
    case 9: PORTD &=~(1<<PD6);PORTD |=(1<<PD7);break; 
   case 10: PORTD &=~(1<<PD7);PORTC |=(1<<PC2);break; 
   case 11: PORTC &=~(1<<PC2);PORTC |=(1<<PC3);break; 
   case 12: PORTC &=~(1<<PC3);PORTC |=(1<<PC4);break; 
   case 13: PORTC &=~(1<<PC4);PORTC |=(1<<PC5);break; 
   case 14: PORTC &=~(1<<PC5);PORTC |=(1<<PC6);break; 
   case 15: PORTC &=~(1<<PC6);PORTC |=(1<<PC7);break;       
   case 16: PORTB &=~(1<<PB0);PORTB &=~(1<<PB1);PORTB &=~(1<<PB2);PORTB &=~(1<<PB3);PORTB &=~(1<<PB4);PORTB &=~(1<<PB5);PORTB &=~(1<<PB6);PORTB &=~(1<<PB7);
   PORTD &=~(1<<PD6);PORTD &=~(1<<PD7);PORTC &=~(1<<PC2);PORTC &=~(1<<PC3);PORTC &=~(1<<PC4);PORTC &=~(1<<PC5);PORTC &=~(1<<PC6);PORTC &=~(1<<PC7);break;                                                     
  }} 

byte i2c_read(byte i2c_addr, byte i2c_reg){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_addr << 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_reg;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT))); 
   TWDR = (i2c_addr << 1) | 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   byte i2c_data = TWDR;  
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); // СТОП
   return i2c_data;
  }

void i2c_write(byte i2c_addr, byte i2c_reg, byte i2c_dat){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_addr << 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_reg;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_dat;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); // СТОП
  }  

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

float dsRead(byte x) {
  byte data[2], addr[8][8], kol = 0;
  while (ds.search(addr[kol])) {  // поиск датчиков, определение адреса и кол-ва датчиков
    kol++;
  } 
  ds.reset_search();  // Сброс поиска датчика
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0x44, 0);  // Измерение температуры с переносом данных в память
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0xBE);     // Обращение памяти
  for (byte i=0; i<9; i++) data[i]=ds.read();
  int raw=(data[1]<<8)|data[0];
  float value = (float)raw / 1.60; return value; // Расчет температуры и вывод  
}

24

Re: Часы на игп-17 (разработка)

Спасибо. Смогу проверить в железе в выходные

25

Re: Часы на игп-17 (разработка)

Александр, добрый день. проверил скетч, компиляция проходит, но при проверке в железе на макете происходит зависание часов при обращении к датчику.
http://forum.rcl-radio.ru/uploads/images/2024/01/91f023ca15b659267360243dacf76248.jpg