DVyacheslavN

Работа С Картой Памяти В Режиме Spi (Использование Petit Fatfs)

60 сообщений в этой теме

я знаю что есть уже скачал . тупо копировать все могут . а обяснить нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    551

Что объяснить, а главное - зачем ?

Человек любезно предоставил отличную библиотеку - бери и пользуйся. Зачем изобретать велосипед ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
fuckir    6

Не все так просто. Под 24HJ ее допиливал сам, но она ничем не лучше библиотеки Джасио, но читабельнее микрочиповской. Раз не нужно, кувыркайтесь сами

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
UTSource

Найдите миллионы труднодоступных

электронных компонентов

ну у чана же есть пример под 24f а раличее от 24h только в производительности (16 против 40 MIPS).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот нашол ссылку на интересный источник http://fotogrf.ucoz.ru/publ/programma_dlja_pic_mikrokontrollera_i_karty_pamjati_mmc_s_fat16/1-1-0-45 конечно fatfs тут и не пахнет но даны понятия как работать с файлами без библиотеки . все достаточно хорошо расписано .

только вот у меня асемблеровская вставка не запускается.

AL = rl(AL); // Умножение на 2 с переносом
AH = rl(AH);
#asm // 17 шаг
MOVF Dat+1,W
ADDWF AL+1,1
MOVF Dat,W
ADDWF AL,1
BTFSS 0x03,Carry
GOTO keinCarry
BCF 0x03,Carry
INCF AL+1,1
BTFSC 0x03,Carry
INCF AH,1
keinCarry:
#endasm

и первые две строчки не компилируются не муогу разобратся как сделать умножение с переносом

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    551

Что за умножение с переносом ? Что-то новенькое... :huh:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    551

Наверно ? :blink:

Мне кажется, это Вы задали вопрос. Или сами не понимаете о чём спросили ?

Как же тогда мы должны на него ответить ? :crazy:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    551

Вы спросили - "Как сделать умножение с переносом". Отсюда и возник вопрос - что это такое и зачем Вам это нужно. Если Вы пытаетесь разобраться с умножением, и у Вас это не получается сделать, однозначно - Вам это для чего то нужно.

Или Вы просто вставляете чужие куски кода себе в программу, не понимая для чего эти куски нужны ? :) Тогда логика Ваших мыслей совершенно непонятна...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ведь сдивиг влево или вправо есть умножение и деление на 2. только вот я и сам не понял что за перенос такой , может ктонить знает что за команад rl();

ну на счет чужих кусков вы погарячились . разве не вы мне писали что нет надобности разбираться в библиотеки FATFS а просто пользоватся хотя сам автор библиотеки задумал что всеже приходится понимать что и как работает а не просто копировать файл diskio.c и менять там регистры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    551
может ктонить знает что за команад rl();
Такой команды в языке Си нет. Это какая то таинственная функция.
разве не вы мне писали что нет надобности разбираться в библиотеки FATFS а просто пользоватся
Я. Но я имел в виду использовать всю библиотеку, а не выдирать чужие непонятные куски кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ну автор статьи утаил от читателей эту функцию . только вот оставил подсказку "// Умножение на 2 с переносом" в которой я не смог разглядеть смысл из за малого опыта в программировании.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    551
AL = rl(AL); // Умножение на 2 с переносом
AH = rl(AH);

Возможно, тут имелось в виду сдвиг влево через перенос. Тогда почему бы не заменить эти строки АСМ-вставкой ?
#asm
RLF   AL, 1
RLF   AH, 1
#endasm

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
может ктонить знает что за команад rl();
Такой команды в языке Си нет. Это какая то таинственная функция.
разве не вы мне писали что нет надобности разбираться в библиотеки FATFS а просто пользоватся
Я. Но я имел в виду использовать всю библиотеку, а не выдирать чужие непонятные куски кода.

куски из файла примера diskio.c а я по вашему с чем пытался разобраться с файлом diskio.c который необходимо самопу дописывать. я выложил свой кусок и оттуда и хотел услышыть ответы на пару вопросов а вы написали что незачем туда лезть.

AL = rl(AL); // Умножение на 2 с переносом
AH = rl(AH);

