1

Тема: ATTINY2313 + ARDUINO IDE

http://forum.rcl-radio.ru/uploads/images/2021/03/33eb748b55c02bc6e8b8efb2dc2d76e0.png

http://drazzy.com/package_drazzy.com_index.json

http://forum.rcl-radio.ru/uploads/images/2021/03/1eb718f0b2d84a9107d1b4821613e04c.png

http://forum.rcl-radio.ru/uploads/images/2021/03/6f4b0737ffc2cca04743b9d70f014e64.png

http://forum.rcl-radio.ru/uploads/images/2021/03/26a83618c43f702b8bcf6b8f2ade3269.png

void setup() {
  pinMode(11, OUTPUT);// PIN14 PB2
}

void loop() {
  digitalWrite(11, HIGH);   
  delay(100);                       
  digitalWrite(11, LOW);   
  delay(100);              
}

2

Re: ATTINY2313 + ARDUINO IDE

void setup() {
  DDRB =  0b00000100; // PB2 OUTPUT
}

void loop() {
  PORTB |= (1 << 2);
  delay(100);
  PORTB &= ~(1 << 2);
  delay(100);             
}

Скетч использует 506 байт (24%) памяти устройства. Всего доступно 2048 байт.
Глобальные переменные используют 9 байт (7%) динамической памяти, оставляя 119 байт для локальных переменных. Максимум: 128 байт.


void setup() {
  pinMode(11, OUTPUT);// PIN14 PB2
}

void loop() {
  digitalWrite(11, HIGH);   
  delay(100);                       
  digitalWrite(11, LOW);   
  delay(100);              
}

Скетч использует 748 байт (36%) памяти устройства. Всего доступно 2048 байт.
Глобальные переменные используют 9 байт (7%) динамической памяти, оставляя 119 байт для локальных переменных. Максимум: 128 байт.

ПУСТОЙ СКЕТЧ

Скетч использует 256 байт (12%) памяти устройства. Всего доступно 2048 байт.
Глобальные переменные используют 9 байт (7%) динамической памяти, оставляя 119 байт для локальных переменных. Максимум: 128 байт.

3

Re: ATTINY2313 + ARDUINO IDE

http://forum.rcl-radio.ru/uploads/images/2021/03/92afe27d1b127ec3153667e0c8a23d07.png

В настройках платы нужно выбрать поддержку Attiny2313 и установить частоту кварца 16 МГц (16 MHz external), остальные параметры менять не нужно. Далее необходимо выставить нужные фьюзы для микроконтроллера, чтобы он всегда работал на выбранной Вами частоте. Для этого в настройках Arduino IDE выберите программатор USBasb и нажмите Инструменты > Записать загрузчик. Эту операцию необходимо проводить всего один и снова повторить если Вы будете менять частоту работы микроконтроллера.

4

Re: ATTINY2313 + ARDUINO IDE

EEPROM

void setup() {
  Serial.begin(9600);
  EEPROM_write(0,125);
  Serial.println(EEPROM_read(0));
}

void loop() {
  
}

unsigned char EEPROM_read(unsigned int uiAddress){
  while(EECR & (1<<EEPE));
    EEAR = uiAddress;
    EECR |= (1<<EERE);
    return EEDR;
}


void EEPROM_write(unsigned int uiAddress, unsigned char ucData){
    while(EECR & (1<<EEPE));
      EEAR = uiAddress;
      EEDR = ucData;
      EECR |= (1<<EEMPE);
      EECR |= (1<<EEPE);
}

5

Re: ATTINY2313 + ARDUINO IDE

tm1637

int i;

void setup() {
  DDRB =  0b00000000; 
 // EEPROM_write(0,125);

 // EEPROM_read(0);
}

void loop() {
  print_time(i++,1);
  delay(1000);
  
}

unsigned char EEPROM_read(unsigned int uiAddress){
  while(EECR & (1<<EEPE));
    EEAR = uiAddress;
    EECR |= (1<<EERE);
    return EEDR;
}


void EEPROM_write(unsigned int uiAddress, unsigned char ucData){
    while(EECR & (1<<EEPE));
      EEAR = uiAddress;
      EEDR = ucData;
      EECR |= (1<<EEMPE);
      EECR |= (1<<EEPE);
}


