Перейти к содержанию

Команда Lpm


skef

Рекомендуемые сообщения

память в большинстве AVR 16-разрядная, при косвенной адресации мы адресуемся к слову (2 байта), команда lpm выгружает один байт в r0, вопрос в том можно ли и как адресоваться ко второму байту?

НА ЛЮБОЙ ЭЛЕМЕНТ НАЙДЕТСЯ МОЩНОСТЬ, КОТОРАЯ ЕГО СОЖЖЕТ

Ссылка на комментарий
Поделиться на другие сайты

ldi ZH, high(Table*2)

ldi ZL, low(Table*2)

=========================

lpm temp, Z

=========================

table:

.dw 0b1100110011111111

т.е если указан 0, то в temp 11111111

а если указан 1, то в temp 11001100, так?

и еще вопрос, где указывать этот 0 или 1?

НА ЛЮБОЙ ЭЛЕМЕНТ НАЙДЕТСЯ МОЩНОСТЬ, КОТОРАЯ ЕГО СОЖЖЕТ

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

ага! все, понял,

Example:

ldi ZH, high(Table_1<<1) ; Initialize Z pointer

ldi ZL, low(Table_1<<1)

lpm r16, Z ; Load constant from program

; memory pointed to by Z (r31:r30)

...

Table_1:

.dw 0x5876; 0x76 is addresses when ZLSB = 0

; 0x58 is addresses when ZLSB = 1

НА ЛЮБОЙ ЭЛЕМЕНТ НАЙДЕТСЯ МОЩНОСТЬ, КОТОРАЯ ЕГО СОЖЖЕТ

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

нет, блин, не все понял, переписал программу под другой процессор, и там начались проблемы, командой lpm извлекается непонятно что (а точнее обсолютно не то, что дожно быть)

программа должна по прерыванию от таймера извлечь сл. значение из таблицы, определить, не конечное ли значение таблицы, если конечное - загрузить начало и выйти из прерывания. все.

кто-нибудь может подсказать почему она не работает? (у меня уже нет вариантов)

.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8535def.inc"

.def temp=r16

rjmp RESET ; Reset Handler

reti;rjmp EXT_INT0 ; IRQ0 Handler

reti;rjmp EXT_INT1 ; IRQ1 Handler

reti;rjmp TIM2_COMP ; Timer2 Compare Handler

reti;rjmp TIM2_OVF ; Timer2 Overflow Handler

reti;rjmp TIM1_CAPT ; Timer1 Capture Handler

reti;rjmp TIM1_COMPA ; Timer1 Compare A Handler

reti;rjmp TIM1_COMPB ; Timer1 Compare B Handler

reti;rjmp TIM1_OVF ; Timer1 Overflow Handler

reti;rjmp TIM0_OVF ; Timer0 Overflow Handler

reti;rjmp SPI_STC ; SPI Transfer Complete Handler

reti;rjmp USART_RXC ; USART RX Complete Handler

reti;rjmp USART_UDRE ; UDR Empty Handler

reti;rjmp USART_TXC ; USART TX Complete Handler

reti;rjmp ADC ; ADC Conversion Complete Handler

reti;rjmp EE_RDY ; EEPROM Ready Handler

reti;rjmp ANA_COMP ; Analog Comparator Handler

reti;rjmp TWSI ; Two-wire Serial Interface Handler

reti;rjmp EXT_INT2 ; IRQ2 Handler

rjmp TIM0_COMP ; Timer0 Compare Handler

reti;rjmp SPM_RDY ; Store Program Memory Ready Handler

RESET:

;íàñòîðîéêà ñ÷åò÷èêà Ò0

ldi temp,(1<<CS02)

out tccr0,temp

ldi temp,127

out ocr0,temp

ldi temp,(1<<ocie0)

out timsk,temp

;íàñòðîéêà ïîðòîâ

ldi temp,255

out ddrb,temp

;íàñòðîéêà èíäåêñíîãî ðåãèñòðà

ldi ZH, high(sinus*2)

ldi ZL, low(sinus*2)

;íàñòðîéêà óêàçàòåëÿ ñòåêà

ldi r16,high(RAMEND)

out SPH,r16

ldi r16,low(RAMEND)

out SPL,r16

sei ; Enable interrupts

main:

rjmp main

TIM0_COMP:

nop

LPM temp,Z+

out portb,temp

cpi temp,0b11111111

breq reload

out_TIM0_COMP:

reti

reload:

ldi ZH,high (sinus*2)

ldi ZL,low (sinus*2)

rjmp out_TIM0_COMP

sinus:

.dw 1010101010101010

.dw 0101010101010101

.dw 1111111111111111

НА ЛЮБОЙ ЭЛЕМЕНТ НАЙДЕТСЯ МОЩНОСТЬ, КОТОРАЯ ЕГО СОЖЖЕТ

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

в какой-то книге прочел... на память не вспомню в какой, но пробовал и с умножением, и без оного. результаты одинаковы.

НА ЛЮБОЙ ЭЛЕМЕНТ НАЙДЕТСЯ МОЩНОСТЬ, КОТОРАЯ ЕГО СОЖЖЕТ

Ссылка на комментарий
Поделиться на другие сайты

