DimonRX

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

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

ruhi    34
1 час назад, DimonRX сказал:

Т.е. в примере читается максимум 32 байта?

 

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

data_buff_spi[y]=data;

...

if(++y>33){ y=0; }

В примере читается 34 байта почему то:

{[0], ... [33] } = 34 штуки

Только когда у=33 , data будет сохранен в 33-й элемент массива, и только после этого у станет = 0!!!

Наверно автор ошибся со знаком, и с остальным соответственно, так должно быть:

if(!(++y<32)){ y=0; }

Изменено пользователем ruhi
допись :)

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


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

В примере читается 34 байта почему то:

Все правильно тут.  Но тут не все еще. Этот код для защиты выхода за пределы объявленного массива. 

А у меня на самом деле 32 байта принимается. Я еще не показывал обработчик сброса указателя. Не стал загромождать пример. 

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


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

Все правильно тут

Ну как же правильно если пишется за пределы выделенного массива???

Человеку и так от С-ей голову сносит, а вы дополнительно его путаете.

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


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

Ну как же правильно если пишется за пределы выделенного массива???

А с чего Вы взяли?? 

Выделенный массив у меня 34 байта. 

Но пишу в него только 32.

 

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


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

Найдите миллионы труднодоступных

электронных компонентов

ruhi    34
В 03.07.2018 в 14:54, artos5 сказал:

Выделенный массив у меня 34 байта. 

Но пишу в него только 32.

О как! Вот ведь до чего техника дошла!

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


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

Так у меня ничего и не получилось.

Купил логический анализатор. Подключил. Он все читает как надо. Что передаю, то и читает. А вот у меня не получается читать.

Опишу свои действия, может кто-то подскажет, где я делаю не так.

Значит для тестов собрал модель и написал программку,  эмулирующую анимацию. В сдвиговый регистр данные передаю следующим образом:

1) Поднимаем и держим RESET в 1
2) Выдаем первый (старший) бит на Data.
3) Опускаем в 0 и поднимаем в 1 тактовый выход. На восходящем фронте происходит занос в регистр и сдвиг всей цепочки на один шаг.
Код, который это делает:

procedure HC164_write(Out_data : byte);
var
 i, Dat : byte;
begin
 for i := 0 to 7 do
  begin
   Dat := (Out_data  shl i) and %10000000;
   PORTC0_bit := Dat.B7;
   
   PORTC1_bit := 0;
   PORTC1_bit := 1;
  end;
end;

В основной программе разрешил прерывание int1 по изменению уровня

GICR := %11000000; 
MCUCR := %00000100; 
SREG_I_bit := 1; 

И пробую читать данные со сдвигового регистра (нога PD3 подключена к CLK, PD1 подключена к линии данных) в массив из 127 элементов для дальнейшего анализа.

procedure ReadData(); iv IVT_ADDR_INT1; ics ICS_AUTO;
var
 rd_bit, rd_data : byte;
 Data_SPI_buf : array[127] of byte; volatile;
begin
 if (PIND3_bit = 1) and (yy <= 127) then
  begin
   rd_data := rd_data shl 1;
   if (PIND1_bit = 1) then
    rd_data := rd_data or 0x01
   else
    rd_data := rd_data or 0x00;
   inc(rd_bit);
   if (rd_bit > 7) then
    begin
     rd_bit := 0;
     Data_SPI_buf[yy] := rd_data;
     inc(yy);
     rd_data := 0;
    end;
  end;
end;

И ничего не читается из того, что передаю. Может подскажете, что я делаю не так?

Если это поможет, то могу выложить те данные, что читает логический анализатор.

IMG_2906.JPG

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


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

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

PORTC1_bit := 0;

// задержка 1 мс

PORTC1_bit := 1;

// задержка 1 мс

При приеме надо ещё анализировать на какой разряд приходят данные. Ножки РС2 и РС3.

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


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

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

PORTC1_bit := 0;

// задержка 1 мс

PORTC1_bit := 1;

// задержка 1 мс

Задержки я могу вставить, а как быть с промышленным решением? У меня же только модель для отладки, к реальной программе, которая делает то же самое, у меня доступа нет.

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

При приеме надо ещё анализировать на какой разряд приходят данные. Ножки РС2 и РС3.

А это зачем? Я же данные с другой стороны читаю. Ну приходит на первый разряд код 140, я знаю, что это буква "Р" и просто игнорирую эти байты. Меня больше интересуют сегменты, а именно коды 254, 253, 251, 247, 239, 223. А их прочитать не получается. А вот логический анализатор их читает:

