ГлавнаяРегистрацияВход Сайт Сокола Сергея Четверг, 02.05.2024, 23:57
  Работа с EEPROM - Форум Приветствую Вас Гость | RSS

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
Форум » Основной форум сайта » Общее » Работа с EEPROM
Работа с EEPROM
AVRикДата: Четверг, 17.01.2013, 22:35 | Сообщение # 1
Лейтенант
Группа: Проверенные
Сообщений: 73
Репутация: 0
Статус: Offline
Научился записывать данные в память EEPROM, а также считывать с памяти. Хочеться большего познания. Как считывать байтами их оттуда.

Сообщение отредактировал AVRик - Четверг, 17.01.2013, 22:38
 
miminoДата: Суббота, 19.01.2013, 19:58 | Сообщение # 2
Полковник
Группа: Администраторы
Сообщений: 227
Репутация: 101
Статус: Offline
Владимир!
Что Вы имеете в виду? Они ж и так считываются и записываются в EEPROM байтами
 
AVRикДата: Воскресенье, 20.01.2013, 20:04 | Сообщение # 3
Лейтенант
Группа: Проверенные
Сообщений: 73
Репутация: 0
Статус: Offline
Сергей, вопрос такой: в ЕЕПРОМ в определнных ячейках памяти записаны операнды, цифры с 0-9. С помощью нехитрой программы контроллер их счытивает с помощью косвенной адресацией и выводит на семисегментный светодиодный дисплей, соответственно с задержкой. Задержка одна и вызывается подпрограммно. Но задержка вывода между цифрами одинаковая, а когда зделает круг от 0 до 9 появляется пауза больше заданной задержки ?

Добавлено (20.01.2013, 16:30)
---------------------------------------------
Сергей, задачу решил. Ошибся в адресации ЕЕПРОМ, лишние 10 ячеек считывал, вот и получилась задержка. Теперь думаю как счетчик написать от 0-99 и 0-999. Хотя дисплей 9 разрядный можно и больше. Хочу еще написать сдвиг цифр, как бы "бегущая строка" должна получится.

Добавлено (20.01.2013, 20:04)
---------------------------------------------
<b></b>Сергей, с бегущей строкой ситуация такова, при считывании с ЕЕПРОМ на сегменты дисплея цифры выводятся, катоды перебираю командой ROL, цифры не перемещаются. Думаю об эффекте бугущей строки. Пока мысли не посетили меня. Получилась статическая индикация.


Сообщение отредактировал AVRик - Воскресенье, 20.01.2013, 20:06
 
miminoДата: Воскресенье, 20.01.2013, 20:26 | Сообщение # 4
Полковник
Группа: Администраторы
Сообщений: 227
Репутация: 101
Статус: Offline
Владимир, насчет бегущей строки. Командой ROL, к сожалению, нельзя обойтись. Несмотря на ее описание, она не переводит старший байт в младший при переполнении. Тут можно вручную проверять бит переполнения статусного регистра и в случае его установки записывать единицу в младший бит. Или можно пользоваться командой SHL. Но все равно придется делать проверку на выход бегущей единицы за пределы байта
 
AVRикДата: Понедельник, 21.01.2013, 18:41 | Сообщение # 5
Лейтенант
Группа: Проверенные
Сообщений: 73
Репутация: 0
Статус: Offline
Сергей, не могу найти команды SHL в справочнике и компилятор его не понимает.
 
miminoДата: Понедельник, 21.01.2013, 18:59 | Сообщение # 6
Полковник
Группа: Администраторы
Сообщений: 227
Репутация: 101
Статус: Offline
Владимир!
Простите, пожалуйста. Перепутал с другим ассемблером. Команда циклического сдвига LSL
 
AVRикДата: Понедельник, 21.01.2013, 19:46 | Сообщение # 7
Лейтенант
Группа: Проверенные
Сообщений: 73
Репутация: 0
Статус: Offline
Сергей, а как добиться эффект "бегущей строки", если команда LSL очищает регистр по порядку, через цикл надо регистр установить, но как очищение регистра плавно заполнять ?
 
miminoДата: Понедельник, 21.01.2013, 22:47 | Сообщение # 8
Полковник
Группа: Администраторы
Сообщений: 227
Репутация: 101
Статус: Offline
Ну тут смысл в чем. Нужно установить 0-й бит в единицу. Потом командой LSL смещать эту единицу влево до тех пор, пока она не станет в 7-м бите. А затем установить ее снова в 0-й бите. Смещение делать в цикле, а условием выхода из цикла будет как раз наличие единицы в 7-м бите.
 
AVRикДата: Вторник, 22.01.2013, 22:46 | Сообщение # 9
Лейтенант
Группа: Проверенные
Сообщений: 73
Репутация: 0
Статус: Offline
Сергей, единица установленная в рег.21 бит 0 в цикле почему-то в бите 1 ? 

