Ну я думаю, что это простое задание для многих из вас, а именно: даны МК: AT90can128 дисплей DV40400, клавиатура телефонная. написать программу проверки на нажатия кнопок...вот такое вот задание
А схема есть? Что сами начали делать?
Да, есть, прикладываю схему. Она разбита на 3 листа а4
Сам только недавно начал осваивать программирование МК и вообще С/C++. Сам писал программы на "двиганье" ножки и по передаче/приему байта по UARTу. Писал программу на нажатие 1 кнопки но там не прошла отладка в AVRStudio.
Ребят, добрый день. Вопрос. Вы замечали, что когда генерируешь прерывание, компилятор переделывает всё это дело в ассемблер и добавляет строки, где производит операции со стеком. Дело благое, но на это тратится время, которое в моём случае на вес золота. Можно ли как-то обойти это дело? Или вообще убрать эти строки, или же "пропихнуть" нужные мне операции до операций со стеком. Спасибо.
Заголовок сообщения: Re: WinAvr в вопросах и ответах
Добавлено: Чт апр 05, 2012 14:57:58
Поставщик валерьянки для Кота
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
q9957789 писал(а):
Ребят, добрый день. Вопрос. Вы замечали, что когда генерируешь прерывание, компилятор переделывает всё это дело в ассемблер и добавляет строки, где производит операции со стеком. Дело благое, но на это тратится время, которое в моём случае на вес золота. Можно ли как-то обойти это дело? Или вообще убрать эти строки, или же "пропихнуть" нужные мне операции до операций со стеком. Спасибо.
у вас есть 2 легальных пути для достижения своей цели: 1. Написать полностью ассемблерный модуль (файл *.S) с обработчиком нужного вам прерывания. 2. Использовать макрос ISR_NAKED для обработчика и соответствующим образом оформленную ассемблерную вставку в Сишном коде.
я бы советовал пойти по первому пути, но при должном старании и второй не плох.
кроме того, последние версии AVR-GCC со стеком работают получше, возможно, вам будет достаточно и этого...
_________________ битва с дураками проиграна, победители торжествуют. слава победителям!
Ребят, добрый день. Вопрос. Вы замечали, что когда генерируешь прерывание, компилятор переделывает всё это дело в ассемблер и добавляет строки, где производит операции со стеком. Дело благое, но на это тратится время, которое в моём случае на вес золота. Можно ли как-то обойти это дело? Или вообще убрать эти строки, или же "пропихнуть" нужные мне операции до операций со стеком. Спасибо.
у вас есть 2 легальных пути для достижения своей цели: 1. Написать полностью ассемблерный модуль (файл *.S) с обработчиком нужного вам прерывания. 2. Использовать макрос ISR_NAKED для обработчика и соответствующим образом оформленную ассемблерную вставку в Сишном коде.
я бы советовал пойти по первому пути, но при должном старании и второй не плох.
кроме того, последние версии AVR-GCC со стеком работают получше, возможно, вам будет достаточно и этого...
Спасибо, что касается работают получше, то это в любом случае не удовлетворяет требованиям, тк мне критичен каждый такт. Делаю синхронизацию 2-х м-последовательностей путём гхм, извините, детектирования растущего фронта синхроимпульса, исходящего, очевидно, из передатчика, после обнаружения запускаю вот то самое прерывание. Вся мп имеет время такта 10мкс, даже в лучшем случае было отставание одной от другой на 1,5 мкс, или 15%, а так низя)
В любом случае, то что вы предложили, кажется, идеально решает проблему, только я не знаю ничего ни о 1м, ни о 2м способе. ну что касается выбора, написать ассемблерный модуль мне видится легче, чем морочиться со вставками. Значит идём по 1му...
Код на си можно описать так:(чтобы не заморачиваться вам)
Код:
ISR (INT0_vect) { PORTB=0xC0;//То что должно выполниться как можно раньше и без использования стека(практически), я надеюсь. //дальше код кусочек, который может подождать. }
Вот вопрос: как это оформить в .s файле и главное - как подключить его.
Заголовок сообщения: Re: WinAvr в вопросах и ответах
Добавлено: Чт апр 05, 2012 21:04:57
Поставщик валерьянки для Кота
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
q9957789 писал(а):
Код на си можно описать так:(чтобы не заморачиваться вам)
Код:
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). Переписывать её отдельно на ассемблере я не вижу возможным, уж очень много мороки. Как это разрешить?
q9957789Вы читать умеете или только на цитаты нажимать?
Мастер Ломастер писал(а):
если вы хотите делать асм-вставку, то код на си должен быть таким:
Код:
ISR(INT0_vect, ISR_NAKED){ }
Слышь ты, красавчик, я тоже самое могу у тебя спросить.
Мастер Ломастер писал(а):
учтите, что "кусочек, который может подождать" (вместо многоточия) придется тоже писать на голом асме, т.к. благодаря ISR_NAKED вы не имеете возможности пользоваться Сишными возможностями из-за автоматически несохраняемых регистров в стеке.
Выводите информацию на экран в основном цикле. А вообще суть задачи не уловил, если нужно синхронизировать какие-то сигналы , да еще и с высокой точностью, то не проще-ли воспользоваться логикой\плис?
Заголовок сообщения: Re: WinAvr в вопросах и ответах
Добавлено: Пт апр 06, 2012 10:19:10
Поставщик валерьянки для Кота
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
q9957789 писал(а):
Я так вижу даже при написании .S файла нужно пользоваться этим извращённым ассемблером?)))
я не знаю, что именно вы называете извращенным ассемблером, но как по мне, так avr-as на несколько порядков лучше, чем дефолтный ассемблер в AVR Studio.
кроме того, обращаю ваше внимание на то, что я говорил об ассемблерных вставках в Сишном коде, т.к. ISR - это макрос дя исходника Си, а не ассемблера. а S-файл - это именно исходник на ассемблере, без всяких ISR и т.п. Сишных штучек, правда, с полной поддержкой сишного препроцессора.
P.S. вам Совесть правильно подсказывает: вывод на ЖКИ (да и вообще куда бы то ни было) делать в обработчике прерывания - это моветон программирования! так делать не стоит.
_________________ битва с дураками проиграна, победители торжествуют. слава победителям!
Я бы вообще не заморачивался, но это не моя прихоть запрячь все эти прелести на мк. Хотя честно говоря, на плисах вообще никогда не работал и даже не знаю как это сделать, кстати с большим бы интересом послушал про это.
Что касается вывода на ЖКИ, то, во-первых, сделать это в таком виде надо только один раз, при обнаружении синхроимпульса на ножке, а, во вторых, в основном цикле я вообще ничего сделать не имею права, ибо появляется джиттер, опяь таки большой дядя настучит по бошке)))
В любом случае проблему я решил, через naked и вставки. Погрешность до 1%. Огромное вам спасибо.
Ещё раз, у меня нет выхода, просто не могу)потом последствия будут хуже чем если я буду удовлетворять вашему программистскому кодексу чести. А что за подсказки, что за суть? Если только в этом, то..ладно. ^^
Слышь ты, красавчик, я тоже самое могу у тебя спросить.
Мастер Ломастер писал(а):
учтите, что "кусочек, который может подождать" (вместо многоточия) придется тоже писать на голом асме, т.к. благодаря ISR_NAKED вы не имеете возможности пользоваться Сишными возможностями из-за автоматически несохраняемых регистров в стеке.
И где тут видно содержание файла .S про который сами же спросили?
q9957789 писал(а):
Я так вижу даже при написании .S файла нужно пользоваться этим извращённым ассемблером?)))
_________________ В поисках истины человек развивается.
Сейчас этот форум просматривают: Jack_A и гости: 328
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения