Jump to content
SergeyKa

Задачка про микроконтроллер.

Recommended Posts

и так имеется микроконтроллер Atmega8 с тактовой частотой внешнего кварцевого резонатора 16 МГц

допустим мы имеем переменную PLUS с бесконечным возможным числом.

while(1) { plus++; }

какое будет значение переменной PLUS за 1 микросекунду.

Share this post


Link to post
Share on other sites

Итак, операция выполняется МК за один такт, соответственно, время такта равно 1/16000000=0,0000000625, то есть, PLUS увеличится на 1 за такое время. За микросекунду PLUS увеличится на 16

Share this post


Link to post
Share on other sites

Это зависит, как компилятор переведет С в ассемблер мк. А там считаем команды и за сколько тактов выполняется каждая. И чтобы прерывания не мешали.

@Дмитрий Кузьмичёв это если без цикла 16 команд inc поставить. А так - еще jmp как минимум, т.е. 8

А если не просто jmp, а перед ним сравнить что-то с 1, тогда еще меньше.

Share this post


Link to post
Share on other sites

Технология Maxim Integrated nanoPower: когда малый IQ имеет преимущества

При разработке устройств с батарейным питанием важно выбирать компоненты не просто с малым потреблением, но и с предельно малым током покоя. При этом следует обратить внимание на линейку nanoPower производства компании Maxim Integrated. В статье рассмотрено их применение на примере системы датчиков беспроводной оконной сигнализации.

Подробнее

12 минуты назад, KomSoft сказал:

как компилятор переведет С в ассемблер мк.

это еще больше это зависит от типа переменной

 

Share this post


Link to post
Share on other sites
17 минут назад, KomSoft сказал:

Это зависит, как компилятор переведет С в ассемблер мк. А там считаем команды и за сколько тактов выполняется каждая. И чтобы прерывания не мешали.

@Дмитрий Кузьмичёв это если без цикла 16 команд inc поставить. А так - еще jmp как минимум, т.е. 8

А если не просто jmp, а перед ним сравнить что-то с 1, тогда еще меньше.

jmp это безусловный переход

Share this post


Link to post
Share on other sites
                     

Платы Nucleo на базе STM32G0: чего можно добиться с помощью связки Nucleo и Arduino

Платы Nucleo и платы расширения X-NUCLEO от STMicroelectronics можно интегрировать в платформу Arduino с помощью библиотеки STM32duino. Связка плат Nucleo и платформы Arduino, и наличие готовых библиотек – представляет удобный инструмент для создания прототипов и конечных приложений в условиях ограниченного времени. Статья содержит пошаговые инструкции по установке библиотек и запуску примеров для Nucleo.

Подробнее...

6 hours ago, Дмитрий Кузьмичёв said:

jmp это безусловный переход

Вот я и говорю, что от компилятора. "While (1) " это тоже бесконечный цикл. Зачем умному компилятору ставить jmp с условием, которого нет?

И @IMXO прав. Если plus четырехбайтовая, то может за 1мкс (16 тактов) и ни разу не успеть

Share this post


Link to post
Share on other sites

Сделайте на таймере прерывание на 1 млсек и посмотрите сколько получилось с переменными разного типа

Share this post


Link to post
Share on other sites

А еще зависит это того, где эта переменная хранится: в регистре, озу или eeprom. :D

Share this post


Link to post
Share on other sites
8 часов назад, SergeyKa сказал:

и так имеется микроконтроллер Atmega8 с тактовой частотой внешнего кварцевого резонатора 16 МГц

допустим мы имеем переменную PLUS с бесконечным возможным числом.


while(1) { plus++; }

какое будет значение переменной PLUS за 1 микросекунду.

Компилируете программу с приведенным кодом и считаете В ДИЗАСМЕ количество машинных циклов, заглядывая в даташит на предмет количества циклов на команду АСМа.

Но у меня смутные подозрения на ПРИЧИНУ Вашего вопроса...

Зачем сие знание Вам? Что Вы хотите тем самым реализовать?

Edited by my504

Share this post


Link to post
Share on other sites
2 часа назад, my504 сказал:

Но у меня смутные подозрения на ПРИЧИНУ Вашего вопроса...

