Обсуждаем контроллеры компании Atmel.
Ответить

Re: Ардуино - запись звука

Пт июн 17, 2022 11:21:30

Интересно, пошто вы так долго и у-порно спорите? :))) Ардуинщики решили написать собственный скетч и не получается? :) Возьмите готовые на arduino.ru для АЦП и SD-флешки и не мучайтесь. Лучше бы конечно с внешнего аудио-ацп оцифровывать.
А для простого диктофона есть прикольные МЭМС-микрофоны с цифровым выходом.

Потому что нам надо обязательно из гамна и палок атмеги8 с родным ацп и оно с обычными библиотеками не влазит :)) без извратов на 328 вроде что надо заработало )

Re: Ардуино - запись звука

Пт июн 17, 2022 12:27:53

Вы такие радостные "профессианалы"... ТС не каждый день работает с мк. Вспомните себя некоторое время назад. Хотя не, вы же родились уже умными...

Re: Ардуино - запись звука

Пт июн 17, 2022 16:39:31

Код:
void loop() {

delay(1000);
   /* x = ((PINB&(1<<0))?(1<<0):0)       \
         | ((PINB&(1<<1))?(1<<1):0)    \
         | ((PINB&(1<<2))?(1<<2):0)    \
         | ((PINB&(1<<3))?(1<<3):0);*/
         
x = ((PINB&(1<<0))?(1<<3):0)       \
         | ((PINB&(1<<1))?(1<<1):0)    \
         | ((PINB&(1<<2))?(1<<2):0)    \
         | ((PINB&(1<<3))?(1<<0):0);
  // put your main code here, to run repeatedly:
  Serial.println("=======");
 Serial.println(digitalRead(8));
 Serial.println(digitalRead(9));
 Serial.println(digitalRead(10));
 Serial.println(digitalRead(11));
 Serial.println(x);
}


нормлаьно работает , но реальную шину пока не подкючал. Там единица получается по умолчанию. На массу сажу пины - десятичная цифра меняется.

Добавлено after 6 minutes 57 seconds:
это я в ардуине проверял на aTmega88 (16мгц),

Добавлено after 2 hours 34 minutes 6 seconds:
Martian,
Martian писал(а):ТС не каждый день работает с мк.



время от времени я обращаюсь к МК смотрю уроки,пытаюсь что-то делать, но как тока бросаю на полгода все очень быстро забывается.

Добавлено after 2 minutes 29 seconds:
Dimon456, Ваш код на контроле, в IDE без ошибок. Но пока нет возможности залить. Распечатал. Изучаю.

Добавлено after 3 minutes 40 seconds:
Dimon456 AudioRecorder code:
Спойлер
Код:
// 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: Ардуино - запись звука

Пт июн 17, 2022 17:09:58

ты когда пишешь проверяешь что пишешь или как?

нееее... выше писал))
среду разработки ардуины я удалил... я этим больше не пользуюсь.
у меня есть всё... кроме ардуины))


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 тактов процессора
На, держи
СпойлерИзображение
volatile uint8_t as;

что держи))

LDI R24, $88
OUT $05, R24
IN R24, $03
ANDI R24, $0F
STS 0149,R24

по нормальному пиши... с названиями регистров ))

LDI R24, $88
OUT PORTB, R24
IN R24, PINB
ANDI R24, $0F
STS 0149,R24

а вопрос какой был ?
Ivanoff-iv писал(а): нельзя зацепив провода к подряд идущим пинам одного порта сделать:

низя.
всё идёт в разнобой... как попало))

valA= DigitalRead(6);
valB=DigitalRead(7);
valC=DigitalRead(8);
valD=DigitalRead(9);

мы не ищем лёгких путей))

читаем пины с ПРОИЗВОЛЬНЫМ доступом

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 такт

для Ардуины принцип тот же ))
olegue писал(а):нормлаьно работает

а так работает ? ))

x = PINB;

или так

x = PINB & 0x0F;

как она у тебя вообще работает... )) :dont_know:

Re: Ардуино - запись звука

Пт июн 17, 2022 17:59:51

roman.com писал(а):для Ардуины принцип тот же ))
это asm вставку надо писать, не охота возится, лень.
roman.com писал(а):как она у тебя вообще работает... ))
Вот еще один пример, с произвольным доступом
СпойлерИзображение
Исходный код, ассемблер, ориентировочное время выполнения (такты сами считайте, кому надо),
входные данные и выходные.

Re: Ардуино - запись звука

Пт июн 17, 2022 18:02:57