Time [s]	 Analyzer Name	 Decoded Protocol Result
0.000000000000000	SPI	MISO: 140
0.010413000000000	SPI	MISO: 247
0.020802000000000	SPI	MISO: 140
0.031215000000000	SPI	MISO: 247
0.041603000000000	SPI	MISO: 140
0.052017000000000	SPI	MISO: 247
0.062408000000000	SPI	MISO: 140
0.072822000000000	SPI	MISO: 247
0.083219000000000	SPI	MISO: 140
0.093631000000000	SPI	MISO: 251
0.104020000000000	SPI	MISO: 140
0.114433000000000	SPI	MISO: 251
0.124824000000000	SPI	MISO: 140
0.135237000000000	SPI	MISO: 251
0.145626000000000	SPI	MISO: 140
0.156039000000000	SPI	MISO: 251
0.166429000000000	SPI	MISO: 140
0.176842000000000	SPI	MISO: 251
0.187232000000000	SPI	MISO: 140
0.197644000000000	SPI	MISO: 251
0.208034000000000	SPI	MISO: 140
0.218446000000000	SPI	MISO: 251
0.228835000000000	SPI	MISO: 140
0.239248000000000	SPI	MISO: 251
0.249638000000000	SPI	MISO: 140
0.260051000000000	SPI	MISO: 251
0.270439000000000	SPI	MISO: 140
0.280852000000000	SPI	MISO: 251
0.291241000000000	SPI	MISO: 140

 

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


Ссылка на сообщение
Поделиться на других сайтах
snn_krs    45
21 minutes ago, DimonRX said:

Задержки я могу вставить, а как быть с промышленным решением?

В устройстве можете анализатором посмотреть время обновления, думаю больше 1 мс. У вас импульс очень короткий, анализатор его поймает, а Атмега нет.

40 minutes ago, DimonRX said:

А это зачем? Я же данные с другой стороны читаю.

Если анализировать РС2 и РС3, то вы точно знаете первый или второй индикатор вы анализируете. Если анализировать как вы, то надо проверять все возможные символы.

  • Одобряю 1

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


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

@snn_krs , спасибо, кто бы мог подумать!

Да, правильно говорят: "Век живи-век учись, а все равно дураком помрёшь." Вставил задержки по 1 мс и все стало читаться! А я месяц голову ломал, почему не работает? Вроде все просто и логично, а не работало. Теперь надо на железе попробовать, будет читаться или нет.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

    • Автор: Kudich
      Всех приветствую!
      Сам я программирую на стандартной среде ардуинки, и в одном проекте потребовалось увеличить частоту ШИМ на портах 5,6,9,10,11,13 Arduino Micro. На этой ардуино стоит Atmega32u4, есть тут знатоки avr? Как повысить частоту на этих пинах?
    • Автор: Evg69
      добрый день. Вернулся к микроконтроллерам после длительного перерыва. Сижу туплю и даже гугл не помог.
      Два вопроса по Atmel Studio 7. Режим отладки. Симуляция.
      1. Как включить окно в котором можно посмотреть что контроллер выплевывает
      в UART? Не содержимое регистра, а типа терминала.
      2. Как подсунуть студии файлик с содержимым EEPROM?
    • Гость Keil
      Автор: Гость Keil
      Добрый день, ситуация такая - попались мне под руку куча рассыпухи в числе которых достаточное количетво тинек и прочей лабуды - пытась хеловродить, попробовал взять готовый пример работы тиньки и лсдишника здесь также имею ардуинку как  Айсипи и чудесно мигаю светодиодом на мк прошитом ею же  так вот при попытке залить код который по ссылке чуда не произошло.
      курение мануалов лсдишника дало понять лиш одно что старший и младший биты одинаковы с лсдишником со статьи - лсдишник рабочий (игрался контрастом одной строки через V0  и потенциометр ) - как в прочем и мк, было задумано ковырнуть все это в протеусе и атмельстудии, но результатом не увенчалось. Пожалуйста тыкните носом что да где не так.
      fail.zip
    • Автор: GreenCrab
      Здравствуйте!
      Стоит задача использовать atmega8 в качестве повторителя/блокиратора сигнала. Т.е. атмега должна просто повторить сигналы полученные на i2c, выводя их на любые другие две ножи.
      Можно просто написать программу, которая будет, в бесконечном цикле, снимать сигнал с пина и ставить такой-же на дублирующую ножку, но я не уверен, что такое решение оптимальное. Есть ли возможность как-то настроить атмегу, чтобы две ножки были соединены в одну цепь ? 

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

    • Автор: Static
      Доброго дня всем!
      Не так давно решил опробовать использовать в схемах ATmega в корпусе TQFP и возник такой вопрос. На ней имеется аж три ноги на "-" и две под "VCC". Подсоединять нужно все или можно только по одной любой?
      Заранее благодарен за помощь.