Коллеги, а накидайте идей, по какой-такой причине на сабже может не работать SPI? Расклад следующий: есть Atmega8, которой нужно выводить информацию на восьмиразрядный индикатор через драйвер MAX7219. В Протеусе всё работает замечательно, но в железе я получаю полный ступор: на линии MOSI висит высокий потенциал и нет никакого движения, на линиях SCK и PB0 низкий потенциал с периодически возникающими пачками каких-то хаотичных импульсов. Индикаторы при этом либо вообще не включаются, либо выводят бессмыслицу. Ну, ОК, программер я тот ещё, мог и накосячить в коде. Беру с сайта NarodStream демонстрационную программу, которая разжёвана уважаемым автором до последней строчки... https://narodstream.ru/avr-urok-28-spi- ... d-max7219/
...заливаю её в контроллер и получаю тот же результат. Отключаю от контроллера драйвер с индикатором -- ничего не меняется. Заливаю для проверки простейшую программу-мигалку, всё работает, контроллер весело дрыгает всеми своими ножками. Прошивается и читается он, к слову, тоже без проблем.
Что бы это могло значить? Попался бракованный контроллер или это я где-то люто торможу? К сожалению, запасного под рукой нет.
В монтаже ошибок нет, флюс смыт уже просто до хруста. Все подключения по даташиту, ну разве что в драйвере по линии ISET стоит не волшебный резистор 9,53К а нормальный в 10К. Атмега не китайская, куплена во всем известном магазинчике с богатым ассортиментом и конскими ценами . Фьюзы установлены по умолчанию, 3F, D9, E4. Блоки питания пробовал разные, в том числе и трансформаторные.
Новый контроллер заказал, жду. А пока буду благодарен за любые идеи.
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Вс сен 20, 2020 13:11:39
Jack_A
Идея есть. Выложить свой неработающий код в части работы SPI и инициализации. Потому что осень ослабляет телепатические способности. На линиях висят те потенциалы, которое им диктует программа - в нормальном МК.
Возможно несоответствие spi mode у дивайса и в программе. Всё легко ущучивается: синхронизнуться внешне от CS, посмотреть MOSI относительно CLK. MOSI постоянно в высоком? Коротыш на питание, косяк в программе, неисправность МК. Чудес не бывает. Разделяется и проверяется по частям.
Ну и МК может быть дохлый. То, что прошивается, ещё не гарантия "хорошести" .
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Вс сен 20, 2020 13:32:22
Самсусамыч
Выписал себе тоже такой индикатор на MAX7219… придёт поделюсь тестовой прошивкой для проверки работы индикатора. А пока жду железку…
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Вс сен 20, 2020 13:53:45
Kalessin72
[uquote="Jack_A",url="/forum/viewtopic.php?p=3895124#p3895124"]Идея есть. Выложить свой неработающий код в части работы SPI и инициализации.[/uquote]
Программер я начинающий и мой код пока что слишком убог, чтобы его публиковать Так что позволю себе ограничиться демо-программой от NarodStream, которую я упоминал выше. Она ровно так же не работает на моей железке, но отлично запускается в Протеусе. От авторской, выложенной на сайте, она отличается только тем, что количество знакомест ограничено пятью, восемь у меня протеус не тянет.
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
char dg = 5;
void SPI_init(void)
{
DDRB |= ((1<<PORTB2)|(1<<PORTB3)|(1<<PORTB5)); //ножки SPI на выход
PORTB &= ~((1<<PORTB2)|(1<<PORTB3)|(1<<PORTB5)); //низкий уровень
SPCR |= (1 << SPE) | (1 << MSTR)| (1<<SPR0);//включим шину, объ¤вим ведущим, делитель 16
}
void SPI_SendByte (char byte)
{
SPDR = byte;
while (!(SPSR & (1 << SPIF)));
}
void Send_7219(char rg, char dt)
{
PORTB &= ~(1<<PORTB2);
SPI_SendByte(rg);
SPI_SendByte(dt);
PORTB |= (1<<PORTB2);
}
void Clear_7219(void)
{
char i = dg;
// Loop until 0, but don't run for zero
do {
// Set each display in use to blank
Send_7219(i, 0xF); //CHAR BLANK
} while (--i);
}
void Number_7219(volatile long n)
{
char ng = 0; //переменная для минуса
if (n < 0)
{
ng = 1;
n *= -1;
}
Clear_7219();
if (n == 0) {
Send_7219(0x01, 0); //в первый разряд напишем 0
return;
}
char i = 0;
do {
Send_7219(++i, n%10);
n /= 10;
} while (n);
if (ng) {
Send_7219(i+1, 0xA); //символ -
}
}
void NumberFull_7219(volatile long n)
{
int i;
//Clear_7219();
for(i=0;i<dg;i++)
{
Send_7219(i+1,(n/((long)pow(10,i)))%10);
}
}
int main(void)
{
unsigned int i=0;
SPI_init();
Send_7219(0x09, 0xFF); //включим режим декодирования
Send_7219(0x0B, dg - 1); //сколько разрядов используем
Send_7219(0x0A, 0x02); //яркость
Send_7219(0x0C, 1); //включим индикатор
Clear_7219();
Send_7219(0x01, 1);
Send_7219(0x02, 2);
Send_7219(0x03, 3);
Send_7219(0x04, 4);
Send_7219(0x05, 5);
Send_7219(0x06, 6);
Send_7219(0x07, 7);
Send_7219(0x08, 8);
_delay_ms(1000);
Number_7219(-2016);
_delay_ms(1000);
while(1)
{
NumberFull_7219(i);
i++;
_delay_ms(500);
}
}
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Вс сен 20, 2020 14:55:40
Jack_A
Читать этот код мне лень, могу посоветовать: перерезать дорожку от MOSI и посмотреть, что теперь на MOSI - есть импульсы или нет. Если есть, а на другой стороне "перереза" высокий - то коротыш. Если нет - косяк МК.
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Вс сен 20, 2020 16:15:23
Kalessin72
Монтаж проверен-перепроверен по десятому кругу, всё с ним нормально, замыканий нет. Я и сам, откровенно говоря, склоняюсь к мысли, что мне "повезло" заиметь глючный МК, но надежда, как известно, умирает последней. Оттого и решил спросить совета у бывалых.
Что касается кода, то если Вам или ещё кому он будет интересен, то вот видеоурок. Автор детально разбирает буквально каждую строчку и демонстрирует работу и в Протеусе и в железе. Чёрт, эта программа просто обязана работать, там нечему глючить.
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Вс сен 20, 2020 17:17:15
Dimon456
Не знаю что там было в регистре перед этой строчкой
Хм... SPI2X по умолчанию стоит в нуле. ОК, попробую выставить бит явно. В Протеусе код работает, позже попробую поэкспериментировать с железкой и о результате отпишусь.
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Пт ноя 06, 2020 19:37:33
Самсусамыч
Пришли индикаторы на мах7219…
Как и обещал, написал тестовую прошивку для меги8. Фьюзы прошивать не нужно (МК тактируется на заводских установках). На индикаторе установлена минимальная яркость. Задействован аппаратный SPI.
MAX7219_Test.hex
Схема для подключения индикатора к выводам МК.
Спойлер
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Чт дек 17, 2020 22:11:28
Kalessin72
Коллеги, премного извиняюсь за долгое молчание, свалился на голову срочный проект.
Продолжаю разговор. Дело, как оказалось не в Меге, а в связке Max7219 и индикаторах. Я тоже разжился готовыми китайскими модулями, точно такими как в посте выше. Подключаю их, вуаля, всё работает идеально! Но мне надобны циферки побольше. Закупаю ещё пять штук 7219 к трём имеющимся у меня, итого их становится восемь. Так вот, из восьми штук на моём самодельном дисплее запустилась лишь одна, да и та работает нестабильно, через несколько минут может погаснуть. Остальные ведут себя так, как описано в первом посте.
Какого шкодливого кота 7219 отказывается работать с индикаторами? Они у меня самые обычные, семисегментные, красные, общий катод, типа TOS-5161AMR-N, высота знакоместа 14 мм.
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Пт дек 18, 2020 07:55:56
Самсусамыч
Если по отдельности (с тестовой прошивкой), все модули работают нормально, а в связке с Вашей программой управления начинают глючить – то засада в Вашей программе… а вообще при необходимости больших цифр/букв используют матрицы 8х8 с МАХ7219 как пример:
Спойлерhttps://aliexpress.ru/item/4001189296229.html?spm=a2g0o.search0302.0.0.2511373a2oNrkN&algo_pvid=5ecffd06-f398-4dad-b9d2-14c0ac266c58&algo_expid=5ecffd06-f398-4dad-b9d2-14c0ac266c58-15&btsid=0b8b034a16082669484826525ee0d4&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Пт дек 18, 2020 11:25:38
BOB51
Для цифирек "побольше" (или совсем "безразмерных") легче разновидности 595го регистра применять с источниками тока на каждый сегмент на основе LM317...
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Вт дек 22, 2020 12:09:50
Kalessin72
Спасибо всем за ответы!
С прошивкой у меня всё в порядке, как выяснилось. С позволения почтенной публики я опишу ситуацию немного подробнее. Итак, имеется устройство, состоящее из двух плат, соединённых бутербродом через PLS-PBS. На нижней распаяна Мега вместе со всей требухой, верхняя -- чисто дисплей, здесь установлены индикаторы и 7219. При включении имеем картинку, описанную в первом посте. Однако, если вместо верхней платы подкинуть китайский модуль, фото которого есть выше у тов. Самсусамыча, то всё работает правильно. Более того, с одной из имеющихся у меня 7219 самодельный дисплей тоже запускается, но работает нестабильно и через пару минут вешается. Тем не менее этот факт как бы говорит, что дисплей распаян правильно и в принципе работоспособен.
Кроме того у меня есть отладочная плата, в которую я залил демонстрационную прошивку от НародСтрим, тоже упомянутую выше. С ней картина аналогичная, самодельный дисплей не работает, китайский -- запускается.
ИМХО я словил какой-то очень странный конфликт 7219 и индикаторов, причины которого я пока не понимаю. Микросхемы куплены в разных местах: три в ЧиД, пять у китайцев, что примечательно запускается "китайская". В качестве рабочей версии подозреваю неудачную разводку платы, из-за которой возникают наводки. Индикаторы одинарные, плата двусторонняя, дорожек, понятное дело, много. Пока не придумал ничего лучше как заказать строенные сборки индикаторов и полностью переделать плату. Посмотрю, что из этого выйдет.
Да, слишком большие цифры мне не требуются, это будет настольное устройство, для которого матрицы излишни. Знакоместо в 14 мм. в самый раз, а вот китайский модуль маловат.
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Вс янв 10, 2021 09:52:09
simonsun
Kalessin72, скажи чем разрешилась проблема?
Чтобы не плодить темы, опишу свою проблему здесь.
У меня подобная сложность - с али пришёл 1 модуль в сборе (матрица 8х8 и max7219), и отдельно 5шт. max7219.
Модуль в сборе работает как положено, а вот если родной max7219 заменить на те, что пришли отдельно, то ничего не работает, и более того, виснет атмега.
Самое интересное, что все 5 отдельных max7219 дают такой эффект.
Есть ли у кого соображения в чём причина зависания атмеги от max7219?
На фото рабочий модуль в сборе.
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Вс янв 10, 2021 16:00:14
BOB51
Отмечалась нестабильная работа блока с 8 индикаторами ("стандартная" платка с СМД МАХом) в случае режима дешифратора.
Нечеткое включение/"зависание" при подаче питания...
Вариант "знакосинтеза" таких дефектов не обнаруживал.
Как предположение...
Собственно в МАХе свой генератор сброса - возможно время до подачи блока команд инициализации надо увеличить.
Расположенный у контактов питания электролит также не слишком увеличивать...
Смотрим за максимально допустимым током на сегмент (задается внешним резистором) и соотношение кратности увеличения при снижении количества активных знакомест (менее 8 ). И корректность команд в блоке инициализации. Возможно имеет значение порядок следования команд - сначала настройка, затем включение индикации.
Крайний случай - подделка...
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Вс янв 10, 2021 17:03:18
simonsun
BOB51, как только к драйверу подключаю контакт DIN (MOSI на атмеге), то атмега перестаёт определяться.
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Пн янв 11, 2021 10:01:41
BOB51
У Вас случаем не адуринка?
Там с контактами ISP надо несколько поаккуратнее обращаться - учитываем их коротенькую активацию на момент запуска бутлоадера при включении платки!
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Пн янв 11, 2021 17:28:00
simonsun
BOB51 писал(а):У Вас случаем не адуринка?
Там с контактами ISP надо несколько поаккуратнее обращаться - учитываем их коротенькую активацию на момент запуска бутлоадера при включении платки!
Нет, голый МК atmega8a
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Пн янв 11, 2021 21:20:02
BOB51
Точно без всяких бутлоадеров?
Да и тест предпочтительно программным SPI провести для полной чистоты...
Re: Atmega8 + MAX7219 не работает SPI
Добавлено: Пн янв 11, 2021 21:46:58
Самсусамыч
[uquote="simonsun",url="/forum/viewtopic.php?p=3956619#p3956619"]Есть ли у кого соображения в чём причина зависания атмеги от max7219?[/uquote]
Моя тестовая прошивка тоже зависает?