|
не пишится в EEPROM данные, Реально не пишится в EEPROM данные |
|
|
|
May 10 2007, 07:19
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(Sholkin @ May 10 2007, 15:09)  Здравствуйте . Код не могу привести вставляю тут нет такого шрифта кракозябы. Предоставлю попозже. Хорошо, я сделаю этот фрагмент за вас, без применения шрифта "кракозябры": .DSEG Num1: .BYTE 1 .ESEG EENum1: .DB 0 .CSEG ;... LDI R20, LOW(EENum1) OUT EEARL, R20 SBI EECR, EERE REP0: SBIC EECR, EERE RJMP REP0 IN R21, EEDR STS Num1,r21 По существу: 1. Перед изменением EEARL,EEARH надо проверять бит EEWE регистра EECR, так как в текущий момент может продолжаться запись в EEPROM 2. Проверка бита EERE, по вашему мнению, видимо должна помочь определить завершение чтения из EEPROM. Интересный способ, а datasheet читать пробовали? Как там рекомендуют определять окончание чтения из EEPROM, и нужно ли это делать? И таких моментов в вашей программе - на каждом шагу. Если вы поменяете абсолютные адреса на символьные имена регистров и битов, то подобные ошибки в программе заметно даже при беглом взгляде. А разбираться в вашем текущем исходнике - мало желающих.
|
|
|
|
|
May 14 2007, 22:45
|
Участник

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

|
Здравствуйте . Сейчас всё наладилось могу предоставить код проивел в читабельный вид Вот был такой
WRITE_EEPROM: clr r22 ;обнуление переменной условия записи в EEPROM ldi r20,0 ; заносим старший бит адреса EEPROM куда будем писать OUT $1F,R20 ; заносим старший бит адреса EEPROM в 1F ldi r20,0 ; заносим младшее значение адреса EEPROM куда будем писать OUT $1E,R20 ; заносим младшее значение адреса EEPROM в $1E lds r21,$60 ; заносим данные в регистр из памяти OUT $1D,R21 ; заносим данные из регистра в EEPROM SBI $1C,2 ; устанавливаем флаг EEWE разрешаем запись в EEPROM SBI $1C,1 ; устанавливаем флаг EERE WEP0:SBIC $1C,1 ; проверяем флаг записи в EEPROM RJMP WEP0 ; Расписал подробно в коментариях что этим хотел
Потом привёл в в такой вид
WEP3:SBIC EECR, EEWE ;проверяем флаг нет ли записи в EEPROM RJMP WEP3
ldi VAR,0 ; заносим старший бит адреса EEPROM куда будем писать OUT EEARH,VAR ; заносим старший бит адреса EEPROM в 1F ldi VAR,3 ; заносим младшее значение адреса EEPROM куда будем писать OUT EEARL,VAR ; заносим младшее значение адреса EEPROM в $1E lds DATA,$63 ; заносим данные в регистр из памяти OUT EEDR,DATA ; заносим данные из регистра в EEPROM SBI EECR,EEMWE ; устанавливаем флаг EEWE разрешаем запись в EEPROM SBI EECR,EEWE ; устанавливаем флаг EERE
Его я написал до сообщения AE . Были технические проблемы раньше не мог предоставить
По существу стал как в даташите снача проверять потом делать все изменения Проблема осталась первые три ячейки пишет четвёртую болт. Некоторые говорят что функцию
WEP3:SBIC EECR, EEWE ;проверяем флаг нет ли записи в EEPROM RJMP WEP3 можно писать до изменя что и после изменения Выше я как то писал что пробовал и так и так но если проверяю перед изменением в имуляторе нулевая ячейка памяти (когда считываю ) переписываеться на последнюю запись при записи в ЕЕПРОМ. Если проверяю у всех после изменения (код который первый в имуляторе всё окей) Но с этим как нибудь сам разберусь. Проблема осталась почему боле трёх не пишит. У кого спрашивал те больше двух ячеек не писали сказать не могут смотрели всё правильно. Перед записью пробовал запрятить прерывания не помогло. Воп в принципе и всё. Кто чем может. С кодом AE по разбиралься не много его не понял
|
|
|
|
|
May 15 2007, 00:15
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(Sholkin @ May 15 2007, 07:45)  ... Проблема осталась почему боле трёх не пишит. У кого спрашивал те больше двух ячеек не писали сказать не могут смотрели всё правильно. Перед записью пробовал запрятить прерывания не помогло. Воп в принципе и всё. Кто чем может. С кодом AE по разбиралься не много его не понял Уважаемый Sholkin ! Это не мой код, это ВАШ код (без изменений), который я привёл в читабельный вид, что бы его легче было понять мне, и, надеюсь, остальным тоже. Теперь вы сами не понимаете СВОЙ код в читабельном виде, круг замкнулся. Вот, как написано вами: ldi R20,0 ;чтение 1 цифры OUT $1E,R20 SBI $1C,0 REP0:SBIC $1C,0 RJMP REP0 IN R21,$1D sts $60,r21 Вот мой вариант: .DSEG Num1: .BYTE 1 .ESEG EENum1: .DB 0 .CSEG ;... LDI R20, LOW(EENum1) OUT EEARL, R20 SBI EECR, EERE REP0: SBIC EECR, EERE RJMP REP0 IN R21, EEDR STS Num1,r21 Оба варианта одинаковы, но вариант с символьными именами позволяет легче обрнаружить ошибку: объясните, что делает инструкция "SBIC EECR, EERE" (SBIC $1C,0) ?
|
|
|
|
|
May 15 2007, 23:14
|
Участник

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