roman.com, должен и сам догадаться, ошибка детская...

откуда roman.com знает как работает ваша ардуина)) :))

ну если у вас ардуина такая умная... значит... переходим на ООП... )) объёктно-ориентированное программирование ))

if ( (PIND & 0x08) == 0x08 ){x |= 0b00001000;}
else {x &= 0b11110111;};
if ( (PIND & 0x04) == 0x04 ){x |= 0b00000100;}
else {x &= 0b11111011;};
if ( (PIND & 0x02) == 0x02 ){x |= 0b00000010;}
else {x &= 0b11111101;};
if ( (PIND & 0x01) == 0x01 ){x |= 0b00000001;}
else {x &= 0b11111110;};

:tea:

Re: Ардуино - запись звука

Пт июн 17, 2022 18:09:04

roman.com, ты перед тем как :tea: попить, спросил бы, а надо ли модифицировать переменную?
Если надо, тогда if else, а если нет, и ты ее перед этим обнулил, то просто if.
roman.com писал(а):переходим на ООП
:facepalm:

Re: Ардуино - запись звука

Пт июн 17, 2022 19:17:34

значит... переходим на ООП... )) объёктно-ориентированное программирование ))

имелось ввиду... возьмём код из ПК... и переделаем под ардуину... ))

x = 0;
if ( (PIND & 0x08) == 0x08 ){x |= 0b00001000;}
if ( (PIND & 0x04) == 0x04 ){x |= 0b00000100;}
if ( (PIND & 0x02) == 0x02 ){x |= 0b00000010;}
if ( (PIND & 0x01) == 0x01 ){x |= 0b00000001;}
:tea:

Re: Ардуино - запись звука

Пт июн 17, 2022 19:26:40

roman.com, ты не как не угомонишься со своим кодом.
Смотри еще какой способ есть
СпойлерИзображение
и время выполнения

Сколько там тактов получилось?

Re: Ардуино - запись звука

Сб июн 18, 2022 06:56:56

f ( (PIND & 0x08) == 0x08 ){x |= 0b00001000;} - это не ООП :)
Возьмите уже готовый скетч на arduino.ru и не чешите задницу ногтями

Re: Ардуино - запись звука

Сб июн 18, 2022 09:21:54

дальше пойдут табличный методы быстрого пересчёта)) это надолго ))
там ещё меньше тактов... сожрём всю память... зато выиграем время))
с ассемблером надо заканчивать... он не для записи флешек)) он для более серьёзных задач.

а так ?
if ( (Sistema_1[28] & 0x80) == 0x80 ){label_Lampa_1L3.setIcon(JPEG_1);}
else {label_Lampa_1L3.setIcon(JPEG_0);};
if ( (Sistema_1[28] & 0x20) == 0x40 ){label_Lampa_1L2.setIcon(JPEG_1);}
else {label_Lampa_1L2.setIcon(JPEG_0);};
if ( (Sistema_1[28] & 0x08) == 0x20 ){label_Lampa_1L1.setIcon(JPEG_1);}
else {label_Lampa_1L1.setIcon(JPEG_0);};
if ( (Sistema_1[28] & 0x02) == 0x10 ){label_Lampa_1L0.setIcon(JPEG_1);}
else {label_Lampa_1L0.setIcon(JPEG_0);};

мы и так взяли готовый скетч на arduino.ru... а сейчас его переделываем)) см. выше

Re: Ардуино - запись звука

Сб июн 18, 2022 10:04:12

roman.com, да не переживай ты так, к каждому компилятору свой подход нужен.
Если вкратце, твой код вот в таком виде
Спойлер
Код:
volatile uint8_t a;

uint8_t f_1 (void) {         
uint8_t x=0;
if (PIND &(1<<PD0))   {x |= (1<<3);};
if (PIND &(1<<PD1))   {x |= (1<<1);};
if (PIND &(1<<PD2))   {x |= (1<<2);};
if (PIND &(1<<PD3))    {x |= (1<<0);};
return x;
}


   while (1)
   {
      a = f_1();         
      PORTD++;
   };

выполняется на
avr-gcc 21 такт
cvavr 25 тактов
iar 18 тактов

А последний код, который с таблицей
avr-gcc 17 такт
cvavr 23 тактов
iar 17 тактов

Который с union
avr-gcc 22 такт
cvavr 87 тактов
iar 60 тактов

Ну а мой, который olegue последний использует
avr-gcc 27 такт
cvavr 40 тактов
iar 27 тактов

