ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
itmaker
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб дек 11, 2010 13:40:56

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение itmaker »

Собираю генератор импульсов управляемый через rs232. Я знаю немного turbo pascal, а с ассемблером незнаком, и время поджимает. Был бы рад если кто нибудь поможет.
Что хорошо для меня - полезно для всех! ;)
Реклама
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение AI_Disable »

Не совсем понятно, причём тут ATtiny2313, паскаль и ассемблер, но, насколько мне понятно, вы раньше не имели дело с МК. Если это так и время поджимает, советую искать готовое решение. Т.к. данную задачу с нуля, не имея знаний и опыта и за месяц врятле сделаешь...
Реклама
Denkot
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт дек 14, 2010 16:07:50

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение Denkot »

Мур, уважаемые коты!
Первый раз работаю с микроконтроллерами (МК), на примере 2313.
Двигаюсь понемногу, как положено, сначала разобрался с прошивкой-мигалкой.
Прошивка пишется в AVR Studio на C
Внимание, вопрос: обычная прошивка-мигалка выходит в hex размером 304 байт и прекрасно работает.
Как только я добавляю одну инструкцию условного перехода (if), hex-файл вырастает до 10 кбайт.
как он влезет в МК в таком случае? он же не влезет. и почему такой резкий рост?
может, я что-то не так делаю? но как тогда опрашивать порты, где висят кнопки?
Мяу
Аватара пользователя
Rimsky
Грызет канифоль
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск
Контактная информация:

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение Rimsky »

Denkot писал(а):Мур, уважаемые коты!
Первый раз работаю с микроконтроллерами (МК), на примере 2313.
Двигаюсь понемногу, как положено, сначала разобрался с прошивкой-мигалкой.
Прошивка пишется в AVR Studio на C
Внимание, вопрос: обычная прошивка-мигалка выходит в hex размером 304 байт и прекрасно работает.
Как только я добавляю одну инструкцию условного перехода (if), hex-файл вырастает до 10 кбайт.
как он влезет в МК в таком случае? он же не влезет. и почему такой резкий рост?
может, я что-то не так делаю? но как тогда опрашивать порты, где висят кнопки?
Мяу

код в студию. (актуальнее будет в ветке про С С++)
Реклама
Эиком - электронные компоненты и радиодетали
Denkot
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт дек 14, 2010 16:07:50

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение Denkot »

код простой как пять копеек, фактически как из примера

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

#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

Сообщение AI_Disable »

Никогда не передавайте функциям задержек переменные - только константы. И наступит щастье.
Используйте такую функцию или подобные:

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

void delay_MS(uint16_t tmp)
{
for(;tmp;tmp--) _delay_ms(1);
}
Реклама
Аватара пользователя
AlexFisher
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Вт апр 21, 2009 13:31:27
Откуда: Санкт-Петербург
Контактная информация:

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение AlexFisher »

Дело в том, что Вы добавили ДЕЛЕНИЕ на 2. Если в настройках компилятора стоит галка "float", то Вы попали на полную библиотеку деления. А всего делов то - сдвинуть целое на 1 бит вправо (сиречь поделить пополам) :)
Замените "s_time=s_time/2" на "s_time=s_time>>1" - и размер кода уменьшится! Старайтесь никогда без острой необходимости не применять деление! И следите, чтобы у Вас был тип "unsigned int", потому что по умолчанию применяется "signed" - а отрицательные значения нам только мешать будут :)
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
Denkot
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт дек 14, 2010 16:07:50

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение Denkot »

Спасибо, AI_Disable и AlexFisher, буду учиться дальше
Но, кстати, AI_Disable, до введения конструкции if код был такой же (переменная s_time была прописана как есть), и занимал в итоге 304 байта
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение avreal »

А с переменной после занесения констты ничего не далалось, компилятор это видел и передавал в задержку ту же константу, а не переменную считывал. В случае с if он уже не знает, что там будет при исполнении, и зачитывает реальное значение.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение AI_Disable »

