WinAvr в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
tzzk
Родился
Сообщения: 9
Зарегистрирован: Пт мар 30, 2012 20:29:41
Откуда: СПб

Re: WinAvr в вопросах и ответах

Сообщение tzzk »

vitalik_1984 писал(а):
tzzk писал(а):Ну я думаю, что это простое задание для многих из вас, а именно: даны МК: AT90can128 дисплей DV40400, клавиатура телефонная. написать программу проверки на нажатия кнопок...вот такое вот задание

А схема есть? Что сами начали делать?


Да, есть, прикладываю схему. Она разбита на 3 листа а4

Сам только недавно начал осваивать программирование МК и вообще С/C++. Сам писал программы на "двиганье" ножки и по передаче/приему байта по UARTу. Писал программу на нажатие 1 кнопки но там не прошла отладка в AVRStudio.
Вложения
003а.jpg
(69.86 КБ) 461 скачивание
002.jpg
(83.16 КБ) 456 скачиваний
001a.jpg
(109.85 КБ) 428 скачиваний
Кот кота видит издалека)
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение vitalik_1984 »

Нифига себе задание что это проект запуска ракеты?
Может вы создадите свою тему? тут так то вопросы по WinAVR.
В поисках истины человек развивается.
Аватара пользователя
tzzk
Родился
Сообщения: 9
Зарегистрирован: Пт мар 30, 2012 20:29:41
Откуда: СПб

Re: WinAvr в вопросах и ответах

Сообщение tzzk »

vitalik_1984 писал(а):Нифига себе задание что это проект запуска ракеты?
Может вы создадите свою тему? тут так то вопросы по WinAVR.



В принципе в схеме я разбираюсь, но именно в написании программы состоит проблема :(

Создал свою тему, спасибо)
Кот кота видит издалека)
q9957789
Родился
Сообщения: 8
Зарегистрирован: Чт апр 05, 2012 14:39:29

Re: WinAvr в вопросах и ответах

Сообщение q9957789 »

Ребят, добрый день. Вопрос. Вы замечали, что когда генерируешь прерывание, компилятор переделывает всё это дело в ассемблер и добавляет строки, где производит операции со стеком. Дело благое, но на это тратится время, которое в моём случае на вес золота. Можно ли как-то обойти это дело? Или вообще убрать эти строки, или же "пропихнуть" нужные мне операции до операций со стеком. Спасибо.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

q9957789 писал(а):Ребят, добрый день. Вопрос. Вы замечали, что когда генерируешь прерывание, компилятор переделывает всё это дело в ассемблер и добавляет строки, где производит операции со стеком. Дело благое, но на это тратится время, которое в моём случае на вес золота. Можно ли как-то обойти это дело? Или вообще убрать эти строки, или же "пропихнуть" нужные мне операции до операций со стеком. Спасибо.

у вас есть 2 легальных пути для достижения своей цели:
1. Написать полностью ассемблерный модуль (файл *.S) с обработчиком нужного вам прерывания.
2. Использовать макрос ISR_NAKED для обработчика и соответствующим образом оформленную ассемблерную вставку в Сишном коде.

я бы советовал пойти по первому пути, но при должном старании и второй не плох.

кроме того, последние версии AVR-GCC со стеком работают получше, возможно, вам будет достаточно и этого...
битва с дураками проиграна, победители торжествуют. слава победителям!
q9957789
Родился
Сообщения: 8
Зарегистрирован: Чт апр 05, 2012 14:39:29

Re: WinAvr в вопросах и ответах

Сообщение q9957789 »

Мастер Ломастер писал(а):
q9957789 писал(а):Ребят, добрый день. Вопрос. Вы замечали, что когда генерируешь прерывание, компилятор переделывает всё это дело в ассемблер и добавляет строки, где производит операции со стеком. Дело благое, но на это тратится время, которое в моём случае на вес золота. Можно ли как-то обойти это дело? Или вообще убрать эти строки, или же "пропихнуть" нужные мне операции до операций со стеком. Спасибо.

