ruhi

логическое И на AVR

48 сообщений в этой теме

my504    357

Логическая функция ног - это совершенно тривиальная задача, которая используется в каждом первом случае. Количество инструкций зависит от того кода, в котором этот анализ производится. Две инструкции или пять - ПО БАРАБАНУ. Для уменьшения латентности применяют аппаратные приблуды (прерывание по изменению ног, встроенные микроПЛИСы и т.п.).

То есть даже как этюд задача неинтересна.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

:D А я то думаю что это я один только учавствую. Можно тип МК с ПЛИС на борту очень интересно!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    357

Открываете сайт микрочипа и ищите МК с модулем CLC на борту...

Это очень много МК, включая новые инкарнации атмелевского наследия.

ЗЫ. Количество модулей может быть больше одного, есличо...

Изменено пользователем my504

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
hasl    62

Когда кажется.

Читают UserGuide, DataSheet и т.д.

когда хотят просто поп....(поговорить), сидят в форуме

;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Геннадий    1 020
5 часов назад, my504 сказал:

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

Вот тут трудно не согласиться с Марком. Если изменение сигнала (в Ваших алгоритмах) произойдет сразу за первой инструкцией (in R, pinX), то можете смело удваивать алгоритмы вдвое. Ну разве не джиттер (до 90%)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    34

Ключ к архиву: 

AndUnitsCode

В 31.01.2018 в 17:54, Геннадий сказал:

трудно не согласиться с Марком.

С Марком можно сколько угодно соглашаться, но джиттер здесь ни при чем!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    357
1 час назад, ruhi сказал:

джиттер здесь ни при чем!

Бездоказательное утверждение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    34
1 час назад, my504 сказал:

Бездоказательное утверждение.

Конечно, потому что тут нечего доказывать, смотрите условия задачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    357

Причем тут условия задачи? Я отметил, что программный логический вентиль будет иметь очень большой джиттер. И все.

Кому джиттер по барабану, тот может это все реализовать. Но если нужно быстро, то как может не волновать джиттер? Однако есть и такой класс задач. Просто их совсем мало. Синтетическая реализация предложенная здесь далека от жизни. Синтетическая она потому, что является блокирующим кодом. Ну разве только весь МК только и делает, что решает эту задачу. Тогда чем он лучше классического вентиля?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    34
24 минуты назад, my504 сказал:

Причем тут условия задачи? Я отметил, что программный логический вентиль будет иметь очень большой джиттер. И все.

Я когда в институте учился, на такие утверждения преподаватели обычно спрашивали: по сравнению с чем очень большой?

Что бы ответить надо какую то прикладную задачу рассматривать. А в общем можно сказать, что при минимальном времени переключения входных сигналов на порядок большем чем время максимальной задержки фронта процессором, решение можно рассматривать для практического применения и в контексте сравнения всех остальных параметров. (будет кажется около 50 мкс минимум входного периода переключений).

Цитата

что является блокирующим кодом.

Ну да! Это конечно тоже надо учитывать при рассмотрении для практического применения. Но можно выходить по прерываниям, если потребуется в реальной задаче.

Но на С такое конечно не напишешь - стек надо подменять, но драйверы тоже не всегда на чистом С пишутся.

Изменено пользователем ruhi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Starichok    1 267
10 часов назад, my504 сказал:

Ну разве только весь МК только и делает, что решает эту задачу.

совершенно верно подмечено - весьма подходящее занятие для МК - максимально быстро делать логическое И и больше ни чем не заниматься...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    34
11 час назад, Starichok сказал:

совершенно верно подмечено - весьма подходящее занятие для МК - максимально быстро делать логическое И и больше ни чем не заниматься...

Вообще то, изначально, задача позиционировалась как теоретическая, если что. Читайте сначала.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    357

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    34
1 час назад, my504 сказал:

она ничего не обобщает

А вы вот здорово обобщаете! У вас, конечно, нет практического выхлопа в этом направлении (реализация специфичной логики через специфичные возможности контроллера), потому что вы им никогда не занимались, видимо, но у меня то он есть - годами девайсы работают! 

Ну не интересно вам, ну не хочется из своей норы выглядывать, ну и ладно, чего так расстраиваться то, что кто то увидит больше чем вам хочется?

Изменено пользователем ruhi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Starichok    1 267

ну и в чем твой выхлоп из 10 процессорных циклов выразится в практическом смысле, если у тебя он есть?..

а то мы тут собрались слепые и не видим в этой затее вообще никакого выхлопа...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    34
12 часа назад, Starichok сказал:

ну и в чем твой выхлоп из 10 процессорных циклов выразится в практическом смысле, если у тебя он есть?..

Так он не только у меня есть! Я же привел пример: программная реализация поддержки USB - посмотрите как сделана. В моем понимании это и есть "реализация специфичной логики через специфичные возможности контроллера" на практике.

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

