Страница 73 из 132

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

Добавлено: Сб дек 11, 2010 19:20:23
itmaker
Собираю генератор импульсов управляемый через rs232. Я знаю немного turbo pascal, а с ассемблером незнаком, и время поджимает. Был бы рад если кто нибудь поможет.

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

Добавлено: Ср дек 15, 2010 17:55:29
AI_Disable
Не совсем понятно, причём тут ATtiny2313, паскаль и ассемблер, но, насколько мне понятно, вы раньше не имели дело с МК. Если это так и время поджимает, советую искать готовое решение. Т.к. данную задачу с нуля, не имея знаний и опыта и за месяц врятле сделаешь...

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

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

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

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

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

Добавлено: Чт дек 16, 2010 03:40:43
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. кнопка в проекте всего одна, но ей нужно реализовать несколько функций (хотя бы две как минимум), так что граблей еще много впереди

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

Добавлено: Чт дек 16, 2010 09:20:01
AI_Disable
Никогда не передавайте функциям задержек переменные - только константы. И наступит щастье.
Используйте такую функцию или подобные:

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

void delay_MS(uint16_t tmp)
{
for(;tmp;tmp--) _delay_ms(1);
}

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

Добавлено: Чт дек 16, 2010 11:13:55
AlexFisher
Дело в том, что Вы добавили ДЕЛЕНИЕ на 2. Если в настройках компилятора стоит галка "float", то Вы попали на полную библиотеку деления. А всего делов то - сдвинуть целое на 1 бит вправо (сиречь поделить пополам) :)
Замените "s_time=s_time/2" на "s_time=s_time>>1" - и размер кода уменьшится! Старайтесь никогда без острой необходимости не применять деление! И следите, чтобы у Вас был тип "unsigned int", потому что по умолчанию применяется "signed" - а отрицательные значения нам только мешать будут :)

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

Добавлено: Чт дек 16, 2010 13:04:53
Denkot
Спасибо, AI_Disable и AlexFisher, буду учиться дальше
Но, кстати, AI_Disable, до введения конструкции if код был такой же (переменная s_time была прописана как есть), и занимал в итоге 304 байта

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

Добавлено: Чт дек 16, 2010 13:40:39
avreal
А с переменной после занесения констты ничего не далалось, компилятор это видел и передавал в задержку ту же константу, а не переменную считывал. В случае с if он уже не знает, что там будет при исполнении, и зачитывает реальное значение.

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

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

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

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

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

Добавлено: Чт дек 16, 2010 16:09:09
Denkot
Подскажите, пожалуйста, еще два момента - хочу сделать, например, по длинному клику уход в sleep или powerdown (типа выключение), как его потом будить той же кнопкой? Если он будет в powerdown, как его потом будить (включать)? Он будет порты опрашивать в таком состоянии? Или только ресетом?
Проблема в том, что кнопка в устройстве одна и ей нужно реализовать и вкл-выкл, и перебор режимов

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

Добавлено: Чт дек 16, 2010 16:15:47
AlexFisher
AI_Disable писал(а):Никогда не передавайте функциям задержек переменные - только константы. И наступит щастье.
Используйте такую функцию или подобные:

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

void delay_MS(uint16_t tmp)
{
for(;tmp;tmp--) _delay_ms(1);
}
Да, правильный вариант! Я сейчас изучаю STM8, там именно так и поступают с задержками - делают 1 мс выдержку на таймере и оборачивают ее циклом.
А по поводу деления - был не совсем прав. /2 оптимизируется именно до >>1 для целых. Но при использовании делителей, некратных 2, код будет расти, правда, незначительно, если делим на константу. Опасайтесь делить на переменную!

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

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

Добавлено: Чт дек 16, 2010 16:23:01
Gudd-Head
Denkot писал(а):Проблема в том, что кнопка в устройстве одна и ей нужно реализовать и вкл-выкл, и перебор режимов
На сколько я помню, от кнопки пробуждение возможно если кнопка висит на внешнем прерывании. Перед уходом в слип мод можно включать прерывание от кнопки, а после пробуждения - выключать.

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

Добавлено: Чт дек 16, 2010 16:25:23
AI_Disable
По поводу sleep mode - повесить кнопку на любое внешнее прерывание. Как только оно произойдет МК проснётся, и, после выхода из обработчика прерывания, продолжит с того же места, на котором остановился...

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

Добавлено: Чт дек 16, 2010 16:26:18
Denkot
AlexFisher писал(а):По поводу слипа - сделайте пробуждение от "собаки" и обратно засыпание, если кнопка не нажата. Скажем, раз в секунду или в 5 его будить для проверки кнопки.
Долго думал, на какую собаку меня натравливают, потом понял :)
А вывод 1 нельзя использовать? Так, чтобы он работал во включенном виде как PA2, а в выключенном как Reset?
или это грозит неработой ресета и отказом в дальнейших прошивках? или чем-то еще?

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

Добавлено: Чт дек 16, 2010 16:31:31
AI_Disable
Denkot, нет, так не выйдет. Он либо ресет, либо порт и программно его назначение не поменять.

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

Добавлено: Чт дек 16, 2010 18:58:37
Denkot
Вопрос про использование прерывания.
Если я повешу кнопку на INT1, то при нажатии, вне зависимости от длительности, он будет уходить на обработку прерывания. Так?
Как тогда мне реализовать длинный клик? Двойной клик? С таймером что-то мудрить?

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

Добавлено: Чт дек 16, 2010 19:17:54
AI_Disable
В отличие от ресета, назначение порта можно динамически изменять в ходе программы. Т.е. пока МК не спит, мы можем отслеживать длительность нажатия, а перед сном переводить порт в режим INT1, по которому МК будет просыпаться и обратно переводить порт в режим входа.

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

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

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