Перейти к содержанию
    

SED1335,PIC18F4550 и LCD320x240

Попытки записи массива типа

 

const byte mS_uS[] = {

0,0,0,0,0,

0,7,128,1,224,

0,8,64,2,16,

61,200,1,10,0,

34,40,1,10,0,

34,39,129,9,224,

34,32,65,8,16,

34,32,65,8,16,

34,40,65,26,16,

34,39,129,233,224,

0,0,1,0,0,

0,0,1,0,0,

};

 

не увенчались успехом

 

Написал процедуру

 

void EEPROM_WRITE(long int address)

{unsigned int16 i;

 

for (i=0;i<60;i++)

{

write_ext_eeprom(address, mS_uS);

}break;

}//--------------------------

 

во-первых пишет целых 5 минут

во-вторых нифига не читает с помошью процедуры

 

long int EEPROM_READ(long int addr)

{long int dat;

 

for (addr=0;addr<990;addr++)

{

dat = read_ext_eeprom(addr);

}return dat;

}//--------------------------

//#####################################################################

void Grid_UpXXX(unsigned int16 y1,unsigned int16 y2,unsigned char setka )//

{unsigned int16 addr, x,y,i;i=0;

for (y = y1; y < y2; y++)

{

for (x = 0; x < 264;x=x+8)

{

addr = 40 * y + x/8 ;//расчитать байт адреса, содержащего пиксель

if( setka==1 ) bild( addr,EEPROM_READ(0));// крупная сетка

else bild( addr,EEPROM_READ(1));// мелкая сетка

 

}

}

}//--------

Подскажите где я напортачил :help:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ещё одно фото для истории.

двухканальный вариант,построенный на ADS831 и FIFO IDT7201 .Всем этим хозяйством управляет PLCD XILINX XC9572.

Cинус , частота- 20 кГц.Каждый канал имеет свой переключатель развёртки.Почему-то рисует половинкой

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

проблема рисования синусоиды половинками решена добавлением резистора 47к на неинвертирующий вход входного ОУ.Осталось добиться устойчивой синхронизации и максимально возможной частоты сигнала.

 

Первая попытка наблюдения видеосигнала с камеры(сверху)

и одновременный синус 20 кГц(снизу)

Ну хоть кто-нибудь порадуется вместе со мной :beer:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ура !!! Удалось засинхронизироать картинку :a14:

//#####################################################################

void pix_A(unsigned int8 y_pos_A,unsigned int8 offset)// рисуем кривую, типа синусоиды и пр.

{unsigned int8 x, y , yy ;//

unsigned int16 xx;

y = y_pos_A;

Output_bit(PLCD_FIFO_RES ,0);//PIN_C0// сброс FIFO в "0"

Output_bit(PLCD_FIFO_RES ,1);//PIN_C0// и разрешение на считывание

Output_bit(READ_FIFO_B ,1); //PIN_C1 запрет канала B

 

do{ // слабая попытка синхронизации

Output_bit(READ_FIFO_A ,0);//PIN_C2

adcA=input_b();

Output_bit(READ_FIFO_A ,1);//PIN_C2

}while(input_b()== adcA );//уже лучше,но всё равно плохо

//--------------- предварительная запись в буфер ---------------------

for(xx=0;xx<512;xx++){// канал A

Output_bit(READ_FIFO_A ,0);//PIN_C2. разрешить

adcA=input_b();

adcA = (adcA > offset) ? offset : adcA;//ограничитель до 115

adcA = 255 - adcA;

Buff_[xx] = adcA;//записываемся в буфер 512 раз

Output_bit(READ_FIFO_A ,1);//PIN_C2.запретить

} xx=0;

for(;;) {//синхронизация буфера по фронту или по спаду

if( Buff_[xx++] <= 175) break; //по фронту

// if( Buff_[xx++] >= 175) break; //по спаду

}

sbros(adcA);

wert_A(adcA);

if( xx >= 255 ) xx = xx - 255; //приводим к int8

//--------------- собственно кривая ---------------------------

for(x=1;x<255;x++){

yy = y;

y = Buff_[xx++] + y_pos_A;

if (yy>y) front(x,yy,y); // Рисуем фронт A

if (yy<y) spad(x,yy,y); // Рисуем спад A

adcA=y-y_pos_A;

pixel(x,y,1); // Рисуем вершину A

}

}//--------------------------OK

//####################################################################

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поздравляю, картинка, конечно красивая, но меня волнует следующий вопрос:

 

Насколько я помню, при рисовании динамически изменяющихся картинок на SED1335 должны возникать флики на экране. Как у вас обстоят дела, с такими глюками?

Изменено пользователем Илья

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поздравляю, картинка, конечно красивая, но меня волнует следующий вопрос:

 

Насколько я помню, при рисовании динамически изменяющихся картинок на SED1335 должны возникать флики на экране. Как у вас обстоят дела, с такими глюками?

Если флики - это когда в разных кадрах есть места по-разному освещенные, то на тёмном фоне их практически не видно, линии-то тонкие и все эти мелькания происходят как бы за экраном, так что с фликами пока всё ОК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сегодня попробовал подать на вход меандр от кварцевого генератора.Нармально можно рассмотреть частоту в 1 МГц при тактовой частоте ПИКа и FIFO- 40МГц. Но вот незадача- не совпадает меандр с масштабом клеток- получается примерно полторы клетки на 1МГц. Перерисовывать клетки как-то не очень хочется, значит надо подгонять частоту тактирования.Можно ли это сделать программно в ПЛИСе или нет-кто мне подскажет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу помощи по теме

