Jump to content
Duhas

Примеры Кода Для Avr

Recommended Posts

а у тебя есть другие способы расширить Таймер2 до 16 бит?

 


Мудрость приходит вместе с импотенцией...

Share this post


Link to post
Share on other sites

delayH:delayL - использовать как 16-битный счетчик (вместо OCR2), выбрав другую пару регистров. Сам OCR2 в режиме CTC будет служить множителем.

Я такие вопросы решаю так:

; значение задержки в регистры R25 - delayH, R24 - delayL (вместо R22, R21. R20 не требуется)
; OCR2 - значение множителя задержки
; прерывание таймера2, режим СТС
timer2_CTC:
   ; сохраним регистры, которые использует прерывание
	sbiw		r25:r24,1
;если длина "тела" большая, то делаем так
	breq		work
	rjmp		exit_timer2_CTC
work:
   ; "тело" прерывания
   ; идем на задание задержки для следующего цикла таймера
exit_timer2_CTC:
	reti

Конечно, для расчета задержки требуется несколько иной подход, но это стОит компактности решения.

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

опять ты не в ту степь...

мне НЕ НУЖЕН произвольный множитель, мне нужно отработать задержку с точностью до одного такта таймера.

и я для себя разработал такой алгоритм.

мне может понадобится задержка и меньше 255 микросекунд.

например, нужно 97 микросекунд или 131 микросекунда. что ты со своими алгоритмом тут будешь делать? что на что будешь умножать?


Мудрость приходит вместе с импотенцией...

Share this post


Link to post
Share on other sites

Вебинар «Параметры выше, цена ниже. Обновление в линейке AC/DC- и DC/DC-преобразователей MORNSUN» (26.01.2021)

Приглашаем 26 января на бесплатный вебинар, посвящённый преимуществам и отличиям новых источников питания и DC/DC-преобразователей Mornsun. На вебинаре будут рассмотрены изолированные и неизолированные DC/DC-преобразователи последнего, четвертого, поколения (R4) и компактные модульные источники питания второго и третьего поколений (семейства LS/R3 и LD/R2) на плату. Рассмотрим новую группу продукции – встраиваемые источники питания в кожухе.

Подробнее

Если нет желания вникать и доработать под себя - продвигайте свой алгоритм. Я же не настаиваю. С уважением. Геннадий.

Share this post


Link to post
Share on other sites

Вебинар "Новый BlueNRG-LP с Bluetooth 5.2 и Long Range — волшебная палочка разработчика IoT" (04/02/2021)

Приглашаем 4 февраля на бесплатный вебинар о BlueNRG-LP - новом программируемом чипе SoC STMicroelectronics. На вебинаре будут детально рассмотрены новые возможности, особенности подключения, аппаратные и программные средства для разработки, а также практические примеры работы с микросхемой.

Подробнее

но ты не ответил на мой вопрос.

спрошу еще раз.

допустим, нужно 269 микросекунд.

что ты будешь в своем алгоритме загружать в OCR2 и на что будешь умножать?

ты сначала сам вникни в то, что ты написал...


Мудрость приходит вместе с импотенцией...

Share this post


Link to post
Share on other sites

Плата STEVAL-IDB011V1 – тестируем идеи на новом BLE 5.2-чипе BlueNRG-LP

Новая система на кристалле BlueNRG-LP производства STMicroelectronics предназначена для устройств интернета вещей(IoT ) и не только, отвечает стандарту BLE 5.2 и поддерживает MESH-сети. Микросхема содержит малопотребляющий MCU Cortex-M0+. Отладка STEVAL-IDB011V1 позволит сэкономить время на разработку новых устройств.

Подробнее

Все решаемо. В моем случае есть выигрыш в лаконичности кода, но только при больших значениях задержек (смутило - необходимость 16-битных значений и первое что пришло в голову - большие задержки). Несомненный выигрыш Вашего кода - меньшее кол-во вызовов обработчика с точностью именно на малых значениях задержек. Прошу прощения за вмешательство (сейчас голова забита оптимизацией большого проекта с целью экономичности кода, вот меня и понесло). 

Share this post


Link to post
Share on other sites

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

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

когда у меня появится механизм от сканера или принтера, я смогу определить реальный диапазон задержек для разгона/торможения шагового двигателя.

вполне может оказаться, что первая задержка при трогании механизма с места может потребоваться и более 65535, и тогда придется изменять что-то в прошивке.

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

сейчас у меня сделан алгоритм разгона на 256 шагов. при этом задержка (время одного шага) уменьшается в 32 раза по сравнению с максимальным временем самого первого шага.

и сейчас я делал отладку программы на слабеньком двигателе от старенького флоппи на 5,25 дюйма.

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

 

 


Мудрость приходит вместе с импотенцией...

Share this post


Link to post
Share on other sites
28.12.2019 в 18:44, Starichok сказал:

то таймер просто не сможет его отработать с точностью до 1 такта таймера