у вас есть 2 легальных пути для достижения своей цели:
1. Написать полностью ассемблерный модуль (файл *.S) с обработчиком нужного вам прерывания.
2. Использовать макрос ISR_NAKED для обработчика и соответствующим образом оформленную ассемблерную вставку в Сишном коде.

я бы советовал пойти по первому пути, но при должном старании и второй не плох.

кроме того, последние версии AVR-GCC со стеком работают получше, возможно, вам будет достаточно и этого...


Спасибо, что касается работают получше, то это в любом случае не удовлетворяет требованиям, тк мне критичен каждый такт. Делаю синхронизацию 2-х м-последовательностей путём гхм, извините, детектирования растущего фронта синхроимпульса, исходящего, очевидно, из передатчика, после обнаружения запускаю вот то самое прерывание. Вся мп имеет время такта 10мкс, даже в лучшем случае было отставание одной от другой на 1,5 мкс, или 15%, а так низя)

В любом случае, то что вы предложили, кажется, идеально решает проблему, только я не знаю ничего ни о 1м, ни о 2м способе.
ну что касается выбора, написать ассемблерный модуль мне видится легче, чем морочиться со вставками. Значит идём по 1му...

Код на си можно описать так:(чтобы не заморачиваться вам)

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

ISR (INT0_vect)
{
   PORTB=0xC0;//То что должно выполниться как можно раньше и без использования стека(практически), я надеюсь.
//дальше код кусочек, который может подождать.
}


Вот вопрос: как это оформить в .s файле и главное - как подключить его.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

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 играет роль!!!), лучше всего почитать в документации. подключать их к проекту точно так же, как и исходники на Си.
битва с дураками проиграна, победители торжествуют. слава победителям!
q9957789
Родился
Сообщения: 8
Зарегистрирован: Чт апр 05, 2012 14:39:29

Re: WinAvr в вопросах и ответах

Сообщение q9957789 »

Мастер Ломастер писал(а):если вы хотите делать асм-вставку, то код на си должен быть таким:

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

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 (INT0_vect)//многие переменные объявлены регистрами
{
   PORTB=0xC0;
   TCNT0=79;
   out=0x40;//r2
   born=0xE0;//r16
   q=1;//r17
   status&=~_BV(mid);
   if(!(status&_BV(rcvr)))
   {
       LCD_WriteCom(0x01);
       _delay_ms(2);
       LCD_WriteCom(0x83);
       LCD_WriteData('%');
       ACSR=_BV(ACIE)|0b11;
       status|=_BV(rcvr);   
   }   
    TIFR=0xFF;
    GIFR=0xFF;
}
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение vitalik_1984 »

q9957789Вы читать умеете или только на цитаты нажимать?
Мастер Ломастер писал(а):если вы хотите делать асм-вставку, то код на си должен быть таким:

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

ISR(INT0_vect, ISR_NAKED){
}
В поисках истины человек развивается.
q9957789
Родился
Сообщения: 8
Зарегистрирован: Чт апр 05, 2012 14:39:29

Re: WinAvr в вопросах и ответах

Сообщение q9957789 »

vitalik_1984 писал(а):q9957789Вы читать умеете или только на цитаты нажимать?
Мастер Ломастер писал(а):если вы хотите делать асм-вставку, то код на си должен быть таким:

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

ISR(INT0_vect, ISR_NAKED){
}

Слышь ты, красавчик, я тоже самое могу у тебя спросить.
Мастер Ломастер писал(а): учтите, что "кусочек, который может подождать" (вместо многоточия) придется тоже писать на голом асме, т.к. благодаря ISR_NAKED вы не имеете возможности пользоваться Сишными возможностями из-за автоматически несохраняемых регистров в стеке.
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Re: WinAvr в вопросах и ответах

Сообщение Совесть »

