Запись измеренных величин на SD-карту с Atmega8

Обсуждаем контроллеры компании Atmel.
Ответить
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн мар 14, 2016 15:38:50
Откуда: Питер

Сообщение kotarnold »

Собственно, вопрос: а как сделать так, чтобы контроллер некое измеренное значение n записывал на карту?

Код: Выделить всё

if(disk_initialize()==0) //инициализируем флешку
{
disk_initialize(0); //инициализируем флешку
f_mount(0, &fs); //монтируем файловую систему
// а тут что?
f_close(&fp); //закрываем файл
}
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

[uquote="kotarnold",url="/forum/viewtopic.php?p=3126672#p3126672"]а тут что?[/uquote]
что то типа:

Код: Выделить всё

    if (Fatfs_OpenFile(&fp, nameTextFile, F_WR) == FATFS_OK)
    {
         Fatfs_WriteString(&fp, stringOut);
         Fatfs_CloseFile(&fp);
    }
измеренное значение преобразуем в строку stringOut, записываем в текстовый файл с именем nameTextFile
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн мар 14, 2016 15:38:50
Откуда: Питер

Сообщение kotarnold »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3126688#p3126688"][uquote="kotarnold",url="/forum/viewtopic.php?p=3126672#p3126672"]а тут что?[/uquote]
что то типа:

Код: Выделить всё

    if (Fatfs_OpenFile(&fp, nameTextFile, F_WR) == FATFS_OK)
    {
         Fatfs_WriteString(&fp, stringOut);
         Fatfs_CloseFile(&fp);
    }
измеренное значение преобразуем в строку stringOut, записываем в текстовый файл с именем nameTextFile[/uquote]


Секундочку. А каким образом преобразовываем n (которое идет, как unsigned int) в stringOut? А также какоe расширение будет иметь файл? .txt?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

kotarnold писал(а):А также какоe расширение будет иметь файл? .txt?
какое вы при создании файла зададите, такое и будет иметь.
kotarnold писал(а):А каким образом преобразовываем n (которое идет, как unsigned int) в stringOut?
ну например при помощи itoa или тем же sprintf
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

[uquote="kotarnold",url="/forum/viewtopic.php?p=3126701#p3126701"]Секундочку. А каким образом преобразовываем n (которое идет, как unsigned int) в stringOut[/uquote]
у меня тупо делением на 10, например время:

Код: Выделить всё

    rtc_Get(&DT);
    value = DT.Hours;
    textInfo[1] = value % 10 + '0';
    textInfo[0] = value / 10 + '0';
    textInfo[2] = '-';
    value = DT.Minutes;
    textInfo[4] = value % 10 + '0';
    textInfo[3] = value / 10 + '0';
    textInfo[5] = '-';
    value = DT.Seconds;
    textInfo[7] = value % 10 + '0';
    textInfo[6] = value / 10 + '0';
    textInfo[8] = '\0';
    oldDay = DT.Day;
для int n потребуется больше делений :)

upd
нашел экономный itoa без делений от Mbedderа, лет 8 назад применял для AVR:

Код: Выделить всё

char asc[5];
void itoa1(unsigned int binval)
{
	register unsigned int temp,val;
	register char binc,atemp;
	
	val=binval;
	
	atemp='0'; temp=10000; while(val >= temp) {atemp++; val-=temp;};*(asc+0)=atemp;
	atemp='0'; temp=1000; while(val >= temp) {atemp++; val-=temp;};*(asc+1)=atemp;
	atemp='0'; temp=100; while(val >= temp) {atemp++; val-=temp;};*(asc+2)=atemp;
	atemp='0'; binc=(char)val; while(binc >= 10) {atemp++; binc-=10;};*(asc+3)=atemp;
	binc+='0';*(asc+4)=binc;
}
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн мар 14, 2016 15:38:50
Откуда: Питер

Сообщение kotarnold »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3126710#p3126710"]upd
нашел экономный itoa без делений от Mbedderа, лет 8 назад применял для AVR:

