Обсуждаем контроллеры компании Atmel.
Ответить

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

Вт дек 06, 2022 08:15:32

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

Добавлено after 1 minute 49 seconds:
Мне нужно из двухмерного arr залить в CGRAM.
Задача простецкая но шото...

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

Вт дек 06, 2022 08:18:20

(uint8_t (*text)[uint8_t line]) - это что за такой сложный параметр функции? Почему внутри квадратных скобок идет объявление переменной?

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

Вт дек 06, 2022 08:50:28

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

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

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

Добавлено after 1 minute 49 seconds:
Вон там скрин прикрепил...
Вложения
Снимок экрана 2022-12-04 202216.png
(53.79 KiB) Скачиваний: 35

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

Вт дек 06, 2022 09:00:26

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

Ссылка 1 - выполнение
Ссылка 2 - листинг AVR

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

Вт дек 06, 2022 09:22:04

GCC.
Atmel Studio 6.2

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

Вт дек 06, 2022 09:32:33

А зачем тогда некомпилирующийся код на форум тянуть?

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

Вт дек 06, 2022 09:45:19

Дак тут надо книжку "Язык программирования Си" читать вначале. А то че-то где-то прочитал, че-то не так понял, Че-то ошибочно было написано в говностатейке, ну и наваял чего-то вообще дикого.
Двухмерный массив объявляется аналогично одномерному:
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);

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

Вт дек 06, 2022 11:41:20

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

Добавлено 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 не поддерживает кириллицу. Поддерживал бы
вообще было бы всё отлично и я бы сюда и не писал ни разу и не раздражал бы глупыми вопросами. И книжки есть.

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

Вт дек 06, 2022 11:54:56

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

Ну книжечки почитать бы прежде чем спорить...

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

Вт дек 06, 2022 12:11:37

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

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

Добавлено after 3 minutes 1 second:
Всё понял. Там пример есть. Щас подумаю.

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

Вт дек 06, 2022 12:14:04

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 раз.

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

Вт дек 06, 2022 12:17:20

veso74, а двумерный?

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

Вт дек 06, 2022 12:18:27

Не вижу смысла двумерной, просто вычисляйте индекс.
Последний раз редактировалось veso74 Вт дек 06, 2022 12:26:27, всего редактировалось 2 раз(а).

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

Вт дек 06, 2022 12:27:06

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

Добавлено after 3 minutes 54 seconds:
Вопрос к VladislavS.
Извините. Я так понял с помощью той функции я смогу выводить слово до 8-ми символов?
Для другого слова мне нужно будет в такую же фу-ю передать массив с другим словом?
Я правильно понимаю?

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

Вт дек 06, 2022 13:14:18

Я не понимаю вопрос. В функцию передаётся адрес начала массива и два его размера. Внутри функции из индексов i, j вычисляется откуда из памяти брать байт.

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

Вт дек 06, 2022 19:16:31

Насколько помню, я на практике практически и не использовал 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

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

Вт дек 06, 2022 19:28:39

Спасибо за помощь Vladislav!
С помощью ваших примеров получилось записать в CGRAM.
Я проверял. В LCDdata(....); передавал адреса ячеек от 0х00-0х5 и буквы выводились правильно.
Теперь надо как-то их в строку придумать как вывести и всё. То стандартная фу-я не катит.

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

Вт дек 06, 2022 19:38:15

И стандартная фукнция прокатит, если в нее передавать не ANSI-строку, а просто числа от 0 до 8. Или закодировать в формате ANSI как показал выше.

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

Вт дек 06, 2022 19:59:02

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


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

Добавлено after 4 minutes 8 seconds:
Сейчас попробую заодить...

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

Вт дек 06, 2022 19:59:27

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