Ассемблер (ASM) для AVR в вопросах и ответах
А вы прерывания, то разрешили, котенок?
общее которое? Читайте внимательней даташит.. параллельно с Евстифеевым
- Реклама
М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 однозначно сходил с ума от такого кода - писал, что недопустимый адрес команды, тем не менее код был абсолютно рабочий, и студия в своем симуляторе его отлично проглатывала.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Значит этот велосипед изобретен до нас, но я в принципе вообще никак не удивлен, раз работает - грех не воспользоваться.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Меня одна тема приколола в описании СИшного компилятора IARовского. они там переменные не в ОЗУ запихивают, а в неиспользуемые регистры периферии. Таким образом экономят такты. Интересно придумали.
Ну молодцы, я тоже так делаю, особенно удобно для флагов (SBI/CBI гораздо удобнее чем LDS-ORI-STS/LDS-ANDI-STS). Мысля пришла сразу как только я увидел регистры GPIOR у тинек, которые прям специально для этого и нужны.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Не используемую периферию (например UBRR в USART), доступную командам SBIC, SBIS, CBI, SBI использую для флагов условий. Очень удобно. 
Вот это вы понаписали
Изменение порядка разрешения прерываний на ногах INT и их настройка результатов не принесли
По поводу того, что там пишется в по адресу 0xc1, я уже сомневаюсь в правильности своего вопроса 
А сейчас вот что я хотел спросить. Как правильно работать с 2байтным числом?
Я резервирую себе некую переменную
А как в неё правильно записывать?
Как-то так:
Придумываем число 5638
Переводим его в 0001 0110 0000 0110
После этого
Читать также, только использовать 2 регистра под старшую и младшую часть.
Ничего не путаю?
А вот, например, чтобы увеличить или уменьшить число, как быть?
Проверять на 0 старшую часть и если она 0, то отнимать командой
от младшей части.
А если она больше 0, декреминировать старшую часть.
А если надо отнять какое-то фиксированное число?
Как-то делать через команду
Если у кого есть под рукой, можете кинуть примеры вычитаний и сложений, плз? Мне не лень покопаться, я этим, собственно, щас и занимаюсь, но просто времени много уйдёт.
Изменение порядка разрешения прерываний на ногах INT и их настройка результатов не принесли
А сейчас вот что я хотел спросить. Как правильно работать с 2байтным числом?
Я резервирую себе некую переменную
Код: Выделить всё
.dseg
c: .byte 2
Как-то так:
Придумываем число 5638
Переводим его в 0001 0110 0000 0110
После этого
Код: Выделить всё
ldi Temp0, 0b00000110 ;Загрузка в Temp0 младшего байта
STS c, Temp0 Загрузка в первый(младший) байт c Temp0
ldi Temp0, 0b00010110 ;Загрузка в Temp0 старшего байта
STS c+1, Temp0 Загрузка во второй(старший) байт c Temp0
Ничего не путаю?
А вот, например, чтобы увеличить или уменьшить число, как быть?
Проверять на 0 старшую часть и если она 0, то отнимать командой
Код: Выделить всё
dec
А если она больше 0, декреминировать старшую часть.
А если надо отнять какое-то фиксированное число?
Как-то делать через команду
Код: Выделить всё
SBC
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Для операций со словами есть регистровые пары R25:R24, XH:XL, YH:YL, ZH:ZL. Лучше такие операции проводить командами ADIW R24,x (x=0...63).
Код: Выделить всё
LDI R25,HIGH(5638)
LDI R24,LOW(5638)
STS C+0,R25
STS C+1,R24
;
;
;
LDS R25,C+0
LDS R24,C+1
ADIW R24,1
Последний раз редактировалось akl Ср апр 16, 2014 17:01:53, всего редактировалось 1 раз.
через флаг Carry (C) делаются такие штуки. Или вон, как сказал akl, есть специальные команды ADIW, SBIW....