void tm_dec(byte dig){
         for(int i = 0; i < 8; i++) {
          DDRB |= (1 << 0);del();
         if (dig & 0x01)
          DDRB &= ~(1 << 1);
         else
          DDRB |= (1 << 1);del();
          DDRB &= ~(1 << 0);del();
           dig = dig >> 1;
  }
           DDRB |= (1 << 0);
           DDRB &= ~(1 << 1);del();
           DDRB &= ~(1 << 0);del();
           uint8_t ack = ((PINB >> 1) & 1);
         if (ack == 0)
           DDRB |= (1 << 1);del();
           DDRB |= (1 << 0);del();
  }  

void tm_stop(){
           DDRB |= (1 << 1);del();
           DDRB &= ~(1 << 0);del();
           DDRB &= ~(1 << 1);del();
  }  

void tm_start(){
           DDRB |= (1 << 1);del();
  }

void print_time(int t, bool pd_t){
        tm_start();tm_dec(0b10001000+7);tm_stop();tm_start();tm_dec(0x40);tm_stop();tm_start();
        
        int data0 = t/1000;
        int data1 = t/100%10;
        int data2 = t/10%10;
        int data3 = t%10;
        
        for(int n=0;n<4;n++){
        int data;
        if(n==0){data=data0;}
        if(n==1){data=data1;}
        if(n==2){data=data2;}
        if(n==3){data=data3;}
              
        switch(data){  // XGFEDCBA
        case 0:  data = 0b00111111;break;     // 0
        case 1:  data = 0b00000110;break;     // 1
        case 2:  data = 0b01011011;break;     // 2
        case 3:  data = 0b01001111;break;     // 3
        case 4:  data = 0b01100110;break;     // 4
        case 5:  data = 0b01101101;break;     // 5
        case 6:  data = 0b01111101;break;     // 6
        case 7:  data = 0b00000111;break;     // 7
        case 8:  data = 0b01111111;break;     // 8
        case 9:  data = 0b01101111;break;     // 9
        }
              
        if(n==0){data0=data;}
        if(n==1){data1=data;}
        if(n==2){data2=data;}
        if(n==3){data3=data;}
        }
        if(pd_t==1){data1=data1+0b10000000;}
        
        tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop();
}  

void del(){delayMicroseconds(100);}

Скетч использует 976 байт (47%) памяти устройства. Всего доступно 2048 байт.
Глобальные переменные используют 11 байт (8%) динамической памяти, оставляя 117 байт для локальных переменных. Максимум: 128 байт.

6

Re: ATTINY2313 + ARDUINO IDE

часы

http://forum.rcl-radio.ru/uploads/images/2021/03/9d150011cc4861b6b98a523ace10245d.png


// tm1637 PB0 === CLK
// tm1637 PB1 === DIO

int i,i1,hh,mm,bb;

void setup() {
  DDRB = 0b00000000; 
  PORTB |= (1 << 2) | (1 << 3);
   cli();  
  TCCR1A = 0;   
  TCCR1B = 0;   
  OCR1A = 18750; // 0.1 s
  TCCR1B |= (1 << WGM12); 
  TCCR1B |= (1 << CS11) | (1 << CS10);  // 256  
  TIMSK |= (1 << OCIE1A);  
   sei(); 
}

void loop() {
  print_time(hh * 100 + mm, bb, 7);// int число выводимое на индикатор, двоеточие, яркость от 0 до 7
  if(i1 <= 5){bb = 1;}else{bb = 0;}

  if(((PINB >> 2) & 1) == 0){mm++; if(mm>59){mm = 0;} delay(200);}
  if(((PINB >> 3) & 1) == 0){hh++; if(hh>23){hh = 0;} delay(200);}
}

void tm_dec(byte dig){
       for(int i = 0; i < 8; i++) {
         DDRB |= (1 << 0);del();
       if (dig & 0x01)
         DDRB &= ~(1 << 1);
       else
         DDRB |= (1 << 1);del();
         DDRB &= ~(1 << 0);del();
         dig = dig >> 1;
  }
         DDRB |= (1 << 0);
         DDRB &= ~(1 << 1);del();
         DDRB &= ~(1 << 0);del();
     
       if (((PINB >> 1) & 1) == 0)
         DDRB |= (1 << 1);del();
         DDRB |= (1 << 0);del();
  }  