Дело такое, надо мне от шифратора кнопок , кот. я зашил в ПЛИСе передать в ПИК значение нажатой кнопки.То есть , если нажата кнопка 1, то вылетает один импульс, если 2, то два импульса и т.д. до 15ти.Длительность импульса прим. 0.5мс без паузы , то есть весь пакет примерно от 0.5 + пауза 0.5мс, до 30ти.Импульсы подаются на вход РА4.также смоделирован признак нажатия кнопки, то есть высокий уровень на весь размер пакета, он подается на порт РА5. Я нарисовал вот такую процедурку, но она почему-то не работает как надо.Может такой способ опознавания вообще не катит?

 

//###### ШИФРАТОР КНОПОК УПРАВЛЕНИЯ. ПОРТ А НА ВХОД ########################

#ifndef Code_Out

#define Code_Out PIN_A4// Пакеты импульсов от 1 до 15

#endif

//--------------------------

#ifndef TASTE_EN

#define TASTE_EN PIN_A5//Признак нажатия кнопки- лог.1

#endif

//###############################

void Tasten(void)// ОПРОС КНОПОК

{unsigned int8 puls;

if (input(TASTE_EN))//признак нажатия кнопки лог."1"

{

while(!input(TASTE_EN));//ждём спад обрезанного импульса

rect(265, 80, 269, 86, 1,0);

text57(265,80,u ,1,1);

puls=0;

while(!input(Code_Out));//ждём спад

while(input(TASTE_EN))//начинаем отсчёт по фронту

{

while(input(Code_Out));//ждём фронт

 

while(!input(Code_Out));//ждём спад

wert_A(puls++);

}

puls=0;

delay_ms(200);

}

else{

rect(265, 80, 269, 86, 1,0);

text57(265,80,m ,1,1);

}

}

//###########################################################################

void wert_A(unsigned int8 wert)

{

char voltage[9];

sprintf(voltage, "%u",(unsigned int8)( wert)); // преобразуем в текст

//voltage[4] = '\0'; //ограничиваем тремя знаками

rect(150, 230, 175, 237, 1,0); //стираем старое значение

text57(150, 230, voltage, 1, 1); //выводим новое значение

}//--------------------------OK

//###################################################################### :help: :beer:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько я понимаю нужно дождаться перехода из низкого в высокий уровень на RA5, а затем посчитать количество импульсов на RA4.

 

Следовательно нужно сделать так:

 

unsigned int8 GetButton(void){
   unsigned int8 puls;
   while(input(TASTE_EN)); // если зашли уже в момент передачи кода кнопки то дождаться окончания передачи
   puls=0;
   while(!input(TASTE_EN));//дождаться начала следующей передачи кода кнопки
   while(input(TASTE_EN)){//пока активно RA5
        while(!input(Code_Out)){//ждём фронт
            if (!input(TASTE_EN)) return puls;//проверяем: если передача законилась то выйти, чтобы не зависнуть
        }
        while(input(Code_Out));//ждём спад
        puls++; 
   }
   return puls;
}

 

А вообще зачем такие сложности, не проще ли сделать так: Передача кода кнопки только по одной ноге, а кодирование длительностью ипульса, например:

0.5 мс - кнопка №1

1 мс - кнопка №2

1.5 мс - кнопка №3

и т.д.

 

тогда для дешифровки делаем следующим образом:

настраиваем прерывание по фронту.

в обработчике прерывания стартуем таймер, и ждем в цикле спада. Стопорим таймер и смотрим: сколько натикало - такой и код :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

попробовал предложенный код.Он работает,только не совсем так.А именно- теперь осциллограмма появляется только в момент нажатия любой кнопки, а иначе картинка замирает.Значение кнопки отображается не совсем корректно- или 0 или на одно значение меньше или правильное значение.

Наверное нужно уточнять частоту импульсов и настраивать прерывание по нажатию- изменению состояния RA5 ? Только я не знаю как(ещё не изучал этот вопрос).Если укажете правильный путь- буду благодарен

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

код работает с небольшой доделкой и понижением частоты импульсов опроса кнопок до 150 кГц.

думаю, что этим можно и ограничиться :beer:

 

 

unsigned int8 GetButton(void){

unsigned int8 puls;

if (!input(TASTE_EN)) return ;//если кнопка не нажималась- уходим

while(input(TASTE_EN)); // если зашли уже в момент передачи кода кнопки то дождаться окончания передачи

puls=0;

while(!input(TASTE_EN));//дождаться начала следующей передачи кода кнопки

while(input(TASTE_EN))//пока активно RA5

{

while(!input(Code_Out))//ждём фронт

{

if (!input(TASTE_EN)) return puls;//проверяем: если передача законилась то выйти, чтобы не зависнуть

}

while(input(Code_Out));//ждём спад

puls++;

}

return puls;

}

...................................................................

а вызов делаем так и уходим от нуля

x=GetButton();

if(x>0) wert_A(x);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот такое у меня ещё пожелание(чувствую, что без посторонней помощи не обойдусь) касательно кнопок управления.

каждый раз ,при нажатии кнопки со значением переменной puls==12, нужно, чтобы значение другой переменной (хх напр.)однократно увеличивалось на единицу и оставалось таким, а при нажатии кнопки со значением puls==13 уменьшалось на единицу и оставалось таким. Я сам пробовал,фигня у меня получается-если держать кнопку и не отпускать, то хх всё время увеличивается или соотв. уменьшается, а это недопустимо.Если с этим поможете, то тогда влпрос с управлением будет закрыт.Спасибо заранее

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...