Вот это серьезная тема пошла, потому что и старший байт, когда начинает отсчитывать 255-ffы? Только после входа в прерывание и загрузки регистра , то есть + дельта какая то на каждую единицу???

Видать до импотенции еще долго :) !

Edited by ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

Share this post


Link to post
Share on other sites

со старшим байтом вообще нет никаких проблем.

прерывание начинает работать с некоторым предыдущим значением в регистре OCR2.

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

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

но для меня это не критично. если, к примеру, требуется 257 (256+1) мкс, то вместо 1 мкс прерывание отработает чуть больше, примерно 260 (256 + 4) мкс.


Мудрость приходит вместе с импотенцией...

Share this post


Link to post
Share on other sites

Парни пожалуйста скиньте пример кода на Си (AtmelStudio) захват таймера, нужно подсчитать время импульса ( pulseIn в Arduino)

Share this post


Link to post
Share on other sites
17.03.2020 в 22:00, sbalymov сказал:

Парни пожалуйста скиньте пример кода на Си (AtmelStudio) захват таймера, нужно подсчитать время импульса ( pulseIn в Arduino)

Вот пример кода среда CodeVision 100% рабочий был написан для расшифровки ИК команд от пультов китайских и не очень ДВД кодировка NEC. Здесь применяется захват импульса как по фронту так и по спаду. Старался как можно меньше занимать работу контроллера поэтому не использовал команды типа delay_ms.

#include <mega32.h>    // F_CPU 8000000
#define Front TCCR1B=0xC2;
       // запуск таймера1 в ркжиме захвата по фронту сигнала
#define Spad  TCCR1B=0x82;       
       // переключение таймера на захват по спаду импульса
#define StopT1 TCCR1B=0x00; TCNT1H=0x00;TCNT1L=0x00
       // остановка таймера1
#define Sbros TCNT1H=0x00; TCNT1L=0x00       
       // сброс таймера1                
register int shetshik @2;
volatile unsigned char  pu[4]={0, 0, 0, 0}, 
                        ur=0, kkomand=0xFF, 
                         tik,  sobitie, oshibka;
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
  sobitie=3;  
}

// Timer 1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
 {  
   #asm 
   IN   R2,0x26
   IN   R3,0x27
   #endasm
   if (oshibka==0){sobitie=2;} else {sobitie=0;};
   Sbros; }

void initializacia (void)
{  
PORTA=0x00;
DDRA=0xFF;

PORTB=0x00;
DDRB=0x0F;

PORTC=0x00;
DDRC=0x00;

PORTD=0xFF;
DDRD=0x00;

TCCR0=0x00; // 05
TCNT0=0x00;
OCR0=0x00;

TCCR1A=0x00;
StopT1;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;
MCUCSR=0x00;

TIMSK=0x24;

ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")

}


void main(void)
 {
 // Declare your local variables here
 initializacia(); 
 oshibka=0; tik=10;
 sobitie=0;  
 while (1)
   { if ((!(PIND.6))&&(oshibka==0)&&(tik==10)){sobitie=1;};
           
     
       switch (sobitie) {
        case 1: 
              Front; Sbros; tik=8;
              pu[0]=0; pu[1]=0; 
              pu[2]=0; pu[3]=0;
              ur=0; sobitie=0;
        break;
        case 2: 
            switch (tik) {
             case 8: 
                     Spad;                          
                     if ((8500<shetshik)&&(shetshik<9700))
                     { tik=9; }
                     else{oshibka=1; tik=10;}; 
                   
                     
             break;                          
             case 9: 
                     if ((4300<shetshik)&&(shetshik<4800))   //4500 4900
                     { tik=0; kkomand=0xFF;} 
                     else
                      { if ((2000<shetshik)&&(shetshik<2600))  //2100 2500
                        {oshibka=7;}  else {oshibka=2;};
                        tik=10;};
                       
             break;
             
             case 10: 
               
             break; 
             
             default: 
                     if (tik>7){ tik=10;} else { 
                     if ((1000<shetshik)&&(shetshik<1280))     //Это "0"
                     {pu[ur] &=(~(1 << (tik)));}
                     else 
                       {if((2100<shetshik)&&(shetshik<2500))   //Это "1"
                        {pu[ur] |=(1 << (tik));}
                        else {oshibka=3; tik=10; };};
                        
                        if (tik==7){ if (ur==3)
                             { tik=10;
                              if ((pu[0]==~pu[1])&&(pu[2]==~pu[3]))
                                { kkomand=pu[2];}
                                else {oshibka=4; kkomand=0xFF;};
                               }
                                else{ur++; tik=0;};}
                        else {tik++;}; };
               };             // конец выборки tik 
             
             sobitie=0;                 
        break;
        case 3:  //установить первоначальный режим
              tik=10; 
              oshibka=0; 
              sobitie=0; 
        break; 
        
                };    // конец выборки sobitie
     PORTA=kkomand; PORTB=oshibka;}; //while вывод в двоичном коде команды - подвешивал светодиоды использовал для отладки.
 }

