Думаете, прокатит? Мне кажется, компилятор будет пытаться допрыгнуть дотудова правильно, т.е. прибавляя больше чем 2к слов. Хотя извратиться, возможно, удастся.Engineer_Keen писал(а):Ну так одна фигня, если переход с отрицательным адресом, то он с конца флеша в 8к будет считаться. т.е. все что с положительным адресом перескакивает в нижнюю половину флеша, все что с отрицательным - в верхнюю.
Ассемблер (ASM) для AVR в вопросах и ответах
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
Спасибо, парни, вроде бы прояснилось 
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Да что Вы говорите? ))) А старшие биты в PC кто будет формировать? ))) У Вас команда-то с отрицательным значением сформирует только младшие 12 бит, а старшие в PC останутся нулями.Ну так одна фигня, если переход с отрицательным адресом, то он с конца флеша в 8к будет считаться. т.е. все что с положительным адресом перескакивает в нижнюю половину флеша, все что с отрицательным - в верхнюю. Ну да, можно запутаться по началу, но на то он и ассемблер
P.S. Если там только не используется что-то типа расширения знака... (Коты, кто хочет проверить? ) )))))))))))))))
Последний раз редактировалось ИС-пытатель Ср апр 16, 2014 11:45:18, всего редактировалось 1 раз.
Блин, народ, не тупите
Только что на меге8 даже проверил
Для тех кто путается: 0x0FFF - это последние 2 байта 8 килобайтного флеша (последнее слово из 4096 слов).
Конечно я не собирался аргументом RJMP-у задавать отрицательный адрес, это задача компилятора, если я правильно понял ваше непонимание
Только что на меге8 даже проверил
Код: Выделить всё
.org 0
START:
RJMP TEST111
TEST222:
RJMP PC
.org 0x0FFF
TEST111:RJMP TEST222
Конечно я не собирался аргументом RJMP-у задавать отрицательный адрес, это задача компилятора, если я правильно понял ваше непонимание
Последний раз редактировалось Engineer_Keen Ср апр 16, 2014 11:44:44, всего редактировалось 1 раз.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Расширитель знака как раз и поломает всю малину. Адрес -1 будет адресовать ячейку с адресом 0x0FFF
- Реклама
А че тут проверять? В мега 8 вектора по 1 слову. Значит Инженеркин был прав. )
Вот, на 2560 на железе проверял. Все робит. Значит, с расширением знака идет.
Код: Выделить всё
.cseg
rjmp 0x800 ; k=-2048 (12 бит) почему-то команда напрямую не воспринимает отрицательные числа
main: rjmp main
.org 262144/2-2048 ; размер флеши в байтах переведенный в слова и за вычетом k
ldi r16, 0xFF
ldi r17, 0x00
out DDRA, r16 ; порт на выход
out PORTA, r17 ; зажечь светодиоды (обратная полярность)
main2: rjmp main2Котыыыы
Такая интересная штука, короче, не работают прерывания на ногах INT0 и INT1. (Просто не реагируют никак.
А дело во какое:
Конфигурируем ответственные регистры:



Второй по аналогии.
Начинаю смотреть пошагово. И в момент, когда в EIMSK записывается 0b00000011, в регистре EIFR, который содержит в себе флаги этих прерываний,

Внезапно появляется (его адрес .equ EIFR = 0x1c)

Но, простите, откуда? На ноги прерываний приходит VCC, через резисторы, конечно, кнопочки не нажаты.
Но не смотря на то, что флаги подняты, в обработчик программа не уходит. Если смотреть на реальном контроллере, то он просто не реагирует на нажатия кнопок. SEI я не забыл. И программа на СИ, на этой же платке, работает нормально с прерываниями. Опять я что-то не знаю про AMtega48...?
UPD:
ldi Temp, 0b00000000
STS EIFR, Temp
не сбрасывают в 0 значения в 0x1c. Что-то я с чем-то путаю, походу.
А дело во какое:
Конфигурируем ответственные регистры:
Код: Выделить всё
;Прерывания для кнопок
ldi Temp, 0b00000011 ; Разрешение прерывания на INT1 и INT0
STS EIMSK, Temp
ldi Temp, 0b00001010 ; Прерывание по спадающему фронту INT1 и INT0
STS EICRA, Temp



Второй по аналогии.
Начинаю смотреть пошагово. И в момент, когда в EIMSK записывается 0b00000011, в регистре EIFR, который содержит в себе флаги этих прерываний,

Внезапно появляется (его адрес .equ EIFR = 0x1c)

Но, простите, откуда? На ноги прерываний приходит VCC, через резисторы, конечно, кнопочки не нажаты.
Но не смотря на то, что флаги подняты, в обработчик программа не уходит. Если смотреть на реальном контроллере, то он просто не реагирует на нажатия кнопок. SEI я не забыл. И программа на СИ, на этой же платке, работает нормально с прерываниями. Опять я что-то не знаю про AMtega48...?
UPD:
ldi Temp, 0b00000000
STS EIFR, Temp
не сбрасывают в 0 значения в 0x1c. Что-то я с чем-то путаю, походу.
Последний раз редактировалось Мikа Ср апр 16, 2014 12:38:13, всего редактировалось 1 раз.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
А вы прерывания, то разрешили, котенок?
общее которое? Читайте внимательней даташит.. параллельно с Евстифеевым
Мikа писал(а):SEI я не забыл.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Флаги сбрасываются записью единицы, если вы об этом.UPD:не сбрасывают в 0 значения в 0x1c. Что-то я с чем-то путаю, походу.Код: Выделить всё
ldi Temp, 0b00000000 STS EIFR, Temp
Код: Выделить всё
ldi Temp, 0b00000011
STS EIFR, TempВ таблице векторов переход на обработчик обозначили, стек проинициализировали, из обработчика по reti вышли?
А вот в контроллерах с большим объемом флеш подобная конструкция уже не прокатывает (естесственно крайний адрес менялся). Студийный компилятор ругается на выход из диапазона. Не хочет через задницу заходить.Engineer_Keen писал(а):Блин, народ, не тупите![]()
Только что на меге8 даже проверилКод: Выделить всё
.org 0 START: RJMP TEST111 TEST222: RJMP PC .org 0x0FFF TEST111:RJMP TEST222
Последний раз редактировалось ИС-пытатель Ср апр 16, 2014 13:47:36, всего редактировалось 1 раз.
Да, но там RJMP по-прежнему работает как надо, просто прибавляя или отнимая 2кслова можно попасть в любое место 4ксловной памяти. А в 4килословной (16кб, мега16 например) нельзя, там можно с нулевого адреса попасть на адрес до +0х0800, а вот с 0х0800 уже можно и вверх на еще 0х0800 или вниз на 0х07FF. За этим компилятор следит.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Вообще, правило простое - сначала настраиваешь потом разрешаешь. А ты сначала разрешил прерывания а потом настроил периферию. Как она себя при этом проведет - неизвестно. Флаги прерываний сбрасываются записью "1" в соответствующие биты, это написано в даташите если внимательно читать.не работают прерывания на ногах INT0 и INT1.
Все работает, на ATMEGA48 подобный способ инициализации вполне работает. Только сначала надо тронуть EICRA, а затем EIMSK.
Да, компилятор.. Вот и странно, что я не могу как в 8-кБайтной через "обратку" пробежать на 4 кБайта.... Интересно, на уровне железа-то это поддерживается?..... пойду hex файл мучать
Не знаю как в железе (думаю что поддерживается), но в симуляторах работает.ИС-пытатель писал(а):Вот и странно, что я не могу как в 8-кБайтной через "обратку" пробежать на 4 кБайта.... Интересно, на уровне железа-то это поддерживается?
Код: Выделить всё
.org 0
.db 0xFD,0xCF ;аналог RJMP на 1 адрес вниз
.org 0x1FFE
.db 0x01,0xC0 ;аналог RJMP на 1 адрес вверх
Надо проверить в железе
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Круто. Писать в машинных кодахEngineer_Keen писал(а):Код: Выделить всё
.org 0 .db 0xFD,0xCF ;аналог RJMP на 1 адрес вниз .org 0x1FFE .db 0x01,0xC0 ;аналог RJMP на 1 адрес вверх
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
симулятор в 6-й студии поддерживает, а компилятор - нет.
Работает в железе. Только что проверил. залазит с конца. Я только hex шаманил.. ))
Компилятор матерится на RJMP с недопустимым адресом? В 4-той такая же фигня, это защита от дурака
Работает в железе, ну зашибись, значит можно эту хитрость использовать для каких-нибудь хитрых трюков.
Gudd-Head
Жить захочешь - не так раскорячишься
А вообще такой стиль программирования костылей пошел со времен спектрума...
Работает в железе, ну зашибись, значит можно эту хитрость использовать для каких-нибудь хитрых трюков.
Спойлер
ОффтопGudd-Head
Жить захочешь - не так раскорячишься
А вообще такой стиль программирования костылей пошел со времен спектрума...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
что касается прыжков с переподвыподвертом, то AVR-GCC в полный рост генерирует для МК код, в котором используется прыжок в обратную сторону путем прыжка вперед через границу доступной flash
сказал - сам не понял, что, но надеюсь, все поняли, что я имел ввиду 
протеус 7.2 однозначно сходил с ума от такого кода - писал, что недопустимый адрес команды, тем не менее код был абсолютно рабочий, и студия в своем симуляторе его отлично проглатывала.
протеус 7.2 однозначно сходил с ума от такого кода - писал, что недопустимый адрес команды, тем не менее код был абсолютно рабочий, и студия в своем симуляторе его отлично проглатывала.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


