ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Собираю генератор импульсов управляемый через rs232. Я знаю немного turbo pascal, а с ассемблером незнаком, и время поджимает. Был бы рад если кто нибудь поможет.
Что хорошо для меня - полезно для всех! 
- Реклама
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Не совсем понятно, причём тут ATtiny2313, паскаль и ассемблер, но, насколько мне понятно, вы раньше не имели дело с МК. Если это так и время поджимает, советую искать готовое решение. Т.к. данную задачу с нуля, не имея знаний и опыта и за месяц врятле сделаешь...
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Мур, уважаемые коты!
Первый раз работаю с микроконтроллерами (МК), на примере 2313.
Двигаюсь понемногу, как положено, сначала разобрался с прошивкой-мигалкой.
Прошивка пишется в AVR Studio на C
Внимание, вопрос: обычная прошивка-мигалка выходит в hex размером 304 байт и прекрасно работает.
Как только я добавляю одну инструкцию условного перехода (if), hex-файл вырастает до 10 кбайт.
как он влезет в МК в таком случае? он же не влезет. и почему такой резкий рост?
может, я что-то не так делаю? но как тогда опрашивать порты, где висят кнопки?
Мяу
Первый раз работаю с микроконтроллерами (МК), на примере 2313.
Двигаюсь понемногу, как положено, сначала разобрался с прошивкой-мигалкой.
Прошивка пишется в AVR Studio на C
Внимание, вопрос: обычная прошивка-мигалка выходит в hex размером 304 байт и прекрасно работает.
Как только я добавляю одну инструкцию условного перехода (if), hex-файл вырастает до 10 кбайт.
как он влезет в МК в таком случае? он же не влезет. и почему такой резкий рост?
может, я что-то не так делаю? но как тогда опрашивать порты, где висят кнопки?
Мяу
- Rimsky
- Грызет канифоль
- Сообщения: 299
- Зарегистрирован: Вт июн 15, 2010 07:16:42
- Откуда: Иркутск
- Контактная информация:
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Denkot писал(а):Мур, уважаемые коты!
Первый раз работаю с микроконтроллерами (МК), на примере 2313.
Двигаюсь понемногу, как положено, сначала разобрался с прошивкой-мигалкой.
Прошивка пишется в AVR Studio на C
Внимание, вопрос: обычная прошивка-мигалка выходит в hex размером 304 байт и прекрасно работает.
Как только я добавляю одну инструкцию условного перехода (if), hex-файл вырастает до 10 кбайт.
как он влезет в МК в таком случае? он же не влезет. и почему такой резкий рост?
может, я что-то не так делаю? но как тогда опрашивать порты, где висят кнопки?
Мяу
код в студию. (актуальнее будет в ветке про С С++)
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
код простой как пять копеек, фактически как из примера
я, правда, не понял, что означает выражение PINA & _BV(PA0) - переписал его из примера с опросом кнопки как есть
может, & _BV использует какой-то громоздкий метод?
P.S. кнопка в проекте всего одна, но ей нужно реализовать несколько функций (хотя бы две как минимум), так что граблей еще много впереди
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
int main()
{
DDRB = 255;
DDRD = 255;
while(1)
{
int s_time = 50;
if (PINA & _BV(PA0))
{
s_time = s_time / 2;
}
PORTB = 0;
_delay_ms(s_time);
PORTB = 255;
_delay_ms(s_time);
}
return 0;
}
я, правда, не понял, что означает выражение PINA & _BV(PA0) - переписал его из примера с опросом кнопки как есть
может, & _BV использует какой-то громоздкий метод?
P.S. кнопка в проекте всего одна, но ей нужно реализовать несколько функций (хотя бы две как минимум), так что граблей еще много впереди
- Реклама
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Никогда не передавайте функциям задержек переменные - только константы. И наступит щастье.
Используйте такую функцию или подобные:
Используйте такую функцию или подобные:
Код: Выделить всё
void delay_MS(uint16_t tmp)
{
for(;tmp;tmp--) _delay_ms(1);
}
- AlexFisher
- Мучитель микросхем
- Сообщения: 493
- Зарегистрирован: Вт апр 21, 2009 13:31:27
- Откуда: Санкт-Петербург
- Контактная информация:
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Дело в том, что Вы добавили ДЕЛЕНИЕ на 2. Если в настройках компилятора стоит галка "float", то Вы попали на полную библиотеку деления. А всего делов то - сдвинуть целое на 1 бит вправо (сиречь поделить пополам) 
Замените "s_time=s_time/2" на "s_time=s_time>>1" - и размер кода уменьшится! Старайтесь никогда без острой необходимости не применять деление! И следите, чтобы у Вас был тип "unsigned int", потому что по умолчанию применяется "signed" - а отрицательные значения нам только мешать будут
Замените "s_time=s_time/2" на "s_time=s_time>>1" - и размер кода уменьшится! Старайтесь никогда без острой необходимости не применять деление! И следите, чтобы у Вас был тип "unsigned int", потому что по умолчанию применяется "signed" - а отрицательные значения нам только мешать будут
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Спасибо, AI_Disable и AlexFisher, буду учиться дальше
Но, кстати, AI_Disable, до введения конструкции if код был такой же (переменная s_time была прописана как есть), и занимал в итоге 304 байта
Но, кстати, AI_Disable, до введения конструкции if код был такой же (переменная s_time была прописана как есть), и занимал в итоге 304 байта
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
А с переменной после занесения констты ничего не далалось, компилятор это видел и передавал в задержку ту же константу, а не переменную считывал. В случае с if он уже не знает, что там будет при исполнении, и зачитывает реальное значение.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
AlexFisher, нет, дело не в делении, а именно в задержке. Уже не один раз обсуждался этот "феномен" и, насколько я помню, тов. ARV даже указывал причину по которой код разуплотняется в десятки раз, если засунуть переменную в _delay. 
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
AI_Disable писал(а):AlexFisher, нет, дело не в делении, а именно в задержке. Уже не один раз обсуждался этот "феномен" и, насколько я помню, тов. ARV даже указывал причину по которой код разуплотняется в десятки раз, если засунуть переменную в _delay.
точно так, стоило убрать ее оттуда, все сложилось в минимум
теперь буду придумывать, как отличить короткий щелчок кнопкой, длинный и двойной
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Подскажите, пожалуйста, еще два момента - хочу сделать, например, по длинному клику уход в sleep или powerdown (типа выключение), как его потом будить той же кнопкой? Если он будет в powerdown, как его потом будить (включать)? Он будет порты опрашивать в таком состоянии? Или только ресетом?
Проблема в том, что кнопка в устройстве одна и ей нужно реализовать и вкл-выкл, и перебор режимов
Проблема в том, что кнопка в устройстве одна и ей нужно реализовать и вкл-выкл, и перебор режимов
- AlexFisher
- Мучитель микросхем
- Сообщения: 493
- Зарегистрирован: Вт апр 21, 2009 13:31:27
- Откуда: Санкт-Петербург
- Контактная информация:
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
AI_Disable писал(а):Никогда не передавайте функциям задержек переменные - только константы. И наступит щастье.
Используйте такую функцию или подобные:Код: Выделить всё
void delay_MS(uint16_t tmp)
{
for(;tmp;tmp--) _delay_ms(1);
}
Да, правильный вариант! Я сейчас изучаю STM8, там именно так и поступают с задержками - делают 1 мс выдержку на таймере и оборачивают ее циклом.
А по поводу деления - был не совсем прав. /2 оптимизируется именно до >>1 для целых. Но при использовании делителей, некратных 2, код будет расти, правда, незначительно, если делим на константу. Опасайтесь делить на переменную!
По поводу слипа - сделайте пробуждение от "собаки" и обратно засыпание, если кнопка не нажата. Скажем, раз в секунду или в 5 его будить для проверки кнопки.
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Denkot писал(а):Проблема в том, что кнопка в устройстве одна и ей нужно реализовать и вкл-выкл, и перебор режимов
На сколько я помню, от кнопки пробуждение возможно если кнопка висит на внешнем прерывании. Перед уходом в слип мод можно включать прерывание от кнопки, а после пробуждения - выключать.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
По поводу sleep mode - повесить кнопку на любое внешнее прерывание. Как только оно произойдет МК проснётся, и, после выхода из обработчика прерывания, продолжит с того же места, на котором остановился...
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
AlexFisher писал(а):По поводу слипа - сделайте пробуждение от "собаки" и обратно засыпание, если кнопка не нажата. Скажем, раз в секунду или в 5 его будить для проверки кнопки.
Долго думал, на какую собаку меня натравливают, потом понял
А вывод 1 нельзя использовать? Так, чтобы он работал во включенном виде как PA2, а в выключенном как Reset?
или это грозит неработой ресета и отказом в дальнейших прошивках? или чем-то еще?
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Denkot, нет, так не выйдет. Он либо ресет, либо порт и программно его назначение не поменять.
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Вопрос про использование прерывания.
Если я повешу кнопку на INT1, то при нажатии, вне зависимости от длительности, он будет уходить на обработку прерывания. Так?
Как тогда мне реализовать длинный клик? Двойной клик? С таймером что-то мудрить?
Если я повешу кнопку на INT1, то при нажатии, вне зависимости от длительности, он будет уходить на обработку прерывания. Так?
Как тогда мне реализовать длинный клик? Двойной клик? С таймером что-то мудрить?
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
В отличие от ресета, назначение порта можно динамически изменять в ходе программы. Т.е. пока МК не спит, мы можем отслеживать длительность нажатия, а перед сном переводить порт в режим INT1, по которому МК будет просыпаться и обратно переводить порт в режим входа.
Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Спасибо, может посоветуете учебник хороший?
А то для первого раза сложновато - и прерывания, и повердаун...
Наверное, буду на асм переписывать, в даташите хоть асм-инструкции есть какие-никакие, а в си я плаваю
P.S. может, кто-нибудь согласится консультировать в онлайне (icq или skype)?
обещаю сильно не надоедать... готов поставить пиво
наступаю на банальные грабли, пишу .include файл (tn2313.inc), ругается на содержимое файла
учебников с разжевкой мало
время жмет
А то для первого раза сложновато - и прерывания, и повердаун...
Наверное, буду на асм переписывать, в даташите хоть асм-инструкции есть какие-никакие, а в си я плаваю
P.S. может, кто-нибудь согласится консультировать в онлайне (icq или skype)?
обещаю сильно не надоедать... готов поставить пиво
наступаю на банальные грабли, пишу .include файл (tn2313.inc), ругается на содержимое файла
учебников с разжевкой мало
время жмет


