Обсуждаем контроллеры компании Atmel.
Вт май 21, 2019 16:26:41
друзья я все это понимаю (и знаю) как он взводиться и как он сбрасываеться.
просто у меня какимто чюдом получилось его вручную взвести через асм код. но на следующий день уже не получалось.
вот просто доказать атмелу что мы можем даже программно его взвести
както же у меня получилось, не переглючило же меня так сильно
утром делал на свежую голову.
а применение всегда найдеться - подняли флаг, сработало прерывание (хотя фактически понятно что нет). ну хотя это можно и еденицу записать на ногу прерывания.
больше ради спортивного интереса конечно.
Вт май 21, 2019 16:43:46
а проект сохранился?
Вт май 21, 2019 17:03:57
Чудес не бывает, эти флаги программно только сбрасываются. Сама внутренняя логика такова.
Вт май 21, 2019 18:26:11
А почему бы и не поставить?
К примеру настроено прерывание по перепаду а сам порт предварительно выставлен как выход с уровнем 1.
Ежли аппаратно такой фокус пройдет - программа пишет туда 0 и тем самым ставит флаг в 1 (улетая в прерывание).
Только по факту это то же самое программное прерывание, только по своей же лапке.
Спутать - вполне можно с переусердия - флаги то на тех же местах, что и биты регистров порта...
Вт май 21, 2019 18:33:43
alex68md писал(а):просто у меня какимто чюдом получилось его вручную взвести через асм код
это был обман зрения
alex68md писал(а):вот просто доказать атмелу что мы можем даже программно его взвести
это вряд ли
я так понимаю, что там обычный RS-триггер: на S вход заведена логика сигналов с пина микроконтроллера, а на вход R - внутренняя шина данных. поэтому при всем желании никак вы туда ничего не запишите, ибо пишется R-вход триггера, а читается - выход триггера.
BOB51 писал(а):А почему бы и не поставить?
потому что эта "поставка" делается не записью в регистр EIFR, как требуется по условию задачи
Ср май 22, 2019 08:20:35
ладно чтото никак не получается. наверно показалоось.
а подскажите такой вопрос. в первой строчки тут все понятно :
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 , почему не после второго : ?
Ср май 22, 2019 09:04:34
ARVЁжли человек с перегрузу
случайно вместо EIFR впишет
соответствующий порт ввода/вывода (или еще какого....),
а затем по утрячку при анализе вчерашнего ... поправится...
Ведь от "волшебного исходника" у него следов не осталось...
Ср май 22, 2019 09:12:30
alex68md, а не могли бы Вы сначала почитать
документацию, а только после этого задавать вопросы?
Ср май 22, 2019 10:52:07
Простонуб , т.е. если после этой инструкции переменная поменяет свое значение то она используется как вывод?
Ок, тогда куда писать порт, как первая или вторая строчка? У всех в примерах в нете порт как инпут, несмотря на то что по мануалу мы же меняем значение этой переменной и получается надо как во второй строчке?
Добавлено after 2 minutes 41 second:
BOB51, если это вы мне, то многократно уже озвучивалось , просто строчка sbi port,pin. Посмотрите мои ответы внимательно.
Ср май 22, 2019 12:02:56
alex68md, с точки зрения компилятора, порт - это указатель, причем константный. И его значение мы не меняем. В ассемблере меняем то, на что ссылается этот указатель.
Ср май 22, 2019 14:25:26
ПростоНуб, хорошо так и как правильнЕЕ ? первая или вторая запись ?
Ср май 22, 2019 15:27:35
alex68md, правильнее первая, так как никаких переменных, известных компилятору, и никаких регистров, используемых компилятором, в коде не изменяется.
Ср май 22, 2019 16:33:10
понятно спасибо
Чт май 23, 2019 05:06:47
Кто знает, что делать с ошибкой constant value required?
На вторую строку ругается:
- Код:
waitForJ:
sbis USBIN, USBMINUS ;1 [40] wait for D- == 1
rjmp waitForJ ;2
Гуглил, гуглил, вроде типа не объявлено что-то.
Я так подозреваю, что это USBIN. Так как не нашел его дефайн в проекте...
Чт май 23, 2019 06:35:27
alex68md, если так, как написали Вы, то не надо. Надо если так:
- Код:
asm volatile("sbi 0x18,0x07\n\t \
sbi 0x18,0x06");
а третья \ тут опечатка ? так должно быть как далее
asm volatile("sbi 0x18,0x07\n\t
sbi 0x18,0x06");
или всетаки как у вас ?
Чт май 23, 2019 08:07:40
alex68md, как у меня будет работать с любым компилятором, так как многострочный литерал преобразуется в однострочный средствами препроцессора С. Как у Вас - зависит уже от компилятора и его параметров.
Чт май 23, 2019 14:01:15
а перед третьим \ должен быть пробел?
т.е. это универсальный вариант ?
- Код:
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");
Чт май 23, 2019 14:52:32
alex68md, второй вариант, вообще не будет работать, так как после табуляции в нем символ комментария, а значит и весь текст до следующего \n будет воспринят, как комментарий, а не как команда.
Я же уже писал, что первый вариант будет работать всегда. Третий - если компилятор поддерживает такую многострочную запись строковых литералов.
Чт май 23, 2019 15:11:34
а можно ссылку какуюто с примерами про этот пустой литерал \
?
а то чёто както непонятно \нет я могу тупо повторять этот тимплейт и всё будет ок но хочеться больше понимания
так а пробел нужен или можно без ?
sbi port,pin \n\t\
sbi port,pin \n\t\
Чт май 23, 2019 15:47:22
alex68md, достаточно почитать стандарт языка C. Да хоть
С11 пункт 6.4.5.
Стандарт С внутри строкового литерала переход на новую строку не допускает, хотя многие компиляторы это позволяют.
Там же в подпукте 2 пункта 5.1.1.2 четко сказано, обратный слеш непосредственно предшествующий переходу на новую строку будет удален вместе с этим переходом, формируя одну логическую строку из нескольких физических.
Отсюда же следует, что пробел перед последним обратным слешем не обязателен, но заметно повышает читабельность.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.