26

Re: attiny13

Все верно.

D8

27

Re: attiny13

Загрузил.
В монитор порта попадает инф, странно что первое нажатие  дает один код (4 знака) второе нажатие дает другой код.
Например: десять нажатий на кнопку "2" дают такие коды -5429, 5429, 5409, 5501, 5501, 5429, 5541, 5409, 5509.

28

Re: attiny13

коротко нажатие кнопки с интервалом 1-2 секунды, если нажимать и удерживать идет код удержания кнопки FFFFFFFF

Пульт держите на расстоянии 1-2 метра

29

Re: attiny13

Всё как сказано сделал.
Четыре нажатия с расстояния 1,5м и паузой 1,5-2сек дали четыре разных кода одной и той же кнопки.

30

Re: attiny13

Вы используете этот скетч - http://forum.rcl-radio.ru/viewtopic.php?pid=8952#p8952

Какой контроллера используете и частоту тактовой.

31 (2023-12-06 04:35:17 отредактировано Karl2233)

Re: attiny13

Да, код из 23 сообщения.
Контроллер Ардуино нано, 5В, 16МГц.

Правда подключение IR датчика не такое как нарисовал, а по даташиту:
GND = GND
VCС = через 100 Ом на +5В.
OUT = через 10кОм на +5В и на D8  Ардуино.

32

Re: attiny13

Буду думать

33 (2023-12-09 21:40:00 отредактировано Karl2233)

Re: attiny13

Уважаемый liman324,
может мою хотелку в 168 Атмегу впихнуть получится?
Нашел у себя один экз.
Видимо Атт13 слишком мала для такого.

34

Re: attiny13

Тогда стандартный скетч запуска IR

#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
IRrecv irrecv(12); 
decode_results ir; 
void setup() {
  Serial.begin(9600);
   irrecv.enableIRIn();

}

void loop() {
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  delay(200);
}

35

Re: attiny13

Не получается впихнуть Атмегу.
Уважаемый liman324,  может начальное ТЗ изменить что б в Аттини влезло?

Если код кнопок просто вписать в скетч - посмотреть его в другом Вашем скетче и прописать в этот.
Или это в принципе не возможно?

36

Re: attiny13

Вход D8
протестируйте на ардуино atmega328, на стабильность вывода кода кнопки пульта

bool start,stops;
byte hh,n;
unsigned long dat,data,code_ir,times;


void setup() {
  Serial.begin(9600);
  DDRB &= ~(1 << PB0);// D8 Arduino UNO INPUT IR
  PCICR |= (1 << PCIE0); // определяет группу входов PCIE0 PCINT0...7
  PCMSK0 |= (1 << PCINT0); // использовать PCINT0 в группе PCIE0


}

void loop() {
 if(start==1){stops=1;start=0;
  delayMicroseconds(13500);
 for(int i=0;i<120;i++){
  times=micros();
  if(i>47&&i<64){n++;}
 //Serial.print( ((PINB >> 0) & 1) ); 
 dat = ((PINB >> 0) & 1);  data+=(dat<<n);
 delayMicroseconds(525);
 times=micros()-times;
  }
 delay(300); Serial.println(data,HEX);data=0;n=0;
 stops=0; 
 //Serial.print(" ");Serial.println(times);
 }


}

ISR(PCINT0_vect) {if(stops==0){start=1;}}

37 (2023-12-26 20:18:50 отредактировано Karl2233)

Re: attiny13

http://forum.rcl-radio.ru/uploads/images/2023/12/46907cd580a4d03df84f27fc48593db2.png
десять нажатий подряд с метра и с паузой 3-4 сек.
Прям странно: в Вашей разработке с 75341 все коды считываются и потом отрабатывабтся программой отлично.

38

Re: attiny13

lcd nokia3410&&dht11. Схема запитана от 3v.
Первый вариант.

