Помогите с кодом на си для AVR (Atmega8)

Обсуждаем контроллеры компании Atmel.
Ответить
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вс мар 27, 2022 09:38:17

Сообщение aleksey chilov »

Нет. Не работает.
Пишет вот это:
Error 1 expected expression before 'uint8_t'
Warning 2 unused variable 'mss' [-Wunused-variable]

Добавлено after 1 minute 49 seconds:
Мне нужно из двухмерного arr залить в CGRAM.
Задача простецкая но шото...
Реклама
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

(uint8_t (*text)[uint8_t line]) - это что за такой сложный параметр функции? Почему внутри квадратных скобок идет объявление переменной?
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вс мар 27, 2022 09:38:17

Сообщение aleksey chilov »

А это указывает на двумерный массив. В статье одной прочёл. А что так не бывает? Яб скрин прикрепил но нельзя.
Ну там было так:

МНОГОМЕРНЫЕ МАССИВЫ ИМЕЮТ ОБЪЯВЛЕНИЯ ВИДА int (*arr)[],
а одномерные массивы int *arr[].

Вот как-то так...

Добавлено after 1 minute 49 seconds:
Вон там скрин прикрепил...
Вложения
Снимок экрана 2022-12-04 202216.png
(53.79 КБ) 63 скачивания
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

aleksey chilov, у вас компилятора нет что-ли что?

Ссылка 1 - выполнение
Ссылка 2 - листинг AVR
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вс мар 27, 2022 09:38:17

Сообщение aleksey chilov »

GCC.
Atmel Studio 6.2
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

А зачем тогда некомпилирующийся код на форум тянуть?
Реклама
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

Дак тут надо книжку "Язык программирования Си" читать вначале. А то че-то где-то прочитал, че-то не так понял, Че-то ошибочно было написано в говностатейке, ну и наваял чего-то вообще дикого.
Двухмерный массив объявляется аналогично одномерному:
int array[2] [4] ,

Код: Выделить всё

void Foo(int array[2][4])
{
	array[0][0] = 5;
	int a = array[1][2];
}