Но как упражнение для понимания возможностей управления этими специфичными возможностями, мне кажется, является достаточно показательным примером!

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

А я, было время, даже генератор ассемблерного кода написал для одной специальной задачи отсчета N=12 (кажется) интервалов времени с точностью до периода тактовой частоты процессора от 1 до 2в32 периодов на одном представителе AT90 серии (атмег тогда еще не было).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    357

Сам по себе программный ЮСБ уже мало кому нужен, гораздо проще  найти МК с аппаратной поддержкой да еще и за меньшие деньги.. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    34
3 часа назад, my504 сказал:

Сам по себе программный ЮСБ уже мало кому нужен, гораздо проще  найти МК с аппаратной поддержкой да еще и за меньшие деньги.. 

ваша правда! да он еще и максимально медленный!

А, когда-то, я был приятно удивлен возможностью разобраться с работой протокола на уровне фронтов и наносекунд. На ассемблере описание гораздо компактнее чем на английском, да и подебажить можно!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    357

С работой протокола проще всего ознакомится по спецификациям на usb.org

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

Изменено пользователем my504

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    34
38 минут назад, my504 сказал:

С работой протокола проще всего ознакомится по спецификациям на usb.org

ознакомиться мне было недостаточно. Мне надо было, именно, досконально разобраться, проверить на практике что я правильно понял спецификацию.

Такая практическая проверка не выглядит, а всегда является несколько перректальной операцией, такова жизнь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    357

Разве для разбора УАРТа требуется его программная эмуляция?

Ерунда какая то....

Вы пытаетесь доказать, что кривая частная реализация HID может служить учебным пособием?

Подключите осциллограф к дифпаре ЮСБ и снифферите физуровень. Все лучше, нежели разбирать чужие каракули на АСМе.

 

Изменено пользователем my504

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    34
18 минут назад, my504 сказал:

Вы пытаетесь доказать, что кривая частная реализация HID может служить учебным пособием?

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

И ассемблер мне читать труда не составляет, и биты в памяти гораздо проще разбирать чем на осциллографе.

И УАРТ это не протокол, там сложности нет никакой - разбирать нечего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    357

УАРТ такой же "не протокол", как и физуровень ЮСБ.

Кроме физуровня в АСМе разбирать нечего.

ЗЫ. К слову. Вы пытались привязать местную задачу к "разобранному" Вами ЮСБ. Сделали это крайне неуклюже. По сути представленная тут задача никакого отношения к программному ЮСБ не имеет. В том смысле, что ЮСБ реализует только входные маски, но никак не выходной сигнал. А если выходной, то никак не входную логику. Это я все к тому, с каким "качеством" Вы разобрали оный АСМ, если мне пришлось Вам долго доказывать вышесказанное....

