Jump to content
DimonRX

Как подружить две ATMega8?

Recommended Posts

Всем доброго времени суток!

В AVR-ках я новичёк и очень нуждаюсь в вашей помощи.

Задача у меня следующая. Есть драйвер управления серводвигателем на ATmega88. Помимо основной задачи ATmega88 через 74HC164D выводит на сдвоенный 7-ми сегментный индикатор направление вращения мотора в виде анимации (вращает сегмент по или против часовой стрелки). Рядом есть некая поделка на ATmega8, одной из задач которой является определение направления вращения мотора и, в зависимости от направления, выполнение различных действий. Как мне это сделать? Как подружить две меги? Всем заранее спасибо.

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Автор , проще всего на первой атмеге выделить два пина и дергать их в зависимости от направления .

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

Share this post


Link to post
Share on other sites

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

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

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

Наверное и одного пина будет достаточно 0 - вправо , 1 - в лево , или на оборот 

Share this post


Link to post
Share on other sites

А если есть третье состояние? И не влево и не вправо? 

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-приложение.

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

Вполне возможно ,  но скорее всего это состояние будет когда устройство обесточено .  А так , даже если шим = 0 , то направление вращения уже определено в программе или в схеме . Конечно если будет нужно определить вращается ли мотор и куда вращается  , то безусловно 2 пина нужно . 

Share this post


Link to post
Share on other sites

Я думаю что в большинстве случаев как раз три состояния . Я поэтому и написал сразу за две ножки :)

Share this post


Link to post
Share on other sites

Приношу извинения за некорректно сформулированную задачу.

Уточню. У меня нет доступа к программе меги, которая установлена в драйвере серводвигателя. Нет и схемы драйвера. Этот драйвер-законченное заводское изделие.

Моя задача, имея вторую мегу, где работает написанная мною программа, каким-то образом подключить свою мегу  к меге драйвера (или к 74HC164D или к индикатору) и определить направление вращения двигателя.

Share this post


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

Моя задача, имея вторую мегу, где работает написанная мною программа,

Ну так возьми анализатор , запиши байты которые поступают при вращении влево и потом при вращении вправо . Создай буфер spi и в буфер записывай данные и анализируй . Исходя из результата - принимай решение о направлении вращения.

Share this post


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

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

Как Вы без схемы и без понятия о работоспособности устройства хотите к нему подключиться ?

PS: Анализировать что-то по индикации - та ещё головная боль...

Share this post


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

Ну так возьми анализатор

 

15 часов назад, DimonRX сказал:

В AVR-ках я новичёк

А можно подробнее?

3 минуты назад, Alex сказал:

Как Вы без схемы и без понятия о работоспособности устройства хотите к нему подключиться ?

Ну, кое-какие понятия о работе есть.

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

Share this post


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

драйвер управления серводвигателем на ATmega88.

Ну так к выходу на двигатели и подключиться. В чем проблема?

Share this post


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

Ну так к выходу на двигатели и подключиться. В чем проблема?

Задача подключиться к линии индикации.

Share this post


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

А можно подробнее?

Купи анализатор у китайцев за 10$ или сколько там он стоит .

8 канальный он. И проанализируй данные. За пару вечеров задачу можно решить.

Share this post


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

Хотел как-то данные до сдвигового регистра анализировать.

Индикация может быть статической, а может динамической.
Схема нужна, в любом случае.

Share this post


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

подключиться к линии индикации

Смысл? Да и как подключиться к индикации вам уже сказали. Считывайте пакеты, отсылаемые на драйвер индикатора и анализируйте.

Share this post


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

Купи анализатор у китайцев за 10$ или сколько там он стоит .

А можно ссылку? Или хотя бы название, как он у китайцев называется. Поймите правильно, для меня это все новое, я AVR-ками меньше месяца занимаюсь. Для меня это темный лес. Пытаюсь разобраться по мере сил и возможностей.

1 час назад, Alex сказал:

Индикация может быть статической, а может динамической.

Индикация динамическая.

1 час назад, BARS_ сказал:

Смысл?

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

3 часа назад, artos5 сказал:

Создай буфер spi и в буфер записывай данные и анализируй .

А как это сделать? Может пример есть какой. Моих знаний для этого не достаточно.

Share this post


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

название, как он у китайцев называется.

Saleae logic

 

7 минут назад, DimonRX сказал:

Индикация динамическая.

И сколько знакомест?

9 минут назад, DimonRX сказал:

А как это сделать?

Научиться работать с МК, а потом уже куда-либо лезть.

Share this post


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

Научиться работать с МК, а потом уже куда-либо лезть.

Вот ради этого ответа я и задал вопрос. А Вы уже родились с абсолютными знаниями о МК? И пока не достигли просветления не задавали вопросов вообще? Тогда зачем нужен форум? Для общения гуру между собой?

Share this post


Link to post
Share on other sites
Только что, DimonRX сказал:

А Вы уже родились с абсолютными знаниями о МК? И пока не достигли просветления не задавали вопросов вообще?

Нет. Но вот вопросов я не задавал. Мне с головой хватило примеров в сети и даташитов. Вместо того, чтобы сидеть на форумах я разбирал примеры.

 

2 минуты назад, DimonRX сказал:

Тогда зачем нужен форум?