int main()
{
	int array[2][4];
	Foo(array);
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вс мар 27, 2022 09:38:17

Сообщение aleksey chilov »

Ну объявляется и так понятно как он объявляется. А я хочу указать на него,а не предавать его в аргумент как массиив.

Добавлено after 3 minutes 22 seconds:
В параметрах должен быть указатель на массив а не сам массив. Его адрес. Чтоб потом пойти по этому адресу и забрать
оттуда то что там лежит. И сохранить в регистр экранчика. А потом вытащить на экран то что в регистре CGRAM ( русские
слова ).

Добавлено after 54 seconds:
8 байт. Ну или 7 с нулём.

Добавлено after 2 minutes 1 second:
Массив и так объявлен вначале как
static uint8_t text[6][8]={...........};
Там хранятся кириллеские символы.

Добавлено after 6 minutes 22 seconds:
У меня задача простая просто выводить короткие слова такие как "ЦИКЛ","МЕНЮ", "ВЛЕВО","ВПРАВО" и т.д.
С латиницей всё шло отлично. И менюшка получилась неплохая всё работает включает выключает сохраняет но вот
оформление ужас! Латиница всё сливает в сартир! А оказалось что LCD не поддерживает кириллицу. Поддерживал бы
вообще было бы всё отлично и я бы сюда и не писал ни разу и не раздражал бы глупыми вопросами. И книжки есть.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Во-первых, ссылки из моего сообщения открывали?
В-третьих, в примере MLX90640 передаётся как раз адрес массива.

Ну книжечки почитать бы прежде чем спорить...
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вс мар 27, 2022 09:38:17

Сообщение aleksey chilov »

Нет ещё.
Сейчас открою изучу...

Добавлено after 4 minutes 12 seconds:
А чё это?
Онлайн кампилятор?

Добавлено after 3 minutes 1 second:
Всё понял. Там пример есть. Щас подумаю.
Поставщик валерьянки для Кота
Сообщения: 1944
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

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

Код: Выделить всё

uint8_t msg[9] = {6, 9, 3, 7, 10, 5, 3, 10, 11};  // 14.250.56
oled_print_w(msg);
...
void oled_print_w(uint8_t *buffer) {
...
  for (uint8_t i = 0; i < 9; i++)
    oled_print_b(buffer[i]);
...
}
Последний раз редактировалось veso74 Вт дек 06, 2022 12:17:22, всего редактировалось 1 раз.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

veso74, а двумерный?
Поставщик валерьянки для Кота
Сообщения: 1944
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

Не вижу смысла двумерной, просто вычисляйте индекс.
Последний раз редактировалось veso74 Вт дек 06, 2022 12:26:27, всего редактировалось 2 раза.
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вс мар 27, 2022 09:38:17

Сообщение aleksey chilov »

Ну двумерный вроде как понятнее...

Добавлено after 3 minutes 54 seconds:
Вопрос к VladislavS.
Извините. Я так понял с помощью той функции я смогу выводить слово до 8-ми символов?
Для другого слова мне нужно будет в такую же фу-ю передать массив с другим словом?
Я правильно понимаю?
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Я не понимаю вопрос. В функцию передаётся адрес начала массива и два его размера. Внутри функции из индексов i, j вычисляется откуда из памяти брать байт.
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

Насколько помню, я на практике практически и не использовал CGRAM дисплея. По крайней мере, не нашел в своих архивах. Поэтому пришлось дописать такую функцию:

Код: Выделить всё

#define CGRAM_ADDR		0x40		/// команда установки адреса CGRAM

void HD44780_WriteCGRAM(uint8_t cgaddr, uint8_t *buf)
{
	WAIT();
	HD44780_IO_Write(CGRAM_ADDR | (cgaddr << 3), HD44780_CMDMODE);

	for(uint8_t line = 0; line < 8; line++)
	{
		WAIT();
		HD44780_IO_Write(*buf, HD44780_DATAMODE);
		buf++;
	}
}
, где HD44780_IO_Write(*buf, HD44780_DATAMODE); - это функция посылки байта в дисплей при ножке RS = 1
параметр в функции uint8_t *buf - это простой указатель на какой-то массив, без разницы какой размерности или с какого места. Просто указатель на какой-то байт, от которого затем в цикле отсчитывается 7 байт вперед.

А если есть изначально двухмерный массив

Код: Выделить всё

uint8_t chArray[2][8] = {{0x08, 0x0C,  0x1E, 0x1F, 0x1E, 0x0C, 0x08, 0x00},
							 {0x02, 0x06, 0x0F, 0x1F, 0x0F, 0x06, 0x02, 0x00}};
, содержащий нарисованные символы (сейчас их два), то передача одной и второй строки этого массива в функцию выглядит вот так:

Код: Выделить всё

	HD44780_WriteCGRAM(0x00, &chArray[0][0]);   // первая строка в первую ячейку CGRAM
	HD44780_WriteCGRAM(0x01, &chArray[1][0]);   // вторая строка во вторую ячейку CGRAM
, где показано, что в функцию HD44780_WriteCGRAM передается адрес элемента chArray[0][0] (с начала первой строчки), а затем адрес элемента chArray[1][0] (с начала второй строчки). То есть, основа в том, что значок & является командой взятия адреса, в данном случае адреса элемента массива с индексом [0][0] или [1][0],
Эти базовые основы языка Си надо знать обязательно, прежде чем чето мутить дальше. Поэтому я настоятельно рекомендую прочитать книжку Ритчи "Язык программирования Си", потренироваться на простых примерах безотносительно чего либо, и лишь только потом переходить к экранчикам и прочей лабудени.

После этого, чтобы вывести содержимое этих двух ячеек, нужно сделать вот так:

Код: Выделить всё

HD44780_Print(0, 0, "\00\01\00\01", 4, 0);
,
где "\00\01\00\01" - это ANSI-строчка, обозначающая 0x00, 0x01, 0x00, 0x01

PS. Если хочется загрузить в CGRAM сразу 8 ячеек, тогда можно либо передать просто имя массива chArray без индексов и значка &, как показывал выше, либо передать адрес &chArray[0][0] начала массива и в функции дальше просто сделать 8 раз показанный цикл for
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вс мар 27, 2022 09:38:17

Сообщение aleksey chilov »

Спасибо за помощь Vladislav!
С помощью ваших примеров получилось записать в CGRAM.
Я проверял. В LCDdata(....); передавал адреса ячеек от 0х00-0х5 и буквы выводились правильно.
Теперь надо как-то их в строку придумать как вывести и всё. То стандартная фу-я не катит.
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

И стандартная фукнция прокатит, если в нее передавать не ANSI-строку, а просто числа от 0 до 8. Или закодировать в формате ANSI как показал выше.
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вс мар 27, 2022 09:38:17

Сообщение aleksey chilov »

Моя фу-я такая.
Вернее она не моя она тут была.
Я её не писал кто-то писал но не суть.
Я ей предавал числа а он ругается на большое кол-во аргументов...


void LCDstring(char *i,uint8_t x,uint8_t y) //Вывести строку на дисплей.
{
LCDGotoXY(x,y);
while( *i )
{
LCDdata(*i++ );
}
}

Добавлено after 4 minutes 8 seconds:
Сейчас попробую заодить...
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

Ругается на большое число аргументов? Нууу, печалька, чож поделать. Видимо, не судьба. (объясните кто-нить этому гражданину, что число передаваемых в функцию аргументов должно быть чотенько равно числу принимаемых функцией аргументов)
Ответить

Вернуться в «AVR»