|
|
  |
Программирование С8051F341, запись в память |
|
|
|
Nov 29 2011, 19:59
|
Группа: Участник
Сообщений: 14
Регистрация: 29-11-11
Из: Санкт-Петербург
Пользователь №: 68 585

|
Здравствуйте, помогите, пожалуйста, начинающему. В общем необходимо сохранить четыре двухбайтовые переменные, так, чтобы при выключении МК через регистр управления питанием, при новом включении по RST их можно было вернуть.
Идея, вообще, в следующем при первом включении оценивается средний уровень в 4-х каналах АЦП МК отключается, при последующем включении используются полученные значения.
Сообщение отредактировал Aloc - Nov 29 2011, 20:00
|
|
|
|
|
Nov 29 2011, 22:33
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
Цитата(Aloc @ Nov 30 2011, 05:59)  Здравствуйте, помогите, пожалуйста, начинающему. В общем необходимо сохранить четыре двухбайтовые переменные, так, чтобы при выключении МК через регистр управления питанием, при новом включении по RST их можно было вернуть.
Идея, вообще, в следующем при первом включении оценивается средний уровень в 4-х каналах АЦП МК отключается, при последующем включении используются полученные значения. Не совсем понял задачу. В Вашей постановке я вижу 2 варианта. Вариант 1. Опрос АЦП и запоминание производится только 1 раз после прошивания МК. В этом случае используем флэш. Работа с ней описана в документации на МК в соответствующем разделе "flash Memory". Будут вопросы после прочтения - обращайтесь сюда. Вариант 2. Вам при каждом включении питания нужно производить опрос, затем софтверный сброс и работа с новыми данными. В этом случае флэш насиловать не стоит. Дальнейшие действия зависят от компилятора. У меня была похожая задача - определять количество софтверных сбросов и после определенного числа вешать контроллер. У меня Keil/ Делал так. В xdata завожу переменную. В подстегиваемом файле startup.a51 по умолчанию Код XDATALEN EQU 0H Т.е. область xdata не обнуляется после сброса. Далее все просто. После сброса по питанию обнуляю переменную, после софтверного сброса инкрементирую. Причину сброса можно определить по регистру сброса RSTSRC. UPD. Сейчас более внимательно вчитался в вопрос. Есть проблема. Хотите повторные сбросы производить ножкой RST. В этом случае нужно обеспечить при включении, чтобы нога сброса поднималась к 1 быстрее tPORDelay (<0.3ms из докуметации). Либо использовать другой сброс, например по копаратору.
|
|
|
|
|
Nov 30 2011, 13:16
|
Группа: Участник
Сообщений: 14
Регистрация: 29-11-11
Из: Санкт-Петербург
Пользователь №: 68 585

|
Цитата Вариант 2. Вам при каждом включении питания нужно производить опрос, затем софтверный сброс и работа с новыми данными. В этом случае флэш насиловать не стоит. У меня скорее второй вариант, только сброс не софтверный, а внешний от обнаружителя сигнала. В принципе модуль автономный, один раз включили питание, он вычислил эти 4 переменные сохранил и отключился до момента прихода сигнала, обработал сигнал отключился и т.д. Единственное, что при отладке и испытаниях, включения и выключения питания будут происходить довольно часто и в различных условиях, и наверно в такой ситуации можно использовать и флэш. Использую IDE Silabs.
Сообщение отредактировал Aloc - Nov 30 2011, 13:17
|
|
|
|
|
Nov 30 2011, 22:50
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
Примерно понятно. Тут уж Вам решать. Если выключения питания не предполагается, можно лишний раз флэш не насиловать. Опять же, насколько критична потеря данных при случайных выключениях питания? Дело в том, что дубовый, на первый взгляд, вариант с сохранением во флэше имеет свои ньюансы. Во-первых, насколько часто приходится сохранять? Даже с разумным "размазанным" по некоторой области хранением можно убить флэш при достаточной частоте сохранений. Во-вторых, само наличие в коде функций записи во флэш повышает шансы на слет прошивки. Это было не только у меня, а также у других горемык здесь и на форуме silabs. А что значит " отключился до момента прихода сигнала"? переход в STOP режим? Цитата Использую IDE Silabs. У silabs нет своего компилятора, используются сторонние. По умолчанию, вроде как, keil. Но у него размер кода ограничен. А вообще о используемом у Вас компиляторе написано в project-> Tool Chain Integration в меню
|
|
|
|
|
Dec 1 2011, 07:16
|
Группа: Участник
Сообщений: 14
Регистрация: 29-11-11
Из: Санкт-Петербург
Пользователь №: 68 585

