реклама на сайте
подробности

 
 
> EFSL стабильна?, Файловая система на Mega32 подвисает
freux
сообщение Feb 16 2009, 21:40
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 41
Регистрация: 7-02-05
Пользователь №: 2 473



Адаптировал EFSL версии 0.3.4 на ATMega32L на STK-500 под SD. Отладочные строки убрал во flash, все файловые переменные - глобальные, размер стека - 0х180, потребление памяти 1 879 bytes of DATA memory, размер кода несущественен - во flash укладывается.
Examplы - копирование файла, вывод содержимого файла в UART проходят без проблем. Усложнил main - добавил командный процессор - и стал выводить содержимое файлов один за другим. И тут возникли зависания. Отладчика нет. Обложил печатью, и выяснил, что зависания происходят в функции посылки команды - sd_Command. Посмотрел исходники FlashFile v2.10 от Progressive Resources LLC, подправил sd_Command() и sd_readSector() на манер, как это сделано у prllc.
Результат тот же, - несколько раз файл считывается и выводится, затем, при чтении сектора того же файла зависает в sd_Command(). На печать вывожу так же #сектора при вызове sd_readSector() - сектора все те же, что и читались успешно.
Очевидно зависание в while(!(SPSR & (1<<SPIF)));
У Трамперта в "AVR-RISC микроконтроллерах" сказано, что в режиме "мастер" текущая передача может быть прервана подачей 1 в линию SS. Счетчик разрядов и внутрення логика Slave сбрасываются.
Оператор while(!(SPSR & (1<<SPIF))) в sd_Command() я добавил флагом, который взводится таймером через некоторое время после посылки команды так, чтобы исключить зависания. Если флаг взведен, поднимаю линию SS. Однако SD попав в это состояние больше не воспринимает команды - зависание исключено, но и секторы карты больше не читаются.
Теперь подумываю о прерывании питания на карту и ее повторной инициализации в случае продолжительного ожидания в SPI.
F osc = 3.68, F spi пробовал /2, /4 и /8 - безразлично.
Никто не испытывал подобных проблем?
Что посоветуете?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Feb 16 2009, 22:43
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(freux @ Feb 16 2009, 23:40) *
размер стека - 0х180, потребление памяти 1 879 bytes of DATA memory, размер кода несущественен - во flash укладывается.

Чем собираете? Если IAR'ом - отдайте под стек все что есть (так как сейчас - у Вас даже на буфер одного сектора нехватает).
Если WinAVR'ом, тогда как посчитали объем стека?

Цитата
Теперь подумываю о прерывании питания на карту и ее повторной инициализации в случае продолжительного ожидания в SPI.
F osc = 3.68, F spi пробовал /2, /4 и /8 - безразлично.

Для FS столь низкая тактовая? Может проц захлебывается данными от SD и обработкой UART'a?...
Если нет подходящего кварца, на внутреннем осцилляторе с OSCCAL = 0xFF получите частоту близкую к 13Mhz.

Цитата
Никто не испытывал подобных проблем?

Всяко бывало. Причиной всему чаще всего - ошибка в программе.

Цитата
Что посоветуете?

Первое - рассчитать или промониторить количество свободных MIPS'ов проца.
И приведите код функций с этой строчкой:
Цитата
Очевидно зависание в while(!(SPSR & (1<<SPIF)));
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 17 2009, 09:13
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Чтоб небыло проблем с SS настройте ее на вывод или включите pullup обязательно.
Таймеры и т.д. это уже извращения ИМХО.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 09:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.0139 секунд с 7
ELECTRONIX ©2004-2016