roboforum.ru

Технический форум по робототехнике.

МикроКонтроллер AVR начинающим - общие вопросы

Re: МикроКонтроллеры начинающим - общие вопросы

avr123.nm.ru » 28 окт 2007, 17:21

Dunkan писал(а):
Myp писал(а): мелкая строчка оказалась намного важнее для меня, чем огромные красные буквы


Сообщите какая. Я выделю.

Re: МикроКонтроллеры начинающим - общие вопросы

Dunkan » 28 окт 2007, 17:32

avr123.nm.ru писал(а):Сообщите какая. Я выделю.


дело не в одной конкретной строке. весь курс написан так, что тяжело читать

Re: МикроКонтроллеры начинающим - общие вопросы

steel_monkey » 28 окт 2007, 18:19

Чесности ради замечу, что на эту книгу есть ссылка в "курсе", она выложена в архиве вместе с FAQ по курсу. Так что господину АВР большое человеческое спасибо :wink:

Re: МикроКонтроллеры начинающим - общие вопросы

avr123.nm.ru » 28 окт 2007, 19:39

steel_monkey писал(а):качайте книжку "Pardue J.C programming for microcontrollers.2005" со страницы http://ihtik.lib.ru/dreamhost_electrote ... v2007.html (799 в списке), распечатывайте и читайте. Книга на английском, но написана очень толково, структурировано, с примерами.


Я давно уже (18 янв 2007) сделал топик об этой книге и указал где скачать У НАС
В БИБЛИОТЕКЕ форума.
viewtopic.php?f=19&t=2031

Re: МикроКонтроллеры начинающим - общие вопросы

avr123.nm.ru » 28 окт 2007, 19:41

Dunkan писал(а):курс написан так, что тяжело читать


Добрые люди делают так - http://www.123avr.com

Re: МикроКонтроллеры начинающим - общие вопросы

Dunkan » 28 окт 2007, 21:35

ну извиняйте, если что не так. я просто высказал своё мнение

Re: МикроКонтроллеры начинающим - общие вопросы

Chip15 » 01 ноя 2007, 03:17

А есть чтонить подобное книги Pardue J.C programming for microcontrollers.2005 только на русском? А то я в англиском не силен.

Re: МикроКонтроллеры начинающим - общие вопросы

Master » 01 ноя 2007, 08:25

Есть вот такое
Шпак Ю.А. Программирование на языке С для AVR и PIC микроконтроллеров. МК-Пресс, Киев, 2006.djvu

Re: МикроКонтроллеры начинающим - общие вопросы

Myp » 01 ноя 2007, 10:39

Master писал(а):Есть вот такое
Шпак Ю.А. Программирование на языке С для AVR и PIC микроконтроллеров. МК-Пресс, Киев, 2006.djvu

лежит на фтп робофорума

Re: МикроКонтроллеры начинающим - общие вопросы

Co$s » 05 дек 2007, 00:29

Приветствую всех, господа!) Я смотрю в последнее время в этой части форума активность не бьет рекорды)), может быть мы это поправим, а заодно поможем мне советом)?

Господа прошу вас помочь в таком плане. Думаю, многим это будет также интересно. Дело в том, что многие из нас при более или менее сносном знании основ языка программирования на первых же порах сталкиваются с проблемой такого понятия как алгоритм... Знать, как работают операторы ветвления и циклов, дело одно, совершенно другое - это понять, как с помощью ограниченного количества команд воплотить все не дюжие амбиции начинающего “емббедера”... Теперь непосредственно задача: С помощью языка C (для мк AVR) реализовать программу опрашивающую некоторое количество кнопок и в зависимости от них соответствующе действовать. Программа разделена на несколько функций-подпрограмм (например: АЦП и его вывод на ЖКИ, измерение температуры и вывод ее на тот же ЖКИ) выполнение между которыми переключается последовательным нажатием одной из кнопок (MODE). Начавшись однажды, выбранная функция должна работать незавершаясь до следующего нажатия MODE. Что бы не загромождать пост лишним кодом, приведу только каркас одной из программ (компилятор CodeVision AVR 1.25.5):

Код: Выделить всёРазвернуть
#define BUTTON_PLUS     PINx.x
#define BUTTON_MINUS  PINx.x
#define BUTTON_MODE   PINx.x

char mode = 1;


interrupt [TIM0_OVF] void timer0_ovf_isr(void)  //Переполнение по timer_0 (3906Khz)
{
     if(!BUTTON_MODE)  //Если нажата клавиша MODE
    {
         mode ^= 1;    //При каждом нажатии клавиши, менять режим
    }
   
    if(mode == 0)
    {
        func_x();
    }   
       else     
      {
          func_y();
      }
}


void func_x(void)
{
     #asm("cli") //прерывания: выкл.

     while(BUTTON_MODE) //Делать пока не нажата клавиша смены режима
    { 
       ..... //Тело func_x
    }
   
    #asm("sei") //прерывания: вкл.
}


void func_y(void)
{
     #asm("cli") //прерывания: выкл.

     while(BUTTON_MODE) //Делать пока не нажата клавиша смены режима
    { 
       ..... //Тело func_y
    }

    #asm("sei") //прерывания: вкл.
}


