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 (и наоборот) согласно видео и инфы с нета. Скечи заливал следующие. Но никак ни заработало. Какие могут быть причины? Ардуины исправные. Спс.