GreenCrab

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

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

GreenCrab    0

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

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

Capture.PNG

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


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

почему не взять готовую микросхему буфера?

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


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

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

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

PORTB = PINC;

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

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


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

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

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


Ссылка на сообщение
Поделиться на других сайтах
COKPOWEHEU    263
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, можно поставить дешифратор и расширить до огромного количества:)

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

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

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


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

А не жирно целую мегу гонять?

  • Лайк 1

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


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

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

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


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

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

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


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

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

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


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

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

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


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

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

    • Автор: 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 (и наоборот) согласно видео и инфы с нета. Скечи заливал следующие. Но никак ни заработало. Какие могут быть причины? Ардуины исправные. Спс.
       
       
       
    • Автор: Yon
      Нарыл код в нете для FM радио на Ардуино на базе EM5807M.  Залил это дело в Atmega8, все заработало, сделал простой выбор стаций.
      А кто знает как управлять програмно громкостью, басами, стерео/моно  и др. Используемая часть кода ниже.
       
  • Сообщения

    • а что вы хотели от линейника? подтверждаю. может. Причем даже длительно. Если контакт корпуса прямой с металлом радиатора, то можно даже и до 200 рассеять. В электронных нагрузках вон парнишка ставил эксперименты на эту тему и довольно успешно.
    • Если медь тонкая и если с заходом на верх керна, то всё же лучше в виде колпака с заходом кромок на торец хотя бы миллиметров пять. Вместо клея, лучше пайка. Аккуратная. Такое мне встречалось на динамиках от Сонидо.  Если без захода меди на торец керна, то КЗ виток из меди, должен быть относительно массивным и расположить его вполне допустимо внизу керна. Я например изготавливал спираль из медной проволоки подходящего диаметра (4,0 мм) в два витка.  Посадка в натяг. Можно выточить алюминиевое кольцо с диаметрами керна и магнита. И магнит правильно выставит относительно керна и роль КЗ витка выполнит.
    • у меня есть пачка 139/140 левых. Там внутри кристалл как у того 5551 размером. Естественно срок действия такого прибора минуты полторы ) Не помешало бы проверить на левачок
    • Есть кто в теме? Вот кстати наугад вчера такое купил товарищу вчера,он сказал очень хорошее,ну что-ремикс?)))
    • так нынче как бы синтезатор частот не проблема. У китайцев вообще за подарочную цену. Без всяких бареттеров и от 0,1Гц до 100 МГц. Ну там попроще/посложнее, в зависимости от финансов/потребностей ИМХО - смысла нет уже заморачиваться с паяльником на эту тему. Получится ущербно в любом разе, а затрат времени несоизмеримо
    • @Waldo ,это для уменьшения напряжения питания,китайцы иногда так делают. 2050 можно впаивать смело,диодики убирать. Смысла от этой переделки только мало конечно. Удачи!
    • В Радиотехнике У-101 было сделано довольно грамотно. Там транзистор крепился к пластине размером 15х30х5 мм (приблизительно, точных размеров не помню), а пластина уже крепилась к основному радиатору через изоляционную прокладку.