Отговори на тема  [ 35 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща
Управление на LCD контролер по SPI. 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 28023
Местоположение: София
Мнение Re: Управление на LCD контролер по SPI.
aaa .. искаш да обърнеш редърт на идианците или аз не разбирам, защото примера който си дал не е това .. аха ... и да ги разделиш, ако е това :

0b01110001
първо медиш индианците
0b10001110
после го делиш на две
0b10000000
0b11100000

Ако е това напиши си цикъл който да ти обърне индианцире, дирекнто побитово работиш, след което ... абе що си губя времето така :)

char reorder(char input)
{
char i,temp;
temp=0;
for(i=0;i<7;i++)
{
if(input&0x01) temp|=0x01;
input>>1;
temp<<1;
}
return(temp);
}

и след това
а=temp&0xF0;
b=(temp&0x0F)<<4;

Но разбира се това може да стане още във функцията за обръщане, като първите 4 пъти въртиш и пълниш А. Вторите 4 пъти въртиш и пълниш В, и след това ги шифтваш по още 4 пъти на ляво и двете.

p.s. това горното на asmbeler става още по лесно като изпозлваш кери бита, не знам можеш ли да убедиш С-то да го компилира по същият начин, би трябвлао да можеш ама ....


Сря Апр 05, 2017 11:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 11:02 am
Мнения: 3070
Местоположение: София
Мнение Re: Управление на LCD контролер по SPI.
lcr написа:
michev написа:
Гледам и се чудя - питащият ли пита грешно или отговарящият отговаря грешно. Ако обаче това е решило проблема, заначи питащият е питал грешно :)


Нямам възможността да го тествам сега. Ще сторя това утре и ще докладвам за резултата.


Възможно е да съм формулирал въпроса си неясно.

С други думи - искам да представя 1 байт, като го разделя на 2 отделни и запиша в тях само най-старшите им 4 бита (младшите 4 са нули).

Освен това битовете от оригиналния байт трябва да се обърнат и по старшинство, преди да бъдат записани.

Например:

0b11101100

трябва да се преобразува така че да придобие вида:

0b00110000

и

0b01110000


Възможно е да не съм разбрал въпроса първия път. Това което описваш в тоя си пост отговаря на:

Код:
uint8 number=0b11101100;
uint8 a, b;

a = (number >> 4 ) | (number << 4); //разменя местата на всеки 2 съседни четворки бита, сега в а имаме 0b11001110;
a = (a & 0xCC) >> 2 | (a & 0x33) << 2; //разменя местата на всеки 2 съседни двойки бита, сега в а имаме 0b00111011;
a = (a & 0xAA) >> 1 | (a & 0x55) << 1; //разменя местата на всеки 2 съседни бита, сега в a имаме 0b00110111;
b = (a & 0x0F) << 4 //в b отиват долните 4 бита, качени в горните 4, или в b имаме 0b01110000
a &= 0xF0; //изчистване на долните 4 бита, така че да останат само горните, или в a имаме 0b00110000;


ПП: Можбе и малко да се оптимизира:
Код:
uint8 number=0b11101100;
uint8 a, b;
а=number;
a = (a & 0xCC) >> 2 | (a & 0x33) << 2; //разменя местата на всеки 2 съседни двойки бита, сега в а имаме 0b10110011;
a = (a & 0xAA) >> 1 | (a & 0x55) << 1; //разменя местата на всеки 2 съседни бита, сега в a имаме 0b01110011;
b = a & 0xF0; //в b отиват горните 4 бита, тоест в b имаме 0b01110000
a <<= 4; //в а остават долните 4 бита, вдигнати горе, тоест  0b00110000;


А каква е целта на мероприятието? Последно като си играх с такова беше май в някакво Фурие, сигурно преди 20 години.

Ако можеш да си го позволиш, най-лесно и бързо става ако си дефинираш таблица с 256 обърнати стойности която направо да четеш.


Чет Апр 06, 2017 12:12 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 10:49 pm
Мнения: 4379
Местоположение: София
Мнение Re: Управление на LCD контролер по SPI.
Благодаря на всички за предложените варианти и особено на @sparkybg за коментарите в кода :)

Ще проиграя всеки един от тях при първа възможност.

Упражнението се налага заради комуникацията с дискутирания в темата контролер.


Чет Апр 06, 2017 10:22 am
Профил
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Съб Май 21, 2016 8:47 pm
Мнения: 476
Местоположение: Бургас
Мнение Re: Управление на LCD контролер по SPI.
Може да си направиш и софтуерен SPI за дисплея- няма да има нужда да дундуркаш битове- предаваш колкото ти е нужно, запълваш с контролните битове и после продължаваш да предаваш втората част (т.е. предаваш винаги състоянието най-младшия бит, след което байта го завърташ надясно). За 24 бита може даже и без цикъл да се мине.