Если есть сложности с объявлением переменной shetshik можно просто её обьявить как обычную тип int. но при этом необходимо изменить считывание значений таймера согласно даташиту  и после соединять два 8-ми байтных числа в одно 16-ти разрядное.

Edited by AL_smeu

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Я настолько не знаю  языка , что даже сам не догадался бы, что это дистанционное управление. А далее чисто логика - если проектов несколько - значит они чем то отличаются . И на tn2313 скорее всего уже подобный , так как такое управление востребовано .  Для перевода у меня стоит закладка "переводчик" в браузере , куда скидываю нужный текст .  Есть более продвинутые системы , но  мне и так нормально.  Кстати код чеха не позволяет параллельно включать кнопки местного управления . С транзисторами можно, у них открытый выход (коллектор) . Открытый выход можно сделать и на МК .  Или как костыль использовать последовательные резисторы 1-10к . И как костыль же поставить после резисторов конденсаторы , чтоб была интегрирующая RC цепь , подправляющая особенности кода .    
    • Я как бы тоже, штука полезная или даже кайфовая. Только посмотрите на этом и соседних форумах, сколько конструкций с лимитером и без. Даже если мощности несколько сот Вт и необходимость в нем как и в слежинии за ОБР не обсуждается. В середине нулевых ВП только и твердил:... защита,... лимитер,... "... гарантировано хуже - нет защиты". А популярность получил только "упрощенный" поскребыш без этого всего. Оказалось что всем "для дома не нужен". Прошло более 15и лет. Можете привести пример форумных конструкций кроме Натали (ещё к ланзару какую то светомузыку приладиладили, и д-класс какой то помнится) в которых был изначально был лимитер и его не норовили кастрировать? 
    • не может быть такого, прошивка работает правильно, иначе бы и у меня показывало одинаковую температуру. а у тебя точно разная температура радиаторов? сразу после включения, да, температура одинаковая. потом начинает разбегаться. если пуск не давать, транзисторы начинают греться током утечки.
    • Конденсаторы получил,все хорошо, Алексею спасибо! 
    • обратноход без ОС? да в страшном сне такое привидеться не может ...

  • Модуль приемопередатчика LoRa SX1280, 2.4GHz, 27dBm, дальность до 8км

  • Similar Content

    • By Обычный Человек
      Микроконтроллер ATmega328p, внешний кварц 16МГц. Компилятор avr-gcc с оптимизацией O1

      Написал код для управление шаговым двигателем. Работает так: требуемая скорость задается переменной STP1_ReqSpeed, дальше с частотой 100Гц срабатывает таймер TIM0, который высчитывает с какой частотой надо подавать сигналы на вход шагового драйвера. TIM1 работает в режиме частотно импульсной модуляции и по прерыванию меняет значение пина на противоположное.

      Управление работает, скорость регулируется, но по какой то причине случаются пропуски шагов. Чаще всего во время ускорения. Количество пропусков от 0 до 4, обычно 2-3, длятся 32мс.

      Из кода вырезал неиспользуемое. Заменить прерывания на аппаратный ШИМ возможности нет. Как убрать эти пропуски?
      Осциллограммы:
       
       
    • By Aristarkh
      Куплю / приму в дар несколько штук Atmega48 / Atmega88 / Atmega168 / Atmega328 в DIP-е 
      Я в Москве, можно почтой 
    • By Женя Соловьев
      Всех приветствую и надеюсь на Вашу помощь по следующему заданию:
      Разработать принципиальную схему прибора с цифровой индикацией измеряемой величины, предназначенного для измерения среднего постоянного тока положительной шины питания нагрузки. Потребление от шины питания постоянного тока может носить импульсный характер. Минимальная частота импульсов может составлять 50 Гц.
      Диапазон измеряемого тока: 0-20 А. На индикаторе отображать величину тока с точностью, не менее 100 мА.
      Время индикации – 1с. Запуск автоматический.
      Как я себе представляю реализацию данной задачи: 
      Первым блоком будет датчик тока, его я хочу взять резистивный , но не до конца понимаю смогу ли добиться такой точности с помощью него, далее нужен по сути фильтр НЧ для выделения постоянной составляющей, далее нужно куда-то впихнуть по сути МВ для обеспечения индикации каждую секунуд, ну и далее на АЦП и на индикатор тут вопросов в принципе не создается, АЦП наверное будет с двойным интегрированием. По первой части большие сомнения того, как будет выглядеть схема, если есть возможность как-то показать как будет выглядеть схема то отлично, если нет, то литература и Ваши мысли очень приветствуются.
       
    • By olezka18
      Здравствуйте! Принесли зарядное, не заряжает, поискал поиском, подобного не нашел. Как и схемы для него, с виду довольно неплохое ЗУ

×
×
  • Create New...