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

Высококачественные конденсаторы Panasonic для надежности вашей электроники!

Электролитические алюминиевые конденсаторы Panasonic отличаются повышенной надежностью, длительным сроком службы, низким импедансом и выдерживают большой ток пульсаций, в то время как семейства полимерных конденсаторов Panasonic SP-CAP, POSCAP, OS-CON и HYBRID характеризуют сверхнизкий ESR и увеличенная емкость, работа при высоких напряжениях и в расширенном температурном диапазоне. Приобретая продукцию Panasonic, вы гарантированно получаете самое передовое решение для ваших задач. Для облегчения вашего выбора, мы подготовили подборку полезных материалов.

Читать статьи

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
                     

Вебинар "Как создать BLE-устройство на базе новейшего беспроводного микроконтроллера STM32WB55"

27 ноября 2019 года компания КОМПЭЛ приглашает разработчиков, технических руководителей и энтузиастов беспроводной связи на вебинар, посвященный новинке 2019 года – мультипротокольному беспроводному микроконтроллеру STM32WB55, который позволяет создавать устройства на базе стандартов BLE 5.0; BLE Mesh; 802.15.4/ZigBee и Thread. На вебинаре мы покажем, как с помощью привычных инструментов STM32Cube и STM32CubeMX можно создать свое первое, надежно работающее BLE-приложение.

Зарегистрироваться на вебинар

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


×
×
  • Create New...