AlexFisher, нет, дело не в делении, а именно в задержке. Уже не один раз обсуждался этот "феномен" и, насколько я помню, тов. ARV даже указывал причину по которой код разуплотняется в десятки раз, если засунуть переменную в _delay. :)))
Denkot
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт дек 14, 2010 16:07:50

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение Denkot »

AI_Disable писал(а):AlexFisher, нет, дело не в делении, а именно в задержке. Уже не один раз обсуждался этот "феномен" и, насколько я помню, тов. ARV даже указывал причину по которой код разуплотняется в десятки раз, если засунуть переменную в _delay. :)))

точно так, стоило убрать ее оттуда, все сложилось в минимум
теперь буду придумывать, как отличить короткий щелчок кнопкой, длинный и двойной
Denkot
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт дек 14, 2010 16:07:50

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение Denkot »

Подскажите, пожалуйста, еще два момента - хочу сделать, например, по длинному клику уход в sleep или powerdown (типа выключение), как его потом будить той же кнопкой? Если он будет в powerdown, как его потом будить (включать)? Он будет порты опрашивать в таком состоянии? Или только ресетом?
Проблема в том, что кнопка в устройстве одна и ей нужно реализовать и вкл-выкл, и перебор режимов
Аватара пользователя
AlexFisher
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Вт апр 21, 2009 13:31:27
Откуда: Санкт-Петербург
Контактная информация:

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение AlexFisher »

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

Сообщение Gudd-Head »

Denkot писал(а):Проблема в том, что кнопка в устройстве одна и ей нужно реализовать и вкл-выкл, и перебор режимов

На сколько я помню, от кнопки пробуждение возможно если кнопка висит на внешнем прерывании. Перед уходом в слип мод можно включать прерывание от кнопки, а после пробуждения - выключать.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение AI_Disable »

По поводу sleep mode - повесить кнопку на любое внешнее прерывание. Как только оно произойдет МК проснётся, и, после выхода из обработчика прерывания, продолжит с того же места, на котором остановился...
Denkot
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт дек 14, 2010 16:07:50

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение Denkot »

AlexFisher писал(а):По поводу слипа - сделайте пробуждение от "собаки" и обратно засыпание, если кнопка не нажата. Скажем, раз в секунду или в 5 его будить для проверки кнопки.

Долго думал, на какую собаку меня натравливают, потом понял :)
А вывод 1 нельзя использовать? Так, чтобы он работал во включенном виде как PA2, а в выключенном как Reset?
или это грозит неработой ресета и отказом в дальнейших прошивках? или чем-то еще?
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение AI_Disable »

Denkot, нет, так не выйдет. Он либо ресет, либо порт и программно его назначение не поменять.
Denkot
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт дек 14, 2010 16:07:50

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение Denkot »

Вопрос про использование прерывания.
Если я повешу кнопку на INT1, то при нажатии, вне зависимости от длительности, он будет уходить на обработку прерывания. Так?
Как тогда мне реализовать длинный клик? Двойной клик? С таймером что-то мудрить?
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение AI_Disable »

В отличие от ресета, назначение порта можно динамически изменять в ходе программы. Т.е. пока МК не спит, мы можем отслеживать длительность нажатия, а перед сном переводить порт в режим INT1, по которому МК будет просыпаться и обратно переводить порт в режим входа.
Denkot
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт дек 14, 2010 16:07:50

Re: ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Сообщение Denkot »

Спасибо, может посоветуете учебник хороший?
А то для первого раза сложновато - и прерывания, и повердаун...
Наверное, буду на асм переписывать, в даташите хоть асм-инструкции есть какие-никакие, а в си я плаваю :)

P.S. может, кто-нибудь согласится консультировать в онлайне (icq или skype)?
обещаю сильно не надоедать... готов поставить пиво :)
наступаю на банальные грабли, пишу .include файл (tn2313.inc), ругается на содержимое файла
учебников с разжевкой мало :(
время жмет
Ответить

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