Форум » Для начинающих. » EEPROM PIC16F877 » Ответить

EEPROM PIC16F877

gosenergo: Прошу сильно не пинать. Данной темы поиском не нашел, пишу здесь. Вопрос: по алгоритму работы моей программы есть необходимость в калибровке датчика. Мне необходимо записать 40 контрольных точек в EEPROM. Какие адреса EEPROM? какие у них номера? запись в память только последовательно с первого адреса или можно произвольно писать? Во-общем пригодится любая информация по организации и работе с EEPROM. Даташит читал внимательно, но там как то сухо написано.

Ответов - 12

MAZ: Пинать ни кто не собирается. Здесь это не принято. Адреса EEPROM расположены в памяти по адресу 0х2100 В программе обращение выглядит так: org 2100h ;Обращение к EEPROM памяти данных. de 0x30,0x33,0x32,0x30,0x30, ;0;1;2;3;4; de 0x06 ; 5 Регистры EEPROM имеют адресацию в пределах одного байта. 0x00;0x01;0x02....0x0F. Конечно надо смотреть и выбирать конкретный контроллер. Есть различие в размерах EEPROM. Работа по записи и чтению в несколько регистров EEPROM, может быть последовательна через косвенную адресацию или выборочно. Выбираются необходимые в настоящий адреса ячеек и производится запись или их чтение. По каким адресам расположены эти ячейки не имеет значения. Конечно адреса ячеек знает программист и их указывает. У меня есть программа записи чтения через косвенную и выборочно. Обычно пользуюсь второй как более гибкой. Если нужно, могу разместить эту программу на сайте чипмк в виде статьи.

Bigor: Надо!!!

gosenergo81: Спасибо за ответ, проблема решена! НО возник второй вопрос, я его озвучу, а Вы пожалуйста подскажите (если нужно я создам отдельно тему). Вопрос: в памяти EEPROM записано подряд 40-к регистров. При включении устройства (каждый раз) данные из этих 40-ка регистров нужно скопировать в 40-к регистров общего назначения (также последовательно, начиная с какого то адреса), как это лучше и компактнее сделать?


MAZ: Через косвенную адресацию. Регистр FSR и INDF. Они именно для этого и предназначены. Ну вот как пример: Чтение из 0...39 ячейки и запись последовательно в РОНы. РОН должны располагаться в памяти данных последовательно, начиная с reg_0. Регистры EEPROM по адресу 0х00 по 0х27. Можно и изменить, но для данного примера именно так. [pre2] h_tnz clrf count ; счетчик адресов EEPROM clrf count_1 ; счетчик РОН hh movf count,W call HTENIE ; стандартная процедура чтения одной ячейки movwf temp ; результат чтения в temp movf count_1, W ; косвенная адресация, копирование ячейки EEPROM в РОН addlw reg_0 ; reg_0 -первый РОН (0х00). movwf FSR movf temp,w movwf INDF incf count_1,F ;увеличиваем на 1 счетчики incf count,F movlw .40 ; проверка окончания чтения из EEPROM subwf count,w btfss STATUS,Z goto hh ; продолжаем чтение из EEPROM return ;---------------------------------------------------------------------- ;============================================= ;чтение из ЕЕPROM ;============================================= HTENIE call adr ;указать адрес калибр. конст. call htenie clrf STATUS return htenie bsf STATUS,RP1 ; банк2 bcf STATUS,RP0 movf ADDR,W ; указать адрес ячейки ( в AD_D должен быть адрес) movwf EEADR bsf STATUS,RP0 ; банк3 bcf EECON1,EEPGD ; выбрать ЕЕPROM bsf EECON1,RD ; чтение bsf STATUS,RP1 ; банк2 bcf STATUS,RP0 movf EEDATA,W ; в W прочитанные данные return ;============================================= ;записать адрес в регистр ;============================================= adr bsf STATUS,RP1 ; банк2 ;записать адрес в EEPROM bcf STATUS,RP0 movwf ADDR return [/pre2]

Alex: Ещё, как вариант http://forum.chipmk.ru/index.php/topic/65-пп-для-работы-с-eeprom/

gosenergo81: все довольно понятно!! спасибо. Вот только здесь movlw .40 ? не .39 должно быть?

Александр: ну вот, весь пирог съели без меня , ну что сказать очень оперативно...

Александр: gosenergo81 пишет: movlw .40 ? не .39 должно быть? всё правильно 1 раз записали № ячейки 0, и 40 раз записали № ячейки 39, значит число 39

Александр: конечно не самый практичный вариант работы с EEPROM, но мне необходимо было только 6 ячеек памяти и последовательная запись/чтение с сохранением в РОН http://zalil.ru/32654682

MAZ: Александр пишет: конечно не самый практичный вариант работы с EEPROM, Да. Для последовательной записи/чтения конечно немного в лоб. Но почему нельзя? работает же. Но этот вариант подходит для выборочной записи или чтения. Например, в один момент надо 1,6 ячейку считать. В другой 2,4,6

MAZ: Александр пишет: gosenergo81 пишет:  цитата: movlw .40 ? не .39 должно быть? всё правильно 1 раз записали № ячейки 0, и 40 раз записали № ячейки 39, значит число 39 Нет, не правильно. Мы же записали 39+0 ячеек,да 40. Но при окончании чтения 39 ячейки и записи в регистр, происходит опять прибавление 1 к счетчику адресов, будет 40, вычитаем все таки 40, получаем 0 и выходим при проверке Z по стеку.

Александр: точно , с математикой туго...



полная версия страницы