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

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

Сообщение tzzk »

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

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

Сообщение vitalik_1984 »

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

Сообщение tzzk »

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

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

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

Сообщение q9957789 »

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

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

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

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

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

Сообщение 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
Откуда: Цветочный город

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

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

Сообщение 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;
}
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

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

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

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

Сообщение q9957789 »

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

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

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

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

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

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

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

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

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

Сообщение q9957789 »

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

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

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

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

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

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

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

Сообщение q9957789 »

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

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

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

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

Сообщение q9957789 »

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

Сообщение vitalik_1984 »

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

Сообщение q9957789 »

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

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

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