tzzk писал(а):Ну я думаю, что это простое задание для многих из вас, а именно: даны МК: AT90can128 дисплей DV40400, клавиатура телефонная. написать программу проверки на нажатия кнопок...вот такое вот задание
А схема есть? Что сами начали делать?
Да, есть, прикладываю схему. Она разбита на 3 листа а4
Сам только недавно начал осваивать программирование МК и вообще С/C++. Сам писал программы на "двиганье" ножки и по передаче/приему байта по UARTу. Писал программу на нажатие 1 кнопки но там не прошла отладка в AVRStudio.
Ребят, добрый день. Вопрос. Вы замечали, что когда генерируешь прерывание, компилятор переделывает всё это дело в ассемблер и добавляет строки, где производит операции со стеком. Дело благое, но на это тратится время, которое в моём случае на вес золота. Можно ли как-то обойти это дело? Или вообще убрать эти строки, или же "пропихнуть" нужные мне операции до операций со стеком. Спасибо.
q9957789 писал(а):Ребят, добрый день. Вопрос. Вы замечали, что когда генерируешь прерывание, компилятор переделывает всё это дело в ассемблер и добавляет строки, где производит операции со стеком. Дело благое, но на это тратится время, которое в моём случае на вес золота. Можно ли как-то обойти это дело? Или вообще убрать эти строки, или же "пропихнуть" нужные мне операции до операций со стеком. Спасибо.
у вас есть 2 легальных пути для достижения своей цели:
1. Написать полностью ассемблерный модуль (файл *.S) с обработчиком нужного вам прерывания.
2. Использовать макрос ISR_NAKED для обработчика и соответствующим образом оформленную ассемблерную вставку в Сишном коде.
я бы советовал пойти по первому пути, но при должном старании и второй не плох.
кроме того, последние версии AVR-GCC со стеком работают получше, возможно, вам будет достаточно и этого...
битва с дураками проиграна, победители торжествуют. слава победителям!
q9957789 писал(а):Ребят, добрый день. Вопрос. Вы замечали, что когда генерируешь прерывание, компилятор переделывает всё это дело в ассемблер и добавляет строки, где производит операции со стеком. Дело благое, но на это тратится время, которое в моём случае на вес золота. Можно ли как-то обойти это дело? Или вообще убрать эти строки, или же "пропихнуть" нужные мне операции до операций со стеком. Спасибо.
у вас есть 2 легальных пути для достижения своей цели:
1. Написать полностью ассемблерный модуль (файл *.S) с обработчиком нужного вам прерывания.
2. Использовать макрос ISR_NAKED для обработчика и соответствующим образом оформленную ассемблерную вставку в Сишном коде.
я бы советовал пойти по первому пути, но при должном старании и второй не плох.
кроме того, последние версии AVR-GCC со стеком работают получше, возможно, вам будет достаточно и этого...
Спасибо, что касается работают получше, то это в любом случае не удовлетворяет требованиям, тк мне критичен каждый такт. Делаю синхронизацию 2-х м-последовательностей путём гхм, извините, детектирования растущего фронта синхроимпульса, исходящего, очевидно, из передатчика, после обнаружения запускаю вот то самое прерывание. Вся мп имеет время такта 10мкс, даже в лучшем случае было отставание одной от другой на 1,5 мкс, или 15%, а так низя)
В любом случае, то что вы предложили, кажется, идеально решает проблему, только я не знаю ничего ни о 1м, ни о 2м способе.
ну что касается выбора, написать ассемблерный модуль мне видится легче, чем морочиться со вставками. Значит идём по 1му...
Код на си можно описать так:(чтобы не заморачиваться вам)
ISR (INT0_vect)
{
PORTB=0xC0;//То что должно выполниться как можно раньше и без использования стека(практически), я надеюсь.
//дальше код кусочек, который может подождать.
}
Вот вопрос: как это оформить в .s файле и главное - как подключить его.
ISR (INT0_vect)
{
PORTB=0xC0;//То что должно выполниться как можно раньше и без использования стека(практически), я надеюсь.
//дальше код кусочек, который может подождать.
}
Вот вопрос: как это оформить в .s файле и главное - как подключить его.
если вы хотите делать асм-вставку, то код на си должен быть таким:
ISR(INT0_vect, ISR_NAKED){
asm("
push r17 \n
ldi r17, 0xC0 \n
out _SFR_IO_ADDR(PORTB), r17 \n
...
pop r17 \n
reti
");
}
по образу и подобию можете написать все, что пожелаете. учтите, что "кусочек, который может подождать" (вместо многоточия) придется тоже писать на голом асме, т.к. благодаря ISR_NAKED вы не имеете возможности пользоваться Сишными возможностями из-за автоматически несохраняемых регистров в стеке.
про то, как оформлять файлы *.S (обращаю ваше внимание на то, что регистр буквы S играет роль!!!), лучше всего почитать в документации. подключать их к проекту точно так же, как и исходники на Си.
битва с дураками проиграна, победители торжествуют. слава победителям!
ISR(INT0_vect, ISR_NAKED){
asm("
push r17 \n
ldi r17, 0xC0 \n
out _SFR_IO_ADDR(PORTB), r17 \n
...
pop r17 \n
reti
");
}
по образу и подобию можете написать все, что пожелаете. учтите, что "кусочек, который может подождать" (вместо многоточия) придется тоже писать на голом асме, т.к. благодаря ISR_NAKED вы не имеете возможности пользоваться Сишными возможностями из-за автоматически несохраняемых регистров в стеке.
про то, как оформлять файлы *.S (обращаю ваше внимание на то, что регистр буквы S играет роль!!!), лучше всего почитать в документации. подключать их к проекту точно так же, как и исходники на Си.
Я так вижу даже при написании .S файла нужно пользоваться этим извращённым ассемблером?)))
Ну ладно это пол беды. Мне дальше, по ходу прерывания, нужно вызывать си функцию(если конкретней, то это функция вывода на LCD). Переписывать её отдельно на ассемблере я не вижу возможным, уж очень много мороки. Как это разрешить?
Слышь ты, красавчик, я тоже самое могу у тебя спросить.
Мастер Ломастер писал(а): учтите, что "кусочек, который может подождать" (вместо многоточия) придется тоже писать на голом асме, т.к. благодаря ISR_NAKED вы не имеете возможности пользоваться Сишными возможностями из-за автоматически несохраняемых регистров в стеке.
Выводите информацию на экран в основном цикле.
А вообще суть задачи не уловил, если нужно синхронизировать какие-то сигналы , да еще и с высокой точностью, то не проще-ли воспользоваться логикой\плис?
q9957789 писал(а):Я так вижу даже при написании .S файла нужно пользоваться этим извращённым ассемблером?)))
я не знаю, что именно вы называете извращенным ассемблером, но как по мне, так avr-as на несколько порядков лучше, чем дефолтный ассемблер в AVR Studio.
кроме того, обращаю ваше внимание на то, что я говорил об ассемблерных вставках в Сишном коде, т.к. ISR - это макрос дя исходника Си, а не ассемблера. а S-файл - это именно исходник на ассемблере, без всяких ISR и т.п. Сишных штучек, правда, с полной поддержкой сишного препроцессора.
P.S. вам Совесть правильно подсказывает: вывод на ЖКИ (да и вообще куда бы то ни было) делать в обработчике прерывания - это моветон программирования! так делать не стоит.
битва с дураками проиграна, победители торжествуют. слава победителям!
Я бы вообще не заморачивался, но это не моя прихоть запрячь все эти прелести на мк. Хотя честно говоря, на плисах вообще никогда не работал и даже не знаю как это сделать, кстати с большим бы интересом послушал про это.
Что касается вывода на ЖКИ, то, во-первых, сделать это в таком виде надо только один раз, при обнаружении синхроимпульса на ножке, а, во вторых, в основном цикле я вообще ничего сделать не имею права, ибо появляется джиттер, опяь таки большой дядя настучит по бошке)))
В любом случае проблему я решил, через naked и вставки. Погрешность до 1%. Огромное вам спасибо.
Ещё раз, у меня нет выхода, просто не могу)потом последствия будут хуже чем если я буду удовлетворять вашему программистскому кодексу чести.
А что за подсказки, что за суть? Если только в этом, то..ладно. ^^
q9957789 писал(а):
Слышь ты, красавчик, я тоже самое могу у тебя спросить.
Мастер Ломастер писал(а): учтите, что "кусочек, который может подождать" (вместо многоточия) придется тоже писать на голом асме, т.к. благодаря ISR_NAKED вы не имеете возможности пользоваться Сишными возможностями из-за автоматически несохраняемых регистров в стеке.
И где тут видно содержание файла .S про который сами же спросили?
q9957789 писал(а):
Я так вижу даже при написании .S файла нужно пользоваться этим извращённым ассемблером?)))