Чет Апр 06, 2017 11:26 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 11:02 am
Мнения: 3070
Местоположение: София
Мнение Re: Управление на LCD контролер по SPI.
lcr написа:
Упражнението се налага заради комуникацията с дискутирания в темата контролер.


Опциите ти са 2
- правиш горното във функция и я викаш само да ти обърне битовете, после ги мяташ към SPI-то.
- правиш си прекодираща таблица в която на всяка позиция стои стойността с обърнати битове
- правиш си прекодираща таблица в която ня всяка позиция стои uint16 директно с двата байта, дето трябва да пратиш към SPI-то.

От първото към последното иска все повече памет, но върви все по-бързо. Ако използваш някой дребен 8-битник може и да нямаш много избор кое от трите да избереш.

Може и таблица с 16 стойности с обърнатите и вдигнати битове само за 4 битови стойности, после правиш:
Код:
SPIWrite(table(a>>4));  //SPIWrite e примерно име на функция, която ти праща байт към SPI-то.
SPIWrite(table[a&0x0F]);


Това последното май е най-добрия вариант,

...въпреки това точно с това LCD си е клизма. Предполагам е архаично, за да не може да поеме цял байт, както и с тая подредба на битовете.


Чет Апр 06, 2017 12:28 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 10:49 pm
Мнения: 4379
Местоположение: София
Мнение Re: Управление на LCD контролер по SPI.
Че дисплеят е дървен, спор няма :) Подритвам няколко бракувани телефона optipoint 500 и барем дисплеите им могат да свършат работа за нещо.


Чет Апр 06, 2017 12:54 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 10:49 pm
Мнения: 4379
Местоположение: София
Мнение Re: Управление на LCD контролер по SPI.
sparkybg написа:

Опциите ти са 2
- правиш горното във функция и я викаш само да ти обърне битовете, после ги мяташ към SPI-то.
- правиш си прекодираща таблица в която на всяка позиция стои стойността с обърнати битове
- правиш си прекодираща таблица в която ня всяка позиция стои uint16 директно с двата байта, дето трябва да пратиш към SPI-то.

От първото към последното иска все повече памет, но върви все по-бързо. Ако използваш някой дребен 8-битник може и да нямаш много избор кое от трите да избереш.

Може и таблица с 16 стойности с обърнатите и вдигнати битове само за 4 битови стойности, после правиш:
Код:
SPIWrite(table(a>>4));  //SPIWrite e примерно име на функция, която ти праща байт към SPI-то.
SPIWrite(table[a&0x0F]);


Това последното май е най-добрия вариант,

...въпреки това точно с това LCD си е клизма. Предполагам е архаично, за да не може да поеме цял байт, както и с тая подредба на битовете.


Схванах идеята в последния вариант, който предлагаш и я намирам за доста добра.

Създадох следната таблица:

Код:
const uint8_t a[16] = {
           
            0b00000000, //0
            0b10000000, //1
            0b01000000, //2
            0b11000000, //3
            0b00100000, //4
            0b10100000, //5
            0b01100000, //6
            0b11100000, //7
            0b00010000, //8
            0b10010000, //9
            0b01010000, //10
            0b11010000, //11
            0b00110000, //12
            0b10110000, //13
            0b01110000, //14
            0b11110000, //15
           
            };
   


тествах засега само това, първият байт да се образува от таблицата (вторият го оставих на постоянна стойност):

Код:
SPI_Exchange8bit(a[1]);
SPI_Exchange8bit(0b00100000);


...и пущината работи :)

Натам, мисля, че ще се справя.

Като ги натъкмя съвсем нещата, ще постна кода за рецензия :)

Много ти благодаря за съдействието!


Чет Апр 06, 2017 5:31 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 28023
Местоположение: София
Мнение Re: Управление на LCD контролер по SPI.
Да таблица е най-бързо, естествено, голяма е зор и много памет, виж за 4 битова не ми хрумна но си е много добра опция.


Чет Апр 06, 2017 6:01 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 10:49 pm
Мнения: 4379
Местоположение: София
Мнение Re: Управление на LCD контролер по SPI.
Окончателно:

Код:
c = ... ; //ASCII кода на символа
l = c & 0x0F; //младшите 4 бита
h = (c & 0xF0) >>4; //старшите 4 бита

SPI_Exchange8bit(a[l]);
SPI_Exchange8bit(a[h]);


:)


Пет Апр 07, 2017 11:51 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 11:02 am
Мнения: 3070
Местоположение: София
Мнение Re: Управление на LCD контролер по SPI.
lcr написа:
Окончателно:

Код:
c = ... ; //ASCII кода на символа
l = c & 0x0F; //младшите 4 бита
h = (c & 0xF0) >>4; //старшите 4 бита