Возможно, тут имелось в виду сдвиг влево через перенос. Тогда почему бы не заменить эти строки АСМ-вставкой ?
#asm
RLF AL, 1
RLF AH, 1
#endasm

спасибо попробую

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    551
Тогда почему бы не заменить эти строки АСМ-вставкой ?
#asm
RLF AL, 1
RLF AH, 1
#endasm

Ну или чистый Си :

*((unsigned int *)&AL) *=2;

пытался разобраться с файлом diskio.c
На сколько я помню, когда прикручивал библиотеку Чена, я правил только драйвер работы с SPI. Т.е. инициализация модуля, отправка и приём байта. А вся работа с картой была уже там готовая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а вот нашол чтото это не тоже самое ??? Побитовый левый сдвиг[note 2] a << b Да Да R T::operator <<(S B); R operator <<(T a, S B);

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    551
a << b Да Да R T::operator <<(S B); R operator <<(T a, S B);

Это что такое ? :D

Если Вы имеете в виду оператор сдвига "<<", то это тоже самое, только не учитывается бит переноса. Умножить побайтово двухбайтовую переменную так не получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    20

Пиши в личку ко мне по работе Micro SD в режиме SPI и работе с FAT. растолкую че надо.

Изменено пользователем Oxford

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mummy117    15

Доброго времени суток. Как Ваши дела с освоением FatFs?

На чем закончилась Ваши изыскания? Сам уже 2 недели бъюсь над этой задачей.

"может ктонить знает что за команад rl();" это компилятор CC5x.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

да fatFs не освоил. пока мучаю дисплеи ЖКИ.

думаю после дисплеев заняться .

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mummy117    15

Я тоже мучаю Fatfs. Так что тема актуальна.

А что у Вас с дислплеями ЖКИ?