// Nokia LCD pin numbers
#define LCD_MOSI  PINB2 //DIN,SDA,data 
#define LCD_SCK   PINB4 //CLK,SCL,clock
#define LCD_CD    PINB1 //DC, D/C
#define LCD_RESET PINB0 //Res,reset
/*pin CS подключить на GND
pin Vout через конденсатор на GND */
/** Number of columns */
#define LCD_COL 96 //for Nokia 3310-84
/** Number of text rows */
#define LCD_ROW 10 //for Nokia 3310-6
#define DHT PINB3 
byte _hum, _temp;// переменные для влажности и температуры
extern const uint8_t SMALL_FONT[] PROGMEM;
const uint8_t SMALL_FONT[] PROGMEM = {
  0x7E, 0x81, 0x81, 0x81, 0x7E, // 30 0
  0x04, 0x82, 0xFF, 0x80, 0x00, // 31 1
  0xC2, 0xA1, 0x91, 0x89, 0x86, // 32 2
  0x42, 0x81, 0x89, 0x89, 0x76, // 33 3
  0x18, 0x14, 0x12, 0xFF, 0x10, // 34 4
  0x47, 0x89, 0x89, 0x89, 0x71, // 35 5
  0x7E, 0x89, 0x89, 0x89, 0x72, // 36 6
  0x01, 0xF1, 0x09, 0x05, 0x03, // 37 7
  0x76, 0x89, 0x89, 0x89, 0x76, // 38 8
  0x4E, 0x91, 0x91, 0x91, 0x7E, // 39 9
  0x08, 0x08, 0x08, 0x08, 0x08,  // 2d -
  0x01, 0x01, 0xFF, 0x01, 0x01,// т
  0xFF, 0x89, 0x89, 0x89, 0x81,//e
  0xFF, 0x02, 0x0C, 0x02, 0xFF,//м
  0xFF, 0x01, 0x01, 0x01, 0xFF,//п
  0xFF, 0x11, 0x11, 0x11, 0x0E,//p
  0x47, 0x88, 0x88, 0x88, 0x7F,//у
  0xFC, 0x12, 0x11, 0x12, 0xFC,//a
  0x00, 0x06, 0x09, 0x09, 0x06,//gradus
  0x7E, 0x81, 0x81, 0x81, 0x42,//c
  0xFF, 0x89, 0x89, 0x89, 0x76,//в
  0x80, 0x7E, 0x01, 0x01, 0xFF,//л
  0xF7, 0x08, 0xFF, 0x08, 0xF7,//ж
  0xFF, 0x08, 0x08, 0x08, 0xFF,//H
  0xFF, 0x88, 0x88, 0x88, 0x70,//Ь
  0x23, 0x13, 0x08, 0x64, 0x62,//%
  };


void setup() {
   uint8_t val = (1 << LCD_SCK) | (1 << LCD_MOSI) | (1 << LCD_RESET) | (1 << LCD_CD);
   PORTB &= ~val;
   DDRB |= val;
   PORTB |= (1 << LCD_RESET);
    lcdCommand(0x21);  // LCD Extended Commands.
   lcdCommand(0xA1);  // Set LCD Vop (Contrast).
   lcdCommand(0x04);  // Set Temp coefficent.
   lcdCommand(0x14);  // LCD bias mode 1:48.
   lcdCommand(0x20);  // LCD Normal commands
   lcdCommand(0x0C);  // Normal display, horizontal addressing
   // clear nokia LCD
    lcdCommand(0x80);
    lcdCommand(0x40);
    // Fill in the whole display with ZEROS
    for(uint16_t index = 0; index < (LCD_COL * LCD_ROW); index++)
     lcdData(0x00);
}

void loop() {
 dht_read(&_hum, &_temp);// опроса датчика
/*выводим температуру на экран*/
               lcdPrintChar(1, 8, 11);
               lcdPrintChar(1, 15,12);
               lcdPrintChar(1, 22,13);
               lcdPrintChar(1, 29,14);
               lcdPrintChar(1, 36,12);
               lcdPrintChar(1, 43,15);
               lcdPrintChar(1, 50,17);
               lcdPrintChar(1, 57,11);
               lcdPrintChar(1, 64,16);
               lcdPrintChar(1, 71,15);
               lcdPrintChar(1, 78,17);
               lcdPrintChar(3, 40,_temp / 10 % 10);
               lcdPrintChar(3, 47, _temp % 10);
               lcdPrintChar(3, 54, 18);
               lcdPrintChar(3, 61, 19);
  /*выводим влажность на экран*/
          
               lcdPrintChar(5, 15,20);
               lcdPrintChar(5, 22,21);
               lcdPrintChar(5, 29,17);
               lcdPrintChar(5, 36,22);
               lcdPrintChar(5, 43,23);
               lcdPrintChar(5, 50,0);
               lcdPrintChar(5, 57,19);
               lcdPrintChar(5, 64,11);
               lcdPrintChar(5, 71,24);
               lcdPrintChar(7, 40,_hum / 10 % 10);
               lcdPrintChar(7, 47, _hum % 10);
               lcdPrintChar(7, 54, 25);//%
              
               
}
/*Display Nokia3310*/
/** Transfer data to a slave (MSB first)
 *
 * @param sck the pin to use for the SCK output
 * @param mosi the pin to use for the MOSI output
 * @param data the data to transfer
 * @param bits the number of bits to transfer
 */
void sspiOutMSB(uint8_t sck, uint8_t mosi, uint16_t data, uint8_t bits) {
  uint16_t mask = (1 << (bits - 1));
  uint8_t output = (1 << mosi);
  uint8_t clock = (1 << sck);
  while(bits) {
    // Set data
    if(data&mask)
      PORTB |= output;
    else
      PORTB &= ~output;
    // Bring the clock high
    PORTB |= clock;
    // Move to the next bit
    mask = mask >> 1;
    bits--;
    // Bring the clock low again
    PORTB &= ~clock;
    }
  }

/** Send a data byte to the LCD
 *
 * @param data the data byte to send.
 */
void lcdData(uint8_t data) {
  // Bring CD high
  PORTB |= (1 << LCD_CD);
  // Send the data
  sspiOutMSB(LCD_SCK, LCD_MOSI, data, 8);
  }

/** Send a command byte to the LCD
 *
 * @param cmd the command byte to send.
 */
void lcdCommand(uint8_t cmd) {
  // Bring CD low
  PORTB &= ~(1 << LCD_CD);
  // Send the data
  sspiOutMSB(LCD_SCK, LCD_MOSI, cmd, 8);
  }

/** Write a single character
 */

void lcdPrintChar(uint8_t row, uint8_t col, uint8_t ch) {

  // Set the starting address
  const uint8_t *chdata = SMALL_FONT + (ch * 5);

    lcdCommand(0x80 | col);
    lcdCommand(0x40 | (row % LCD_ROW));
    // And send the column data
   for(uint8_t pixels = 0; pixels < 5; pixels++, chdata++) {
    uint8_t data = pgm_read_byte_near(chdata);
    lcdData(data);
    // for double sized font put
   // lcdData(data);
    };
  // Add the padding byte
//if(col < LCD_COL)
 lcdData(0x00);
  }
// общая функция опроса датчика
  byte dht_read(byte *hum, byte* temp) {
  byte data[5];// массив под данные датчика
  byte error=dht_start();// стартуем и получаем код ошибки в переменную

  if (error) return error; // если есть ошибки выходим с кодом ошибки
  
  // получаем 5 байт от датчика
  for (byte i=0; i<5; i++)
  {
    data[i]=dht_byte();
  }
  
  if (data[0]+data[1]+data[2]+data[3]!=data[4]) return 3; // если контрольная сумма не сошлась вернем ошибку 3
  
  *hum=data[0];// пишем данные влажности 
  *temp=data[2];// пишем данные температуры 
  return 0;// вернем 0 - ошибок нет.
}
// функция передачи условия "старт" на линию и проверка ответов от датчика.
 byte  dht_start(){
  DDRB|=(1<<DHT);// притянули линию к земле - 0
  _delay_ms(20);// пауза 20 мс 
  DDRB&=~(1<<DHT);// отпустили линию - 1
  _delay_us(40);// ждем 40 мкс чтобы попасть в середину низкого сигнала
  if (PINB&(1<<DHT)) return 1; // если на линии 1 ошибка - "датчик не ответил"
  _delay_us(80); // ждем 80 мкс чтобы попасть в середину высокого сигнала
  if (!(PINB&(1<<DHT))) return 2; // если на линии 0 ошибка - "датчик не готов "
  while(PINB&(1<<DHT));// ждем пока датчик не притянет линию к земле.
  return 0;// ошибок нет
}
// получение байта от датчика
byte dht_byte(){
  byte i=8, byte=0;// переменная для цикла и под байт
  while(i--){
    while(!(PINB&(1<<DHT)));// ждем пока линия не поднимится в 1
    _delay_us(40);// отступаем 40 мкс
    if (PINB&(1<<DHT)) {// если на линии 1 = приняли 1
      byte|=(1<<i);// поднимаем итый бит в 1
      while(PINB&(1<<DHT));// ждем пока линия упадет в 0
    }
  }
  return byte;// возвращаем полученный байт
}

http://forum.rcl-radio.ru/uploads/images/2023/12/df23c8e8b390ca3c9c2266bcb34e101e.jpg
Второй вариант с пониженным энергопотреблением

#include <avr/sleep.h>
#include <util/delay.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
// Nokia LCD pin numbers
#define LCD_MOSI  PINB2 //DIN,SDA,data 
#define LCD_SCK   PINB4 //CLK,SCL,clock
#define LCD_CD    PINB1 //DC, D/C
#define LCD_RESET PINB0 //Res,reset
/*pin CS подключить на GND
pin Vout через конденсатор на GND */
/** Number of columns */
#define LCD_COL 96 //for Nokia 3310-84
/** Number of text rows */
#define LCD_ROW 10 //for Nokia 3310-6
#define DHT PINB3 
byte _hum, _temp;// переменные для влажности и температуры
extern const uint8_t SMALL_FONT[] PROGMEM;
const uint8_t SMALL_FONT[] PROGMEM = {
  0x7E, 0x81, 0x81, 0x81, 0x7E, // 30 0
  0x04, 0x82, 0xFF, 0x80, 0x00, // 31 1
  0xC2, 0xA1, 0x91, 0x89, 0x86, // 32 2
  0x42, 0x81, 0x89, 0x89, 0x76, // 33 3
  0x18, 0x14, 0x12, 0xFF, 0x10, // 34 4
  0x47, 0x89, 0x89, 0x89, 0x71, // 35 5
  0x7E, 0x89, 0x89, 0x89, 0x72, // 36 6
  0x01, 0xF1, 0x09, 0x05, 0x03, // 37 7
  0x76, 0x89, 0x89, 0x89, 0x76, // 38 8
  0x4E, 0x91, 0x91, 0x91, 0x7E, // 39 9
  0x08, 0x08, 0x08, 0x08, 0x08,  // 2d -
  0x01, 0x01, 0xFF, 0x01, 0x01,// т
  0xFF, 0x89, 0x89, 0x89, 0x81,//e
  0xFF, 0x02, 0x0C, 0x02, 0xFF,//м
  0xFF, 0x01, 0x01, 0x01, 0xFF,//п
  0xFF, 0x11, 0x11, 0x11, 0x0E,//p
  0x47, 0x88, 0x88, 0x88, 0x7F,//у
  0xFC, 0x12, 0x11, 0x12, 0xFC,//a
  0x00, 0x06, 0x09, 0x09, 0x06,//gradus
  0x7E, 0x81, 0x81, 0x81, 0x42,//c
  0xFF, 0x89, 0x89, 0x89, 0x76,//в
  0x80, 0x7E, 0x01, 0x01, 0xFF,//л
  0xF7, 0x08, 0xFF, 0x08, 0xF7,//ж
  0xFF, 0x08, 0x08, 0x08, 0xFF,//H
  0xFF, 0x88, 0x88, 0x88, 0x70,//Ь
  0x23, 0x13, 0x08, 0x64, 0x62,//%
  };