ldi ZH,high (sinus<<1)

ldi ZL,low (sinus<<1)

Я обычно так адресую. Все проходит. Только вот о каком втором байте вы говорите? Может это не у AVR? В описании говорится: команда LPM загружает ОДИН БАЙТ... И она используется либо без операндов, либо в качестве операнда идет номер регистра. Больше ничего.

Skef, а зачем тебе второй байт (dw 0101010101010101, бинар пишется dw 0b01010101...), ведь ты берешь только 8бит (temp 8-ми битный), да и порт тоже 8-ми битный. Перепиши:

sinus:

.db 0b10101010

.db 0b01010101

.db 0b11111111

или так

sinus:

.db 0xAA, 0x55, 0xFF (db $AA, $55, $FF)

индексный регистр устанавливай, как указано выше (или как у тебя). Если надо по два байта (16 бит), просто считывай два раза за один проход (не забудь в массив включить ВСЕ нужные байты). В памяти они расположатся линейно по адресам. С каждым LPM ...,Z+ индексный регистр будет инкременитроваться на 1. Все-равно "пройдешь" побайтно. 

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

поставил в каждой строчке в таблице .db, все как надо запустилось.

на контроллере будет светодинамическое устройство, крутится цилиндр, на нем стоят 16 светодиодов, создает рисунки, надписи, и пр. так что для понятности надо в шестнадцать разрядов все подробно писать. будет по два считывания в два порта

и еще можно пару вопросов?

1) почему sinus<<1? для чего нужен сдвиг (<<)

2)когда ставил не .dw, a .db, он выдавал: .db warning: .cseg .db misalignment - padding zero byte

НА ЛЮБОЙ ЭЛЕМЕНТ НАЙДЕТСЯ МОЩНОСТЬ, КОТОРАЯ ЕГО СОЖЖЕТ

Ссылка на комментарий
Поделиться на другие сайты

Хоть организация памяти 16-ти разрядная (кратная слову), но все же процессор 8-ми битный. Отсюда "1) почему sinus<<1? для чего нужен сдвиг (<<)" объясняется тем, что компилятор вычисляет адрес слова, а камень работает с адресом байта, поэтому и делается сдвиг (умножение на 2), т.к. в одном слове два байта. В твоей проге получается, что первый байт данных находится по адресу слова $002E, а адрес байта будет $002E*2 (или 002E<<1)= $005C, куда и обратится камень за данными, используя индексный регистр Z, который адресует не слова, а байты. Т.е. процессор, используя регистр Z, может адресоваться к одному байту данных, поэтому твое дело вычилить правильно адрес в программе.

директива .dw (data word) резервирует два байта (одно слово) и укладывает твои 0b1010101010101010 так $AAAA

директива .db (data byte) резервирует один байт и ей требуется только 0b10101010

Передавая директиве .db 16бит данных "2)когда ставил не .dw, a .db, он выдавал: .db warning: .cseg .db misalignment - padding zero byte" ты сводил с ума компилятор, который, повинуясь директиве, мог брать только 8бит из 16-ти, но и игнорировать 16-ти битное значение не мог. Поэтому в память укладывалось 00AA (вместо АААА). АА-взято 8-ми битной директивой из твоих данных, а 00-добавлено, потому что ты пытался уложить 16 бит. О чем ты и получал сообщение, которое можно расценить примерно так "неправильное размещение, добавлен нулевой байт".

В принципе и твой вариант адресуется правильно, но при эмуляции у меня не работало прерывание. И еще "...при косвенной адресации мы адресуемся к слову (2 байта), команда lpm выгружает один байт в r0, вопрос..." откуда взял? Мы адресуемся всегда к байту. 

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

  • 9 лет спустя...

Доброго дня, друзья. У меня возникла проблема с использованием команды LPM в симуляторе AVR studio 4, version 4.19 Build 730.

   mov   r30,ir
   mov   r31,irdop
   lpm   
   mov   ir,r0
   inc   r30  
   lpm   

Перед выполнением инструкции LPM в регистре Z число 0x0082, по этому адресу в памяти программ значение 0xbb. Однако в регистре R0 после исполнения я получаю 0xff.

В чём может быть проблема? 

Пока ты жив, надежда есть.

Ссылка на комментарий
Поделиться на другие сайты

52 минуты назад, mazzi сказал:

по этому адресу в памяти программ значение 0xbb

Может ты на 2 просмотрел умножить/поделить адрес - посмотри по адресу 0х0082/2 или 0х0082*2 - положи в них что то осмысленное чтобы понять!, скорее всего не тот адрес смотришь-читаешь!!!

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

avrstd.thumb.png.95f8d360cbdaa1cb3de4a078a65667c7.png

Вот так выглядит экран непосредственно перед выполнением инструкции LPM. Здесь видно содержимое Z и памяти программ. Делить зачем?

Пока ты жив, надежда есть.

Ссылка на комментарий
Поделиться на другие сайты

20 часов назад, mazzi сказал:

Здесь видно содержимое Z и памяти программ. Делить зачем?

Действительно все видно! Смотрите внимательнее!

потому что адресация памяти программ 2-х байтная (по слову), а вам надо по байтную адресацию.

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...