|
Здраствуйте. То что это мой код я понял . Но почему вы указываете на ошибку в чтении . А у меня не идёт запись. (ошибку там я понял кажеться на которую вы указалино чтение у меня осуществляеться) я этот блок тоже убрал оставил только записать и зажечь диод.
|
|
|
|
|
May 15 2007, 23:37
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(Sholkin @ May 16 2007, 12:14)  Здраствуйте. То что это мой код я понял . Но почему вы указываете на ошибку в чтении . А у меня не идёт запись. (ошибку там я понял кажеться на которую вы указалино чтение у меня осуществляеться) я этот блок тоже убрал оставил только записать и зажечь диод. Этот фрагмент я привёл потому, что он просто бросился в глаза явной ошибкой, хотя вы утверждаете, что в программе ошибок нет (что ж тогда она не рабоет-то?!!!). И что бы найти остальные ошибки в вашей программе, которых там якобы нет, надо переписать исходник с использованием символьных имен регистров и битов, портов в/в, переменных в пямяти ит.д. Когда будет читабельный исходник, тогда любой участник конференции сможет легко ответить на все ваши вопросы.
|
|
|
|
|
May 17 2007, 12:59
|
Участник

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

|
Здравствуйте. Вот этого фрагмента не достаточно
WEP3:SBIC EECR, EEWE ;проверяем флаг нет ли записи в EEPROM RJMP WEP3
ldi VAR,0 ;заносим старший бит адреса EEPROM куда будем писать OUT EEARH,VAR ; заносим старший бит адреса EEPROM в 1F ldi VAR,3 ; заносим младшее значение адреса EEPROM куда будем писать OUT EEARL,VAR ; заносим младшее значение адреса EEPROM в $1E lds DATA,$60 ; заносим данные в регистр из памяти OUT EEDR,DATA ; заносим данные из регистра в EEPROM SBI EECR,EEMWE ; устанавливаем флаг EEWE разрешаем запись в EEPROM SBI EECR,EEWE ; устанавливаем флаг EERE
Или привести весь код . Впринципе вот этот фрагмент в программе повторяеться 6 раз меняется только данные взятые из ячеек памяти lds DATA,$60 ; заносим данные в регистр из памяти это данные из ячеки памяти по адресу $60 пот тот же врагмент только из ячейки $61 $62 $63 ...
|
|
|
|
|
May 17 2007, 22:51
|

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

|
Цитата(Sholkin @ May 17 2007, 14:59)  Вот этого фрагмента не достаточно тут вроде бы все ок, нехватает только cli/sei: Код OUT EEDR,DATA ; заносим данные из регистра в EEPROM cli SBI EECR,EEMWE ; устанавливаем флаг EEWE разрешаем запись в EEPROM SBI EECR,EEWE ; устанавливаем флаг EERE sei С записью вроде бы разобрались. Если проблема осталась - ищите ее в чтении. Еще, если вы оформите фрагметы записи и чтения ячейки eeprom как функции, то работать станет гораздо проще, и ошибок будет меньше. Ниже я привожу пример записи/чтения массивов размером до 255 символов в/из eeprom. Разберитесь с этим примером.
|
|
|
|
|
May 23 2007, 07:26
|
Участник

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

|
Привет. Привел все как надо на выходных (часть кода приводил)ещё хуже получилось третья ечейка заглохла и вообще не чего не пишиться. Вообще не понятно стало . Чем лучше делаешь тем хуже получаеться . Чего надо ???????????????????????? Сегодня ещё по мучаюсь не получиться приведу весь код .
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|