Изменено пользователем mummy117

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Гость Keil
      Автор: Гость Keil
      Добрый день, ситуация такая - попались мне под руку куча рассыпухи в числе которых достаточное количетво тинек и прочей лабуды - пытась хеловродить, попробовал взять готовый пример работы тиньки и лсдишника здесь также имею ардуинку как  Айсипи и чудесно мигаю светодиодом на мк прошитом ею же  так вот при попытке залить код который по ссылке чуда не произошло.
      курение мануалов лсдишника дало понять лиш одно что старший и младший биты одинаковы с лсдишником со статьи - лсдишник рабочий (игрался контрастом одной строки через V0  и потенциометр ) - как в прочем и мк, было задумано ковырнуть все это в протеусе и атмельстудии, но результатом не увенчалось. Пожалуйста тыкните носом что да где не так.
      fail.zip
    • Автор: В гостях у Михалыча
      Приветики. На днях купил колонку сгоревшую под ремонт. При нажатии на кнопку включения сразу же нагревается микросхема (B6THM1016 1516arz) В интернете вообще нет ничего о ней. Как я понял, это контроллер сенсорных кнопок и питания (даже если включить зарядку, то микруха не греется, пока не нажмешь на кнопку), ибо есть еще две микросхемы, одна из них усилитель, а вторая-блютуз. Может ее получится как-то заменить или выкинуть вообще? 


    • Автор: aske12345
      Здравствуйте! Прошу помощи ! Столкнулся со следующей проблемой пытаюсь подключить к контроллеру по spi память FRAM FM25CL64 ,компилятор keil , пытаюсь записать одно число и его же считать, а осциллографом вижу, что считывается не то, что записывал. Пытался в разные ячейки памяти разные числа - считываются разные числа, но не те. Пишу 0x2F считывается 0x1С,  пишу 0xFF считывается 0xFE, пишу 0x99 считывается 0x20 - ерунда какая то. 
      Куски кода привел ниже:

      int main(void) {          SystemCoreClockUpdate();     SysTick_Config(SystemCoreClock/1000);//1ms     LEDs_ini();     Button_ini();     SPI3_FRAM_ini();         delay_ms(50);     //проверим FRAM начало запись 1 байта        CS_FRAM_ON();//        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};        SPI_I2S_SendData(SPI3, 0x06);//Set Write Enable Latch 6        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется        CS_FRAM_OFF();        delay_us(3);    //на самом деле задержка выходит около 500нс                CS_FRAM_ON();         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};     SPI_I2S_SendData(SPI3, 0x02);// Write              while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется     SPI_I2S_SendData(SPI3, 0x10);// 13 битный адрес         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется         SPI_I2S_SendData(SPI3, 0x00);// 13 битный адрес         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется     SPI_I2S_SendData(SPI3, 0x2F);// данные          while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется              CS_FRAM_OFF();         delay_us(3);//на самом деле задержка выходит около 500нс         //проверим FRAM конец запись  1 байта         //проверим FRAM начало чтение 1 байта         CS_FRAM_ON();//         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};     SPI_I2S_SendData(SPI3, 0x03);// Read              while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется     SPI_I2S_SendData(SPI3, 0x10);// 13 битный адрес         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется         SPI_I2S_SendData(SPI3, 0x00);// 13 битный адрес         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется     SPI_I2S_SendData(SPI3, 0x00);// пишем 0 для считывания         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется         CS_FRAM_OFF(); //проверим FRAM конец чтение 1 байта              //LED1_OFF;          while(1)     {
      настройки spi:

      SPI_Init_user3.SPI_Direction = SPI_Direction_2Lines_FullDuplex;     SPI_Init_user3.SPI_Mode = SPI_Mode_Master;     SPI_Init_user3.SPI_DataSize = SPI_DataSize_8b;     SPI_Init_user3.SPI_CPOL = SPI_CPOL_High;//SPI_CPOL_Low     SPI_Init_user3.SPI_CPHA = SPI_CPHA_2Edge;     SPI_Init_user3.SPI_NSS = SPI_NSS_Soft;     SPI_Init_user3.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;//4     SPI_Init_user3.SPI_FirstBit = SPI_FirstBit_MSB;         SPI_Init_user3.SPI_CRCPolynomial = 7;          SPI_Init(SPI3, &SPI_Init_user3);
      контакты вроде все пересмотрел, думал провода может длинноваты,  клок spi настраивал на разную частоту уменьшал до 1МГц - не влияет,  пробовал делать паузу между командой WREN и командой записи 15мс, а записью и считыванием 20мс, всё то же самое не помогло..
      приложил осциллограммы:
      Осциллограмма всех посылок  WREN, WITE, READ  (тактовый сигнал ch1 и miso FRAM ch2) (синий луч отношения к делу не имеет)
      Осциллограмма  команды WREN (тактовый сигнал ch1 и miso FRAM ch2)(синий луч отношения к делу не имеет)
      Осциллограмма  команды WITE (тактовый сигнал ch1 и miso FRAM ch2)
      Осциллограмма  считанного значения записывал 0x2F, считал 0x1C (тактовый сигнал ch1 и mosi FRAM ch2)
       




    • Автор: Сергей Скопинцев
      Нужно разработать циклическую программу сбора информации от 10 измерительных источников. Период повторения цикла - одна секунда
      Источники:
       М - тензопреобразователь давления. Мостовая схема питается постоянным напряжением, выходной сигнал от 0 до 100 милливольт
       Т, ТМ, ТА- три канала измерения изменения напряжения в диапазоне от 400 до 600 милливольт (тоже нужен мост?)
       ЛМ - анализатор максимума напряжения (от 0 до 5 Вольт) по 10 точкам более-менее распределённых в измерительном цикле. Найденный максимум потом должен участвовать в анализе, постепенно уменьшаясь на 20% каждый цикл
       ВЛ - измерить напряжение на Малой емкости (50 пФ) с помощью емкостного делителя по алгоритму:
                         Снять Землю со средней точки емкостного делителя, подать на емкостной делитель положительный Импульс
                         Замерить нужное нам напряжение в средней точке делителя
                         Снять положительный Импульс с делителя, посадить на землю среднюю точку делителя
      - остальные каналы К7...К10  служебные
      Разрядность данных - 16 двоичных.

      Результаты писать на MicroSD текстовым файлом, на первом месте в строке текущее время в секундах, остальные каналы разделены пробелами
      Порядок каналов:
      Т - М -ТМ - Вл - ЛМ -...
      Коэффициенты усиления по каждому информационному каналу должен иметь возможность изменить оператор по формуле y = Ax + B
      Прибор автономный, питается от + 5 Вольт.
       
    • Автор: Ru_s
      Здравствуйте. Подскажите пожалуйста, возможно ли на attiny13 реализовать такую штуку. Мне в процессе работы программы нужно поменять режим работы таймера/счетчика с fast PWM на обычный счёт, отсчитать длительный промежуток времени и опять вернутся в режим ШИМ. Т.е. я подаю на ногу сигнал ШИМ и когда он в максимальном значении, я его отключаю, и тупо подаю на ногу высокий лог. уровень. В это время Т/С по идее свободен, и мне надо посчитать время работы выхода на максимальном лог. уровне, при достижении какого-то значения времени нужно перевести т/с обратно в ШИМ. Возможно ли это? И как приблизительно это реализовать
  • Сообщения

    • Это не для константы, const означает, что функция может читать данные, на которые указывает передаваемый ей указатель, но не может изменять их. Пробовал, никакой разницы Если в коде, с которым мк зависает, закомментировать вызов функции USART_Init() - мк не зависает (но юарт не работает, понятное дело). Инициализация простейшая, тут почти все значения по умолчанию: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE);  
    • и все таки попробуйте для константы сделать как положено: void Send_to_UART(const char* string)
    • гену на вход имел я ввиду и на выходе мерять переменку!потребление 3 А на хх измерено питание +12в на входе преобразователя. ща сфоткаю и попробую выложить пока сверлю еще один канал на этой же печатке
    • Falconist ты че меня преследуешь на этом форуме? Здесь что, некому больше тему поддержать!? Почему только ты отвечаешь на мои вопросы? Пусть нормальные люди отвечают по теме. Я спрашивал сколько ждать посылку, а не как отследить её. А ты мне что ответил?
    • А теперь все разрисуй по молекулам и про бонус с нулями не забудь.
    • Добрый вечер.
      Протестировал я индикацию, она работает довольно хорошо, а об этом чуть подробнее.
      1. Максимальное потребление тока было 140 мА, только индикация. Релейные блоки с фотодатчиком не были подключены.
      2. Минимальное потребление тока 80 мА, только индикация. Смена загорания сегментов влияет на потребление тока.
      3. При смене сегментов есть небольшое, если только присматриваться, мерцание, не активных сегментов. В статическом состоянии мерцания нет. @MaratAM об этом предупреждал как раз. Думаю если поставить светофильтр, то мерцание не будет видно.
      4. Дисплей горит очень ярко. У меня красные сегменты, думаю для снижение тока можно было впаять и больше номинал резисторов на сегменты. Но я оставлю таким, как есть, мне с далека будет лучше видно.
      5. Радиатор на кренки обязателен. Большое спасибо пользователю @Genry133 за упоминание об этом. Теперь я сам в этом убедился. Резистор R1 нужно снизить до 5-10 Ом.
      6. При подаче питания на схему на секунду загорается Сегмент Е в Первом разряде, потом он изчезает и высвечивается текущее ослабление.
      7. Минимально показывающее ослабление на дисплее -94 дБ, а минимальное 00 дБ.
      8. Так-же был обнаружен маленький косяк, при обрыве Переменника, плата не много начинает жить своей жизнью, а именно: если обрыв произошел на -94 дБ, то на индикации начинается движение цифр в низ, приблизительно в секунду уменьшение происходит на единицу. У меня хватило терпения дождаться опуска с -94 до -70 дБ.
      Если произошел обрыв переменника на 00 дБ, то цифры ползут в верх, я дождался от 00 до -15 дБ. 
      Делайте очень хороший контакт с перменником.
      9. Так-же при пайке индикации, есть не большой риск замкнуть линии питания в области перемычки J1, так как там линии питания очень близки друг к другу, паяйте аккуратно в этом месте. После пайки воспользуйтесь прозвонкой, для подстраховки. Это касается если Вы паяете платы промышленного изготовления, а если домашний вариант изготовления, то тогда очень аккуратно паяйте, так как дорожки имеют зазоры 0,3 мм.
      10. Регулировка очень плавная.
      @koan51 Большое Спасибо автору устройства за предоставленные материалы и поддержку проекта. Удачных запусков.
       
    • Так и есть, вот он, ноль в конце строки