Пример я это привел из-за сомнения в его оптимальности... У меня есть определенные сомнения насчет момента нажатия клавиши MODE – получится, что при нажатии функция должна закончить свое выполнение и в тот же момент перейти в тело функции timer0_ovf_isr, насколько оптимален такой подход? Может у кого-то есть свои идеи, которыми он может поделиться?
Второй момент который меня подтолкнул на написание этого поста – тот факт что приведенный выше пример являет собой наверное самый простой метод в работе с клавишами и их опросом. Но существуют ведь и различные вариации на эту тему, в одном из случаев у меня возник вот такой момент:
Имеется абсолютно такого же принципа программка, что и приведенная выше, за исключением работы одной из функций – в ней происходит управление работой ШИ-регулятора МК (реализуется попросту простейший “реобас”) и функция должна соответственным образом уметь изменять величину заполнения (не знаю насколько справедлив такой термин, но в известном всем курсе avr123.nm.ru это называется “величина ШИМ”) в зависимости от состояния присутствующих на внешних входах МК, кнопок “ПЛЮС” и “МИНУС”, то есть по сути цель функции инкрементировать \ декрементировать регистр OCR1xx. Так вот если применить выше представленный пример то работать это конечно же не будет – пока не нажата клавиша смены режима, ни на какие действия в отношении других кнопок, программа реагировать не будет... Естественно возникает желание сделать логическое “И” между клавишей MODE и двумя оставшимися... К сожалению все усугубляется отсутствием работающего девайса, на котором можно провести эксперименты и отладку, мною используется все известный симулятор ISIS из пакета Proteus (7.1 SP2) в котором подобная затея успехом не венчалась, имеются проблемы. Не вдаваясь в их суть, хочу опять таки спросить, если у кого-то свои идеи по этому поводу? (Я имею виду реализацию таких функций). Неужели придется вешать кнопку MODE на внешнее прерывание?
Тем, кто хотел бы мне помочь прилагаю ссылку на архив с проектом (схема в ISIS, проект в CVAVR) где собственно у меня и возникают сомнения насчет оптимальности используемого алгоритма (отмечаю сразу в ISIS все работает, причем “на глаз” даже вполне нормально, просто хочется узнать мнение по поводу рациональности того “бардака” что пришлось организовать...)
http://cp.people.overclockers.ru/cgi-bin/dl.pl?id=26068&filename=Device_X.rar

Re: МикроКонтроллеры начинающим - общие вопросы

Strijar » 10 дек 2007, 13:06

Я бы советовал быть в обработчике прерывания как можно меньше времени.

1) Опрашивать кнопки из таймера - это как то не очень...
2) ...лучше уж аппаратные прерывания на них повесить.
3) Что-б не занимать прерывния долго, по его приходу взводите переменую "флаг", а потом в основном цикле обрабатываете и сбрасываете флаг.

Re: МикроКонтроллеры начинающим - общие вопросы

shemmer » 23 дек 2007, 12:45

Добрый день.
Столкнулся с проблемой. разабатываю блок питания на МК atmega8.
Не могу реализовать режим стабилизации по току.
Пробовал вот так ток скачет даже на стабильной нагрузке +-200мА
да еще и скорость реакции медленная
Код: Выделить всёРазвернуть
 //Режим стабилизации по току
       /* if (Vdec>ZNACH_STAB) {   //если измеренное больше установленного
            if (OCR2!=0) {         //ограничение по границам байта
           
                 delay_ms(10);
                 OCR2--; };};    //уменьшить значение ШИМ
                             
         if (Vdec<ZNACH_STAB) {  //если измеренное меньше установленног
            if (OCR2!=255) {       //ограничение по границам байта
                   delay_ms(10);
                  OCR2++;}; };     //увеличить значение ШИМ 

Пробовал увеличить разрядность для более тонкой настройки, ток скачет вообще в пределах 1А
Код: Выделить всёРазвернуть
//использование для регулирования ШИМ значения меньше 1
//(увеличение разрядности
unsigned int reaction;

if (Vdec > ZNACH_STAB & reaction!=0)


reaction--;
else if (Vdec < ZNACH_STAB & reaction!=0xFFFF)

  reaction++;
   
OCR2 = reaction >> 2 ;};

Помогите пожалуйста.
Может кто-нибудь подскажет алгоритм ПИД регулирования на конкретном примере или применительно к моему случаю?
Последний раз редактировалось Vooon 23 дек 2007, 12:51, всего редактировалось 1 раз.
Причина: CODE

Re: МикроКонтроллеры начинающим - общие вопросы

avr123.nm.ru » 23 дек 2007, 13:07

Вот посмотри:

http://model.exponenta.ru/z_tf_pid.html

http://avr123.nm.ru/07.htm внизу список апноутов - по ПИД номер на 200 и в апноутах по электроприводу применяется - это на 49х.

Простейший пид в AN532 у микрочип, посложней в AN699 - они на картинке на ПЕРВОЙ странице этого топика.

Re: МикроКонтроллеры начинающим - общие вопросы

shemmer » 23 дек 2007, 14:02

Ну а вприведенном мною коде можно ли как-нибудь добиться стабильности? Или только использование ПИД?
Я просто никогда не сталкивался с ПИД регулированием. И не очень понимаю как его программно реализовать

Re: МикроКонтроллеры начинающим - общие вопросы

Vooon » 23 дек 2007, 14:11

посмотрите appnote AVR221
там и реализация алгоритма на Си (и несложно переписать в класс С++)
под IAR но легко переписывается под другие компиляторы, почти все стандартный си.


Rambler\'s Top100 Mail.ru counter