void setup() {
   uint8_t val = (1 << LCD_SCK) | (1 << LCD_MOSI) | (1 << LCD_RESET) | (1 << LCD_CD);
   PORTB &= ~val;
   DDRB |= val;
   PORTB |= (1 << LCD_RESET);
    lcdCommand(0x21);  // LCD Extended Commands.
   lcdCommand(0xA1);  // Set LCD Vop (Contrast).
   lcdCommand(0x04);  // Set Temp coefficent.
   lcdCommand(0x14);  // LCD bias mode 1:48.
   lcdCommand(0x20);  // LCD Normal commands
   lcdCommand(0x0C);  // Normal display, horizontal addressing
   // clear nokia LCD
    lcdCommand(0x80);
    lcdCommand(0x40);
    // Fill in the whole display with ZEROS
    for(uint16_t index = 0; index < (LCD_COL * LCD_ROW); index++)
     lcdData(0x00);
     //set timer to 1 sec 
       WDTCR |= (0<<WDP3) | (1<<WDP2) | (1<<WDP1) | (0<<WDP0);
      // set timer to 0.5s
      // WDTCR |= (1<<WDP2) | (1<<WDP0);
      // set timer to 4 sec
      // WDTCR |= (1<<WDP3);
      // Set watchdog timer in interrupt mode
          WDTCR |= (1<<WDTIE);
          WDTCR |= (0<<WDE);   
          sei(); // Enable global interrupts
          set_sleep_mode(SLEEP_MODE_PWR_DOWN);
}

void loop() {
      
for (;;) {
    sleep_mode();   // go to sleep and wait for interrupt...
  }
}
/*Display Nokia3310*/
/** Transfer data to a slave (MSB first)
 *
 * @param sck the pin to use for the SCK output
 * @param mosi the pin to use for the MOSI output
 * @param data the data to transfer
 * @param bits the number of bits to transfer
 */
void sspiOutMSB(uint8_t sck, uint8_t mosi, uint16_t data, uint8_t bits) {
  uint16_t mask = (1 << (bits - 1));
  uint8_t output = (1 << mosi);
  uint8_t clock = (1 << sck);
  while(bits) {
    // Set data
    if(data&mask)
      PORTB |= output;
    else
      PORTB &= ~output;
    // Bring the clock high
    PORTB |= clock;
    // Move to the next bit
    mask = mask >> 1;
    bits--;
    // Bring the clock low again
    PORTB &= ~clock;
    }
  }

/** Send a data byte to the LCD
 *
 * @param data the data byte to send.
 */
void lcdData(uint8_t data) {
  // Bring CD high
  PORTB |= (1 << LCD_CD);
  // Send the data
  sspiOutMSB(LCD_SCK, LCD_MOSI, data, 8);
  }

/** Send a command byte to the LCD
 *
 * @param cmd the command byte to send.
 */
void lcdCommand(uint8_t cmd) {
  // Bring CD low
  PORTB &= ~(1 << LCD_CD);
  // Send the data
  sspiOutMSB(LCD_SCK, LCD_MOSI, cmd, 8);
  }

/** Write a single character
 */

void lcdPrintChar(uint8_t row, uint8_t col, uint8_t ch) {

  // Set the starting address
  const uint8_t *chdata = SMALL_FONT + (ch * 5);

    lcdCommand(0x80 | col);
    lcdCommand(0x40 | (row % LCD_ROW));
    // And send the column data
   for(uint8_t pixels = 0; pixels < 5; pixels++, chdata++) {
    uint8_t data = pgm_read_byte_near(chdata);
    lcdData(data);
    // for double sized font put
   // lcdData(data);
    };
  // Add the padding byte
//if(col < LCD_COL)
 lcdData(0x00);
  }