А полностью тестовая программы занимает
avr-gcc 344 байта
cvavr 458 байтов
iar 198 байт

Вот и делай выводы

Re: Ардуино - запись звука

Сб июн 18, 2022 10:12:12

... он не для записи флешек)) он для более серьёзных задаче

Ассемблер? Да ну не смешите :))) попробуйте на асме написать более серьёзные задачи с GUI или ЦОС - е##нетесь количество строчек текста считать.

И зачем переделывать то, что работает? Первое правило - работает - не лезь. А чтобы переделать, надо разбираться в этом хорошо

Re: Ардуино - запись звука

Сб июн 18, 2022 11:03:07

Dimon456 кто сказал что я переживаю ?)) флешки у меня и на простом cvavr читаются ...пишутся))

Up2805 зачем переделывать то, что работает? нам так захотелось))

а под словом "серьёзная задача" имелось ввиду другое... "необычная задача" ))

например какой-нибудь... "синтезатор сложного сигнала на синхронном фазовращателе" ))
сонхронный_фазовращатель.jpg
(95.09 KiB) Скачиваний: 40

несколько программа запущенных на разных AVR должны выполнять все инструкции синхронно.
причём не только с точностью до такта процессора... а с точностью до фазы ! ))
делали и такое... )) Ассемблер справляется с такими задачами.
но это уже совсем другая история))
:tea:

Re: Ардуино - запись звука

Сб июн 18, 2022 14:27:25

Так эту задачу гораздо проще и с другой стороны решают. Не нужно никаких ассемблеров и кучи МК с синхронностью до фазы. Потому что задержки распространения сигнала до выходных транзисторов строго синхронны только в эмуляторе типа протеуса. А на деле иначе делается - ОДНИМ микроконтроллером считывается очередная строчка со всех таблиц форм сигналов, суммируется и отправляется сумма в ЦАП по единственному сигналу. Это же можно сделать и на дискретной логике или ПЛИС. Просто и легко. Всё остальное - оверинжениринг и неправильное решение поставленной задачи.

Re: Ардуино - запись звука

Сб июн 18, 2022 17:51:38

roman.com,
Спойлери так, любезный
За инлайнил я функции

выше код выполняется за
avr-gcc 13 тактов
cvavr 19 тактов
iar 11 тактов

Видишь, только iar выдал 11 тактов

А последний код, который с таблицей
avr-gcc 9 такт
cvavr 16 тактов
iar 10 тактов

Который с union
avr-gcc 24 такт
cvavr 80 тактов
iar 50 тактов

Ну а мой, который olegue последний использует
avr-gcc 19 такт
cvavr 35 тактов
iar 22 тактов

Блин, твой компиль проигрывает даже iarу.

Re: Ардуино - запись звука

Пн июн 20, 2022 10:44:56

Up2805 писал(а):Потому что задержки распространения сигнала до выходных транзисторов строго синхронны только в эмуляторе типа протеуса.

на практике работает удовлетворительно))
Up2805 писал(а):А на деле иначе делается - ОДНИМ микроконтроллером считывается очередная строчка со всех таблиц форм сигналов...

у AVR на это нет времени)) все AVR и так работают на предельной частоте - 20 мгц
Up2805 писал(а):Это же можно сделать и на дискретной логике или ПЛИС.

на дискретной логике или ПЛИС любой дурак может))
задача была сделать на AVR.

Dimon456 в компиляторе есть ещё куча настроек...

например "оптимизация кода по максимальной скорости"...
при этом компилятор жрёт в два раза больше памяти... но зато код работает в два раза быстрей ))

или "оптимизация кода по минимальному занимаемому объёму памяти"...
при этом компилятор жрёт в два раза меньше памяти... но и код работает в два раза медленней ))
настройки_компилятора.jpg
(66.81 KiB) Скачиваний: 35

поэтому результаты одного и того же компилятора зависят ещё и от настройки самого компилятора...
:tea:

Re: Ардуино - запись звука

Пн июн 20, 2022 13:49:25

roman.com писал(а):в компиляторе есть ещё куча настроек...
:facepalm:

Давай так, рекорд принадлежит avr_gcc - 9 тактов, сможешь быстрее, приходи.

Re: Ардуино - запись звука

Пт июл 01, 2022 14:27:52

Как так получается что если я присваиваю переменной младшую тетраду шестнадцатиричного числа то получаю в переменной ее десятичное выражение и смогу вывести ее в lcd в десятичном виде.

Re: Ардуино - запись звука

Пт июл 01, 2022 15:00:23

Покажите хоть как так )
Ответить