void tm_stop(){
         DDRB |= (1 << 1);del();
         DDRB &= ~(1 << 0);del();
         DDRB &= ~(1 << 1);del();
  }  

void tm_start(){
         DDRB |= (1 << 1);del();
  }

void print_time(int t, bool pd_t, int br){
        tm_start();tm_dec(0b10001000 + br);//tm_stop();tm_start();
        tm_dec(0x40);tm_stop();tm_start();
        
        int data0 = t / 1000;
        int data1 = t / 100 % 10;
        int data2 = t / 10 % 10;
        int data3 = t % 10;
        
      for(byte n = 0; n < 4; n++){
        int data;
      switch(n){
        case 0: data = data0;break;
        case 1: data = data1;break;
        case 2: data = data2;break;
        case 3: data = data3;break;
        }
              
      switch(data){  // XGFEDCBA
        case 0:  data = 0b00111111;break;     // 0
        case 1:  data = 0b00000110;break;     // 1
        case 2:  data = 0b01011011;break;     // 2
        case 3:  data = 0b01001111;break;     // 3
        case 4:  data = 0b01100110;break;     // 4
        case 5:  data = 0b01101101;break;     // 5
        case 6:  data = 0b01111101;break;     // 6
        case 7:  data = 0b00000111;break;     // 7
        case 8:  data = 0b01111111;break;     // 8
        case 9:  data = 0b01101111;break;     // 9
        }
              
        if(n == 0){data0 = data;}
        if(n == 1){data1 = data;}
        if(n == 2){data2 = data;}
        if(n == 3){data3 = data;}
        }
      if(pd_t == 1){data1+= 0b10000000;}
      tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop();
}  

void del(){delayMicroseconds(100);}

ISR(TIMER1_COMPA_vect){
     i++;i1++;
     if(i1 > 9){i1 = 0;}
     if(i > 599){mm++;i = 0;}
     if(mm > 59){hh++;mm = 0;}
     if(hh > 23){hh = 0;}
     }

Скетч использует 1330 байт (64%) памяти устройства. Всего доступно 2048 байт.
Глобальные переменные используют 19 байт (14%) динамической памяти, оставляя 109 байт для локальных переменных. Максимум: 128 байт.

7

Re: ATTINY2313 + ARDUINO IDE

Часы + будильник

http://forum.rcl-radio.ru/uploads/images/2021/03/0753d3d16b1cdfd23e6f324611aeb32f.png


// tm1637       PB0 === CLK
// tm1637       PB1 === DIO
// zummer       PD5
// MM+          PB2
// HH+          PB3
// ALARM/TIME   PB4
// ALARM ON/OFF PD4
// led ALARM    PD3

int i,i1,hh,mm,bb,b_hh,b_mm,bud,blok;

void setup() {
  DDRB = 0b00000000; 
  DDRD = 0b00101000;
  PORTB |= (1 << 2) | (1 << 3) | (1 << 4);
  PORTD |= (1 << 4);
   cli();  
  TCCR1A = 0;   
  TCCR1B = 0;   
  OCR1A = 18750; // 0.1 s
  TCCR1B |= (1 << WGM12); 
  TCCR1B |= (1 << CS11) | (1 << CS10);  // 256  
  TIMSK |= (1 << OCIE1A);  
   sei(); 
   b_hh = EEPROM_read(1);
   b_mm = EEPROM_read(0);
}