// общая функция опроса датчика
  byte dht_read(byte *hum, byte* temp) {
  byte data[5];// массив под данные датчика
  byte error=dht_start();// стартуем и получаем код ошибки в переменную

  if (error) return error; // если есть ошибки выходим с кодом ошибки
  
  // получаем 5 байт от датчика
  for (byte i=0; i<5; i++)
  {
    data[i]=dht_byte();
  }
  
  if (data[0]+data[1]+data[2]+data[3]!=data[4]) return 3; // если контрольная сумма не сошлась вернем ошибку 3
  
  *hum=data[0];// пишем данные влажности 
  *temp=data[2];// пишем данные температуры 
  return 0;// вернем 0 - ошибок нет.
}
// функция передачи условия "старт" на линию и проверка ответов от датчика.
 byte  dht_start(){
  DDRB|=(1<<DHT);// притянули линию к земле - 0
  _delay_ms(20);// пауза 20 мс 
  DDRB&=~(1<<DHT);// отпустили линию - 1
  _delay_us(40);// ждем 40 мкс чтобы попасть в середину низкого сигнала
  if (PINB&(1<<DHT)) return 1; // если на линии 1 ошибка - "датчик не ответил"
  _delay_us(80); // ждем 80 мкс чтобы попасть в середину высокого сигнала
  if (!(PINB&(1<<DHT))) return 2; // если на линии 0 ошибка - "датчик не готов "
  while(PINB&(1<<DHT));// ждем пока датчик не притянет линию к земле.
  return 0;// ошибок нет
}
// получение байта от датчика
byte dht_byte(){
  byte i=8, byte=0;// переменная для цикла и под байт
  while(i--){
    while(!(PINB&(1<<DHT)));// ждем пока линия не поднимится в 1
    _delay_us(40);// отступаем 40 мкс
    if (PINB&(1<<DHT)) {// если на линии 1 = приняли 1
      byte|=(1<<i);// поднимаем итый бит в 1
      while(PINB&(1<<DHT));// ждем пока линия упадет в 0
    }
  }
  return byte;// возвращаем полученный байт
}
ISR(WDT_vect) {
    
   dht_read(&_hum, &_temp);// опроса датчика
/*выводим температуру на экран*/
               lcdPrintChar(0, 8, 11);
               lcdPrintChar(0, 15,12);
               lcdPrintChar(0, 22,13);
               lcdPrintChar(0, 29,14);
               lcdPrintChar(0, 36,12);
               lcdPrintChar(0, 43,15);
               lcdPrintChar(0, 50,17);
               lcdPrintChar(0, 57,11);
               lcdPrintChar(0, 64,16);
               lcdPrintChar(0, 71,15);
               lcdPrintChar(0, 78,17);
               lcdPrintChar(2, 40,_temp / 10 % 10);
               lcdPrintChar(2, 47, _temp % 10);
               lcdPrintChar(2, 54, 18);
               lcdPrintChar(2, 61, 19);
  /*выводим влажность на экран*/
          
               lcdPrintChar(4, 15,20);
               lcdPrintChar(4, 22,21);
               lcdPrintChar(4, 29,17);
               lcdPrintChar(4, 36,22);
               lcdPrintChar(4, 43,23);
               lcdPrintChar(4, 50,0);
               lcdPrintChar(4, 57,19);
               lcdPrintChar(4, 64,11);
               lcdPrintChar(4, 71,24);
               lcdPrintChar(6, 40,_hum / 10 % 10);
               lcdPrintChar(6, 47, _hum % 10);
               lcdPrintChar(6, 54, 25);//%
              
  }

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

39 (2024-01-07 18:24:20 отредактировано Karl2233)

Re: attiny13

