DimonRX

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

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

DimonRX    0

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

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

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

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


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

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

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

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


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

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

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

  • Одобряю 1

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


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

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

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


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

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

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


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

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

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


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

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

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


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

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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
artos5    290
12 минуты назад, DimonRX сказал:

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
Alex    546
16 минут назад, DimonRX сказал:

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

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

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

  • Не одобряю 1

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


Ссылка на сообщение
Поделиться на других сайтах
DimonRX    0
2 минуты назад, artos5 сказал:

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

 

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

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

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

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

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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
BARS_    733
15 часов назад, DimonRX сказал:

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

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

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


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

Тоже вариант нормальный.

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


Ссылка на сообщение
Поделиться на других сайтах
DimonRX    0
13 минуты назад, BARS_ сказал:

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

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

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


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

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

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

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

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


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

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

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

  • Не одобряю 1

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


Ссылка на сообщение
Поделиться на других сайтах
BARS_    733
37 минут назад, DimonRX сказал:

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

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

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


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

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

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

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

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

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

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

Смысл?

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

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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
BARS_    733
6 минут назад, DimonRX сказал:

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

Saleae logic

 

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

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

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

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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
DimonRX    0
14 минуты назад, BARS_ сказал:

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
BARS_    733
Только что, DimonRX сказал:

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

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

 

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

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

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

  • Одобряю 3

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


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

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

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

 

