Страница 16 из 36
Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 17:09:47
olegue
Ivanoff-iv, пины ардуино по умалчанию настроены на вход. Получается это и будет z-состояние?
Потому что если
если я едлаю pinmode(6,HIGH) ИЛИ PINMODE(6,LOW), то я просто выходит пина по умолчанию на строенный на входа притягиваю к плюсу или к земле.
Если так идием дальше, нужно теперь считаь значение пинов
valA= DigitalRead(6);
valB=DigitalRead(7);
valC=DigitalRead(8);
valD=DigitalRead(9);
а дальше что делать?
Добавлено after 5 minutes 29 seconds:
а , ну да, удобнее же взять пины одноо регистра
например PD0,pd1,pd2,pd3 и подать на них, а как из "взять"? Эти биты?
Добавлено after 2 minutes 10 seconds:
Надо глянуть чтение регистров Атмеги...
Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 17:16:10
roman.com
[uquote="olegue",url="/forum/viewtopic.php?p=4246405#p4246405"]если я едлаю pinmode(6,HIGH) ИЛИ PINMODE(6,LOW), то я просто выходит пина по умолчанию на строенный на входа притягиваю к плюсу или к земле.[/uquote]
это слишком сложный вопрос... для простых смертных))
[uquote="olegue",url="/forum/viewtopic.php?p=4246405#p4246405"]а как из "взять"? Эти биты?[/uquote]
простые смертные делают так
x = PINC; // в переменной х содержатся значения пинов 0,1,2,3,4,5,6,7 потр С
а можно и по отдельности ))
x0 = PINC.0; // в переменной х0 содержится значения пина 0 потр С
x1 = PINC.1; // в переменной х1 содержится значения пина 1 потр С
x2 = PINC.2; // в переменной х2 содержится значения пина 2 потр С
x3 = PINC.3; // в переменной х3 содержится значения пина 3 потр С
x4 = PINC.4; // в переменной х4 содержится значения пина 4 потр С
x5 = PINC.5; // в переменной х5 содержится значения пина 5 потр С
x6 = PINC.6; // в переменной х6 содержится значения пина 6 потр С
x7 = PINC.7; // в переменной х7 содержится значения пина 7 потр С
а можно и по другому))
[uquote="olegue",url="/forum/viewtopic.php?p=4246405#p4246405"]а дальше что делать?[/uquote]
преобразования HEX в DEC... ? я пересчитываю через счётчик... ))
Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 18:04:46
olegue
нагуглив вот это
https://www.geeksforgeeks.org/program-t ... al-number/
Спойлер
Код: Выделить всё
// C++ code to convert BCD to its
// decimal number(base 10).
// Including Header Files
#include <bits/stdc++.h>
using namespace std;
// Function to convert BCD to Decimal
int bcdToDecimal(string s)
{
int len = s.length(),
check = 0, check0 = 0;
int num = 0, sum = 0,
mul = 1, rev = 0;
// Iterating through the bits backwards
for (int i = len - 1; i >= 0; i--) {
// Forming the equivalent
// digit(0 to 9)
// from the group of 4.
sum += (s[i] - '0') * mul;
mul *= 2;
check++;
// Reinitialize all variables
// and compute the number.
if (check == 4 || i == 0) {
if (sum == 0 && check0 == 0) {
num = 1;
check0 = 1;
}
else {
// update the answer
num = num * 10 + sum;
}
check = 0;
sum = 0;
mul = 1;
}
}
// Reverse the number formed.
while (num > 0) {
rev = rev * 10 + (num % 10);
num /= 10;
}
if (check0 == 1)
return rev - 1;
return rev;
}
// Driver Code
int main()
{
string s = "100000101000";
// Function Call
cout << bcdToDecimal(s);
return 0;
}
но тут в строку надо преобразовать 4 бита
А мне бы надо функцию с 4мя параметрами
Добавлено after 6 minutes 43 seconds:
уже чуть ближе
https://math.stackexchange.com/question ... mal-number
Код: Выделить всё
x = [0 0 0 1];
n = length(x);
y = 0;
for i = 1:n
if x(i)
y = y + 2^(n-i);
end
end
Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 18:06:52
roman.com
[uquote="olegue",url="/forum/viewtopic.php?p=4246430#p4246430"]нагуглив вот это[/uquote]
щас подумаем... ))
а что у нас со звуком ? когда будем подключать AVR (читай Ардуина) к Интернету ?))
для интереса посмотрел как работает наш самодельный диктофон на ПК...
sampleRate = 8000
sampleSizeInBits = 8
видим непрерывный поток... по сети Интернет... в реальном времени ))
50 Гц - это помехи от микрофона... плохо экранирован... и без заземления))
слышим сигнал помехи от микрофона частотой 50 герц в динамике...
olegue ты тоже можешь себе сделать такой типа "монитор"... будешь смотреть как твои байты записываются на флешку... в реальном времени ))
всё работает)) но без шифрования))
включаем кнопочку "зашифровать" поток...
видим непрерывный поток... по сети Интернет... в реальном времени... в зашифрованном виде ))
тот же самый сигнал частотой 50 герц в динамике слышен как просто громкий шум... просто белый шум))
замечательно)) теперь никто нас не подслушает))
теперь надо подключить к сети Интернет... ATmega8 или ATmega328...
тут есть одна проблема... ATmega8 или ATmega328... шифруют слишком медленно...
Ардуина 16 мгц будет шифровать поток со скоростью ~2000 байт в секунду...
а нам надо шифровать поток со скоростью ~8000 байт в секунду...
этот вариант нам не подходит...
можно попробовать поменять протокол шифрования... например вместо AES128 использовать старый ГОСТ 28147-89...
неее... этот вариант нам тоже не подходит... старый ГОСТ 28147-89 работает ещё медленней...
для шифрования потока нужен более мощный процессор... типа ESP32 )) с частотой процессора 160/240 мгц )) тогда будет нормально.
точно))
сделаем радио диктофон по Wi-Fi на ESP32 )) с записью на ПК...
или радио микрофон по Wi-Fi на ESP32 ))
короче... будем петь в караоке ))

Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 18:23:55
olegue
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4246397#p4246397"]бсд 4 бита соответствует хексу - преобразовывать ничего не надо.[/uquote]
но для этого нужно получить именно это 4 бита из регистра в котором 8 бит. Как это сделать?
Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 18:31:57
roman.com
[uquote="olegue",url="/forum/viewtopic.php?p=4246441#p4246441"][uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4246397#p4246397"]бсд 4 бита соответствует хексу - преобразовывать ничего не надо.[/uquote]
но для этого нужно получить именно это 4 бита из регистра в котором 8 бит. Как это сделать?[/uquote]
эти ?
valA= DigitalRead(6);
valB=DigitalRead(7);
valC=DigitalRead(8);
valD=DigitalRead(9);
что это ? в регистре всего 8 бит... 0,1,2,3,4,5,6,7
откуда взялось эти 8 и 9 ?
Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 18:35:46
olegue
по сути ,е сли без заморочек и сдвиговых финтов то вот это
Добавлено after 2 minutes 52 seconds:
[uquote="roman.com",url="/forum/viewtopic.php?p=4246447#p4246447"]valA= DigitalRead(6);
valB=DigitalRead(7);
valC=DigitalRead(8);
valD=DigitalRead(9);
что это ? в регистре всего 8 бит... 0,1,2,3,4,5,6,7
откуда взялось эти 8 и 9 ?[/uquote]
это пины в которх лежат эти биты
Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 18:41:09
Dimon456
olegue писал(а):ошибки:
Вот полностью код
Спойлер
Код: Выделить всё
// Arduino Audio Recorder
#include <SdFat.h> // https://yadi.sk/d/zqi8-L5xruhFq
#include <EEPROM.h>
#include <RTClib.h>
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
SdFat sd;
SdFile rec;
RTC_DS1307 rtc;
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (1<<ADLAR))
volatile uint8_t sum_adc;
volatile bool n0=0, n1=0;
const int chipSelect = 4; /* Поменял на 10-pln */
unsigned long fileSize = 0L;
unsigned long waveChunk = 16;
unsigned int waveType = 1;
unsigned int numChannels = 1;
unsigned long sampleRate = 22050;
unsigned long bytesPerSec = 22050;
unsigned int blockAlign = 1;
unsigned int bitsPerSample = 8;
unsigned long dataSize = 0L;
unsigned long recByteCount = 0L;
unsigned long recByteSaved = 0L;
const int btnStart = 6;
const int btnStop = 5;
const int ledStart = 2;
const int ledStop = 3;
int recPressed = 0;
int stopPressed = 0;
unsigned long oldTime = 0L;
unsigned long newTime = 0L;
byte buf00[256]; // buffer array 1
byte buf01[256]; // buffer array 2
byte byte1, byte2, byte3, byte4;
unsigned int bufByteCount;
byte bufWrite;
unsigned long timer1;
int timer1on = 0;
//----------
//char NameRecord[4]; /* Имя нового - записываемого файла на SD-карту. */
int RecordNumber; /* Номер записи - храним в EEPROM. в диапазоне 0..255. */
char filename[12];
void setup() { // THIS RUNS ONCE
rtc.begin();
//EEPROM.put(0, 20000);
Setup_timer2();
Setup_ADC();
pinMode(10, OUTPUT);
pinMode(ledStart, OUTPUT);
pinMode(ledStop, OUTPUT);
pinMode(btnStop, INPUT_PULLUP);
pinMode(btnStart, INPUT_PULLUP);
if (sd.begin(chipSelect, SPI_FULL_SPEED)) { // initialise card on SPI to 8MHz SPI bus speed
for (int dloop = 0; dloop < 4; dloop++) {
digitalWrite(ledStart, !digitalRead(ledStart));
delay(100);
}
} else { // if error, flash LED twice per second, until reset
while (1) {
digitalWrite(ledStart, !digitalRead(ledStart));
delay(500);
}
}
}
void loop() { // THIS RUNS LOTS!
if (digitalRead(btnStart) == LOW && recPressed == 0) {
/* Записываем в RecordNumber, значение из ячейки №0 EEPROM, и прибавляем 1. */
/*RecordNumber = EEPROM.read(0) + 1;*/
if (RecordNumber == 32767)RecordNumber = 0;
/*RecordNumber==RecordNumber+1;*/
EEPROM.get(0,RecordNumber) ;
/* Записываем в ячейку №0 EEPROM, увеличенное значение RecordNumber. */
/*EEPROM.write(0, RecordNumber);*/
EEPROM.put(0, RecordNumber+1);
String str; //declaring string.
//
str = String(RecordNumber); //converting integer into a string.
while (str.length() < 6)
{
str = "0" + str;
}
str.concat(".wav");
str.toCharArray(filename, sizeof(filename));
/*str.toCharArray(NameRecord, 4); //passing the value of the string to the character array.*/
/*SdFile::dateTimeCallback(dateTime);*/
StartRec(); // launch StartRec method
timer1on = 0;
}
else if (digitalRead(btnStart) == HIGH && recPressed == 1 && timer1on == 0)
{
timer1 = millis();
timer1on = 1;
}
else if (digitalRead(btnStart) == LOW && recPressed == 1 && timer1on == 1) {
timer1on = 0;
}
else if (digitalRead(btnStart) == HIGH && recPressed == 1 && timer1on == 1 && (millis() - timer1) > 2000)
{
StopRec(); // launch StopRec method
/* Поэтому (Делаем программную перезагрузку). */
((void (*)())0x0000)(); /* Делаем программную перезагрузку - Arduino */
}
//if (recByteCount % 512 == 256 && recPressed == 1) {
// rec.write(buf00, 256); // save buf01 to card
// recByteSaved += 256;
//}
//if (recByteCount % 512 == 0 && recPressed == 1) {
// rec.write(buf01, 256); // save buf02 to card
// recByteSaved += 256;
//}
if (n0==0 && n1 == 1) {
rec.write(buf00, 256); // save buf01 to card
recByteSaved += 256;
n0=0; n1=0;
}
if (n0==1 && n1 == 0) {
rec.write(buf01, 256); // save buf02 to card
recByteSaved += 256;
n0=0; n1=0;
}
}
void StartRec() { // begin recording process
digitalWrite(ledStart, HIGH);
digitalWrite(ledStop, LOW);
recByteCount = 0;
recByteSaved = 0;
recPressed = 1; // recording button has been pressed
stopPressed = 0;
writeWavHeader();
//sbi (TIMSK2, OCIE2A); // enable timer interrupt, start grabbing audio
ADCSRA |= (1<<ADEN);
}
void StopRec() { // stop recording process, update WAV header, close file
//cbi (TIMSK2, OCIE2A); // disable timer interrupt
//writeOutHeader();
//digitalWrite(ledStart, LOW); // turn off recording LED
//digitalWrite(ledStop, HIGH); // light stop LED
//recPressed = 0;
//cbi (TIMSK2, OCIE2A); // disable timer interrupt
ADCSRA &= ~(1<<ADEN);
writeOutHeader();
digitalWrite(ledStart, LOW); // turn off recording LED
digitalWrite(ledStop, HIGH); // light stop LED
recPressed = 0;
}
void writeOutHeader() { // update WAV header with final filesize/datasize
rec.seekSet(4);
byte1 = recByteSaved & 0xff;
byte2 = (recByteSaved >> 8) & 0xff;
byte3 = (recByteSaved >> 16) & 0xff;
byte4 = (recByteSaved >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
rec.seekSet(40);
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
rec.close();
}
void dateTime(uint16_t* date, uint16_t* time) {
DateTime now = rtc.now();
// return date using FAT_DATE macro to format fields
*date = FAT_DATE(now.year(), now.month(), now.day());
// return time using FAT_TIME macro to format fields
*time = FAT_TIME(now.hour(), now.minute(), now.second());
}
void writeWavHeader() { // write out original WAV header to file
recByteSaved = 0;
// rec.open("rec00000.wav", O_CREAT | O_TRUNC | O_RDWR);
/*rec.open(NameRecord, O_CREAT | O_TRUNC | O_RDWR); /* Имя нового - записываемого файла на SD-карту. */
//DateTime now = rtc.now();
SdFile::dateTimeCallback(dateTime);
rec.open(filename, O_CREAT | O_TRUNC | O_RDWR); /* Имя нового - записываемого файла на SD-карту. */
//rec.timestamp(T_CREATE, now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second());
rec.write("RIFF");
byte1 = fileSize & 0xff;
byte2 = (fileSize >> 8) & 0xff;
byte3 = (fileSize >> 16) & 0xff;
byte4 = (fileSize >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
rec.write("WAVE");
rec.write("fmt ");
byte1 = waveChunk & 0xff;
byte2 = (waveChunk >> 8) & 0xff;
byte3 = (waveChunk >> 16) & 0xff;
byte4 = (waveChunk >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
byte1 = waveType & 0xff;
byte2 = (waveType >> 8) & 0xff;
rec.write(byte1); rec.write(byte2);
byte1 = numChannels & 0xff;
byte2 = (numChannels >> 8) & 0xff;
rec.write(byte1); rec.write(byte2);
byte1 = sampleRate & 0xff;
byte2 = (sampleRate >> 8) & 0xff;
byte3 = (sampleRate >> 16) & 0xff;
byte4 = (sampleRate >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
byte1 = bytesPerSec & 0xff;
byte2 = (bytesPerSec >> 8) & 0xff;
byte3 = (bytesPerSec >> 16) & 0xff;
byte4 = (bytesPerSec >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
byte1 = blockAlign & 0xff;
byte2 = (blockAlign >> 8) & 0xff;
rec.write(byte1); rec.write(byte2);
byte1 = bitsPerSample & 0xff;
byte2 = (bitsPerSample >> 8) & 0xff;
rec.write(byte1); rec.write(byte2);
rec.write("data");
byte1 = dataSize & 0xff;
byte2 = (dataSize >> 8) & 0xff;
byte3 = (dataSize >> 16) & 0xff;
byte4 = (dataSize >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
}
void Setup_timer2() {
//TCCR2B = _BV(CS21); // Timer2 Clock Prescaler to : 8
//TCCR2A = _BV(WGM21); // Interupt frequency = 16MHz / (8 x 90 + 1) = 22191Hz
//OCR2A = 90; // Compare Match register set to 90
}
void Setup_ADC() {
// ADMUX = 0x61; // set ADC to read pin A5, ADLAR to 1 (left adjust)
// cbi(ADCSRA, ADPS2); // set prescaler to 8 / ADC clock = 2MHz
// sbi(ADCSRA, ADPS1);
// sbi(ADCSRA, ADPS0);
// ADC initialization
DIDR0=(0<<ADC5D) | (0<<ADC4D) | (0<<ADC3D) | (0<<ADC2D) | (0<<ADC1D) | (0<<ADC0D);
ADMUX= (1<<MUX0) | ADC_VREF_TYPE;
ADCSRA=(0<<ADEN) | (1<<ADSC) | (1<<ADATE) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (0<<ADPS1) | (1<<ADPS0); // 500kHz
//sampleRate = 20000; bytesPerSec = 20000;
sampleRate = 19600; bytesPerSec = 19600;
//ADCSRA=(0<<ADEN) | (1<<ADSC) | (1<<ADATE) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0); // 250kHz
//sampleRate = 9800; bytesPerSec = 9800;
//sampleRate = 19230; bytesPerSec = 19230;
//ADCSRA=(0<<ADEN) | (1<<ADSC) | (1<<ADATE) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // 125kHz
//sampleRate = 4807; bytesPerSec = 4807;
ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
}
// ADC interrupt service routine
ISR(ADC_vect)
{
static uint8_t count = 0;
static uint8_t temp=0;
static uint32_t temp_adc=0;
static uint16_t count_buf = 0;
if(ADMUX & (1<<MUX0)){
temp = ADCH;
ADMUX = ADC_VREF_TYPE | (0<<MUX0);//set ch 0
if(count_buf < 256) {
buf00[count_buf] = temp;
} else buf01[count_buf - 256] = temp;
if(count_buf == 255) {
n0=0; n1=1;
}
if(++count_buf > 511) {
count_buf=0; n0=1; n1=0;
}
}else{
temp_adc += ADCH;
ADMUX = ADC_VREF_TYPE | (1<<MUX0);//set ch 1
if (++count > ((127))) {
count = 0;
sum_adc = temp_adc>>7;
temp_adc=0;
}
}
}
ISR(TIMER2_COMPA_vect) {
sbi(ADCSRA, ADSC); // start ADC sample
while (bit_is_set(ADCSRA, ADSC)); // wait until ADSC bit goes low = new sample ready
recByteCount++; // increment sample counter
bufByteCount++;
if (bufByteCount == 256 && bufWrite == 0) {
bufByteCount = 0;
bufWrite = 1;
} else if (bufByteCount == 256 & bufWrite == 1) {
bufByteCount = 0;
bufWrite = 0;
}
if (bufWrite == 0) {
buf00[bufByteCount] = ADCH;
}
if (bufWrite == 1) {
buf01[bufByteCount] = ADCH;
}
}
В ардуино иде собирается без проблем.
Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 19:05:46
roman.com
[uquote="olegue",url="/forum/viewtopic.php?p=4246448#p4246448"]это пины в которх лежат эти биты[/uquote]
берём переменную х и записываем в неё данные из пинов 0,1,2,3 потр С
if (PINC.0 == 1) {x |= 0b00000001;};
if (PINC.0 == 0) {x &= 0b11111110;};
if (PINC.1 == 1) {x |= 0b00000010;};
if (PINC.1 == 0) {x &= 0b11111101;};
if (PINC.2 == 1) {x |= 0b00000100;};
if (PINC.2 == 0) {x &= 0b11111011;};
if (PINC.3 == 1) {x |= 0b00001000;};
if (PINC.3 == 0) {x &= 0b11110111;};
в переменной х содержатся значения пинов 0,1,2,3 потр С
Добавлено after 20 minutes 42 seconds:
Dimon456 писал(а):Вот полностью код
на этой ардуине работать не будет
Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 19:40:49
Dimon456
roman.com писал(а):на этой ардуине работать не будет
если в 1 килобайт твой код укладывается, тогда давай, выкладывай.
Надо еще места на плюшки там оставить, на загрузчик и т.п.
roman.com писал(а):берём переменную х и записываем в неё данные из пинов 0,1,2,3 потр С
Спойлер
if (PINC.0 == 1) {x |= 0b00000001;};
if (PINC.0 == 0) {x &= 0b11111110;};
if (PINC.1 == 1) {x |= 0b00000010;};
if (PINC.1 == 0) {x &= 0b11111101;};
if (PINC.2 == 1) {x |= 0b00000100;};
if (PINC.2 == 0) {x &= 0b11111011;};
if (PINC.3 == 1) {x |= 0b00001000;};
if (PINC.3 == 0) {x &= 0b11110111;};
в переменной х содержатся значения пинов 0,1,2,3 потр С
Код: Выделить всё
x = ((PINC&(1<<0))?(1<<0):0) \
| ((PINC&(1<<1))?(1<<1):0) \
| ((PINC&(1<<2))?(1<<2):0) \
| ((PINC&(1<<3))?(1<<3):0);
Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 20:14:01
Ivanoff-iv
[uquote="roman.com",url="/forum/viewtopic.php?p=4246454#p4246454"]берём переменную х и записываем в неё данные из пинов 0,1,2,3 потр С
if (PINC.0 == 1) {x |= 0b00000001;};
if (PINC.0 == 0) {x &= 0b11111110;};
if (PINC.1 == 1) {x |= 0b0000[/uquote]
а нельзя зацепив провода к подряд идущим пинам одного порта сделать:
х=PINC&0x0f;
или х=(PINC>>2)&0x0f; (если пины начинаются не з 0, а со 2го)
?
Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 21:15:56
roman.com
Ivanoff-iv писал(а): нельзя зацепив провода к подряд идущим пинам одного порта сделать:
низя.
всё идёт в разнобой... как попало))
valA= DigitalRead(6);
valB=DigitalRead(7);
valC=DigitalRead(8);
valD=DigitalRead(9);
мы не ищем лёгких путей))
x = ((PINC&(1<<0))?(1<<0):0) \
| ((PINC&(1<<1))?(1<<1):0) \
| ((PINC&(1<<2))?(1<<2):0) \
| ((PINC&(1<<3))?(1<<3):0);
я смотрю ты просто помешался на сдвигах)) будь осторожней)) а то так ведь и самому сдвинуться можно))
а такты процессора посчитал ?
сравнил с этим ?
if (PINC.0 == 1) {x |= 0b00000001;};
if (PINC.0 == 0) {x &= 0b11111110;};
if (PINC.1 == 1) {x |= 0b00000010;};
if (PINC.1 == 0) {x &= 0b11111101;};
if (PINC.2 == 1) {x |= 0b00000100;};
if (PINC.2 == 0) {x &= 0b11111011;};
if (PINC.3 == 1) {x |= 0b00001000;};
if (PINC.3 == 0) {x &= 0b11110111;};
а с этим ?
x = 0;
if (PINC.0 == 1) {x |= 0b00000001;};
if (PINC.1 == 1) {x |= 0b00000010;};
if (PINC.2 == 1) {x |= 0b00000100;};
if (PINC.3 == 1) {x |= 0b00001000;};

Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 21:19:37
Dimon456
roman.com писал(а):а такты процессора посчитал ?
сравнил с этим ?
PINC.0
Откуда ты это выдрал? ИЗ CVAVR? Эта фича только есть у него.

Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 21:21:10
roman.com
ну да... у ардуины фич нет)) видимо поэтому они такие тормознутые))
Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 21:36:00
olegue
Код: Выделить всё
if (PINC.0 == 1) {x |= 0b00000001;};
if (PINC.0 == 0) {x &= 0b11111110;};
if (PINC.1 == 1) {x |= 0b00000010;};
if (PINC.1 == 0) {x &= 0b11111101;};
if (PINC.2 == 1) {x |= 0b00000100;};
if (PINC.2 == 0) {x &= 0b11111011;};
if (PINC.3 == 1) {x |= 0b00001000;};
if (PINC.3 == 0) {x &= 0b11110111;};
у ардуины такого нету, тока если так, допустим:
Код: Выделить всё
if ((PIND &(1<<PD0))==1) {x |= 0b00000001;};
if ((PIND &(1<<PD0))==0) {x &= 0b11111110;};
if ((PIND &(1<<PD1))==1) {x |= 0b00000010;};
if ((PIND &(1<<PD1))==0) {x &= 0b11111101;};
if ((PIND &(1<<PD2))==1) {x |= 0b00000100;};
if ((PIND &(1<<PD2))==0) {x &= 0b11111011;};
if ((PIND &(1<<PD3))==1) {x |= 0b00001000;};
if ((PIND &(1<<PD3))==0) {x &= 0b11110111;};
если это правильно? Ардуино ИДЕ пропускает
Но короткие решения мне , конечно, больше нравиться.
Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 21:37:28
Dimon456
roman.com писал(а):а такты процессора посчитал ?
сравнил с этим ?
На, застрелись
Спойлер


Выкинь этот компилятор
Спойлер

Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 21:41:27
olegue
roman.com,
olegue писал(а):Добавлено after 5 minutes 29 seconds:
а , ну да, удобнее же взять пины одноо регистра
например PD0,pd1,pd2,pd3 и подать на них, а как из "взять"? Эти биты?
я потом прикинул , что так даже будет лучше, другие участники дисскусси это заметили и предложили свои решения исходя из изменившихся условий задачи.
Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 21:44:32
Dimon456
Вам надо поменять биты местами
Код: Выделить всё
x = ((PINC&(1<<0))?(1<<3):0) \
| ((PINC&(1<<1))?(1<<1):0) \
| ((PINC&(1<<2))?(1<<2):0) \
| ((PINC&(1<<3))?(1<<0):0);
или пины местами
Код: Выделить всё
x = ((PINC&(1<<2))?(1<<0):0) \
| ((PINC&(1<<1))?(1<<1):0) \
| ((PINC&(1<<3))?(1<<2):0) \
| ((PINC&(1<<7))?(1<<3):0);
Re: Ардуино - запись звука
Добавлено: Чт июн 16, 2022 22:32:01
olegue
Dimon456 писал(а):Вам надо поменять биты местами
Код:
x = ((PINC&(1<<0))?(1<<3):0) \
| ((PINC&(1<<1))?(1<<1):0) \
| ((PINC&(1<<2))?(1<<2):0) \
| ((PINC&(1<<3))?(1<<0):0);
или пины местами
Dimon456,
это мне было обращено, если честно, я не совсем понял
к этому коду была реплика?
Код: Выделить всё
if ((PIND &(1<<PD0))==1) {x |= 0b00000001;};
if ((PIND &(1<<PD0))==0) {x &= 0b11111110;};
if ((PIND &(1<<PD1))==1) {x |= 0b00000010;};
if ((PIND &(1<<PD1))==0) {x &= 0b11111101;};
if ((PIND &(1<<PD2))==1) {x |= 0b00000100;};
if ((PIND &(1<<PD2))==0) {x &= 0b11111011;};
if ((PIND &(1<<PD3))==1) {x |= 0b00001000;};
if ((PIND &(1<<PD3))==0) {x &= 0b11110111;};
Re: Ардуино - запись звука
Добавлено: Пт июн 17, 2022 00:37:28
roman.com
[uquote="olegue",url="/forum/viewtopic.php?p=4246551#p4246551"]
Код: Выделить всё
if (PINC.0 == 1) {x |= 0b00000001;};
if (PINC.0 == 0) {x &= 0b11111110;};
if (PINC.1 == 1) {x |= 0b00000010;};
if (PINC.1 == 0) {x &= 0b11111101;};
if (PINC.2 == 1) {x |= 0b00000100;};
if (PINC.2 == 0) {x &= 0b11111011;};
if (PINC.3 == 1) {x |= 0b00001000;};
if (PINC.3 == 0) {x &= 0b11110111;};
у ардуины такого нету, тока если так, допустим:
Код: Выделить всё
if ((PIND &(1<<PD0))==1) {x |= 0b00000001;};
if ((PIND &(1<<PD0))==0) {x &= 0b11111110;};
if ((PIND &(1<<PD1))==1) {x |= 0b00000010;};
if ((PIND &(1<<PD1))==0) {x &= 0b11111101;};
if ((PIND &(1<<PD2))==1) {x |= 0b00000100;};
if ((PIND &(1<<PD2))==0) {x &= 0b11111011;};
if ((PIND &(1<<PD3))==1) {x |= 0b00001000;};
if ((PIND &(1<<PD3))==0) {x &= 0b11110111;};
если это правильно? Ардуино ИДЕ пропускает[/uquote]
наверное для ардуины это и правильно)) мой компилятор такого не понимает ))
загрузи... проверь.
[uquote="olegue",url="/forum/viewtopic.php?p=4246551#p4246551"]Но короткие решения мне , конечно, больше нравиться.[/uquote]
ещё короче ?
x = 0;
if ((PIND &(1<<PD0))==1) {x |= 0b00000001;};
if ((PIND &(1<<PD1))==1) {x |= 0b00000010;};
if ((PIND &(1<<PD2))==1) {x |= 0b00000100;};
if ((PIND &(1<<PD3))==1) {x |= 0b00001000;};
или ещё короче ? ))
Dimon456 писал(а):roman.com писал(а):а такты процессора посчитал ?
сравнил с этим ?
На, застрелись
Спойлер


Выкинь этот компилятор
Спойлер

IN R22, PINC // -1 такт
LDI R21, 0b00000000 // -1 такт
SBRC R22, 0 // -1 такт
ORI R21, 0b00000001 // -1 такт
SBRC R22, 1 // -1 такт
ORI R21, 0b00000010 // -1 такт
SBRC R22, 2 // -1 такт
ORI R21, 0b00000100 // -1 такт
SBRC R22, 3 // -1 такт
ORI R21, 0b00001000 // -1 такт
OUT PORTD, R21 // -1 такт
итого: 11 тактов процессора
Dimon456 мы знаем что ты можешь лучше ! )) не сдавайся ! )) мы в тебя верим ! ))