Всех с прошедшими, наступившими и наступающими!
На кону бутылка рома.
Нужен селектор входов.
Купил недорого Pioneer SA540, в нем было несколько проблем, устранил все, кроме одной: там организовано переключение входов через четыре зависимых подобия П2К.
Это жесть.
Выпаял, разобрал, там всё окислено.
Понимаю что лучше заменить на реле.
Вот и просьба: нужна прошивка на Аттини13 как селектор 4 входов.
Уважаемый liman324, можете помочь?
http://forum.rcl-radio.ru/uploads/images/2024/01/5a81f7b538e02afc3c04fe725a10e5a2.jpg
Логика работы простая: всегда включен только один вход(значит на трёх выходах "0").
Переключение происходит так: вначале отключается старый потом включается новый вход(важно что б не было даже шанса на одновременное включение двух входов).
Запоминание при выключении желательно, но не обязательно.

40

Re: attiny13

Тут все просто, вот скетч вольтметра http://forum.rcl-radio.ru/viewtopic.php?pid=3392#p3392

Надо просто создать условие при котором будут активны выходы

Нужно измерить напряжение на входе когда кнопки не нажаты, при этом напряжении выходы не переключаются, а далее нажимая кнопки измерить напряжение на входе и прописать их в скетч, но конечно не само напряжение а его цифровое значение.

41 (2024-01-07 19:46:01 отредактировано Karl2233)

Re: attiny13

liman324 пишет:

Тут все просто

Ага.
Ещё б китайско-зимбабвийский словарь, с ним я быстрее управлюсь...
В этом скетче идёт обращение напрямую, я так не умею.
Пробовал в Ардуино, но и там не сильно преуспел.
......
Александр, если не сложно, напишите, плз, программу.

42

Re: attiny13

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


Примерно так:

unsigned int u;
byte input;

void setup() {
 /// конфигурация АЦП 
   ADMUX |= (1<<MUX1);// ADC2 (PB4) input
   ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADIF);
   ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);// Division Factor 128
 ///
   DDRB |= (1 << PB0)|(1 << PB1)|(1 << PB2)|(1 << PB3);// пины PB0-PB3 как выходы
   
}
 

void loop() {
  while((ADCSRA & (1 << ADIF)) == 0);
   u = (ADCL|ADCH << 8);

 if(u>100 && u<200){input=0;}  
 if(u>200 && u<300){input=1;}  
 if(u>300 && u<400){input=2;}
 if(u>400 && u<500){input=3;}  
   

 switch(input){
  case 0: PORTB |= (1<<PB0);PORTB &=~(1 << PB1)|(1 << PB2)|(1 << PB3); break;
  case 1: PORTB |= (1<<PB1);PORTB &=~(1 << PB0)|(1 << PB2)|(1 << PB3); break;
  case 2: PORTB |= (1<<PB2);PORTB &=~(1 << PB0)|(1 << PB1)|(1 << PB3); break;
  case 3: PORTB |= (1<<PB3);PORTB &=~(1 << PB0)|(1 << PB1)|(1 << PB2); break;
  }        
}

Когда ни одна кнопка не нажата значение u должно быть выше 900, это аналогично подачи на вход около 5 В.

далее при нажатии первой кнопки значение u должно быть от 100 до 200 , это примерно 0,25-0,5 В

Эти условия Вы можете поменять сами при условии что 5 В равно числовому значению 1023, 2,5В = 511 и тд.

43 (2024-01-15 19:47:39 отредактировано Karl2233)

Re: attiny13

Уважаемый liman324, не взлетело.
Фьюзы заводские.
Схема как я изобразил, только 2 и 3 ноги Аттини поменял местами.
На делителе 0,45-0,95-1,4-2,4 Вольта при ненажатых кнопках.

Резисторы снизу вверх 1к8 +1к8+2к2+2к2 и на "+" 10к.