SPI_Exchange8bit(a[l]);
SPI_Exchange8bit(a[h]);


:)


А съвсем окончателно:
Код:
c = ... ; //ASCII кода на символа
SPI_Exchange8bit(a[c & 0x0F]);
SPI_EXchenge8bit(a[c >> 4]);


2 променливи и един оператор по-малко.

Само не вдявам какво прави SPI_Exchange8bit, при положение че и подаваш вече обърнатите стойности от таблица "а".


Пет Апр 07, 2017 12:01 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 10:49 pm
Мнения: 4379
Местоположение: София
Мнение Re: Управление на LCD контролер по SPI.
sparkybg написа:

А съвсем окончателно:
Код:
c = ... ; //ASCII кода на символа
SPI_Exchange8bit(a[c & 0x0F]);
SPI_EXchenge8bit(a[c >> 4]);


2 променливи и един оператор по-малко.

Само не вдявам какво прави SPI_Exchange8bit, при положение че и подаваш вече обърнатите стойности от таблица "а".


Благодаря! :)

Относно SPI_Exchange8bit, може и аз да съм подходил грешно, но доколкото разбрах от дейташита на контролера (стр. 50)

"(1) Write Operation (R/W = 0)
After start byte is transferred from MPU to S6A0073, 8-bit data is transferred which is divided into 2 bytes, each
byte has 4 bit's real data and 4 bit's partition token data. For example, if real data is "10110001" (D0 - D7), then
serially transferred data becomes "1011 0000 0001 0000" where 2nd and 4th 4 bits must be "0000" for safe
transfer.....
"

трябва да му се предаде на 2 пъти.

А това е, което ми е генерирал MCC (в spi.c):

Код:
uint8_t SPI_Exchange8bit(uint8_t data)
{
    // Clear the Write Collision flag, to allow writing
    SSP1CON1bits.WCOL = 0;

    SSPBUF = data;

    while(SSP1STATbits.BF == SPI_RX_IN_PROGRESS)
    {
    }

    return (SSPBUF);
}

uint8_t SPI_Exchange8bitBuffer(uint8_t *dataIn, uint8_t bufLen, uint8_t *dataOut)
{
    uint8_t bytesWritten = 0;

    if(bufLen != 0)
    {
        if(dataIn != NULL)
        {
            while(bytesWritten < bufLen)
            {
                if(dataOut == NULL)
                {
                    SPI_Exchange8bit(dataIn[bytesWritten]);
                }
                else
                {
                    dataOut[bytesWritten] = SPI_Exchange8bit(dataIn[bytesWritten]);
                }

                bytesWritten++;
            }
        }
        else
        {
            if(dataOut != NULL)
            {
                while(bytesWritten < bufLen )
                {
                    dataOut[bytesWritten] = SPI_Exchange8bit(DUMMY_DATA);

                    bytesWritten++;
                }
            }
        }
    }

    return bytesWritten;
}

bool SPI_IsBufferFull(void)
{
    return (SSP1STATbits.BF);
}

bool SPI_HasWriteCollisionOccured(void)
{
    return (SSP1CON1bits.WCOL);
}

void SPI_ClearWriteCollisionStatus(void)
{
    SSP1CON1bits.WCOL = 0;
}


Пет Апр 07, 2017 1:13 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 11:02 am
Мнения: 3070
Местоположение: София
Мнение Re: Управление на LCD контролер по SPI.
Ясно. SPI_Exchange8bit 'лъзга един байт по SPI-то и чете отговора. Демек откъм твоя код всичко е както трябва. Аз реших че самата функция SPI_Exchange8bit вътрешно си обръща битовете пак. :)


Пет Апр 07, 2017 2:22 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 10:49 pm
Мнения: 4379
Местоположение: София
Мнение Re: Управление на LCD контролер по SPI.
Пуснах един цикъл да върти цялата ASCII таблица да видя всички символи. Добрата новина е, че визуализира и символите от кирилицата. Е - няма ги малките букви на кирилица, но то няма и пълно щастие :)


Пет Апр 07, 2017 2:29 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4723
Мнение Re: Управление на LCD контролер по SPI.
За пълно щастие май ще ти трябва и прекодираща таблица за кирилицата, щото в повечето подобни дисплеи таблицата с буквите не е Windows-1251

_________________
main[-1u]={1};


Пет Апр 07, 2017 5:34 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4723
Мнение Re: Управление на LCD контролер по SPI.
Един подобен(OLED) подкарвах наскоро
https://store.comet.bg/Catalogue/Product/45111/


Прикачени файлове:
20170322_153753.jpg
20170322_153753.jpg [ 483.84 KiB | Прегледано 2131 пъти ]

_________________
main[-1u]={1};
Пет Апр 07, 2017 5:40 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 35 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 6 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни