CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

oleg110592 писал(а):для тупых просьба объяснить в чем отличие
я-то тупым вас не считал, но теперь что, мне изменить мнение? :shock:
аппаратный сброс инициализирует все периферийные устройства, прыжок на 0 адрес этого не делает. в частности, не останавливает начатую передачу по USART, SPI и т.п., не останавливает работу таймеров, не меняет режим WDT, АЦП и другой периферии. даже режимы работы портов ввода-вывода не меняет! и это верно дл любого типа МК, в том числе для ARM, который вы так уважаете и рекламируете всем.

только не вздумайте возражать, что "в правильно написанной программе вся периферия инициализируется в начале main принудительно", чтобы окончательно не испортить моё мнение.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

ARV писал(а):
COKPOWEHEU писал(а):Но это опять не ресет, а только прыжок в начало - rcall 0
вот именно! об этом с самого начала я и говорю.
Наверное, некоторые восприняли комментарий "что-то из черной магии" чересчур буквально и решили что и правда волшебным образом ресетит контроллер.
Кстати, странно что никто не упомянул (или это я пропустил) простейшего аппаратного решения - соединить ресет с любой ногой ввода-вывода и из программы дергать именно ее.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

COKPOWEHEU писал(а):Кстати, странно что никто не упомянул (или это я пропустил) простейшего аппаратного решения - соединить ресет с любой ногой ввода-вывода и из программы дергать именно ее.
это не странно, т.к. в этом случае не факт, что будет выдержан минимальный интервал удержания линии RST в низком уровне согласно требованиям даташита. ведь в тот момент, когда начнется процедура сброса, порты перейдут в 3-е состояние и не смогут удерживать уровень на RST. я нигде не встречал точных временных диаграмм процесса сброса, т.е. в какой момент какая периферия изменяет свое состояние. но раз в даташите есть упоминание о минимальной длительности импульса сброса, это неспроста.

поэтому я и не рекомендую этот "аппаратный" способ, хотя и доказательств его непригодности у меня нет. ну и не всегда есть лишняя ножка, да и линия RST иной раз может быть занята другим делом :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

ARV писал(а):только не вздумайте возражать, что "в правильно написанной программе вся периферия инициализируется в начале main принудительно", чтобы окончательно не испортить моё мнение.
испорчу - забыл что AVRы разные, использовал в основном мегу48 - там ненужная периферия выключается в регистре PRR, нужную периферию после сброса всегда инициализировал, раз она нужная - как же ее не проинициализировать. В паре проектов (ассеммблер АБ) использовал для установок всех параметров и настроек в начальное значение команду rjmp RESET - все прекрасно работает. В последующих проектах делал через ватчдог.
В АРМах нужная периферия наоборот после сброса (любого) включается, перед программным сбросом можно просто выключить, как и перед режимом сна.
для STM32 есть NVIC_SystemReset(); но если хочется именно на лыжах и в гамаке, то так ((void(*)(void))((void*)*((DWORD*)(0x08000004))))();
p.s. из документации Codevision (мы ж в теме о сабже):
Note: By default the CodeWizardAVR generates initialization code even for peripherals that are not in use
(disabled).
This is a safety measure to configure correctly the chip if a software reset occurred by jumping to address 0.
In order to reduce generated program size, this can be disabled by un-checking the Program|Generate Code
for Disabled Peripherals menu option.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

oleg110592 писал(а):все прекрасно работает
:facepalm:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

смайлик означает "ооой..." не понятно это признание "И всё-таки она вертится!" или отрицание или уход от темы :)) .
прыжок на 0 адрес + инициализация периферии = аппаратный сброс. Инициализация периферии присутствует по любому - хоть при аппаратном, хоть при софтварном сбросе, значит упрощаем формулу:
прыжок на 0 адрес + (инициализация периферии - инициализация периферии) = аппаратный сброс
прыжок на 0 адрес = аппаратный сброс
опять просьба для тупых - если это не так, объясните почему, желательно без смайликов, а то тоже буду "изменить мнение".
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

неужели для вас начало программы и ее последующее поведение всегда одинаково? при сбросе периферия устанавливается в некое ОПИСАННОЕ состояние, которое затем может быть изменено программно.

возьмем простой WDT: после сброса он выключен (если, конечно, аппаратно не запрещено его выключать). если вы хотите, то ваша программа его ВКЛЮЧИТ, когда потребуется. но если вы просто прыгнете на 0, то ОН ОСТАНЕТСЯ ВКЛЮЧЕННЫМ, и ваше включение его ничего не изменит. то есть как минимум возможна ситуация, когда WDT сработает раньше, чем вы успеете это понять.

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