я вспомнил как бы передачу кода от магнитной ленты до моего старенького zx-spectrum и вот когда я изучал этот код, там понятно были длинные импульсы единицы, короткие импульсы нули. Но что самое главное. Микросхема (специальная) которая считывала всё это, могла работать в разных режимах скорости. Т.е. понятное дело что двигатель магнитофона не мог выдать ровно ту скорость ленты которая нужна была, и эта скорость просто напросто плавала. Но сбой это в считывании программы не возникало. Сейчас создаю подобие устройство (ну как бы протокол передачи данных), и вот нужно что бы программа могла считывать данные согласно скорости устройства. Там уже плавающая не должна быть, но скорость разная. Т.е. например. на линии появился импульс и он длительностью как 8 бит информации, этот импульс был по времени 8 микросекунд. Значит на 1 бит уходит 1 микросекунда. Зная эту информацию можно осуществить безошибочное сканирование остальных битов (т.е. как бы подстроить тактовую частоту. А вот допустим пусть импульс 8,1 микросекунд, тут уже 1,0125 микросекунд. И вот у меня и встает задача. Как это реализовать на микроконтроллере. Что бы он сканировал пакет (который и служит для определения скорости передачи) а затем выбрал оптимальную скорость тактирования битов причем эта скорость должна варьироваться от 7,8 до 8,2 микросекунд. 

Придумал алгоритм такой. В Меге. Минимальная пауза это 1 микросекунда. Но команды он выполняет шустрее. Т.е. за время пока появляется этот 8 битный пакет определяющий скорость, врубается обычный счетчик, который считает. 1..2..3..4..5..6.. и т.д. как только пакет прошел. мы определяем число. зная это число можно разделить его на 8 и на 2. так как должен же быть тактовый импульс это пол бита 1 пол бита 0. Вот и получаем число. Которое дальше можно заставить считать микроконтроллер что бы отмерить нужную скорость. Для 8 микросекунд, это будет допустим число 0,5 микросекунд единица (число 8) и 0,5 микросекунд ноль (число 8) - при условии если за одну микросекунду он досчитал до 16.

Но задача видимо туго осуществимая.

Edited by SergeyKa

Share this post


Link to post
Share on other sites

А почему туго осуществимая? В этом месте делайте вставку на асме типа: прочитать регистр, что-то там, задержка (цикл или набор nop'ов) , снова прочитать. И вы отвяжетесь от компилятора и точно будете знать время выполнения. 

Share this post


Link to post
Share on other sites
2 часа назад, SergeyKa сказал:

там понятно были длинные импульсы единицы, короткие импульсы нули

Привераете, там, был и есть манчейстер. Ноль и единица кодируются переходом уровня.

Он самосинхронизирующийся! Если скорость плавает плавно( во как), то оно не страшно, а если рывок в пределах одного бита( детонация), то ППЦ.

 

Edited by o_l_e_g

Share this post


Link to post
Share on other sites
18 часов назад, KomSoft сказал:

А почему туго осуществимая? В этом месте делайте вставку на асме типа: прочитать регистр, что-то там, задержка (цикл или набор nop'ов) , снова прочитать. И вы отвяжетесь от компилятора и точно будете знать время выполнения. 

я на си печатаю, там нет noop(

Share this post


Link to post
Share on other sites
В 18.06.2017 в 00:38, SergeyKa сказал:

допустим мы имеем переменную PLUS с бесконечным возможным числом.

Бесконечно возможное число потребует бесконечно возможного количества битов для своего представления. Инкремент такой переменной потребует бесконечно большое время. За 1 микросекунду переменная не изменится никак.

Share this post


Link to post
Share on other sites
12 часа назад, SergeyKa сказал:

я на си печатаю, там нет noop(

там есть ассемблерные вставки asm("nop");

11 час назад, ARV сказал:

Бесконечно возможное число потребует бесконечно возможного количества битов для своего представления. Инкремент такой переменной потребует бесконечно большое время. За 1 микросекунду переменная не изменится никак.

Что ж не довели мысль до конца? :) Бесконечно большую переменную компилятор не позволит создать так что за 1 мкс оно даже не запустится

Share this post


Link to post
Share on other sites

nop - это "не операции", ассемблерная команда процессора, которая ничего не делает и выполняется за 1 такт. Из них делают (или ими дополняют) циклы для задержек.

Share this post


Link to post
Share on other sites
22 минуты назад, COKPOWEHEU сказал:

Бесконечно большую переменную компилятор не позволит создать

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

P.S. Вообще говоря, математическая бесконечность - это одна из тем высшей математики, которая повергает меня в уныние из-за противоречия бытового и научного понимания... Бесконечности могут быть больше или меньше друг друга, над ними можно делать математические действия (напр., умножать на бесконечность или складывать с нею), и результат получается достаточно непредсказуемым для неподготовленного ума... Худшим для моего мозга явилось откровение, что уравнение sin(x) = -2 имеет решение... с этого момента я с математикой перестал поддерживать тесные отношения и больше ушел в философию :)

Edited by ARV

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...

  • Similar Content

    • By Максим123456789
      делаю диплом, в схеме у меня микроконтроллер PIC16F688 и мне нужно его заменить на ATmega. Не могу найти похожий
    • By Anton Bondarenko
      Всем привет
      Прошу не ругать, впервые подобный вопрос задаю.
      Хочу сделать прибор, который будет посылать сигнал, когда возле прибора будет проходить металлический предмет. 
      — угол отслеживания до 30° а лучше прямая линия, траектория
      — время реакции очень высокое до 100 мс
      — ширина проема в котором нужно сканировать от 10 до 20метров,
      — передача сигнала через вифи
      Может есть готовые решения, или отдельные компоненты.
      Подскажите пжл в каком направлении искать.
      Смотрел датчики движения, но главная проблема — время реакции.
      Спасибо
       
    • By Sofia Vin
      Предлагаем проектную работу в Москве:
      Микроконтроллер STM32F103.
        
      Есть встроенный код с использованием функций библиотеки FreeRTOS, код имеет описанный протокол для связи с внешним миром.
        
      Необходимо проводить доработку кода под задачи программиста верхнего уровня и его тестирование в составе оборудования. 
      Работа в лаборатории (м.Университет) и удаленно. 
      Оплата по договоренности.
      Если Вы обладаете опытом схемотехнического проектирования и программирования микроконтроллеров, и Вас заинтересовала данная возможность, ждем Ваши отклики по контактным данным:
      8 (925) 023-60-02   Алексей
      E-mail: nassa@marathon.ru
       
    • By Антон Плюшкин
      В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны.
      Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод.
      Собрал, протестил, всё норм, но!
      Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает!
      #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit3=In Bit2=Out Bit1=In Bit0=In DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit3=T Bit2=0 Bit1=T Bit0=T PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // Timer Period: 0,031875 ms // Output Pulse(s): // OC0A Period: 0,031875 ms Width: 0 us // OC0B Period: 0,031875 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=0x00FF // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 0,031875 ms // Output Pulse(s): // OC1A Period: 0,031875 ms Width: 0 us // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=(0<<ISC01) | (0<<ISC00); GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0); // USI initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<ADC1D) | (0<<ADC2D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); unsigned char VL_OCR0A = 0, VL_OCR0B = 0, VL_OCR1A = 0; OCR0A = 0; OCR0B = 0; OCR1A = 0; while(1) { _delay_ms( 100 ); VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } } Т.е. если указать задержку в начале цикла, то светодиод не светится вообще.
      Если задержку убрать - светодиод немного подсвечивает всеми цветами.
      while(1) { _delay_ms( 100 ); // <--- ЗАДЕРЖКА --- VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } Где я накосячил?
      З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
    • Guest Денис
      By Guest Денис
      В общем, есть такое чудо китайской техники (фото)
      Что оно может:
      1. Заряжаться через microUSB порт
      2. Кнопка вкл/выкл, она же переключает режимы
      3. 3 режима свечения светодиода (он светит разными цветами)
      Что я хочу сделать:
      1. Пункты 1 и 2 выше
      2. Разнообразить количество режимов, переливание статичный цвет и тд...
      Вопрос: как это сделать? что купить?

      P.S. К сожалению, в гугле не нашел подробной инструкции, а я в электронике я дуб дубом


  • Сообщения

    • И последнее. Как правильно было сказано, 6гд6-80 в рлане "улучшения отдачи баса" хуже 25гдн т.к а) Fs80 против 50 б) мотор слабее и соответственно Qts выше, что потребует Vb больше чем для 25гдн. А он работает в 8литрах, для пары нужно фи всего 16литров. Супротив четырёх не даст. Проще сделать Sp=0.7-1.0Sd чем измерять "ветер"...
    • Если не гоняться за 4-ым знаком после запятой, то для любительских измерений этой карточки за глаза (собственные гармошки у неё менее 0,001% при 24-разрядах и 96кГц). В конце концов всё будет зависеть от характеристик PC-дюка, в который ты её установишь, ну и ест-но от кривизны измерительных "кайобочек", подключаемых к ней.  
    • да на самом деле ничего другого под руками не было. P.s. потенциометр громкости все таки надо будет поменять. Хрипит, шуршит, цикает и некорректно распределяет звук по каналам. В одном положение - звук тише в левом канале, в правом громче, в другом положение наоборот, а в третьем положении вроде выравнивается. Я Так понял проще заменить чем старый ремонтировать. Гемору немеряно. Клепки эти высверливать замучаешься чтоб ничего не повредить, плюс потом все это проволокой скреплять... ну нафиг.
    • 1. При замене номиналов таким образом, да, Fcpез не меняется. НО! Катушка получилась конская т.к при увеличении L для сохранения её активного сопротивления Rc (не более 0.1Re нагрузки= в данном случае 0.4ома) растёт масса-габарит. Можно намотать на сердечнике, но его надо расчитать... Ладно, хай будэ так. 2. Ну увеличили объём. А ПТС динов снимали? Откуда знаете Vas каждого мидбаса и что они вообще идентичны тому проекту?  3. Ошибаетесь. Минимально допустимый диаметр порта Dp =0.5Dэкв. А теория гласит Dp=Dэкв или Sp=Sd. Просто в целях экономии и укорочения длинны порта его уменьшают. Снижение Sp приводит к снижению кпд, увеличению кни, скорости потока и турбулентных завихрений. Для двух 4" либо один 70мм, либо 2×50мм. Второй вариант предпочтительнее. Межосевое портов (как и их геометрия) тоже влияет на их длинну и добротность при неизменной Fb. 4. Поясню вашу ситуацию. Мидбасы работают до 500гц, соответственно межосевое самих мидбасов, как и между мидом не должно превышать 34.4см. Но с акустической точки зрения мидбасы лучше ставить ближе друг к другу, тогда их присоединённые массы взаимодействуют, общее Ra увелививается и два мидбасовичка виртуально превращаются в один с диаметром в 1.414 раз больше. По той же причине трубы порта лучше размещать ближе к мидбасовикам. Оптимум такого решения это КФИ-кольцевой фазоинвертор. Но это другая тема разговора. 5. Естессно знаю. Даже не один раз выкладывал таблицу распределения мощности от вастоты среза. Но, увы, посетители тем не читают... а зря. Заглублять дины в "колодец" вообще нельзя. Их надо ставить за под лицо с баффлом, почитайте теорию волн. А мидбас и басовик можно (ваще нужно) выставлять на подложку, толщина которой расчитывается согласно выравниванию акустических центров (АЦ) с мидом относительно порядка применяемых ФНЧ и ПФ. 12см вч/сч это межосевое для среза 1430гц, что на две с лишним октавы ниже реальной Fсрез 8-9кгц. Это приводит к интерференции и звука не улучшает. В вашем случае 3гд36 надо ставить впритык к миду, раз. Настроить установку по глубине относительно мида согласно АЦ и фазовому сдвигу фильтров, два. И полюбому ставить цепь фазокоррекции т.к при всём желании сделать межосевое сч-вч 2см применяемые дины не позволяют физически. Либо резать ниже и переделывать фильтр, либо поменять мид с твитером на хороший ширик, тянущий до 14-15кгц. 6. Как измеряли сч-нч 15см, от верхнего или от центра между мидбасами? Надо от центра т.к любая пара головок работает вместе= синфазно=как одно целое= как один излучатель и их АЦ и ось ДН находится ровнёхонько между ними.  Судя по фото межосевое нч-нч больше 20см т.к диаметр корзины 6гд6 125мм, Dэкв10см и если их поставить впритык друг к другу межосевое d =12.6см а на фото я вижу что между ними влезет третий мидбас, значит измерили между корзинами а не ценрами диффузоров. В итоге межосевое нч-сч = 16.25+15= 31.25см. Правда вам повезло, т.к это расстояние на 3.15см меньше положенного и вписывается в допуск. В следующий раз учитывайте где находится АЦ пары головок..
    • Книжку бы с описанием схем мультиметров,  принципом работы, деталировкой, методикой проверки и подстройки.  
    • Это "сферический конь в вакууме". Что есть "тоненькие провода"? Каково их сечение? Длина? Сопротивление? Можно резистором ограничить ток мотора, но это бред  Тем паче что под нагрузуой плата всё равно уйдёт в защиту. Если вы хотите использовать устройство с защитой и от "сети" (не понятно чего вы в итоге хотите от "шуруповёрта" (электроотвёртки?) и как хотите этот девайс использовать), меняйте модуль на более подходящий. Либо питайте мотор напрямую от АКБ, а данный модуль используйте только для зарядки самой АКБ. Всё остальное, лютая дичь. Ну не подходит этот модуль под эти цели, для этого есть другие модули с бОльшей нагрузочной способностью. Если защита срабатывает, то это не просто так, это защита от КЗ, от превышения нагрузки и "от дураков". 
×
×
  • Create New...