Demonrostov

Members
  • Публикации

    68
  • Зарегистрирован

  • Посещение

Репутация

1 Обычный

О Demonrostov

  • Звание
    Осваивающийся

Информация

  • Город
    Ростов-на-Дону

Электроника

  • Стаж в электронике
    Более 20 лет

Посетители профиля

347 просмотров профиля
  1. Вопросы От Начинающих По Мк

    Спасибо, значит и я не буду тратить свои драгоценные тики на это )))
  2. Вопросы От Начинающих По Мк

    Имеется W25Q64 . По даташиту она может работать в режиме QUAD SPI, т.е. за один такт выдает 4 бита,. Вопрос собственно вот в чем. В Atmege 328 один SPI. Если реализовать программный режим QUAD SPI выиграю я в скорости чтения по сравнению c аппаратной реализацией обычного SPI?
  3. Вопросы От Начинающих По Мк

    последний вариант с "сonst uint8_t* const* tmp; tmp = &Font_16_array[0];" проверил в железе все корректно работает, код уменьшился. Поменял в обоих функциях. Но осадочек остался)) "assignment discards 'const' qualifier from pointer target type [enabled by default] " Наверняка же есть правильная запись для данного решения. Виноват, это ошибка была с uint8_t** tmp; не доглядел. сonst uint8_t* const* tmp; tmp = &Font_16_array[0]; рабочий вариант ! Спасибо всем за помощь! Буду дальше прокачивать скил))) А можете пояснить как трактовать эту запись с позиции компилятора? Пытаюсь осознать язык а не просто копировать.... Где то на просторах находил очень доходчивое разъяснение такому: " uint16_t i; (uint8_t*)i- компилятор, значение i -адрес восмибитного значения. Используй значение i в выражении как адрес" типа как то так).
  4. Вопросы От Начинающих По Мк

    последний вариант с "сonst uint8_t* const* tmp; tmp = &Font_16_array[0];" проверил в железе все корректно работает, код уменьшился. Поменял в обоих функциях. Но осадочек остался)) "assignment discards 'const' qualifier from pointer target type [enabled by default] " Наверняка же есть правильная запись для данного решения.
  5. Вопросы От Начинающих По Мк

    я в курсе. написал вам варнинг но вы наверно не поверили я прислал скрин. Таким образом вы предлагаете забить на варнинг?
  6. Вопросы От Начинающих По Мк

    Warning 1 assignment discards 'const' qualifier from pointer target type [enabled by default] Еще есть варианты
  7. Вопросы От Начинающих По Мк

    Warning 1 assignment from incompatible pointer type [enabled by default]
  8. Вопросы От Начинающих По Мк

    Error 1 assignment of read-only variable 'tmp'
  9. Вопросы От Начинающих По Мк

    В AVRStudio 6 не канает( Ну так и не сказали как это реализовать и нужно ли вообще.
  10. Вопросы От Начинающих По Мк

    В String я читаю ширину и определяю положение символа чтобы влезло в поле экрана, Print_char вывод самого символа. В массиве символа первый байт его ширина, дальше данные самого символа. Шрифт с переменной шириной.
  11. Вопросы От Начинающих По Мк

    Все сделано вот так. Как по мне так даже универсально, любой шрифт с высотой кратной 8 пикселям выводит. void TFT_String(uint16_t x, uint16_t y, uint16_t color, uint16_t fon,char *str, uint8_t size) { uint16_t h=size*8; uint8_t Width=0; while (*str) { switch(size) { case 1: return; case 2: if((uint8_t)*str>=192){ Width=pgm_read_byte(pgm_read_word(&Font_16_array[(uint8_t)*str-97]));} else { Width=pgm_read_byte(pgm_read_word(&Font_16_array[(uint8_t)*str-32]));} break; case 4: if((uint8_t)*str>=192){ Width=pgm_read_byte(pgm_read_word(&Font_32_var[(uint8_t)*str-97]));} else { Width=pgm_read_byte(pgm_read_word(&Font_32_var[(uint8_t)*str-32]));} break; } if ((x+Width)>X_SIZE)//следим за окончанием строки { x = 0; y = y + h; } RM68140_Print_char(x,y,color,fon,*str,size,Width); x += Width; str++; } } void RM68140_Print_char (uint16_t x,uint16_t y, uint16_t color, uint16_t fon, uint8_t charcode,uint8_t size,uint8_t Width) { uint8_t n,n1,n2,n3; Address_set(x,y,Width+x-1,y+size*8-1); for ( n=0; n<size;n++) { n3=n*Width; for( n1=0;n1<Width;n1++) { switch(size) { case 1:return; case 2:if(charcode>=192){ mass[n1][n]=pgm_read_byte(pgm_read_word(&Font_16_array[charcode-97])+1+n1+n3);} else { mass[n1][n]=pgm_read_byte(pgm_read_word(&Font_16_array[charcode-32])+1+n1+n3);}break; case 4:if(charcode>=192){ mass[n1][n]=pgm_read_byte(pgm_read_word(&Font_32_var[charcode-97])+1+n1+n3);} else { mass[n1][n]=pgm_read_byte(pgm_read_word(&Font_32_var[charcode-32])+1+n1+n3);}break; } } } CS_LOW; Lcd_Write_Com(Memory_Write); for ( n2=0;n2<size;n2++) { for ( n=0;n<8;n++) { for( n1=0;n1<Width;n1++) { if ((mass[n1][n2]<<n)&0b10000000) { Lcd_Write_Data(color >> 8); Lcd_Write_Data(color & 0xFF); } else { Lcd_Write_Data(fon >> 8); Lcd_Write_Data(fon & 0xFF); } } } } CS_HIGH; } Создаем неизменяемый массив и пытаемся в него записать? правильно я понимаю....?
  12. Вопросы От Начинающих По Мк

    компилятор ругается. Ну, так вроде и происходит. В этой функции я читаю первый байт массива символа по нему определяю ширину символа, высота у меня задается размером size. Далее в следующей функции вывожу весь массив символа. Вопрос возник из за повторяющегося кода сравнения в цикле switch. Вот и подумал а не компактней ли получится если одно и тоже условие вынести за скобки, но моего уровня прокачки не хватило. Шрифтом может быть много, тогда и условие будет повторяться много раз. Если от этого код не уменьшиться тогда и смысла в принципе нет.
  13. Вопросы От Начинающих По Мк

    Все верно. Я думал чтобы ни писать одно и тоже условие выбора написать его один раз а в цикле switch просто определять переменную в соответствии с выбранным массивом, что и написал ниже. Но вот никак не получается присвоить переменной правильный адрес массива. extern const uint8_t* const Font_16_array[]PROGMEM; extern const uint8_t* const Font_32_var []PROGMEM; void TFT_String(uint16_t x, uint16_t y, uint16_t color, uint16_t fon,char *str, uint8_t size) { uint16_t h=size*8; uint8_t Width=0; определяем переменную adress while (*str) { switch(size) { case 1: return; case 2: adress= /* здесь выбрать массив указателей Font_16_array*/ break; case 4: adress =/* здесь выбрать массив указателей Font_32_var*/ break; } if((uint8_t)*str>=192){ Width=pgm_read_byte(pgm_read_word( adress/* здесь подставить выбранный массив*/[(uint8_t)*str-97]));} else { Width=pgm_read_byte(pgm_read_word(adress/* здесь подставить выбранный массив*/[(uint8_t)*str-32]));} if ((x+Width)>X_SIZE)//следим за окончанием строки { x = 0; y = y + h; } RM68140_Print_char(x,y,color,fon,*str,size,Width); x += Width; str++; } } Ну как то так.
  14. Вопросы От Начинающих По Мк

    Есть функция вывода текста: extern const uint8_t* const Font_16_array[]PROGMEM; extern const uint8_t* const Font_32_var []PROGMEM; void TFT_String(uint16_t x, uint16_t y, uint16_t color, uint16_t fon,char *str, uint8_t size) { uint16_t h=size*8; uint8_t Width=0; while (*str) { switch(size) { case 1: return; case 2: if((uint8_t)*str>=192){ Width=pgm_read_byte(pgm_read_word(&Font_16_array[(uint8_t)*str-97]));} else { Width=pgm_read_byte(pgm_read_word(&Font_16_array[(uint8_t)*str-32]));} break; case 4: if((uint8_t)*str>=192){ Width=pgm_read_byte(pgm_read_word(&Font_32_var[(uint8_t)*str-97]));} else { Width=pgm_read_byte(pgm_read_word(&Font_32_var[(uint8_t)*str-32]));} break; } if ((x+Width)>X_SIZE)//следим за окончанием строки { x = 0; y = y + h; } RM68140_Print_char(x,y,color,fon,*str,size,Width); x += Width; str++; } } Для вывода разного шрифта приходиться писать одно и тоже условие в цикле switch. Как сделать, чтобы функцию привести к такому виду: extern const uint8_t* const Font_16_array[]PROGMEM; extern const uint8_t* const Font_32_var []PROGMEM; void TFT_String(uint16_t x, uint16_t y, uint16_t color, uint16_t fon,char *str, uint8_t size) { uint16_t h=size*8; uint8_t Width=0; while (*str) { switch(size) { case 1: return; case 2: /* здесь выбрать массив указателей Font_16_array*/ break; case 4: /* здесь выбрать массив указателей Font_32_var*/ break; } if((uint8_t)*str>=192){ Width=pgm_read_byte(pgm_read_word(/* здесь подставить выбранный массив*/[(uint8_t)*str-97]));} else { Width=pgm_read_byte(pgm_read_word(/* здесь подставить выбранный массив*/[(uint8_t)*str-32]));} if ((x+Width)>X_SIZE)//следим за окончанием строки { x = 0; y = y + h; } RM68140_Print_char(x,y,color,fon,*str,size,Width); x += Width; str++; } }