Re: attiny13
Все верно.
D8
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Разное → attiny13
Все верно.
D8
Загрузил.
В монитор порта попадает инф, странно что первое нажатие дает один код (4 знака) второе нажатие дает другой код.
Например: десять нажатий на кнопку "2" дают такие коды -5429, 5429, 5409, 5501, 5501, 5429, 5541, 5409, 5509.
коротко нажатие кнопки с интервалом 1-2 секунды, если нажимать и удерживать идет код удержания кнопки FFFFFFFF
Пульт держите на расстоянии 1-2 метра
Всё как сказано сделал.
Четыре нажатия с расстояния 1,5м и паузой 1,5-2сек дали четыре разных кода одной и той же кнопки.
Вы используете этот скетч - http://forum.rcl-radio.ru/viewtopic.php?pid=8952#p8952
Какой контроллера используете и частоту тактовой.
Да, код из 23 сообщения.
Контроллер Ардуино нано, 5В, 16МГц.
Правда подключение IR датчика не такое как нарисовал, а по даташиту:
GND = GND
VCС = через 100 Ом на +5В.
OUT = через 10кОм на +5В и на D8 Ардуино.
Буду думать
Уважаемый liman324,
может мою хотелку в 168 Атмегу впихнуть получится?
Нашел у себя один экз.
Видимо Атт13 слишком мала для такого.
Тогда стандартный скетч запуска 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);
}
Не получается впихнуть Атмегу.
Уважаемый liman324, может начальное ТЗ изменить что б в Аттини влезло?
Если код кнопок просто вписать в скетч - посмотреть его в другом Вашем скетче и прописать в этот.
Или это в принципе не возможно?
Вход 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;}}
десять нажатий подряд с метра и с паузой 3-4 сек.
Прям странно: в Вашей разработке с 75341 все коды считываются и потом отрабатывабтся программой отлично.
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;// возвращаем полученный байт
}
Второй вариант с пониженным энергопотреблением
#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);//%
}
Программа "рисовалка"
Данный контент доступен только зарегистрированным пользователям.
Всех с прошедшими, наступившими и наступающими!
На кону бутылка рома.
Нужен селектор входов.
Купил недорого Pioneer SA540, в нем было несколько проблем, устранил все, кроме одной: там организовано переключение входов через четыре зависимых подобия П2К.
Это жесть.
Выпаял, разобрал, там всё окислено.
Понимаю что лучше заменить на реле.
Вот и просьба: нужна прошивка на Аттини13 как селектор 4 входов.
Уважаемый liman324, можете помочь?
Логика работы простая: всегда включен только один вход(значит на трёх выходах "0").
Переключение происходит так: вначале отключается старый потом включается новый вход(важно что б не было даже шанса на одновременное включение двух входов).
Запоминание при выключении желательно, но не обязательно.
Тут все просто, вот скетч вольтметра http://forum.rcl-radio.ru/viewtopic.php?pid=3392#p3392
Надо просто создать условие при котором будут активны выходы
Нужно измерить напряжение на входе когда кнопки не нажаты, при этом напряжении выходы не переключаются, а далее нажимая кнопки измерить напряжение на входе и прописать их в скетч, но конечно не само напряжение а его цифровое значение.
Тут все просто
Ага.
Ещё б китайско-зимбабвийский словарь, с ним я быстрее управлюсь...
В этом скетче идёт обращение напрямую, я так не умею.
Пробовал в Ардуино, но и там не сильно преуспел.
......
Александр, если не сложно, напишите, плз, программу.
Примерно так:
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 и тд.
Уважаемый 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 ноге.
Четвертая кнопка(она первая снизу) ничего не даёт.
Я с делителем ошибся?
По идее, должно быть как четыре зависимые кнопки (включение одной отключает остальные).
Кажется я втупил - делитель надо было не так делать.
А вот так:
Я поправил код под напряжение на кнопках которые Вы указали
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;
}
}
Большое спасибо за помощь!
А схему делителя какую делать? Как первая или вторая?
Скетч написан под указанные напряжения, схема кнопок не имеет значения.
Не работает.
При включении питания, 5В на 6 ноге.
Поставил на третью ногу переменный резистор 50К и на землю.
С третьей ноги 10к на 5В.
Вращая переменник должно по очереди появляться 5В на 5-6-7-2 ногах.
Но нет: вначале на 5, потом на 6 и сразу на 7 и 2.
Когда кручу переменник уменьшая напрядение, то 5В на всех ногах, кроме 6.
Нужно точно установить значение напряжения нажатия кнопок:
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
Нужно точно установить значение напряжения нажатия кнопок:
По-идее, переменником (перед этим были просто 4 резистора) я поочередно обеспечиваю необходимое напряжение.
И когда оно меняется, должно меняться состояние выходов.
Верно?
А оно не меняется.
Ведь в начале на 3 ноге 5В.
Нажимая кнопку(=обеспечиваю нужное напряжение с делителя), должен включится соответствующий выход (и отклбчиться другой).
При отпускании кнопки, состояние должно остаться до нажатия другой кнопки.
Но так не получается.
Ведь у меня всегда на 3 ноге 5В.
Какое напряжение на входе когда ни одна кнопка не нажата?
forum.rcl-radio.ru → Разное → attiny13
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|