Код: Выделить всё

char asc[5];
void itoa1(unsigned int binval)
{
	register unsigned int temp,val;
	register char binc,atemp;
	
	val=binval;
	
	atemp='0'; temp=10000; while(val >= temp) {atemp++; val-=temp;};*(asc+0)=atemp;
	atemp='0'; temp=1000; while(val >= temp) {atemp++; val-=temp;};*(asc+1)=atemp;
	atemp='0'; temp=100; while(val >= temp) {atemp++; val-=temp;};*(asc+2)=atemp;
	atemp='0'; binc=(char)val; while(binc >= 10) {atemp++; binc-=10;};*(asc+3)=atemp;
	binc+='0';*(asc+4)=binc;
}
[/uquote]

О, Боже! что мне делать с этим счастьем? Точнее - куда ставить n и где в итоге название файла? Особенно с учетом того, что у меня это n принимает максимальное значение 5, минимальное - 0, а между ними 1022 значения.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

делаем типа так
adcValue = read_adc(0);
itoa1(adcValue);
итого в asc значение ацп в виде строки

имя файла у меня тупо формируется так (меняется каждый день):

Код: Выделить всё

char nameTextFile[13];
    value = DT.Day;
    nameTextFile[1] = value % 10 + '0';
    nameTextFile[0] = value / 10 + '0';
    nameTextFile[2] = '-';
    value = DT.Month;
    nameTextFile[4] = value % 10 + '0';
    nameTextFile[3] = value / 10 + '0';
    nameTextFile[5] = '-';
    value = DT.Year;
    nameTextFile[7] = value % 10 + '0';
    nameTextFile[6] = value / 10 + '0';
    nameTextFile[8] = '.';
    nameTextFile[9] = 't';
    nameTextFile[10] = 'x';
    nameTextFile[11] = 't';
    nameTextFile[12] = '\0';
между 0 и 5 unsigned int бывает 1022 значения?
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн мар 14, 2016 15:38:50
Откуда: Питер

Сообщение kotarnold »

Обождите. Я считываю с АЦП число типа unsigned int, мне его, аки измернное напряжение, нужно записать в файл.
Если опорное напряжение 5В, а в диапазон от 0 до 5В я могу поделить на 1024 части, то... сам запутался :shock:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

пишите в мВ 5В = 5000мВ, как значение ацп перевести в мВ вроде есть в документации
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн мар 14, 2016 15:38:50
Откуда: Питер

Сообщение kotarnold »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3126767#p3126767"]пишите в мВ 5В = 5000мВ, как значение ацп перевести в мВ вроде есть в документации[/uquote]

на атмегу?
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

да ADC = (VIN * 1024)/VREF
отсюда VIN = (ADC * VREF)/1024
VREF = 5000
бывают менее затратные по памяти способы
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн мар 14, 2016 15:38:50
Откуда: Питер

Сообщение kotarnold »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3126777#p3126777"]да ADC = (VIN * 1024)/VREF
отсюда VIN = (ADC * VREF)/1024
VREF = 5000
бывают менее затратные по памяти способы[/uquote]

Ничего нового. Мне бы это в файл закатать...
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

[uquote="kotarnold",url="/forum/viewtopic.php?p=3126812#p3126812"]Ничего нового. Мне бы...[/uquote]
вроде все в теме есть, подробнее приблизительно так:

Код: Выделить всё

FRESULT open_append (
  FIL* fp,            /* [OUT] File object to create */
  const char* path    /* [IN]  File name to be opened */
)
{
  FRESULT fr;
  /* Opens an existing file. If not exist, creates a new file. */
  fr = f_open(fp, path, FA_WRITE | FA_OPEN_ALWAYS);
  if (fr == FR_OK)
  {
    /* Seek to end of the file to append data */
    fr = f_lseek(fp, f_size(fp));
    if (fr != FR_OK)
      f_close(fp);
  }
  return fr;
}