void loop() {
  if(bud == 0){print_time(hh * 100 + mm, bb, 7);}// int число выводимое на индикатор, двоеточие, яркость от 0 до 7
  if(bud == 1){print_time(b_hh * 100 + b_mm, bb, 7);}// int число выводимое на индикатор, двоеточие, яркость от 0 до 7
  if(i1 <= 5){bb = 1;}else{bb = 0;} 
  if(bud == 1){bb = 1;}
  // button set time
  if(((PINB >> 2) & 1) == 0 && bud == 0){mm++; if(mm>59){mm = 0;} delay(200);}
  if(((PINB >> 3) & 1) == 0 && bud == 0){hh++; if(hh>23){hh = 0;} delay(200);}
  // button set alarm
  if(((PINB >> 4) & 1) == 0 && bud == 0){bud = 1; delay(200);}
  if(((PINB >> 4) & 1) == 0 && bud == 1){bud = 0; delay(200);}
  // button set time alarm
  if(((PINB >> 2) & 1) == 0 && bud == 1){b_mm++;  if(b_mm>59){b_mm = 0;}EEPROM_write(0,b_mm); delay(200);}
  if(((PINB >> 3) & 1) == 0 && bud == 1){b_hh++;  if(b_hh>23){b_hh = 0;}EEPROM_write(1,b_hh); delay(200);}
  // led alarm | button on/off
  if(((PIND >> 4) & 1) == 0 && blok == 1){blok = 0; delay(200);}
  if(((PIND >> 4) & 1) == 0 && blok == 0){blok = 1; delay(200);}
  if(blok == 1){PORTD &= ~(1 << 3);}else{PORTD |= (1 << 3);}
  // zummer
  if((hh * 100 + mm) == (b_hh * 100 + b_mm) && blok == 0){if(i1 <= 5){DDRD |= (1 << 5);pic();} else {DDRD &= ~(1 << 5);}}  
} // loop

void pic(){
  for(int g=0;g<1000;g++){
  PORTD |= (1 << 5);
  delayMicroseconds(150);
  PORTD &= ~(1 << 5);
  delayMicroseconds(100);}
  }

void tm_dec(byte dig){
       for(int i = 0; i < 8; i++) {
         DDRB |= (1 << 0);del();
       if (dig & 0x01)
         DDRB &= ~(1 << 1);
       else
         DDRB |= (1 << 1);del();
         DDRB &= ~(1 << 0);del();
         dig = dig >> 1;
  }
         DDRB |= (1 << 0);
         DDRB &= ~(1 << 1);del();
         DDRB &= ~(1 << 0);del();
     
       if (((PINB >> 1) & 1) == 0)
         DDRB |= (1 << 1);del();
         DDRB |= (1 << 0);del();
  }  

void tm_stop(){
         DDRB |= (1 << 1);del();
         DDRB &= ~(1 << 0);del();
         DDRB &= ~(1 << 1);del();
  }  

void tm_start(){
         DDRB |= (1 << 1);del();
  }

void print_time(int t, bool pd_t, int br){
        tm_start();tm_dec(0b10001000 + br);//tm_stop();tm_start();
        tm_dec(0x40);tm_stop();tm_start();
        
        int data0 = t / 1000;
        int data1 = t / 100 % 10;
        int data2 = t / 10 % 10;
        int data3 = t % 10;
        
      for(byte n = 0; n < 4; n++){
        int data;
      switch(n){
        case 0: data = data0;break;
        case 1: data = data1;break;
        case 2: data = data2;break;
        case 3: data = data3;break;
        }
              
      switch(data){  // XGFEDCBA
        case 0:  data = 0b00111111;break;     // 0
        case 1:  data = 0b00000110;break;     // 1
        case 2:  data = 0b01011011;break;     // 2
        case 3:  data = 0b01001111;break;     // 3
        case 4:  data = 0b01100110;break;     // 4
        case 5:  data = 0b01101101;break;     // 5
        case 6:  data = 0b01111101;break;     // 6
        case 7:  data = 0b00000111;break;     // 7
        case 8:  data = 0b01111111;break;     // 8
        case 9:  data = 0b01101111;break;     // 9
        }
              
        if(n == 0){data0 = data;}
        if(n == 1){data1 = data;}
        if(n == 2){data2 = data;}
        if(n == 3){data3 = data;}
        }
      if(pd_t == 1){data1+= 0b10000000;}
      tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop();
}  

void del(){delayMicroseconds(100);}

ISR(TIMER1_COMPA_vect){
     i++;i1++;
     if(i1 > 9){i1 = 0;}
     if(i > 599){mm++;i = 0;}
     if(mm > 59){hh++;mm = 0;}
     if(hh > 23){hh = 0;}
     }

unsigned char EEPROM_read(unsigned int uiAddress){
  while(EECR & (1<<EEPE));
    EEAR = uiAddress;
    EECR |= (1<<EERE);
    return EEDR;
}

