Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Эмуляция регистра с последовательным вводом на Atmega328
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
StalkerSoft
Разговорились со знакомым радиолюбителем и он мне рассказал о том что есть устройство "Синтезатор частот для любительской коротковолновой радиостанции" схема которого публиковалась в Радио 3-2005. с индикатором реализованном на на регистрах сдвига 74HC595 и ему хотелось заменить этот индикатор и поставить вместо старого индикатора, индикатор на базе MAX7219. Я слегка погорячился и сказал не проблема все можно сделать ставим контроллер подключаем по SPI драйвер и будет работать новый индикатор......

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


По схеме видно что для работы индикатора нужны 3-и сигнала данные (data), синхронизация (Clock) и сигнал для защелки (strobe)
Нашел в инете прошивку для синтезатора sd_ra6lm.HEX загрузил в стенд запускаю ну вроде что-то паказывает


Добавил в стенд ATmega328 завел strobe на itn0, clock на int1 и данные portd.4

Написал код по идее который должен был считывать данные и заполнять буффер и посылать их в MAX7219
Это собственно сам код обработчиков прерываний

Код
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Strobe signal
    TrComplete=1;
    charcount=0;
}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
    InputBuff[charcount]=(InputBuff[charcount]<<1) | PIND.4;
    if (++bitcount==7){
            bitcount=0;
            charcount++;
            InputBuff[charcount]=0;
    }
}


Полный код проект на CodeVision прикреплен к сообщению.

При тестировании работы получилось что индикаторы отображают разную информацию.

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



Сергей Борщ
Подозреваю, что контроллер тупо не успевает принимать данные по прерывниям EXT_INT. Почему бы вам не завести сигналы data и clock на SPI, а strobe на EXT_INT? Тогда биты будут задвигаться автоматически, а по strobe будет достаточно сбросить SPI (чтобы восстановить вдруг потерянную синхронизацию) и запустить процесс вывода в MAX7219.
StalkerSoft
Цитата(Сергей Борщ @ Jun 28 2016, 12:55) *
Подозреваю, что контроллер тупо не успевает принимать данные по прерывниям EXT_INT. Почему бы вам не завести сигналы data и clock на SPI, а strobe на EXT_INT? Тогда биты будут задвигаться автоматически, а по strobe будет достаточно сбросить SPI (чтобы восстановить вдруг потерянную синхронизацию) и запустить процесс вывода в MAX7219.

Попробую вечером.
т.е. вы предлагаете на spi повесить и входящий поток и max7219 при приеме данных от пика pin load на max7219 опускать и по приходу на ext_int STROBE его поднимать и выдавать в MAX7219 полученные данные
Так?
Сергей Борщ
QUOTE (StalkerSoft @ Jun 28 2016, 13:57) *
т.е. вы предлагаете на spi повесить и входящий поток и max7219 при приеме данных от пика
Вот видите - вы точку и заглавную букву сэкономили, а я пять раз перечитывал и пытался понять. Уважайте других.

Нет, я предлагаю принимать данные в SPI (поскольку для этого нужна скорость реакции), а выдавать их в max7219 любыми другими ногами ногодрыгом - потому что скорость в этом процессе не нужна и вывод написать гораздо проще, чем ввод. Повесить и то и другое на один-единственный SPI не получится, потому что для приема данных он должен работать в режиме ведомого, а для передачи - в роли ведущего.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.