Вопрос по FATFS

Обсуждаем контроллеры компании Atmel.
Ответить
mir_ds
Родился
Сообщения: 3
Зарегистрирован: Вс фев 07, 2016 09:13:29

Вопрос по FATFS

Сообщение mir_ds »

Всем привет.

Подскажите, пожалуйста.

Хочу записывать в текстовые файлы на карте памяти данные, поступающие по UART. CodeVision AVR.
По UART вопросов нет.
С картой раньше не работал. Использую FATFS, встроенную в CVAVR. Карта памяти 4Gb.
Начал с теста карты памяти. И сразу наткнулся на ошибку - f_open возвращает FR_NO_FILE.
Перед открытием файла выполняю disk_initialize и f_mount - все нормально.
Делаю все, как в тысяче примеров в сети и в хэлпе CVAVR, и в примерах CVAVR.

Путь к файлу char path[]="0:/file.txt";

res=f_open(&file,path, FA_OPEN_ALWAYS | FA_WRITE ); В этом месте res=1(FR_DISK_ERR). Также в параметры ставил FA_CREATE_NEW, для существующего файла ставил FA_OPEN_EXISTING | FA_READ - результат один.

Точно такой же ответ и на f_mkdir(path), где char path[]="0:/files"; Пишет FR_DISK_ERR.

В общем - любые процедуры с файлами/папками - FR_DISK_ERR.
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Re: Вопрос по FATFS

Сообщение Pnjom-Penb »

mir_ds писал(а):С картой раньше не работал.
А что про нее комп говорит? Может она неисправна, не отформатирована, или отформатирована, да не в FAT...
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Re: Вопрос по FATFS

Сообщение GRAF »

Полный код выкладывайте. Путь к файлу должен заканчиваться символом конца строки '\0'.
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Re: Вопрос по FATFS

Сообщение Pnjom-Penb »

GRAF писал(а):Путь к файлу должен заканчиваться символом конца строки '\0'.
Полностью разделяю Вашу низкую оценку гуану по имени CVAvr, но все же... чем еще может оканчиваться массив char, заданный таким обазом:
mir_ds писал(а):... CodeVision AVR ... char path[]="0:/file.txt";
, - пусть даже и в этой дурно пахнущей отрыжке мира программирования?
Последний раз редактировалось Pnjom-Penb Вс фев 07, 2016 18:00:59, всего редактировалось 1 раз.
mir_ds
Родился
Сообщения: 3
Зарегистрирован: Вс фев 07, 2016 09:13:29

Re: Вопрос по FATFS

Сообщение mir_ds »

Цель кода - быстро проверить как работает карта, поэтому на реализацию ругаться не нужно.
То есть я нажимаю на кнопку и при каждом нажатии с картой что-то происходит.
1 - монтируется диск,
2 - открывается файл,
3 - указатель в конец файла,
4 - пишется какой-то текст,
5 - закрывается файл.
По флагам - какая-то индикация светодиодами.

Есть две карты: SD 2Gb и SDHC 4Gb. Карты форматировал всеми известными способами, то есть разные наборы "фатов" и размеров кластеров.

Когда в case 1:...... не появился FR_OK - вычислил, что возвращается ошибка FR_DISK_ERR.

initialize (в самом начале) и f_mount проходят нормально.

часов нет, поэтому библиотеку часов немного поправил:
rtc_get_time возвращает нули (hour, min, sec). rtc_get_date возвращает date - 1, month - 1, year - 2000.

Когда пойму как работают все эти функции - буду писать нормальную программу.

#include <mega32u4.h>
#include <delay.h>
#include <sdcard.h>
#include <ff.h>
#include <PCF8563.h>

//
typedef unsigned char byte;
typedef unsigned int uint;
//
#define cb(x,y) (x&=~y)
#define sb(x,y) (x|=y)
//portf defines
#define ledRed (1<<4)
#define ledGreen (1<<0)
#define sbRec (1<<6)
//add leds deines
#define ledE1 (1<<6)
#define ledE2 (1<<2)
#define ledB (1<<7)
#define ledD (1<<5)
//flags
//#define butPressF (1<<0)
//const
#define BLINK_DELAY 250
#define BUT_DELAY 1000
//flags1
#define butPressF (1<<0)
#define diskStatusF (1<<1)
#define diskMountF (1<<2)
#define fileOpenF (1<<3)
#define fileLseekF (1<<4)
#define fileWrF (1<<5)
#define fileCloseF (1<<6)

