Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Грызет канифоль
Сообщения: 278
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

друзья я все это понимаю (и знаю) как он взводиться и как он сбрасываеться.

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

а применение всегда найдеться - подняли флаг, сработало прерывание (хотя фактически понятно что нет). ну хотя это можно и еденицу записать на ногу прерывания.
больше ради спортивного интереса конечно.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

а проект сохранился?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Чудес не бывает, эти флаги программно только сбрасываются. Сама внутренняя логика такова.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15690
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

А почему бы и не поставить?
К примеру настроено прерывание по перепаду а сам порт предварительно выставлен как выход с уровнем 1.
Ежли аппаратно такой фокус пройдет - программа пишет туда 0 и тем самым ставит флаг в 1 (улетая в прерывание).
:roll:
Только по факту это то же самое программное прерывание, только по своей же лапке.
8)
Спутать - вполне можно с переусердия - флаги то на тех же местах, что и биты регистров порта...
:tea:
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

alex68md писал(а):просто у меня какимто чюдом получилось его вручную взвести через асм код
это был обман зрения :)
alex68md писал(а):вот просто доказать атмелу что мы можем даже программно его взвести
это вряд ли :) я так понимаю, что там обычный RS-триггер: на S вход заведена логика сигналов с пина микроконтроллера, а на вход R - внутренняя шина данных. поэтому при всем желании никак вы туда ничего не запишите, ибо пишется R-вход триггера, а читается - выход триггера.
BOB51 писал(а):А почему бы и не поставить?
потому что эта "поставка" делается не записью в регистр EIFR, как требуется по условию задачи :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Грызет канифоль
Сообщения: 278
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

ладно чтото никак не получается. наверно показалоось.

а подскажите такой вопрос. в первой строчки тут все понятно :
asm volatile("sbi %0, %1" : : "I" (_SFR_IO_ADDR(PORTB)), "I" (PB5));
asm volatile("sbi %0, 0x07" : "I" (_SFR_IO_ADDR(PORTB)):);

1) для чего вообще используется секция вывод и в каких случаях? после первой :
2) почему во второй строчке после первой : в секции вывод унас определение аргумента %0 , почему не после второго : ?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15690
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

ARV
Ёжли человек с перегрузу
:write: :sleep: :shock:
случайно вместо EIFR впишет
соответствующий порт ввода/вывода (или еще какого....),
а затем по утрячку при анализе вчерашнего ... поправится...
:dont_know:
Ведь от "волшебного исходника" у него следов не осталось...
:wink:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

alex68md, а не могли бы Вы сначала почитать документацию, а только после этого задавать вопросы?
Грызет канифоль
Сообщения: 278
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

Простонуб , т.е. если после этой инструкции переменная поменяет свое значение то она используется как вывод?
Ок, тогда куда писать порт, как первая или вторая строчка? У всех в примерах в нете порт как инпут, несмотря на то что по мануалу мы же меняем значение этой переменной и получается надо как во второй строчке?

Добавлено after 2 minutes 41 second:
BOB51, если это вы мне, то многократно уже озвучивалось , просто строчка sbi port,pin. Посмотрите мои ответы внимательно.
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

alex68md, с точки зрения компилятора, порт - это указатель, причем константный. И его значение мы не меняем. В ассемблере меняем то, на что ссылается этот указатель.
Грызет канифоль
Сообщения: 278
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

ПростоНуб, хорошо так и как правильнЕЕ ? первая или вторая запись ?
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

alex68md, правильнее первая, так как никаких переменных, известных компилятору, и никаких регистров, используемых компилятором, в коде не изменяется.
Грызет канифоль
Сообщения: 278
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

понятно спасибо
Опытный кот
Аватара пользователя
Сообщения: 859
Зарегистрирован: Ср апр 13, 2011 02:13:43

Сообщение ApTu(T »

Кто знает, что делать с ошибкой constant value required?
На вторую строку ругается:

Код: Выделить всё

waitForJ:
    sbis    USBIN, USBMINUS ;1 [40] wait for D- == 1
    rjmp    waitForJ        ;2
Гуглил, гуглил, вроде типа не объявлено что-то.
Я так подозреваю, что это USBIN. Так как не нашел его дефайн в проекте...
Грызет канифоль
Сообщения: 278
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3636754#p3636754"]alex68md, если так, как написали Вы, то не надо. Надо если так:

Код: Выделить всё

asm volatile("sbi 0x18,0x07\n\t \
              sbi 0x18,0x06");
[/uquote]

а третья \ тут опечатка ? так должно быть как далее

asm volatile("sbi 0x18,0x07\n\t
sbi 0x18,0x06");

или всетаки как у вас ?
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

alex68md, как у меня будет работать с любым компилятором, так как многострочный литерал преобразуется в однострочный средствами препроцессора С. Как у Вас - зависит уже от компилятора и его параметров.
Грызет канифоль
Сообщения: 278
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

а перед третьим \ должен быть пробел?

т.е. это универсальный вариант ?

Код: Выделить всё

asm volatile("sbi 0x18, 7\n\t \
              sbi 0x18, 6\n\t \
              sbi 0x18, 5");
это тоже?

Код: Выделить всё

asm volatile("sbi 0x18, 7\n\t;
              sbi 0x18, 6\n\t;
              sbi 0x18, 5");
а это не всегда ?

Код: Выделить всё

asm volatile("sbi 0x18, 7\n\t
              sbi 0x18, 6\n\t
              sbi 0x18, 5");
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

alex68md, второй вариант, вообще не будет работать, так как после табуляции в нем символ комментария, а значит и весь текст до следующего \n будет воспринят, как комментарий, а не как команда.
Я же уже писал, что первый вариант будет работать всегда. Третий - если компилятор поддерживает такую многострочную запись строковых литералов.
Грызет канифоль
Сообщения: 278
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

а можно ссылку какуюто с примерами про этот пустой литерал \
?

а то чёто както непонятно \нет я могу тупо повторять этот тимплейт и всё будет ок но хочеться больше понимания

так а пробел нужен или можно без ?
sbi port,pin \n\t\
sbi port,pin \n\t\
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

alex68md, достаточно почитать стандарт языка C. Да хоть С11 пункт 6.4.5.
Стандарт С внутри строкового литерала переход на новую строку не допускает, хотя многие компиляторы это позволяют.

Там же в подпукте 2 пункта 5.1.1.2 четко сказано, обратный слеш непосредственно предшествующий переходу на новую строку будет удален вместе с этим переходом, формируя одну логическую строку из нескольких физических.

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

Вернуться в «AVR»