При включении 5 Вольт на 2 ноге, при нажатии второй кнопки, дополнительно появляется еденица на 7 ноге, при нажатии 3 кнопки = 1 на 6 ноге.
Четвертая кнопка(она первая снизу) ничего не даёт.
Я с делителем ошибся?

По идее, должно быть как четыре зависимые кнопки (включение одной отключает остальные).
Кажется я втупил - делитель надо было не так делать.
А вот так: http://forum.rcl-radio.ru/uploads/images/2024/01/d94846356c4093b4f1bc91da6472988a.jpeg

44

Re: attiny13

Я поправил код под напряжение на кнопках которые Вы указали

unsigned int u;
byte input;

void setup() {
 /// конфигурация АЦП 
   ADMUX |= (1<<MUX1);// ADC2 (PB4) input
   ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADIF);
   ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);// Division Factor 128
 ///
   DDRB |= (1 << PB0)|(1 << PB1)|(1 << PB2)|(1 << PB3);// пины PB0-PB3 как выходы
   
}
 

void loop() {
  while((ADCSRA & (1 << ADIF)) == 0);
   u = (ADCL|ADCH << 8);

 if(u>60 && u<160){input=0;}  
 if(u>160 && u<260){input=1;}  
 if(u>260 && u<460){input=2;}
 if(u>460 && u<600){input=3;}  
   

 switch(input){
  case 0: PORTB |= (1<<PB0);PORTB &=~(1 << PB1)|(1 << PB2)|(1 << PB3); break;
  case 1: PORTB |= (1<<PB1);PORTB &=~(1 << PB0)|(1 << PB2)|(1 << PB3); break;
  case 2: PORTB |= (1<<PB2);PORTB &=~(1 << PB0)|(1 << PB1)|(1 << PB3); break;
  case 3: PORTB |= (1<<PB3);PORTB &=~(1 << PB0)|(1 << PB1)|(1 << PB2); break;
  }        
}

45 (2024-01-15 20:21:09 отредактировано Karl2233)

Re: attiny13

Большое спасибо за помощь!
А схему делителя какую делать? Как первая или вторая?

46

Re: attiny13

Скетч написан под указанные напряжения, схема кнопок не имеет значения.

47

Re: attiny13

Не работает.
При включении питания, 5В на 6 ноге.
Поставил на третью ногу переменный резистор 50К и на землю.
С третьей ноги 10к на 5В.
Вращая переменник должно по очереди появляться 5В на 5-6-7-2 ногах.
Но нет: вначале на 5, потом на 6 и сразу на 7 и 2.
Когда кручу переменник уменьшая напрядение, то 5В на всех ногах, кроме 6.

48

Re: attiny13

Нужно точно установить значение напряжения нажатия кнопок:

if(u>60 && u<160){input=0;} 
if(u>160 && u<260){input=1;} 
if(u>260 && u<460){input=2;}
if(u>460 && u<600){input=3;}

Расчитывается по формуле:

1023/5*напряжение кнопки

пример-напряжение кнопки 2,1 В

1023/5*2.1 =430

430 это цифровое значение кнопки

Например это кнопка 2

то

if(u>400 && u<500){input=2;}

тоесть кнопка 1 должна быть меньше 400, а кнопка 3 больше 500

49 (2024-01-16 19:19:03 отредактировано Karl2233)

Re: attiny13

liman324 пишет:

Нужно точно установить значение напряжения нажатия кнопок:

По-идее, переменником (перед этим были просто 4 резистора) я поочередно обеспечиваю необходимое напряжение.
И когда оно меняется, должно меняться состояние выходов.
Верно?
А оно не меняется.

Ведь в начале на 3 ноге 5В.
Нажимая кнопку(=обеспечиваю нужное напряжение с делителя), должен включится соответствующий выход (и отклбчиться другой).
При отпускании кнопки, состояние должно остаться до нажатия другой кнопки.
Но так не получается.
Ведь у меня всегда на 3 ноге 5В.

50

Re: attiny13

Какое напряжение на входе когда ни одна кнопка не нажата?