GreenCrab

Atmega8 в качестве повторителя сигнала

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

GreenCrab    0

Здравствуйте!
Стоит задача использовать atmega8 в качестве повторителя/блокиратора сигнала. Т.е. атмега должна просто повторить сигналы полученные на i2c, выводя их на любые другие две ножи.
Можно просто написать программу, которая будет, в бесконечном цикле, снимать сигнал с пина и ставить такой-же на дублирующую ножку, но я не уверен, что такое решение оптимальное. Есть ли возможность как-то настроить атмегу, чтобы две ножки были соединены в одну цепь ? 

REPEATER должен либо пропускать сигнал от i2c к RECEIVER, либо нет. 

Capture.PNG

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


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

Впервые на русском языке! Работаем с микроконтроллерами STM32F7(на основе STM32F7 Online Training)

Цикл материалов на основе STM32F7 Online Training от компании STMicroelectronics. Описаны функциональные блоки и инструменты разработки для семейства микроконтроллеров STM32F7, охватывающие тематику системной периферии, памяти, безопасности, аналоговой периферии, цифровой периферии, таймеров, экосистемы.

Подробнее>>

COKPOWEHEU    264

@Никитос, плохая идея. Во-первых используются нестандартные имена вроде PORTB.5. Во-вторых, код переусложнен.

В данном случае достаточно

PORTB = PINC;

Разумеется, при приведенной схеме, когда PC0-PC3, PC6 висят в воздухе.

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


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

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

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


Ссылка на сообщение
Поделиться на других сайтах
COKPOWEHEU    264
PORTB = PINC & enable; //enable не 1 бит, а маска: биты 4 и 5. Но можно просто 0x00/0xFF

Тоже мне нашлась проблема. 3 такта на весь повторитель.

Хотя проще было поставить микросхему низкой степени интеграции: 4х2И-НЕ, 4х2ИЛИ-НЕ, буфер или инвертор с Z-состоянием, аналоговые ключи (вроде КТ3)

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


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

@COKPOWEHEU PORTB = PINC заберет все два порта, затратно... зато просто в написании:)

if(PINB.0 == 1){
	if(PINC.4 == 1)
		PORTB.4 = 1;
		else
		PORTB.4 = 0;
	if(PINC.5 == 1)
		PORTB.5 = 1;
		else
		PORTB.5 = 0;
}

Если на ноге B0 висит плюс, то МК транслирует. Если минус - не транслирует)))))

Конечно так не пишется, но для разового проекта попрет:D

На счет нестандартных имен - согласен,это под великий и ужасный CVAVR:D

Изменено пользователем Никитос

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


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

Я выше какую то чушь написал!))))))))

/*******************************************************
Chip type               : ATmega8
Program type            : Application
AVR Core Clock frequency: 1,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*******************************************************/

#include <mega8.h>

void main(void)
{
DDRB=(1<<DDB5) | (1<<DDB4);

while (1)
      {
		if(PINB.0 == 1){
		PORTB.4 = PINC.4;
		PORTB.5 = PINC.5;
		}
		else
		{
		PORTB.4 = 0;
		PORTB.5 = 0;
		}
	  }
}

5b923c4e7c9e6_.thumb.png.96f51e682a252cb13f78f6a4cc392c23.png

Изменено пользователем Никитос

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


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

Спасибо за ответы, но подобные решения я уже пробовал.
Атмега является звеном между i2c master и i2c slave. Ее предназначение - расширение диапазона адресов. Т.е. я отправляю сигнал "открыть" на одну из таких атмег и она транслирует сигнал дальше.
Проще говоря, за атмегой1 есть устройство с адресом 0x33 и за атмега2 есть устройство с таким адресом (см. картинку). Нужно обратиться (и получить ответ!) к одному из них. Потому вариант PORTB = PINC не подходит. Ведь slave тоже изменяет sda.
К тому-же, если продублировать только scl, то slave не поймет команду. Видимо, атмега слишком долго выполняет инструкции и получается рассинхрон.

Я хотел узнать, есть ли в атмегах какой-то магический регистр, который позволит замкнуть (буквально) две ножки между собой, чтоб сигнал проходил без задержек и в обе стороны. Вариант "проводок", разумеется, не подойдет. Разве что кто-то знает, как паять и отпаивать его средствами С :D
 

Capture.PNG

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


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

@GreenCrab реле поставь:) обращаешься к одному мк,подключил к нему линию,обращаешься к другому- от первого отключил и к другому подключил))

5b9249a13ed7f_.thumb.png.54ac6fe22f082f2abda62ab4372a59e6.png

Своего рода ChipSelect, можно поставить дешифратор и расширить до огромного количества:)

Только усиление сигнала не происходит)

Изменено пользователем Никитос

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


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

Кто-то мешает по I2C кинуть адрес нужного устройства в виде байта данных?

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


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

ога в i2c насколько я помню 128 устройств на одной шине - неужели мало?

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


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

@Никитос В итоге я что-то похожее и сделал. Только без реле. Теперь меги-хабы просто дают 0 на линию со своими слейвами, чтобы те начали слушать i2c. Ну, и еще одна линия, чтоб отключать ненужные хабы в момент общения мастера и слейвов.
Проблема, можно сказать, решена. Раз уж нет способа "замкнуть" ноги, что было бы еще проще, чем сделано сейчас.
 

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


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

Суть неясна - тогда уж просто на полевике ключ сделать - подал напругу, ключ замкнулся и сигнал прошел. Убрал - сигнал не проходит.

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


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

Что-то я не пойму, нафига такие сложности с трансляцией. Во-первых, без задержек это никак не получится. Во-вторых, МК, который транслирует команды должен не транслировать их, а понимать и сам общаться с магическим девайсом, ибо I2C подразумевает перенастройку вывода с выхода на вход, и обратно. В-третьих, зачем именно трансляция? Что мешает просто послать некую команду в МК, а он уже пнет девайс с адресом 33h? Тем более нужен еще и анализ полученных команд. Плюс связь, судя по всему, односторонняя.

Берем какую-нибудь TINY с 8 выводами, ставим возле каждого девайса 33h, задаем каждому МК свой адрес. Затем МК просто принимают команды от мастера и тупо рулят девайсами. Тут их вообще можно по UART объединить при желании. Это если там именно МК нужен. А так поставить микросхему свич или горсть транзилей и рулить шинами.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

    • Автор: Ruslik334
      Уважаемые электроники-программисты. Кто силен в CVAVR? Или может кто подскажет где уже есть. 
      Есть вот такой прогресс бар https://radioparty.ru/programming/avr/c/361-lesson-lib-lcd написанный в Atmel Studio. Но у меня весь проект в CVAVR, попытался привязать его, но не поддается он мне. Помогите или дайте вектор. На Ардуино много, но там для меня совсем темень
    • Автор: 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


      Верх меги на фото слева. 
    • Автор: Static
      Доброго дня всем!
      Не так давно решил опробовать использовать в схемах ATmega в корпусе TQFP и возник такой вопрос. На ней имеется аж три ноги на "-" и две под "VCC". Подсоединять нужно все или можно только по одной любой?
      Заранее благодарен за помощь.
    • Автор: Yon
      Цеплял радиомодули RF 433 МГц на Ардуино Уно и ""Ардуино" на Атмеге 8 (и наоборот) согласно видео и инфы с нета. Скечи заливал следующие. Но никак ни заработало. Какие могут быть причины? Ардуины исправные. Спс.
       
       
       
  • Сообщения

    • ...представляю, что у Вас дома творится, если этикетки с 1975 года храните ! Тохаристан. Тохары - древний индоевропейский народ. Только они жили в Китае, где уйгуры сейчас.
    • Что означает надпись на дисплее :SDA pullup is not installed
    • Для этого существуют понятия ТКС, температурный коэфицент, допустимое отклонение, техническое задание, и много других. Есть большой ряд линейных стабилизаторов которые вообще не греются, вопрос только в том какую мощность вы на нем высадите и какой у него ток покоя - Iq.   Греть.... греть можно до: температуры плавления припоя. выхода волшебного дыма на котором компонент работает. расчетной температуры. допустимой температуры. Что нужно вам?
    • Чё,в профиле не отображается?В связи с ситуацией...У нас тоже не принято "мальчиков"вызывать,тем не менее,в "обезьяннике "бывал за громкую музыку."доброжелателей"  хватало.А тут...
    • Ну выставь ты частоту среза не 80кГц, а 40кГц. Кто тебе мешает? Несущая станет много меньше. Всё достаточно просто: Если нагрузка 8Ом, то конденсатор ставь на 0.22мкФ для частоты среза 80кГц. Если нагрузка 8Ом, то конденсатор ставь на 0.47мкФ для частоты среза 40кГц. Если нагрузка 4Ом, то конденсатор ставь на 0.47мкФ для частоты среза 80кГц. Если нагрузка 4Ом, то конденсатор ставь на 1мкФ для частоты среза 40кГц. Если нагрузка 2Ом, то конденсатор ставь на 1мкФ для частоты среза 80кГц. Если нагрузка 2Ом, то конденсатор ставь на 2.2мкФ для частоты среза 40кГц. Однако, чем больше номинал конденсатора, тем больше реактивные токи в контуре. То-есть, чем больше амплитуда несущей частоты, тем легче фильтру. Если так мешает несущая частота (мало ли, вдруг дома перестаёт работать телевизор от длинного провода акустического), никто не мешает поставить дополнительный фильтр частот на выход. Это снизит амплитуду несущей частоты, хоть до 0.1В.  Ещё раз напишу, что амплитуда несущей частоты на выходе зависит от частоты среза фильтра! То-есть, для 16Ом и 100кГц фильтре, при 300кГц несущей, 5 вольт - норма!
    • Есть же куча нормальных УМ в АБ классе, зачем собирать этот шлак? Любят наши люди извращения, за уши не оттянешь.