IMG_2581.TRIM.MOV

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

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


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

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

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

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

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

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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
BARS_    733
1 минуту назад, DimonRX сказал:

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

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

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


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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

    • Автор: Alexey104
      Всем привет!
      Возникла следующая проблема:
       
      Есть две ардуины 'Mega2560'. По несчастливому стечению обстоятельств данные платы попали в руки одному чуваку, который, вернув их, заявил, что они перестали работать после того, как он "чисто ради интереса" поковырял на обеих некоторые фьюзы. Есть у меня такой китайский usbasp v2 программатор:
      Подключив данный девайс к ICSP-пинам первой платы, удалось без проблем восстановить на ней загрузчик через стандартную Arduino-IDE, после чего работоспособность платы полностью восстановилась. Но вот при попытке сделать то же самое со второй платой, получаю это:
      Такое же сообщение получаю при попытке зашить загрузчик в неподключенную к программатору ардуину, то есть программатор вообще не видит МК. Плата прекрасно работала до того, как вышеупомянутый товарищ покрутил настройки фьюзов.
       
      Что я пытался предпринять:
      Замыкал пины JP3 программатора, отвечающие за понижение скорости, подключал к ардуине 5V от внешнего источника при прошивке загрузчика, - не помогло.
       
      Поиском пользоваться умею, аналогичную тему тут находил, но там проблема была в том, что парень неверно подключал программатор к контроллеру. В моём же случае всё подключено верно, повторюсь, что загрузчик первой платы этим же программатором был восстановлен успешно.
      Буду рад любым советам касательно того, как восстановить работоспособность платы.
       
       
       
    • Автор: KVN
      Всем привет.
      Застрял на подключении 2 датчиков HC-SR04 к Atmega8 (CVAVR 3.12).
      1 настроен на прерывание 0, работает на таймере 0. (работает нормально)
      2 настроен на прерывание 1, работает на таймере 1. (показывает ерунду если рассчитанное расстояние 1 датчика меньше чем расстояние 2 датчика). 
      Фото прилагаю, видна часть кода. Прошу направить на путь истинный.
       
       


    • Автор: Ru_s
      Здравствуйте. Подскажите пожалуйста, возможно ли на attiny13 реализовать такую штуку. Мне в процессе работы программы нужно поменять режим работы таймера/счетчика с fast PWM на обычный счёт, отсчитать длительный промежуток времени и опять вернутся в режим ШИМ. Т.е. я подаю на ногу сигнал ШИМ и когда он в максимальном значении, я его отключаю, и тупо подаю на ногу высокий лог. уровень. В это время Т/С по идее свободен, и мне надо посчитать время работы выхода на максимальном лог. уровне, при достижении какого-то значения времени нужно перевести т/с обратно в ШИМ. Возможно ли это? И как приблизительно это реализовать
    • Автор: ShimkoMax
      Здравствуйте. Требуется вывести данные температуры и влажности на экран. С LCD дисплеем разобрался, осталось разобраться с SHT21. Постоянно выводит 0 на дисплей:
      Main.c:
      #define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdio.h> #include <stdlib.h> #include "globals.h" #include "LCD_lib.h" #include "twi.h" // I2C #include "sht21.h" int main(void) { I2C_Init(); _delay_ms(100); LCD_init(); char buffer[20]; roomAdrInit(); SHT21_reset(); while(1) { SHT21_reset(); LCD_sendString(itoa((int)get_temperature(), buffer, 10), 4, 0, 0); _delay_ms(1000); } } twi.c:
      #include <avr/io.h> #include "twi.h" void I2C_Init(void) { TWSR = 0; TWBR = 0x20; TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); } void I2C_StartCondition(void) { TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while(!(TWCR & (1<<TWINT))); } void I2C_StopCondition(void) { TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN); } void I2C_SendByte(uint8_t data) { TWDR = data; TWCR = (1<<TWINT) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); } unsigned char I2C_ReadByteAck(void) { TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA); while(!(TWCR & (1<<TWINT))); return TWDR; } unsigned char I2C_ReadByteNak(void) { TWCR = (1<<TWINT) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); return TWDR; } sht21.c:
      #define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include <stdio.h> #include "twi.h" #include "sht21.h" void SHT21_reset() { unsigned char reg[1]; reg[0]=SHT21_reset_cmd; I2C_StartCondition(); I2C_SendByte(SHT21_i2c_write); I2C_SendByte(*reg); I2C_StopCondition(); _delay_ms(100); } uint16_t checksum(unsigned char data[],uint8_t byte, uint8_t check) { uint8_t crc=0; uint8_t bytectr,bit; for (bytectr=0; bytectr<byte;bytectr++) { crc^=(data[bytectr]); for (bit=8;bit>0;bit--) { if(crc&0x80) { crc=(crc<<1)^polynomial; } else { crc=crc<<1; } } } if (crc!=check) { return 0; } else { return data; } } void write_user_register() { unsigned char reg[3]; reg[0]=user_register_write; reg[1]=0x44; I2C_StartCondition(); I2C_SendByte(SHT21_i2c_write); I2C_SendByte(*reg); I2C_StopCondition(); } uint16_t read_value(uint8_t reg) { char data[4],crc; uint16_t result; data[0]=reg; I2C_StartCondition(); I2C_SendByte(SHT21_i2c_write); I2C_SendByte(reg); I2C_StartCondition(); I2C_SendByte(SHT21_i2c_read); data[1] = I2C_ReadByteAck(); data[2] = I2C_ReadByteAck(); crc=I2C_ReadByteNak(); I2C_StopCondition(); result=(data[1]<<8) | data[2]; checksum(result,4,crc); result &= 0xFFFC; return result; } float get_humidity() { //char buffer2[4]; uint16_t hum_value = read_value(humidity_hold_mode); return -6 + 125.0 / 65536.0 * hum_value; //dtostrf(rh,5,2,buffer2); _delay_ms(100); } float get_temperature() { //char buffer1[4]; uint16_t temp_value = read_value(temperature_hold_mode); return -46.85 + 175.72 / 65536.0 * temp_value; //dtostrf(tc,5,2,buffer1); _delay_ms(100); }  
    • Автор: GeloMik
       
      Я новичок в программировании AVR контроллеров, хотя знаю +/- C++.
      Проблема заключается в том, что я не могу написать прошивку к своему маленькому проекту. Используемый мною контроллер - ATTiny45. У него на борту имеется 1 АЦП с выходом на 4 ноги. Нужно, чтобы фактически одновременно брался замер с 3, 4 и 5 порта по АЦП, и при появлении 1 на одном из них МК должен подать 5В на 1 или 2 порты. Источник АЦП AREF. 
      Сюда прикреплю схему самого робота, если кого не затруднит помочь написать прошивку, буду очень благодарен