//var
uint flags1=0;
uint blinkCr=0;
uint butCr=0;
byte diskStatus=0;

byte pressNum=0;

/* FAT function result */
FRESULT res;
/* number of bytes written/read to the file */
unsigned int nbytes;
/* will hold the information for logical drive 0: */
FATFS fat;
/* will hold the file information */
FIL file;
/* will hold file attributes, time stamp information */
FILINFO finfo;
/* file path */
char path[]="0:/log.txt";
/* text to be written to the file */
char text[]="<TEST_test>";

// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TCNT1H=0x00;
TCNT1L=0x00;
//
disk_timerproc();
}



void main()
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
//ports init
DDRB=0xff;
PORTB=0x00;
DDRC=0xff;
PORTC=0x00;
DDRD=0xff;
PORTD=0x00;
DDRE=0xff;
PORTE=0x00;
//
DDRF=0xff;
cb(DDRF,sbRec);
PORTF=0x00;
sb(PORTF,sbRec);
// Timer/Counter 1 initialization
//62.5 kHz, 10 ms interrupt OCR1A
TCCR1A=0x00;
TCCR1B=0x04;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x02;
OCR1AL=0x71;
TIMSK1=0x02;
//

prtc_get_time =(void (*)(unsigned char *,unsigned char *,unsigned char *)) rtc_get_time;
prtc_get_date=(void (*)(unsigned char *,unsigned char *,unsigned int *)) rtc_get_date;

#asm("sei")

delay_ms(1000);
diskStatus=disk_initialize(0);
if ((diskStatus & STA_NOINIT) || (diskStatus & STA_NODISK) || (diskStatus & STA_PROTECT)) cb(flags1,diskStatusF); else sb(flags1,diskStatusF);
delay_ms(2500);


//
while(1)
{
//set leds
if (++blinkCr>=BLINK_DELAY)
{
blinkCr=0;
//disk init and mount indic
if ((~flags1&diskStatusF)&&(~flags1&diskMountF)) cb(PORTF,ledRed);
if ((flags1&diskStatusF)&&(~flags1&diskMountF)) PORTF^=ledRed;
if ((flags1&diskStatusF)&&(flags1&diskMountF)) sb(PORTF,ledRed);
//file indic
if (flags1&fileOpenF) sb(PORTE,ledE1); else PORTE^=ledE1;
if (flags1&fileLseekF) sb(PORTE,ledE2);
if (flags1&fileWrF) sb(PORTB,ledB);
if (flags1&fileCloseF) sb(PORTD,ledD);
}
//read button
if ((~PINF&sbRec)&&(~flags1&butPressF))
{
if (++butCr>=BUT_DELAY)
{
butCr=0; sb(flags1, butPressF);
PORTF^=ledGreen;
//
switch (pressNum)
{
case 0: if ((res=f_mount(0,&fat))==FR_OK) sb(flags1,diskMountF); break;
case 1: if ((res=f_open(&file,path, FA_OPEN_ALWAYS | FA_WRITE ))==FR_OK) sb(flags1,fileOpenF); break;
case 2: if ((res=f_lseek(&file,file.fsize))==FR_OK) sb(flags1,fileLseekF); break;
case 3: if ((res=f_write(&file,text,sizeof(text)-1,&nbytes))==FR_OK) sb(flags1,fileWrF); break;
case 4: if ((res=f_close(&file))==FR_OK) sb(flags1,fileCloseF); break;
}
if (pressNum<4) pressNum++;


}
}
if (PINF&sbRec)
{
cb(flags1,butPressF); butCr=0;

}
delay_ms(1);
}

}
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Re: Вопрос по FATFS

Сообщение Pnjom-Penb »

mir_ds писал(а):Цель кода - быстро проверить как работает карта ...
М-да... Именно так формулируется цель написания большинства программ, состоящих, в основном, из ошибок... Исходных данных нет, результатов каких-либо проверок - тоже нет...
Че-то, как-то... повеяло не то безысходностью, не то скукой. Пойду посмотрю КВН от 95 года.
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Re: Вопрос по FATFS

Сообщение GRAF »

Pnjom-Penb писал(а):Полностью разделяю Вашу низкую оценку гуану по имени CVAvr, но все же... чем еще может оканчиваться массив char, заданный таким обазом:
mir_ds писал(а):... CodeVision AVR ... char path[]="0:/file.txt";
, - пусть даже и в этой дурно пахнущей отрыжке мира программирования?

CVAVR я не оценивал.
И чем же может оканчиваться массив char path[]="0:/file.txt"; в CVAVR?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопрос по FATFS

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