|
Цитата Примерно понятно. Тут уж Вам решать. Если выключения питания не предполагается, можно лишний раз флэш не насиловать. Опять же, насколько критична потеря данных при случайных выключениях питания? Дело в том, что дубовый, на первый взгляд, вариант с сохранением во флэше имеет свои ньюансы. Во-первых, насколько часто приходится сохранять? Даже с разумным "размазанным" по некоторой области хранением можно убить флэш при достаточной частоте сохранений. Во-вторых, само наличие в коде функций записи во флэш повышает шансы на слет прошивки. Это было не только у меня, а также у других горемык здесь и на форуме silabs. В принципе не критична, если что их можно заново рассчитать, думаю флэшем тогда не заморачиваться. Цитата А что значит " отключился до момента прихода сигнала"? переход в STOP режим? да, переход в STOP Цитата У silabs нет своего компилятора, используются сторонние. По умолчанию, вроде как, keil. Но у него размер кода ограничен. А вообще о используемом у Вас компиляторе написано в project-> Tool Chain Integration в меню Тогда Keil. Цитата В xdata завожу переменную. В подстегиваемом файле startup.a51 по умолчанию Код XDATALEN EQU 0H Т.е. область xdata не обнуляется после сброса. Далее все просто. После сброса по питанию обнуляю переменную, после софтверного сброса инкрементирую. Причину сброса можно определить по регистру сброса RSTSRC. Файл startup.a51 нужно самостоятельно скинуть в проект и пристегнуть? Полазил в стандартных примерах, во всех файлах startup xdata с 0h, т.е. переменная в xdata не обнуляется при объявлении в любом случае?
|
|
|
|
|
Dec 1 2011, 08:10
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
Цитата(Aloc @ Dec 1 2011, 17:16)  Файл startup.a51 нужно самостоятельно скинуть в проект и пристегнуть? необязательно, он автоматом подстегивается. Но я всегда его копирую в свою папку и подстегиваю при работе с этими камнями, добавив соответсвующие 2 строки, дабы избежать проблем с watchdog. Цитата Полазил в стандартных примерах, во всех файлах startup xdata с 0h, т.е. переменная в xdata не обнуляется при объявлении в любом случае? Да, честно говоря, не знаю в каких случаях компилятор модифицирует длину xdata. В общем случае можно организовать хранение переменных в любом месте, но слегка модифицировав statrup.a51
|
|
|
|
|
Dec 1 2011, 13:22
|
Группа: Участник
Сообщений: 14
Регистрация: 29-11-11
Из: Санкт-Петербург
Пользователь №: 68 585

|
Цитата ..добавив соответсвующие 2 строки, дабы избежать проблем с watchdog имеется ввиду include и отключение watchdog?
|
|
|
|
|
Dec 2 2011, 04:06
|
Группа: Участник
Сообщений: 14
Регистрация: 29-11-11
Из: Санкт-Петербург
Пользователь №: 68 585

|
А, это про модификацицию startup, я немного не про то подумал
|
|
|
|
|
Dec 2 2011, 13:30
|
Группа: Участник
Сообщений: 14
Регистрация: 29-11-11
Из: Санкт-Петербург
Пользователь №: 68 585

|
Завел в xdata переменные, всё заработало  Единственное ,что если в ручную добавить startup в директорию проекта компилятор начинает находить в нем ошибки.. решил понадеяться на файл, который по умолчанию. Большое спасибо за помощь и потраченное время.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|