мягких вам граблей. :facepalm: :facepalm: :facepalm: :facepalm:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

ARV писал(а):при сбросе периферия устанавливается в некое ОПИСАННОЕ состояние, которое затем может быть изменено программно.
кто мешает перед софтовым сбросом установить ВРУЧНУЮ периферию "в некое ОПИСАННОЕ состояние"? Думал это само собой разумеется - разве для безопасности перед софтовым ресетом не надо запретить глобально прерывания, ватчдог можно и не выключать - сработает, не помню точно, минимум через 12мс, до этого мы уже заново его проинициализируем, но можно и выключить - разве это проблема.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

oleg110592 писал(а):кто мешает перед софтовым сбросом установить ВРУЧНУЮ периферию
ARV писал(а):только не вздумайте возражать, что "в правильно написанной программе вся периферия инициализируется в начале main принудительно"
:facepalm: :facepalm: :facepalm:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

ага
перед софтовым сбросом != в начале main
например, как выше писал, можно в функции reboot() установить ВРУЧНУЮ периферию, функция вызывается из любого места программы, не только из main

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

void reboot(void)
{
   void (*fn_ptr) (void) = (void (*) (void)) 0;
   fn_ptr();
}

void RebootReady()
{
   if((PINB & (1<<0)) == 0)
   {  
      CLI();
      reboot();
   }
}

void main( void )
{
  while(1)
  {
      foo1();
      foo2();
      RebootReady();
      foo3();
  }
}
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Не знаю как кто, а я единожды про###охавшись с битом, который в исходное описанное состояние по включению питания не встал, с тех пор всю используемую периферию выставляю софтово, не полагаясь на умолчание. Поди потом объясни заказчику - у вас мотор сгорел не по моей вине, а этот Атмел, @@@@ этакая, бит XYZ не выставил по умолчанию.
Спойлер"Кто обжегся на молоке, дует водку".

Кстати, если уж совсем, сброс по ресету != сброс по включению питания. Мне довелось читать про случай ( тип МК и подробности не помню уже хучь убей ), когда MK раскорячился в такую позицию, что на ресет уже не реагировал, только на передерг питания.
Изображение
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Jack_A писал(а):сброс по ресету != сброс по включению питания
с формальной точки зрения это верно, т.к. биты в соответствующем регистре устанавливаются по-разному в этих случаях. однако на инициализацию периферии оба варианта действуют аналогично.
oleg110592 писал(а):можно в функции reboot() установить ВРУЧНУЮ периферию
можно Машку за ляжку и козу на возу. но НУЖНО делать просто правильно: если вам нужен прыжок - прыгаете, если нужен СБРОС - надо делать именно сброс, а не прыжок.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

с тех пор всю используемую периферию выставляю софтово
тоже при изучении STM32 вначале поражали конструкции типа:

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

  /* Select output mode (01) on GPIOC pin 8 and 9 */
  GPIOC->MODER = (GPIOC->MODER & ~(GPIO_MODER_MODER8 | GPIO_MODER_MODER9)) \
               | (GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0);
все это после ресета - регистр и так в нуле - тем не менее его биты принудительно сбрасывают в начальное состояние в 0, потом устанавливают нужные. Все очень логично и безопасно. Таймеры и пр. периферию тоже вначале типа: TIM1_Deinit();, потом TIM1_Init();, хотя после сброса все и так deinit.
но НУЖНО делать просто правильно: если вам нужен прыжок - прыгаете, если нужен СБРОС - надо делать именно сброс, а не прыжок
Кому это надо? Никому не надо
Кому это нужно? Никому не нужно
а в чем разница между прыжком и сбросом - ответа так и нет, аксиома наверное. Можно ж все таки пусть с ухищрениями сделать, чтоб выполнялось:
прыжок на 0 адрес = аппаратный сброс
Может так попробуем:
Будет ли работать программа, текст которой выше приведен? Будут ли равнозначны аппаратный сброс и софтовый сброс по ноге PINB.0?
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Еще один пример отличия я уже называл - самозагрузчик (bootloader).
На счет дерганья ресета вручную. В даташите указано время что после снижения напряжения на ресете до определенной границы МК переходит в состояние сброса, в котором находится не менее t(TOUT) - какой-то величины - независимо от уровня на ресете. Я так понял, что если уж ресет наступил, нештатно контроллер из него не выйдет. А если сигнал длился меньше минимального времени то и портам сбрасываться не с чего. Но основная проблема и правда в необходимости наличия свободной ноги.
Ну и еще вариант программно-аппаратного решения - сброс по питанию. УЖ там можно хоть одновибратор взгромоздить, он-то точно даст минимальную задержку.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