Выводите информацию на экран в основном цикле.
А вообще суть задачи не уловил, если нужно синхронизировать какие-то сигналы , да еще и с высокой точностью, то не проще-ли воспользоваться логикой\плис?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

q9957789 писал(а):Я так вижу даже при написании .S файла нужно пользоваться этим извращённым ассемблером?)))
я не знаю, что именно вы называете извращенным ассемблером, но как по мне, так avr-as на несколько порядков лучше, чем дефолтный ассемблер в AVR Studio.

кроме того, обращаю ваше внимание на то, что я говорил об ассемблерных вставках в Сишном коде, т.к. ISR - это макрос дя исходника Си, а не ассемблера. а S-файл - это именно исходник на ассемблере, без всяких ISR и т.п. Сишных штучек, правда, с полной поддержкой сишного препроцессора.

P.S. вам Совесть правильно подсказывает: вывод на ЖКИ (да и вообще куда бы то ни было) делать в обработчике прерывания - это моветон программирования! так делать не стоит.
битва с дураками проиграна, победители торжествуют. слава победителям!
q9957789
Родился
Сообщения: 8
Зарегистрирован: Чт апр 05, 2012 14:39:29

Re: WinAvr в вопросах и ответах

Сообщение q9957789 »

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

Что касается вывода на ЖКИ, то, во-первых, сделать это в таком виде надо только один раз, при обнаружении синхроимпульса на ножке, а, во вторых, в основном цикле я вообще ничего сделать не имею права, ибо появляется джиттер, опяь таки большой дядя настучит по бошке)))

В любом случае проблему я решил, через naked и вставки. Погрешность до 1%. Огромное вам спасибо.
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Re: WinAvr в вопросах и ответах

Сообщение Совесть »

То что проблема решена это хорошо, но сути подсказок вы не поняли.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

вот так всегда: совесть разочек подкачает - и пошло-поехало... не хорошо это, когда задача решена неправильно, ой как нехорошо...
битва с дураками проиграна, победители торжествуют. слава победителям!
q9957789
Родился
Сообщения: 8
Зарегистрирован: Чт апр 05, 2012 14:39:29

Re: WinAvr в вопросах и ответах

Сообщение q9957789 »

xD я ничё не понял из того что вы щас написали)

Что по-вашему не так?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

не так - выводить на ЖКИ из обработчика прерываний.
битва с дураками проиграна, победители торжествуют. слава победителям!
q9957789
Родился
Сообщения: 8
Зарегистрирован: Чт апр 05, 2012 14:39:29

Re: WinAvr в вопросах и ответах

Сообщение q9957789 »

Ещё раз, у меня нет выхода, просто не могу)потом последствия будут хуже чем если я буду удовлетворять вашему программистскому кодексу чести.
А что за подсказки, что за суть? Если только в этом, то..ладно. ^^
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение vitalik_1984 »

q9957789 писал(а):Слышь ты, красавчик, я тоже самое могу у тебя спросить.
Мастер Ломастер писал(а): учтите, что "кусочек, который может подождать" (вместо многоточия) придется тоже писать на голом асме, т.к. благодаря ISR_NAKED вы не имеете возможности пользоваться Сишными возможностями из-за автоматически несохраняемых регистров в стеке.

И где тут видно содержание файла .S про который сами же спросили?
q9957789 писал(а):Я так вижу даже при написании .S файла нужно пользоваться этим извращённым ассемблером?)))
В поисках истины человек развивается.
q9957789
Родился
Сообщения: 8
Зарегистрирован: Чт апр 05, 2012 14:39:29

Re: WinAvr в вопросах и ответах

Сообщение q9957789 »

vitalik_1984 писал(а):И где тут видно содержание файла .S про который сами же спросили?

А вам без него плохо спится?

Вы читать умеете?Я всё хозяйство сделал через ISR_NAKED, соответственно ни о каких .S уже я не думал.
Ответить

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