Init: 
 sbr r21,0b00000001
 ldi ZL,1
main:
rcall EEPROM_read
lsl r21
out PortB,r21     
inc ZL          ; инкрементируем регистр
cpi  ZL, 0x08  ; сравниваем значение с константой 0x...
breq exit       ; перепрыгиваем через след. команду  
rcall delay
rjmp main  ; Переход к метке
exit:
rjmp Init    ;

Добавлено (22.01.2013, 22:18)
---------------------------------------------
А вот как следующую и последующую единицы отправить следом друг за другом ?
Ломаю голову. Должно получится целое слово.

Добавлено (22.01.2013, 22:46)
---------------------------------------------
 Сергей, идея такова из ЕЕПРОМ выгрузить слово в стек, а потом сдвигать.

 
miminoДата: Среда, 23.01.2013, 20:58 | Сообщение # 10
Полковник
Группа: Администраторы
Сообщений: 227
Репутация: 101
Статус: Offline
Владимир!

Что-то я уже совсем потерялся в том, что Вы хотите сделать... У Вас задача считывать из EEPROM или сделать бегущую строку? Потому как одно для другого вроде не требуется.
 
AVRикДата: Среда, 23.01.2013, 21:31 | Сообщение # 11
Лейтенант
Группа: Проверенные
Сообщений: 73
Репутация: 0
Статус: Offline
Сергей, а как правильно написать бегущую строку. Работа с ЕЕПРОМ это вроде упражнения, нехочется стоять на месте, а двигаться дальше.

Сообщение отредактировал AVRик - Четверг, 24.01.2013, 21:35
 
miminoДата: Пятница, 25.01.2013, 01:11 | Сообщение # 12
Полковник
Группа: Администраторы
Сообщений: 227
Репутация: 101
Статус: Offline
Владимир!
Я же общий принцип Вам написал. И у Вас в коде что-то похожее написано. Только непонятно, зачем ZL и r21. Смещайте единицу в одном регистре, и потом копируйте этот регистр в PORTB, например, чтобы сразу выводить ее на светодиоды.
 
AVRикДата: Пятница, 25.01.2013, 10:21 | Сообщение # 13
Лейтенант
Группа: Проверенные
Сообщений: 73
Репутация: 0
Статус: Offline
Сергей !
Регистр ZL служит для адресации в ЕЕПРОМ, а потом данные с ЕЕПРОМ пересылаются в r21, где происходит смещение. Может это не верно, но по другому я еще не придумал. Если в ZL ничего не записать, то он несчитает адреса в ЕЕПРОМ.
 
miminoДата: Пятница, 25.01.2013, 12:56 | Сообщение # 14
Полковник
Группа: Администраторы
Сообщений: 227
Репутация: 101
Статус: Offline
Ааа... Вот, в чем дело. А то у Вас в тексте есть
Цитата
rcall EEPROM_read
а самого описания подпрограммы этой нет, поэтому и непонятно, что за ZL. А вот этими строками Вы что делаете:
Цитата
inc ZL          ; инкрементируем регистр
cpi  ZL, 0x08  ; сравниваем значение с константой 0x...
 
AVRикДата: Пятница, 25.01.2013, 21:52 | Сообщение # 15
Лейтенант
Группа: Проверенные
Сообщений: 73
Репутация: 0
Статус: Offline
Сергей, вот эта подпрограмма -
EEPROM_read: ; Подпрограмма считывания с ЕЕПРОМ
cli
out EEARL,ZL ; Записываем содержимое в регистр адреса
out EEARH,ZH
sbi EECR,EERE ; Устанавливаем бит в регистре управления разрешение чтения из ЕЕПРОМ
sbic EECR,EEWE ; Пропускаем, если бит EEWE в регистре управления сброшен
rjmp PC-1  ; Переход на строку вверх
in r20,EEDR  ; Счытиваем содержимое регистра данных в R20
out PortD,r20   ;
retAVRик
AVRикAVRик

А вот код ЕЕПРОМ :10000000FF065B4F666D7D077F6F3FFFFFFFFFFFC2
                                 :10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0

Здесь храняться цифры от 0- 9, работа программы проста, считывание цифр с ЕЕПРОМ и сдвиг с выводом на семисегментный дисплей.

Добавлено (25.01.2013, 21:52)
---------------------------------------------
Но сейчас задача посложнее, появился у меня PCB-1602S-04.
Хочу добиться вывода каких нибудь символов на дисплей.

 
Форум » Основной форум сайта » Общее » Работа с EEPROM
  • Страница 1 из 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
Поиск:

 

Copyright MyCorp © 2024
Бесплатный конструктор сайтов - uCoz