char nameTextFile[13]; //имя файла в nameTextFile

int main (void)
{
  FRESULT fr;
  FATFS fs;
  FIL fil;
  
  adcValue = read_adc(0);
  vin = (adcValue * 5000)/1024;
  itoa1(vin); //в asc строка
  
/* Open or create a log file and ready to append */
  f_mount(&fs, "", 0);
  fr = open_append(&fil, nameTextFile);
  if (fr != FR_OK) return 1;
  /* Append a line */
  f_printf(&fil, asc);
  /* Close the file */
  f_close(&fil);
  return 0;
}
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн мар 14, 2016 15:38:50
Откуда: Питер

Сообщение kotarnold »

Кошмар. Такое количество кода обуслолено только тем, что переменная unsigned int, а не просто int?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

такое количество кода обусловлено тем, что никто не понимает, чего не понимаете вы. я вам написал - sprintf решает ваши проблемы в 2 строки.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

[uquote="kotarnold",url="/forum/viewtopic.php?p=3127056#p3127056"]Кошмар. Такое количество кода...[/uquote]
используйте f_printf с форматированием http://elm-chan.org/fsw/ff/doc/printf.html
не хотите значение преобразовывать в строку - пишите байтами как раз UINT type http://elm-chan.org/fsw/ff/doc/write.html
карту потом читать будет человек или компьютерная программа?
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн мар 14, 2016 15:38:50
Откуда: Питер

Сообщение kotarnold »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3127117#p3127117"][uquote="kotarnold",url="/forum/viewtopic.php?p=3127056#p3127056"]Кошмар. Такое количество кода...[/uquote]
используйте f_printf с форматированием http://elm-chan.org/fsw/ff/doc/printf.html
не хотите значение преобразовывать в строку - пишите байтами как раз UINT type http://elm-chan.org/fsw/ff/doc/write.html
карту потом читать будет человек или компьютерная программа?[/uquote]

Пограмма. По циферкам будет строить график в относительных единицах.

Добавлено after 14 minutes 12 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3127058#p3127058"]такое количество кода обусловлено тем, что никто не понимает, чего не понимаете вы. я вам написал - sprintf решает ваши проблемы в 2 строки.[/uquote]

Я растерялся в поисках примера тех двух строк, о которых Вы говорите.
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

[uquote="kotarnold",url="/forum/viewtopic.php?p=3127197#p3127197"]Я растерялся в поисках примера...[/uquote]
лучшие примеры как всегда на сайте производителя:
AVR42777 Digital Sound Recorder using DAC with ATtiny817
This example demonstrates a digital ound recorder using ADC for sampling and DAC for playback. Samples timed at a defined frequency, controlled by a timer and event system. SPI used to store raw data on an SD card, driver included. This example demonstrates direct register read and write operations for peripheral initialization, and therefore does not use peripheral drivers.

AVR42780 Temperature Logger with ATtiny817 and SD Card
This example demonstrates logging temperature to a file on an SD card using the Petit FAT File System module, with a timestamp generated with the AVR RTC using ATtiny817. Includes drivers for TWI Master, AT30TSE75x temperature sensor, and the Petit FAT File System module with an AVR disk I/O layer defined. All other peripherals are initialized using direct register manipulation to save memory and therefore peripheral initialization drivers are not used.

имхо из вышеперечисленного, взяв нужные куски кода, можно слепить "Запись измеренных величин на SD-карту с Atmega8"
качать исходники тут, чуток подождать - ларчик откроется:
http://start.atmel.com/#examples/rec

p/s/ sprintf там есть
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

kotarnold, Вы скажите по конкретнее, с чем возникают проблемы ?
На вопрос :
kotarnold писал(а):а как сделать так, чтобы контроллер некое измеренное значение n записывал на карту?
есть множество ответов, которые имеют ветвления.
Контактная информация:
Ответить

Вернуться в «AVR»