GRAF писал(а):И чем же может оканчиваться массив char path[]="0:/file.txt"; в CVAVR?
Ну, если он хоть как-то придерживается стандартам, то - естественно нулевым байтом (аля '\0').
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Re: Вопрос по FATFS

Сообщение GRAF »

Теперь ясно, что в DATASEG никто не заглядывает.
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Re: Вопрос по FATFS

Сообщение Pnjom-Penb »

Не судите обо всех по себе. :dont_know:
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Re: Вопрос по FATFS

Сообщение GRAF »

Тема не обо мне, а о применении fatfs в CVAVR. Не отклоняйтесь.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопрос по FATFS

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

Т.е. о всех:
GRAF писал(а):в DATASEG никто не заглядывает.
можно тут разговаривать, а конкретно о Вас - нет ? :)

Можно Вам тот-же вопрос : И чем же может оканчиваться массив char path[]="0:/file.txt"; в CVAVR?
Ну и вообще, чем оканчиваются массивы в Си, инициализированные строкой ?

Мне просто даже интересно, куда Вы там заглядываете и какую информацию об этом вопросе держите в голове. Может мы просто ошибаемся. Тогда поправьте нас и прикрепите свои поправки аргументами, а не домыслами о том, куда мы все заглядываем, а куда нет. Тогда будет уже конструктивный разговор.
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Re: Вопрос по FATFS

Сообщение GRAF »

Файл asm, генерируемый CVAVR.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопрос по FATFS

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

Поставил CVAVR, проверил. Даже и не знаю что сказать... Кроме того, что мнение о Вас складывается, как о любителе впустую потрепаться языком.
СпойлерИзображение
2016-02-08 16-51-32 Скриншот экрана.png
(133.69 КБ) 394 скачивания

В догонку - https://yandex.ru/search/?lr=5&msid=228 ... 0%A1%D0%B8

Какие asm-файлы, какие DATASEG, ... какая блоха.... :facepalm:
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Re: Вопрос по FATFS

Сообщение Pnjom-Penb »

Аlex писал(а):Какие asm-файлы, какие DATASEG, ... какая блоха.... :facepalm:
Увы, одни люди, аргументируя свою позицию, ссылаются на Re'альные знания, другие - на Im'нимые... Отношение числа первых к числу вторых, что вполне ожидаемо, повторяет отношение числа действительных чисел к числу комплексных.
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Re: Вопрос по FATFS

Сообщение GRAF »

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

#include <mega48.h>
char path[]="0:/AVR.exe";
char a=0x0E;

void main(void)
{
    char c;
    unsigned char i;
   
    for(i=0; i<sizeof(path);i++)
    {
        c=path[i];
    }
   
    path[1]=a;
   
    while(1);
}


HEX:

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

:0400000026C0FECF49
:10000400FDCFFCCFFBCFFACFF9CFF8CFF7CFF6CFA8
:10001400F5CFF4CFF3CFF2CFF1CFF0CFEFCFEECFD8
:10002400EDCFECCFEBCFEACFE9CFE8CFE7CFE6CF08
:10003400303A2F4156522E6578650E000A00800131
:100044003400010005003E000000F894EE27EFBBE9
:10005400E5BFF8E1A895A4B7A77FA4BFF09360001B
:10006400E09360008DE0A2E0BB27ED938A95E9F769
:1000740080E092E0A0E0B1E0ED930197E9F7E0E4DD
:10008400F0E085919591009761F0A591B591059067
:100094001590BF01F00105900D920197E1F7FB0166
:1000A400F0CFE0E0EEBBEFEFEDBFE2E0EEBFC0E883
:1000B400D1E000C000E00B3038F4E02FF0E0E0586D
:1000C400FE4F10810F5FF7CF50928101FFCFFFCF1A
:00000001FF

Данные начинаются с адреса 0034. Следом за массивом символов идёт a, затем 00.
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Re: Вопрос по FATFS

Сообщение Pnjom-Penb »

Читать DATASEG черех HEX, это хорошо забытый старый изврат. Над ним стебались еще во времена "Настоящие программисты не используют Паскаль". Но что гораздо хуже - это поооолное непонимание строк в Си.
mir_ds
Родился
Сообщения: 3
Зарегистрирован: Вс фев 07, 2016 09:13:29

Re: Вопрос по FATFS

Сообщение mir_ds »

Сейчас немного экспериментирую. Дело не в строке. Сегодня/завтра отпишусь.
Ответить

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