реклама на сайте
подробности

 
 
30 страниц V  < 1 2 3 4 > »   
Closed TopicStart new topic
> SED1335,PIC18F4550 и LCD320x240, разбираем по косточкам модуль SED1335.c
andreichk
сообщение Feb 17 2008, 22:31
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



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

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[i]);
}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.gif


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Feb 20 2008, 17:50
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



да, не густо тут помошников.....


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Feb 20 2008, 23:20
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



ещё одно фото для истории.
двухканальный вариант,построенный на ADS831 и FIFO IDT7201 .Всем этим хозяйством управляет PLCD XILINX XC9572.
Cинус , частота- 20 кГц.Каждый канал имеет свой переключатель развёртки.Почему-то рисует половинкой


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Feb 23 2008, 15:32
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



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

Первая попытка наблюдения видеосигнала с камеры(сверху)
и одновременный синус 20 кГц(снизу)
Ну хоть кто-нибудь порадуется вместе со мной beer.gif


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Feb 25 2008, 22:22
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



Ура !!! Удалось засинхронизироать картинку a14.gif
//#####################################################################
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
//####################################################################


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Feb 26 2008, 07:52
Сообщение #21


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



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

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

Сообщение отредактировал Илья - Feb 26 2008, 07:54
Go to the top of the page
 
+Quote Post
andreichk
сообщение Feb 26 2008, 17:54
Сообщение #22


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



Цитата(Илья @ Feb 26 2008, 08:52) *
Поздравляю, картинка, конечно красивая, но меня волнует следующий вопрос:

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

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


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Feb 27 2008, 14:29
Сообщение #23


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



У меня сегодня день рождения. Спасибо всем за поздравления


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Feb 27 2008, 20:02
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



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


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 2 2008, 13:44
Сообщение #25


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



Прошу помощи по теме
Дело такое, надо мне от шифратора кнопок , кот. я зашил в ПЛИСе передать в ПИК значение нажатой кнопки.То есть , если нажата кнопка 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.gif beer.gif


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 3 2008, 03:27
Сообщение #26


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



Насколько я понимаю нужно дождаться перехода из низкого в высокий уровень на 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
и т.д.

тогда для дешифровки делаем следующим образом:
настраиваем прерывание по фронту.
в обработчике прерывания стартуем таймер, и ждем в цикле спада. Стопорим таймер и смотрим: сколько натикало - такой и код smile.gif
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 3 2008, 14:34
Сообщение #27


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



Спасибо, я попробую как вы советуете и отпишусь


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 3 2008, 15:57
Сообщение #28


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



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


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 3 2008, 21:44
Сообщение #29


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



код работает с небольшой доделкой и понижением частоты импульсов опроса кнопок до 150 кГц.
думаю, что этим можно и ограничиться beer.gif


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);


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 4 2008, 18:56
Сообщение #30


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



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


--------------------
Go to the top of the page
 
+Quote Post

30 страниц V  < 1 2 3 4 > » 
Closed TopicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01495 секунд с 7
ELECTRONIX ©2004-2016