|
Работа с EEPROM
| |
AVRик | Дата: Четверг, 17.01.2013, 22:35 | Сообщение # 1 |
Лейтенант
Группа: Проверенные
Сообщений: 73
Статус: Offline
| Научился записывать данные в память EEPROM, а также считывать с памяти. Хочеться большего познания. Как считывать байтами их оттуда.
Сообщение отредактировал AVRик - Четверг, 17.01.2013, 22:38 |
|
| |
mimino | Дата: Суббота, 19.01.2013, 19:58 | Сообщение # 2 |
Полковник
Группа: Администраторы
Сообщений: 227
Статус: Offline
| Владимир! Что Вы имеете в виду? Они ж и так считываются и записываются в EEPROM байтами
|
|
| |
AVRик | Дата: Воскресенье, 20.01.2013, 20:04 | Сообщение # 3 |
Лейтенант
Группа: Проверенные
Сообщений: 73
Статус: 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
Статус: Offline
| Владимир, насчет бегущей строки. Командой ROL, к сожалению, нельзя обойтись. Несмотря на ее описание, она не переводит старший байт в младший при переполнении. Тут можно вручную проверять бит переполнения статусного регистра и в случае его установки записывать единицу в младший бит. Или можно пользоваться командой SHL. Но все равно придется делать проверку на выход бегущей единицы за пределы байта
|
|
| |
AVRик | Дата: Понедельник, 21.01.2013, 18:41 | Сообщение # 5 |
Лейтенант
Группа: Проверенные
Сообщений: 73
Статус: Offline
| Сергей, не могу найти команды SHL в справочнике и компилятор его не понимает.
|
|
| |
mimino | Дата: Понедельник, 21.01.2013, 18:59 | Сообщение # 6 |
Полковник
Группа: Администраторы
Сообщений: 227
Статус: Offline
| Владимир! Простите, пожалуйста. Перепутал с другим ассемблером. Команда циклического сдвига LSL
|
|
| |
AVRик | Дата: Понедельник, 21.01.2013, 19:46 | Сообщение # 7 |
Лейтенант
Группа: Проверенные
Сообщений: 73
Статус: Offline
| Сергей, а как добиться эффект "бегущей строки", если команда LSL очищает регистр по порядку, через цикл надо регистр установить, но как очищение регистра плавно заполнять ?
|
|
| |
mimino | Дата: Понедельник, 21.01.2013, 22:47 | Сообщение # 8 |
Полковник
Группа: Администраторы
Сообщений: 227
Статус: Offline
| Ну тут смысл в чем. Нужно установить 0-й бит в единицу. Потом командой LSL смещать эту единицу влево до тех пор, пока она не станет в 7-м бите. А затем установить ее снова в 0-й бите. Смещение делать в цикле, а условием выхода из цикла будет как раз наличие единицы в 7-м бите.
|
|
| |
AVRик | Дата: Вторник, 22.01.2013, 22:46 | Сообщение # 9 |
Лейтенант
Группа: Проверенные
Сообщений: 73
Статус: 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
Статус: Offline
| Владимир!
Что-то я уже совсем потерялся в том, что Вы хотите сделать... У Вас задача считывать из EEPROM или сделать бегущую строку? Потому как одно для другого вроде не требуется.
|
|
| |
AVRик | Дата: Среда, 23.01.2013, 21:31 | Сообщение # 11 |
Лейтенант
Группа: Проверенные
Сообщений: 73
Статус: Offline
| Сергей, а как правильно написать бегущую строку. Работа с ЕЕПРОМ это вроде упражнения, нехочется стоять на месте, а двигаться дальше.
Сообщение отредактировал AVRик - Четверг, 24.01.2013, 21:35 |
|
| |
mimino | Дата: Пятница, 25.01.2013, 01:11 | Сообщение # 12 |
Полковник
Группа: Администраторы
Сообщений: 227
Статус: Offline
| Владимир! Я же общий принцип Вам написал. И у Вас в коде что-то похожее написано. Только непонятно, зачем ZL и r21. Смещайте единицу в одном регистре, и потом копируйте этот регистр в PORTB, например, чтобы сразу выводить ее на светодиоды.
|
|
| |
AVRик | Дата: Пятница, 25.01.2013, 10:21 | Сообщение # 13 |
Лейтенант
Группа: Проверенные
Сообщений: 73
Статус: Offline
| Сергей ! Регистр ZL служит для адресации в ЕЕПРОМ, а потом данные с ЕЕПРОМ пересылаются в r21, где происходит смещение. Может это не верно, но по другому я еще не придумал. Если в ZL ничего не записать, то он несчитает адреса в ЕЕПРОМ.
|
|
| |
mimino | Дата: Пятница, 25.01.2013, 12:56 | Сообщение # 14 |
Полковник
Группа: Администраторы
Сообщений: 227
Статус: Offline
| Ааа... Вот, в чем дело. А то у Вас в тексте есть а самого описания подпрограммы этой нет, поэтому и непонятно, что за ZL. А вот этими строками Вы что делаете: Цитата inc ZL ; инкрементируем регистр cpi ZL, 0x08 ; сравниваем значение с константой 0x...
|
|
| |
AVRик | Дата: Пятница, 25.01.2013, 21:52 | Сообщение # 15 |
Лейтенант
Группа: Проверенные
Сообщений: 73
Статус: 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. Хочу добиться вывода каких нибудь символов на дисплей.
|
|
| |
| |