void EEPROM_write(unsigned int uiAddress, unsigned char ucData){
    while(EECR & (1<<EEPE));
      EEAR = uiAddress;
      EEDR = ucData;
      EECR |= (1<<EEMPE);
      EECR |= (1<<EEPE);
}       
      

Скетч использует 1884 байт (91%) памяти устройства. Всего доступно 2048 байт.
Глобальные переменные используют 27 байт (21%) динамической памяти, оставляя 101 байт для локальных переменных. Максимум: 128 байт.

8

Re: ATTINY2313 + ARDUINO IDE

Хотел узнать тайну , почему версия библиотеки 2313  не последняя ?
И схема часов attiny2313 и lcd1602 как упростить под i2c ?

9

Re: ATTINY2313 + ARDUINO IDE

Хотел узнать тайну , почему версия библиотеки 2313  не последняя ?

На последней не шьется

И схема часов attiny2313 и lcd1602 как упростить под i2c ?

Очень сложно, я не смогу сделать

10 (2023-03-26 20:16:40 отредактировано selan61)

Re: ATTINY2313 + ARDUINO IDE

liman324 пишет:

часы

void setup() {
  DDRB = 0b00000000; 
  PORTB |= (1 << 2) | (1 << 3);
 

А что эти строчки означают? В них нет ошибки, раз используются PB0 и PB1?
И можно использовать скетч без кварца?

11

Re: ATTINY2313 + ARDUINO IDE

Порт B весь как вход, установить подтягивающие резисторы на входах PB2 PB3

12 (2023-04-08 14:42:31 отредактировано selan61)

Re: ATTINY2313 + ARDUINO IDE

Собрал на 2313а, без кварца. Версия ATTinyCore 1.5.2. При первой прошивке получил ошибку "avrdude: AVR Part "attiny2313a" not found." Почитал интернет, исправил в avrdude.conf - attiny2313 на attiny2313a. Заработало. Прошивал для пробы 8MHz(internal).
Кварца 12МГц нет. Часы сильно отстают. Подскажите, каким образом часы зависят от частоты? Мне кажется, тайминги должны быть приблизительно одинаковы при любой частоте. Просто с внешним кварцем, часы идут точнее, например за сутки, а с внутренним немного убегать. А у меня, за час, убегают минут на 15. Странно это.

13

Re: ATTINY2313 + ARDUINO IDE

Надо менять настройки таймера Т1 под свою частоту:

  TCCR1A = 0;   
  TCCR1B = 0;   
  OCR1A = 18750; // 0.1 s
  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS11) | (1 << CS10); 


Надо получить 100 мс

если CS11 и CS10 единицы, то исходя из даташита

http://forum.rcl-radio.ru/uploads/images/2023/04/b70c643acf78667f5c4e369f81d4d580.png

у Вас делитель 64

значит

(8000000/((12499+1)x64))=10 Hz

OCR1A должно быть равно 12499

14

Re: ATTINY2313 + ARDUINO IDE

liman324 пишет:

Надо менять настройки таймера Т1 под свою частоту:

Надо получить 100 мс

если CS11 и CS10 единицы, то у Вас делитель 64

значит

(8000000/((12499+1)x64))=10 Hz

OCR1A должно быть равно 12499

Спасибо за ответ. Но меня смутило, что у вас в комментариях к скетчу написано

TCCR1B |= (1 << CS11) | (1 << CS10);  // 256

Я понял что это делитель 256 и опираясь на это не мог пересчитать. А по даташиту действительно получается 64.

15 (2023-04-19 15:45:34 отредактировано selan61)

Re: ATTINY2313 + ARDUINO IDE

Если можно, ещё спрошу. Мне надо, чтобы при определенном событии, счет времени останавливался и индикатор показывал остановленное время. Сделал так:
ISR(TIMER1_COMPA_vect){
     i1++;
     if(detect == 0){i++;} // при detect не равном 0, счет останавливается
     if(i1 > 9) {i1 = 0;}
     if(i > 599){mm++; i = 0;}
     if(mm > 59){hh++; mm = 0;}
     if(hh > 23){hh = 0;}
Однако это почему то не работает и счет продолжается. Что не так?