Изменено пользователем my504

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: Денис Оробей
       Помогите написать простую задачку (для вас - простую, а я не шарю), на плате контроллера-конструнтора KIT-8515 нужно  сделать вот это: "Пусть движковыми переключателями задаются два четырехзначных операнда.  Напишите и протестируйте программу, при работе которой после нажатия кнопки 1 операнды складывались, а при нажатии кнопки 2 операнды вычитались, а результат операции выводился на светодиоды"
      Прикреплённый файл - начало задачки.
      Заранее благодарствую:)
      123.rar
    • Автор: Николай Зубий
      Как сделать  устройство, выводящие на индикатор время, прошедшее с момента последней перезагрузки контроллера?
    • Автор: forestdozor
      Здравствуйте!

      Мне нужно измерить длительность импульса. Для этого сначала применял внешнее прерывание, а теперь перешел на режим захвата таймера в Atmega 328.
      Однако сейчас происходит странное: Через определенное таймер просто останавливается. Гугл результатов не дает, ни у кого захват таймера 1 не останавливается.
      Подскажите пожалуйста, что делать?
      Среда разработки CodeVisionAVR v3.12. Сейчас попробовал версию 3.3, толку нет. Не работает. Код максимально упростил, но по прежнему толку ноль.
      Переполнение таймера 0 так же работает отлично, до тех пор, пока что-то не произойдет с прерыванием по захвату. Как только что-то произошло - мк останавливается...
      Может немножко подождать, и увеличить значение счетчика current_timp еще на пару значений... Совсем не знаю что делать.
       
       
      interrupt [TIM1_OVF] void timer1_ovf_isr(void)
      {
      TCNT1H = 0x00;
      TCNT1L = 0x00;
      }
      // Timer1 input capture interrupt service routine
      interrupt [TIM1_CAPT] void timer1_capt_isr(void)
      {
       
             TCNT1H = 0x00;
             TCNT1L = 0x00;           // Это уже уровень танцев с бубном "авось поможет" - не помогает.
         
              current_timp++;          // Все упрощено до максимума. Мне бы он хоть количество периодов для начала...
              
        //  }
      }
      // Прерывание по переполнению первого таймера
      interrupt [TIM0_OVF] void timer0_ovf_isr(void)
      {
      // Обнуление счетного регистра.
      TCNT0=0x00;

          
          counter ++;
          if (counter > 10)
          {
                  lcd_clear();
                  sprintf(buffer,"%d us", current_timp);
                  lcd_gotoxy(0,0);
                  lcd_puts(buffer);
                  counter = 0;
          }
          
          
      }

      // Главный цикл программы
      void main(void)
      {

      #pragma optsize-
      CLKPR=(1<<CLKPCE);
      CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
      #ifdef _OPTIMIZE_SIZE_
      #pragma optsize+
      #endif

      // Port B initialization
      // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
      DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
      // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
      PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
      // Port C initialization
      // Function: Bit6=In Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
      DDRC=(0<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
      // State: Bit6=T Bit5=1 Bit4=1 Bit3=1 Bit2=1 Bit1=1 Bit0=1
      PORTC=(0<<PORTC6) | (1<<PORTC5) | (1<<PORTC4) | (1<<PORTC3) | (1<<PORTC2) | (1<<PORTC1) | (1<<PORTC0);
      // Port D initialization
      // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
      DDRD=(1<<DDD7) | (1<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
      // State: Bit7=1 Bit6=1 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
      PORTD=(1<<PORTD7) | (1<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
      // Делители таймера 0 рассчитаны таким образом , что его тактовая частота = 15,625 КГц. Расчет был на применение в схеме семисегментников, но с LCD индикатором будет информативнее.
      TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
      TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (1<<CS00);
      TCNT0=0x00;
      OCR0A=0x00;
      OCR0B=0x00;
       
      // Настройка таймера 1
      TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
      TCCR1B=(1<<ICNC1) | (1<<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;
      // Разрешение прерывания по переполнению таймера 0
      TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);
      // Timer/Counter 1 Interrupt(s) initialization
      TIMSK1=(1<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (1<<TOIE1);
    • Автор: voltex
      Всем привет! Подскажите, пожалуйста, как правильно считать данные с внешней eeprom по шине spi, в данном случае 25LC256.
      Написал код ссылаясь на даташит. Собрал схему в протеусе, подключил spi отладчик и вот что получил в итоге. Так же не могу проверить получается записать данные в память или нет. Весь код прикрепил.
       

      main.c
    • Автор: CUBE
      Не могу запустить асинхронный режим. 
      Ниже будет представлен код которым пытаюсь отладить. Там в 1 коде идёт работа от внутреннего источника таков (стоит 1МГц).  После 5 миганий таймер должен перейти в асинхронный режим и мигать с частотой в 1 Гц. У меня происходит 5 миганий потом ничего. Фьюзы менять пробовал, ничего не дало, сейчас дефолт. Корпус кварца к земле тянуть пробовал - безрезультатно. 
      Возможно что-то в подключении накосячил, если не видно на фото ниже, спрашиваете, нужно будет - нарисую схему. 
      Компилятор Atmel Studio 7
      Шью через Sind Prog 2.1.1 + USBasp 2.0
      Вот код: 
      .macro outi 
       ldi r16, @1 
       out @0, r16 
      .endm 
      .org $000 
      rjmp reset 
      .org $001 
      reti 
      .org $002 
      reti 
      .org $003 
      reti 
      .org $004 
      rjmp timer2_ovf 
      .org $005 
      reti 
      .org $006 
      reti 
      .org $007 
      reti 
      .org $008 
      reti 
      .org $009 
      reti 
      .org $00A 
      reti 
      .org $00B 
      reti 
      .org $00C 
      reti 
      .org $00D 
      reti 
      .org $00E 
      reti 
      .org $00F 
      reti 
      .org $011 
      reti 
      .org $012 
      reti 
      .ORG INT_VECTORS_SIZE 
       
      reset: 
      .equ portout=portd 
      .equ ddrout=ddrd 
      .def led=r17 
      .def mask=r18 
      .def counter=r19 
       outi spl,low(ramend) 
       outi sph,high(ramend) 
       
       outi ddrout, 0xff 
       
       outi tccr2, 0b00000111 
       outi timsk, 1«toie2 
       
        
       
        
       ldi led,1«5 
       ldi mask,1«5 
       sei 
      cycle: 
      cpi counter, 10 
      breq offtim 
       rjmp cycle 
       
      timer2_ovf: 
      inc counter 
       out portout, led 
       eor led, mask 
      reti 
        
      offtim: 
      outi timsk, 0«toie2 
      rjmp asinxron 
       
      asinxron: 
       outi assr, 0b00001000 
      back: 
       in r16, assr 
       cpi r16, 0b00001000 
       brne back 
       
        outi tccr2, 0b00000101 
        outi tcnt2, 0 
        outi ocr2, 0 
        outi timsk, 1«toie2 
       
       
      m1: 
      rjmp m1


      Верх меги на фото слева.