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
                     

Материалы вебинара STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

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

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

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. К сожалению, в гугле не нашел подробной инструкции, а я в электронике я дуб дубом


  • Сообщения

    • @Alkarn  Почему подано на вход схемы 1 Вольт ? Начать с 1 мВ хотя бы, но вообще, схема работает с уровнями ниже.  R3 переменный резистор. Где он ? Это моделировано на МС ? Это твои проблемы.  Сначала это все моделировалось в мультисиме и потом уже собиралось практически  
    • именно так. Пульсации в источниках никто не отменял. Или у вас все источники только аккумуляторы и без внутреннего сопротивления? я вам ребят скажу, что хоть сила и собрана по этой схеме, но она далеко не торт на самом деле. Если смотреть с позиции цифрового управления, то линейность на начальном участке у нее отвратная. Стабильность тоже так себе, потому как управление и ОС идет по разным входам ОУ и очень зависит от параметров каждого (!) конкретного ОУ. И это только основные проблемы. Есть еще куча нюансов. Но чтобы все их затронуть и описать, надо книжку написать по электронным нагрузкам и их схемотехнике Чисто ради разминки ума - кто нибудь сможет мне доходчиво рассказать как в моей схеме работает режим CR на умножителе AD633? Ну к примеру. И обьяснить хоть в общих чертах почему я не смог достигнуть сопротивления ниже 1 Ом? А вроде узелок такой простенький достаточно... Полноценная тема для главы той книги
    • РадиоНастройщик, кто вам сказал, что вы что-то понимаете в схемах, и можете поучать других? Не поленился, и промоделировал начальную схему и вашу. Результат еще раз подтвердил то, что и так было очевидно - начальная схема великолепно работает  и индицирует СВЧ сигнал с уровнем менее 100 мВ. Ваша даже при уровне входного сигнала 1 В на выходе выдает ослабленный сигнал входной частоты. Начните с Борисова и Айсберга. Иначе остаются 2 предположения:  1-вы злостный тр олль, 2 - надо обратиться к психоаналитику для коррекции самооценки.  
    • ошибка с тиристором - но интересует больше разводка земли у МС и влияние перемычек 
    • скину свою защиту сюда - может кому пригодится - так как чую - не скоро доберусь до задуманного усилка) схема комплексной зашиты на ОУ ЛМ324 , схема зашиты проверена - в кулере применил полевик - нет смысла регулировать - ес радиаторы горят) - зашита по току на оптопаре - честно - не проверял -но- по идее при перегрузе той или иной полярности должна сработать - желательно ес слишком мощный умзч - добавить резистор в цепь шунта - для ограничения тока - не спалить оптопару , печатку не делал - так как планировал делать все полностью одной платой - весь УМЗЧ и добавить еще пару задуманных схем - но это позже.
    • Пожалуйста. Если что, у Omron есть и оптические датчики с таким питанием. 
    • Продам ГМ-70 графитовые. Новые, с хранения. В наличии 8шт. по 1300 руб/шт. Саратовская обл. Возможна отправка почтой или ТК.
×
×
  • Create New...