Форум? А смысл что-то советовать, если такое слово, как "буфер" уже вводит в ступор? Чтобы что-то посоветовать необходимо чтобы у вас были хотя бы начальные знания программирования. Выше ужа дали совет, слить данные, которые идут в индикатор за пару кадров анимации вращения на индикаторе (учитывая динамическую индикацию - это не такая уж и простая задача). Найти закономерость, т.е. выделить байты, которые отвечают именно за анимацию и по порядку байт в двух кадрах определять направление. Например, картинка крутится вправо, подается 0x01 (один кадр анимации), а в другом пакете 0х02 (второй кадр анимации). При анимации влево подается тоже самое, но в обратном порядке, сначала 0х02, потом 0х01. Проблема будет лишь в том, что из-за динамики десяток раз придет пакет с 0х01, и десяток с 0х02. Т.к. заранее известно, сколько байт занимает одна прорисовка, то и записывать буфер в МК будет легко.

Share this post


Link to post
Share on other sites

BARS_,  вот за совет по делу спасибо!

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

 

IMG_2581.TRIM.MOV

Edited by DimonRX

Share this post


Link to post
Share on other sites

Снова попробую обратиться за помощью.

Читать данные с индикатора не получилось. Хочу попробовать читать данные со входа сдвигового регистра. Запись туда происходит по следующему алгоритму:

1. выдаём первый старший бит из пачки на линию DATA

2. опускаем в лог. 0 линию CLC

3. поднимаем в лог.1 линию CLC

4. повторяем все пункты с 1, пока не выдадим все биты.

Мысли такие. Повесить линию CLC на прерывание, например на INT1 со срабатыванием по спаду уровня. При срабатывании прерывания считывать бит данных. И так, пока не прочитаю байт. Вроде логично (на мой дилетантский взгляд), но есть проблема. Как мне синхронизироваться с передачей? Я же могу начать читать не обязательно сначала, а с любого места? И тогда будет считана неверная информация. Как мне узнать, что в данный момент начата передача нового байта?

Share this post


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

Повесить линию CLC на прерывание, например на INT1 со срабатыванием по спаду уровня.

Нахрена, есть же SPI...

Share this post


Link to post
Share on other sites

По SPI у меня подключен цифровой потенциометр MCP41010. И SPI у меня инициализирован как master. Мысли были попробовать по SPI прочитать, но не могу врубиться, как?

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 RIMUS1989i
      Здравствуйте. Затеялся собрать анализатор спектра на светодиодах, 20x20 светодиодов, МК ATMEGA328P. 
      Долго ломал голову, как переключать столбцы без использования МК, дабы его не загружать.И вот что у меня получилось. Набросал тестовую прошивку для теста в протеусе. 
      При инилизации подается импульс на вторую ножку U4a, и на предпоследнем столбце.
      Думал сетку сделать на 5 сдвиговых регистрах (как раз 40 сигнальных линий), но боюсь мощности МК не хватит для обработки FFT и вывода на матрицу, будет подвисать.
      Кто что думает по поводу схемы?
      бегущая строка.pdsprj Natali_2012_program.hex
    • By Максим123456789
      делаю диплом, в схеме у меня микроконтроллер PIC16F688 и мне нужно его заменить на ATmega. Не могу найти похожий
    • By Вячеслав_НС
      помогите разобраться с кодом .(послать значение по шине TWI на ЦАП PCF8591) не работает в протеусе ...
      #define F_CPU 8000000UL 
      #include <stdlib.h>
      #include <avr/io.h>
      #include <util/delay.h>
      //*** ИНИЦИАЛИЗАЦИЯ ШИНЫ TWI ***/
      void TWI_Init(void)
      {
          // Установка тактовой частоты F_scl  = 100 кГц
          TWBR =32;
          TWSR &= (~((1<<TWPS1)|(1<<TWPS0)));
          TWCR |= (1 << TWEN);            // Разрешение работы TWI-модуля
      }

      /*** ЗАПУСК TWI ***/
      void TWI_Start(void)
      {
          TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
          while(!(TWCR & (1<<TWINT)));
          TWDR = 1001000; // передача адреса модуля PCF8591 в шину TWI
          TWCR=(1<<TWINT)|(1<<TWEN);
          while(!(TWCR & (1<<TWINT)));
      }
      /*** ОСТАНОВКА TWI ***/
      void TWI_Stop(void)
      {
          TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
          while(TWCR & (1<<TWSTO));        // Ожидание завершения передачи условия СТОП
      }
      /***ПЕРЕДАЧА ДАННЫХ В TWI***/
      void TWI_WriteByte(uint8_t data)
      {
          TWDR = data;                    // Загрузка данных в TWDR
          TWCR=(1<<TWINT)|(1<<TWEN);
          while(!(TWCR & (1 << TWINT)));    // Ожидание завершения передачи данных
      }
      /*** ПЕРЕДАТЬ ЗНАЧЕНИЕ В PCF8591 ***/
      void PCF8591_get(void)
      {
          TWI_Start();                // Запуск TWI
          TWI_WriteByte(0x40);        //включаем цап
          TWI_WriteByte(100);            // запись в ЦАП значения 100
          TWI_Stop();                    // Остановить TWI
      }            
          int main(void)
      {
          TWI_Init();    
          while (1)
      {
              PCF8591_get;
             _delay_ms(50);
        }
      }
    • By Вячеслав_НС
      Здравствуйте ! подскажите , какую лучше библиотеку использовать (и где ее взять) для управления i2c atmega8 в atmel studio 7  .  задача - управлять atmega8 по i2c ,  цап  PCF8591T .
      понимаю , в интернете много примеров и библиотек , но хотелось бы пример максимально простой и точно рабочий . т.к. пока что все мои попытки не привели к успеху ... то Atmel Studio 7 при компиляции ругается на несуществующий файл ( к примеру - "stream.h") при использовании библиотеки i2c , то еще какие то грабли .
    • 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; } Где я накосячил?
      З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
×
×
  • Create New...