oleg110592 писал(а):тоже при изучении STM32 вначале поражали конструкции типа
порочная "индусская" практика, только и всего. вместо использования наиболее подходящего к ситуации кода тупо копипастить "безопасный" вариант. то же самое можно сказать и про инициализацию нулями DDRx и PORTx, которые делает CVAVR. но если рассуждать по-вашему, что старт с нулевого адреса есть эквивалент аппаратного сброса, то да, именно так, по-индусски и надо делать.
oleg110592 писал(а):а в чем разница между прыжком и сбросом - ответа так и нет, аксиома наверное
вообще-то ответ вам был дан неоднократно, неужели снова надо объяснять? прыжок на ЛЮБОЙ адрес - это всего-навсего изменение программного счетчика команд. что именно там по этому адресу будет, несущественно. сброс же - это аппаратный процесс инициализации встроенной периферии в некоторое "стартовое" состояние.

в чем разница? что пнем сову, что об пень сову, все равно сове больно. это факт. однако, пнем сову ТРУДНЕЕ, а совой ОБ ПЕНЬ легче ввиду разной массы пня и совы :))) может этот образный пример вам более понятен?

еще раз: разница между аппаратным сбросом и программным в том, что все действия по приведению периферии в "исходное состояние" выполняются микроконтроллером без малейшего участия программиста, условно говоря ОДНОВРЕМЕННО. я уже приводил пример про WDT, могу еще сказать, что прыжок на 0 не остановит генерацию ШИМ, например, как не остановит начатый процесс АЦП и т.п.

судя по всему, вам просто интересно спорить? ок, я умолкаю, последнее слово можете оставить за собой.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

спорить не интересно, но не очевидно было утверждение: прыжок на 0 адрес != аппаратный сброс.
Выразил свое имхо (форум для этого), что ресет можно сделать и софтово и аппаратно, и они (оба) будут выполнять одно и то же действие - т.е. ресетить микроконтроллер АБСОЛЮТНО ОДИНАКОВО, ведь главное получение результата а не механизм действия. Периферия же которая не трогалась после софтового ресета так и останется нетронутой, точно так же как и после аппаратного ресета, а которая трогалась заново проинициализирутся. Но если хочется привести периферию в исходное состояние (аппаратно-ресетное), то это можно сделать перед софтовым ресетом - тогда после софтового ресета микроконтроллер будет выглядеть как новенький, по настоящему проресеченый, сколько там в в AVR той периферии :)
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

может уже хватит п..... мериться. ??? мне кажется информации про ресет уже достаточно написано . может кто нибудь про серво привод что нибудь подсказать????? заказал на эбее себе вот такой sg90 но не совсем понятно как им управлять, шимом или обычными импульсами с нулем и единицей и с временной задержкой
задумка такая , по наступлению какого либо события привод начинает движение от своей начальной точки до конечной и останавливается. затем при наступлении еще раз такого же события привод совершает обратное движение от конечной точки к начальной и останавливается.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

pashaumnov писал(а):может уже хватит п..... мериться. ???
мы уже замерили :)
А сервопривод к кодевижену какое отношение имеет? Тема на форуме была http://radiokot.ru/forum/viewtopic.php?f=2&t=113756
там вроде достаточно всего, там, имхо лучше и продолжить.
Аватара пользователя
DataLife
Вымогатель припоя
Сообщения: 601
Зарегистрирован: Пт фев 13, 2009 20:58:13
Откуда: Донецк

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

Сообщение DataLife »

Коты, помогите, пожалуйста.

Подключаю к Мега8 цифровой потенциометр. Нужно отправить по SPI 16 бит данных, где первые 8 бит - команда, вторые 8 бит - сами данные (значения от 1 до 255).
Так вот, эти значения у меня периодически меняются, а сама команда неизменна.
Хотел записать как в функции вычисления АПЦ реализован выбор канала, но что-то не понял... Запарился.

Вот:

unsigned int ADC_result(unsigned char adc_input)
{
ADMUX=adc_input | (ADMUX & 0xF0);
delay_us(10);
ADCSRA | = 0x40;
while((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

У меня первый байт 0х11 (команда), второй должен меняться.
Правильно я сделаю, если запишу так:

SPDR = r_spi | (SPDR & 0x1100); // r_spi содержит значение от 1 до 255.

Подскажите, как красивей записать?
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

SPDR - это регистр, через который отправляются данные на SPI ?
Зачем тогда такое шаманство ? Почему просто в него не записать значение переменной r_spi ?
Ответить

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