Я хотел бы уточнить свой вопрос: как происходит в коде формирование пакета для MAX7456?
Я хотел бы уточнить свой вопрос: как происходит в коде формирование пакета для MAX7456?
Я собирал и у меня все работало
Скорее всего при копировании первую строчку не докопировал, ага так и есть открыл скетч там все в порядке.
исправился, добавил потеряную строчку
Все остальные здесь копипастили, можете по дате размещения проверить
На момент публикации в рунете не было ни одной статьи
Последний раз редактировалось Chip; 01.11.2016 в 19:11.
Проблема в том, что я пытаюсь написать свой код под Ардуино. И не могу понять, как там формируются команды для передачи в SPI для MAX7456. Сейчас перевожу даташит на MAX7456.
У меня задача в том, чтобы не символы выводить, а графическое изображение, изображение я разбил на символы, но надо не только вывести их на экран, а еще и смещать все вместе по команде с ардуино. Никаких переменных, только статическая картинка. Типа гироскопа автомобиля.
Последний раз редактировалось onemamba; 01.11.2016 в 20:54.
Здравствуйте, прошу прокомментировать данный кусочек кода.Не совсем понимаю, как работает.
В первой части вы создаете адреса:
(
void OSD_write_to_screen(const char s[], byte x, byte y, byte blink, byte invert)
),
а во второй отправляете их на MAX:
(
digitalWrite(MAX7456SELECT,LOW);
spi_transfer(DMM_reg);
spi_transfer(settings);
spi_transfer(DMAH_reg);
spi_transfer(char_address_hi);
spi_transfer(DMAL_reg);
spi_transfer(char_address_lo)
) ?
Последний раз редактировалось onemamba; 02.11.2016 в 14:05.
// ================================================== ==========
void OSD_write_to_screen(const char s[], byte x, byte y, byte blink, byte invert){ //создание функции OSD_write_to_screen
// с параметрами(числовая константа "s", байт "x", байт "y",байт "blink", байт "invert")
unsigned int linepos; //создание "linepos" без знаковой переменной
byte local_count; //создание байта "local_count"
byte settings, char_address_hi, char_address_lo; //создание байт "settings, char_address_hi, char_address_lo"
byte screen_char; //создание байта "screen_char"
local_count = 0; // Присвоение байту "local_count" значения "0"
char_address_hi = 0; // Присвоение байту "char_address_hi" значения "0"
char_address_lo = 0; // Присвоение байту "char_address_hi" значения "0"
linepos = y*30+x; // Присвоение байту "linepos" значения выражения "y*30+x" Где берутся значения для "x" и "y"
char_address_hi = linepos >> 8; // Присваивается байту "char_address_hi" значения 2х байтовой переменной "linepos".
// Вот это ">>" означает, что значение не может быть более 8 бит?
char_address_lo = linepos; //Присваивается байту "char_address_lo" значения 2х байтовой переменной "linepos"
// Я понимаю, что ждя MAX надо переслать два байта информации (старший байт и младший байт), видимо они и именуются тут
// "char_address_hi, char_address_lo". Подозреваю, что двухбайтный "linepos" содержит этот адрес из двух байт, но синтаксиса не понимаю.
settings = B00000001; // Присвоение байту "setting" значения в восьмеричной "B00000001" это 1 в десятичной
if (blink) { // если "значение параметра "blink"" - условие? условие чего, наличия параметра?
settings |= (1 << 4); //выполнить байт "setting" не равен выражению "(1 << 4)"
}
if (invert){ // если "значение параметра "invert"" - условие? условие чего, наличия параметра?
settings |= (1 << 3); //выполнить байт "setting" не равен выражению "(1 << 3)"
}
Попытался пошагово прокомментировать, чтобы понять для себя. поправьте, где ошибся пожалуйста.
Я так давно с ним разбирался, уже все забыл
По синтактаксису
Вот это ">>" это побитовый сдвиг вправо на восемь бит
char_address_hi - это старший байт адреса
char_address_lo - это младший байт адреса
settings |= (1 << 4); установить бит 4
settings |= (1 << 3); установить бит 3
Последний раз редактировалось Chip; 02.11.2016 в 15:25.
- спасибо огромное, у меня завис поиск, пока пытался ему пояснить, что я хочу узнать, для чего эти знаки! Это многое объясняет, значит из двух байтовой переменной linepos вытесняется пошагово 8 бит младшего адреса, а его место занимает адрес старшего адреса, который уже укладывается в однобайтовую переменную char_address_hi.
Соответственно во втором выражении ничего не сдвигается и при присвоении linepos к char_address_lo, а т.к. char_address_lo - однобайтовая, то старший байт просто теряется и остается один байт - младший! УРА!!!
settings |= (1 << 4); установить бит 4 - этого пока не понял... зачем это делать, пойду поищу в интернете еще.
Последний раз редактировалось onemamba; 02.11.2016 в 16:06.
Вот тут вторая порция, тоже комментировал, как понял, но не все понял, я понимаю, что задолбал с дилетантскими вопросами, но вдруг кроме меня это еще кому надо, а вы, автор программы, хоть и давней, как говорится от первого лица...
digitalWrite(MAX7456SELECT,LOW); // переводим MAX в режим приема данных
spi_transfer(DMM_reg); // команда отправляющая через интерфейс SPI в MAX7456 данные (DMM_reg это 0x04)
// в начале были задекларированы. почему 0х04? DMM - режим работы памяти. 04H - записываемый регистр из даташита?
spi_transfer(settings);
spi_transfer(DMAH_reg); // команда отправляющая через интерфейс SPI в MAX7456 данные (старший байт) или подготовка MAX
// к приему старшего байта адреса?
spi_transfer(char_address_hi); // команда отправляющая через интерфейс SPI в MAX7456 данные где взять символ (старший байт)
spi_transfer(DMAL_reg); // команда отправляющая через интерфейс SPI в MAX7456 данные (младший байт) или подготовка MAX
// к приему младшего байта адреса?
spi_transfer(char_address_lo); // команда отправляющая через интерфейс SPI в MAX7456 данные где взять символ (младший байт)
while(s[local_count]!='\0') // Запуск цикла с числовой константой "s" пока выражение (s[local_count]!='\0') - истина,
//будет выполнятся. синтаксис не понятен : s[local_count] - числовая константа байта "local_count"?
{
screen_char = s[local_count]; //
if(screen_char != 208 && screen_char != 209) // если байт "screen_char" не равен 208 и не равен 209 то...
//промежуток между 208 и 209 является условием... не понятно
{
spi_transfer(DMDI_reg); // отправить в MAX "DMDI_reg 0x07" вход данных памяти дисплея
spi_transfer(screen_char); // и отправить туда же байт "screen_char"
}
local_count++; // байт "local_count" +1
}
spi_transfer(DMDI_reg); // отправить в MAX "DMDI_reg 0x07" - вход данных памяти дисплея
spi_transfer(END_string); // отправить в MAX "END_string 0xff" - конец строки, это команда SPI ?
spi_transfer(DMM_reg); // отправить в MAX "DMDI_reg 0x07" - вход данных памяти дисплея
spi_transfer(B00000000); // отправить в MAX "B00000000" нуль... для сего его отправлять?
digitalWrite(MAX7456SELECT,HIGH); // конец приема данных.
нет, это команда для MAX7456spi_transfer(END_string); // отправить в MAX "END_string 0xff" - конец строки, это команда SPI ?
Вот это больше всего не понятно, прокомментируйте, если не сложно:
linepos = y*30+x; // Присвоение байту "linepos" значения выражения "y*30+x" Где берутся значения для "x" и "y"
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)