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

SED1335,PIC18F4550 и LCD320x240

можно написать так

#asm

BSF F8B.2 //LATC2=1

#endasm

но он не хочет узнавать F8B.2

Попробуйте написать так: BSF 0x0F8B, 0x2

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


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

написал так, ошибок нет,но экран тухнет через пару сек

 

#asm

BSF 0xF8B.2//LATC2=0;

#endasm

*ptr++=input_b(); //чтение порта В

#asm

BCF 0xF8B.2//LATC2=1;

#endasm

 

Попробуйте написать так: BSF 0x0F8B, 0x2

 

всё равно тухнет

 

просмотр видео состоялся?

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

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


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

написал так, ошибок нет,но экран тухнет через пару сек

Что значит тухнет экран? Весь? или только перестает рисоваться сигнал?

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


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

в самом прямом смысле тухнет.Пропадает не только линия,но и сетка и цифирьки.

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


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

в самом прямом смысле тухнет.Пропадает не только линия,но и сетка и цифирьки.

При добавлении какой именно строчки такое происходит? Попробуйте модифицировать постепенно.

 

просмотр видео состоялся?

Нет, пишет: No matching videos.

 

Не проще ли залить файлик на рапиду? ;)

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


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

вот этой

*ptr++=input_b(); //чтение порта В

ну тогда отсюда попробуйте

http://forum.radiospec.ru/index.php?showtopic=6310

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


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

вот этой

*ptr++=input_b(); //чтение порта В

попробуйте сделать так:

*ptr=input_b(); //чтение порта В
ptr++;

Кстати, а приведите лучше дизассемблер, посмотрим что там ваш компилятор на компилировал

 

ну тогда отсюда попробуйте

http://forum.radiospec.ru/index.php?showtopic=6310

12 МБ.... я щас на диалапе, завтра качну по нормальному каналу :)

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


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

.................... //####################################################################

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

.................... unsigned char *ptr=Buf;

.................... void curve_A(unsigned int8 y_pos_A){

.................... unsigned int8 x,y, yy;

.................... x=2;

*

26E4: MOVLW 02

26E6: MOVLB 1

26E8: MOVWF x6D

.................... // for(x=0;x<254;x++){

.................... while(x++){

26EA: MOVF x6D,W

26EC: INCF x6D,F

26EE: XORLW 00

26F0: BZ 270E

.................... #asm

.................... BSF 0x0F8B,0x2//LATC2=0;

26F2: BSF F8B.2

.................... #endasm

.................... *ptr=input_b(); //чтение порта В

26F4: MOVFF 15F,FE9

26F8: MOVFF 160,FEA

26FC: MOVLW FF

26FE: MOVWF F93

2700: MOVFF F81,FEF

.................... ptr++;

2704: INCF x5F,F

2706: BTFSC FD8.2

2708: INCF x60,F

.................... #asm

.................... BCF 0x0F8B,0x2//LATC2=1;

270A: BCF F8B.2

.................... #endasm

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

.................... //Buf[x]=input_b(); //чтение порта В

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

.................... }

270C: BRA 26EA

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

270E: MOVLW 01

2710: MOVWF x6D

2712: INCFSZ x6D,W

2714: BRA 2718

2716: BRA 27A4

.................... yy = adcA;//y

2718: MOVFF 154,16F

.................... adcA = (Buf[x-1] > 200) ? 200 : Buf[x-1]; //ограничитель до выбранной величины

271C: MOVLW 01

271E: SUBWF x6D,W

2720: CLRF 03

2722: ADDLW 55

2724: MOVWF FE9

2726: MOVLW 00

2728: ADDWFC 03,W

272A: MOVWF FEA

272C: MOVF FEF,W

272E: SUBLW C8

2730: BC 2736

2732: MOVLW C8

2734: BRA 2748

2736: MOVLW 01

2738: SUBWF x6D,W

273A: CLRF 03

273C: ADDLW 55

273E: MOVWF FE9

2740: MOVLW 00

2742: ADDWFC 03,W

2744: MOVWF FEA

2746: MOVF FEF,W

2748: MOVWF x54

.................... adcA = (255 - adcA) + y_pos_A; // разворот на 180° по вертикали и сдвиг

274A: MOVLW FF

274C: BSF FD8.0

274E: SUBFWB x54,W

2750: ADDWF x6C,W

2752: MOVWF x54

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

2754: MOVF x6F,W

2756: SUBWF x54,W

2758: BC 276E

275A: MOVFF 16D,170

275E: MOVFF 16F,171

2762: MOVFF 154,172

2766: MOVLB 0

2768: CALL 1DEC

276C: MOVLB 1

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

276E: MOVF x54,W

2770: SUBWF x6F,W

2772: BC 2788

2774: MOVFF 16D,170

2778: MOVFF 16F,171

277C: MOVFF 154,172

2780: MOVLB 0

2782: CALL 1E18

2786: MOVLB 1

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

2788: CLRF x8D

278A: MOVFF 16D,18C

278E: CLRF x8F

2790: MOVFF 154,18E

2794: MOVLW 01

2796: MOVWF x90

2798: MOVLB 0

279A: CALL 0BE8

.................... }

279E: MOVLB 1

27A0: INCF x6D,F

27A2: BRA 2712

.................... }

27A4: MOVLB 0

27A6: RETLW 00

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

.................... //####

 

всё равно тухнет.Я так думаю, что там всё правильно и нужно.Наверное не стоит там ковыряться

 

12 МБ....

Ограбили :1111493779: я на 43 наснимал !!! :1111493779:

 

давайте лучше это строить, только я не знаю с какого боку подьезжать

 

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

void spectrum_analizator(void)

{

realfastfouriertransform( Buf,128,0);

}

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

:)
Изменено пользователем andreichk

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


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

всё равно тухнет.Я так думаю, что там всё правильно и нужно.

Нет, вы не правы, там половина операций ненужна... но я заметил что не происходит инициализация указателя ptr, при входе в функцию, хотя у меня написано (ненравится мне этот компилятор, блин...)

 

напишите явное присвоение

ptr=Buf;

перед циклом

while(x++)

Просто происходило следующее: при каждом входе в процедуру, указатель все увеличивался и увеличивался... и затирал все подряд...

 

также абсолютнно бессмыслены следующие строчки:

26FC: MOVLW FF
26FE: MOVWF F93

их нужно максимум выполнить 1 раз перед циклом.

 

А проверка условия выхода из цикла:

26EA: MOVF x6D,W
26EC: INCF x6D,F
26EE: XORLW 00
26F0: BZ 270E

Это же просто ужас!!! :07: Они что не знают инструкции INCFSZ ???

 

Я бы написал весь цикл в 5 асмовских инструкций, и выполнялся бы он за 6 тактов процессора...

 

давайте лучше это строить, только я не знаю с какого боку подьезжать

Ну вы хоть начните подъезжать!!! ;) Может вопросы по конкретнее появятся...

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


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

Илья, я уже запутался, что куда вписывать, сделайте плиз это за меня , а я сразу же проверю

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

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

{ unsigned int16 n=0;

 

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

//-------------------- синхронизация ---------------------------

n=0;

for(;;){

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

adcA=input_b(); //чтение порта В

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

adcA = (adcA > 200) ? 200 : adcA; //ограничитель до выбранной величины

adcA = 255 - adcA; // разворот на 180° по вертикали

if (n++>TIMEOUT) {curve_A(y_pos_A); return;}

if (syncA){

if(adcA>sync_volume_A) continue;else break;

}else{

if(adcA<=sync_volume_A+115) continue;else break;

}

} curve_A(y_pos_A);//собственно кривая

 

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

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

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

unsigned char *ptr=Buf;

void curve_A(unsigned int8 y_pos_A){

unsigned int8 x,y, yy;

x=2;

// for(x=0;x<254;x++){

while(x++){

#asm

BSF 0x0F8B,0x2//LATC2=0;

#endasm

*ptr=input_b(); //чтение порта В

ptr++;

#asm

BCF 0x0F8B,0x2//LATC2=1;

#endasm

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

//Buf[x]=input_b(); //чтение порта В

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

}

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

yy = adcA;//y

adcA = (Buf[x-1] > 200) ? 200 : Buf[x-1]; //ограничитель до выбранной величины

adcA = (255 - adcA) + y_pos_A; // разворот на 180° по вертикали и сдвиг

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

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

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

}

}

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

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


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

блин, инструкции перепутали :05: и ptr надо было локальной сделать. теперь работает

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

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

void curve_A(unsigned int8 y_pos_A)

{ unsigned char *ptr=Buf;

unsigned int8 x, yy;

x=2;

while(x++){

#asm

BCF 0x0F8B,2//LATC2=0;

#endasm

*ptr++=input_b(); //чтение порта В

#asm

BSF 0x0F8B,2//LATC2=1;

#endasm

}

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

yy = adcA;//y

adcA = (Buf[x-1] > 200) ? 200 : Buf[x-1]; //ограничитель до выбранной величины

adcA = (255 - adcA) + y_pos_A; // разворот на 180° по вертикали и сдвиг

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

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

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

}

}

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

 

только вот не замечаю разницы(пока), но работает :beer:

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


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

Да, конечно, засунуть бы ваш компилятор.... куда подальше ;)

 

Я полагаю, что если перекинуть while в конец, можно еще немного сэкономить:

 

//--------------- собственно кривая ---------------------------
void curve_A(unsigned int8 y_pos_A)
{ unsigned char *ptr=Buf;
unsigned int8 x, yy; 
x=2;
do{ 
#asm
BCF 0x0F8B,2//LATC2=0;
#endasm
*ptr++=input_b(); //чтение порта В
#asm
BSF 0x0F8B,2//LATC2=1;
#endasm 
}while(x++);
for(x=1;x<255;x++){ 
yy = adcA;//y
adcA = (Buf[x-1] > 200) ? 200 : Buf[x-1]; //ограничитель до выбранной величины
adcA = (255 - adcA) + y_pos_A; // разворот на 180° по вертикали и сдвиг
if (yy>adcA) front(x,yy,adcA); // Рисуем фронт A
if (yy<adcA) spad(x,yy,adcA); // Рисуем спад A 
pixel(x,adcA,1); // Рисуем вершину A 
} 
}

 

Приведите дизассемблер как исправите, ОК?

 

Вообще руки чешуться исправить весь цикл чтения на асм.... да вот хрен его знает как в это CCS получать адреса Сишных переменных...

только вот не замечаю разницы(пока), но работает

Особой разницы вы и не заметите... т.к. принципиально не правильно выбраны размеры буферов...

 

кстати, вы ПЛИСку во время работы тормознуть можете?

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


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

.................... //####################################################################

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

.................... void curve_A(unsigned int8 y_pos_A)

.................... { unsigned char *ptr=Buf;

*

26F0: MOVLB 1

26F2: CLRF x6D

26F4: MOVLW 55

26F6: MOVWF x6C

.................... unsigned int8 x=2, yy;

26F8: MOVLW 02

26FA: MOVWF x6E

.................... do{

.................... #asm

.................... BCF 0x0F8B,2//LATC2=0;//PIN_C2. разрешить

26FC: BCF F8B.2

.................... #endasm

.................... *ptr++=input_b(); //чтение порта В

26FE: MOVFF 16D,03

2702: MOVF x6C,W

2704: INCF x6C,F

2706: BTFSC FD8.2

2708: INCF x6D,F

270A: MOVWF FE9

270C: MOVFF 03,FEA

2710: MOVLW FF

2712: MOVWF F93

2714: MOVFF F81,FEF

.................... #asm

.................... BSF 0x0F8B,2//LATC2=1;//PIN_C2.запретить

2718: BSF F8B.2

.................... #endasm

.................... }while(x++);

271A: MOVF x6E,W

271C: INCF x6E,F

271E: XORLW 00

2720: BNZ 26FC

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

2722: MOVLW 01

2724: MOVWF x6E

2726: INCFSZ x6E,W

2728: BRA 272C

272A: BRA 27B8

.................... yy = adcA;//y

272C: MOVFF 154,16F

.................... adcA = (Buf[x-1] > 200) ? 200 : Buf[x-1]; //ограничитель до выбранной величины

2730: MOVLW 01

2732: SUBWF x6E,W

2734: CLRF 03

2736: ADDLW 55

2738: MOVWF FE9

273A: MOVLW 00

273C: ADDWFC 03,W

273E: MOVWF FEA

2740: MOVF FEF,W

2742: SUBLW C8

2744: BC 274A

2746: MOVLW C8

2748: BRA 275C

274A: MOVLW 01

274C: SUBWF x6E,W

274E: CLRF 03

2750: ADDLW 55

2752: MOVWF FE9

2754: MOVLW 00

2756: ADDWFC 03,W

2758: MOVWF FEA

275A: MOVF FEF,W

275C: MOVWF x54

.................... adcA = (255 - adcA) + y_pos_A; // разворот на 180° по вертикали и сдвиг

275E: MOVLW FF

2760: BSF FD8.0

2762: SUBFWB x54,W

2764: ADDWF x6B,W

2766: MOVWF x54

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

2768: MOVF x6F,W

276A: SUBWF x54,W

276C: BC 2782

276E: MOVFF 16E,170

2772: MOVFF 16F,171

2776: MOVFF 154,172

277A: MOVLB 0

277C: CALL 1DF8

2780: MOVLB 1

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

2782: MOVF x54,W

2784: SUBWF x6F,W

2786: BC 279C

2788: MOVFF 16E,170

278C: MOVFF 16F,171

2790: MOVFF 154,172

2794: MOVLB 0

2796: CALL 1E24

279A: MOVLB 1

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

279C: CLRF x8C

279E: MOVFF 16E,18B

27A2: CLRF x8E

27A4: MOVFF 154,18D

27A8: MOVLW 01

27AA: MOVWF x8F

27AC: MOVLB 0

27AE: CALL 0BAA

.................... }

27B2: MOVLB 1

27B4: INCF x6E,F

27B6: BRA 2726

.................... }

27B8: MOVLB 0

27BA: RETLW 00

.................... //#########################################

ПЛИСКУ я тормознуть могу, но тогда и ПИК остановится, та как клок на него через неё идёт.А зачем её тормозить?

 

принципиально не правильно выбраны размеры буферов...

это вы про ФИФО ? а какие тогда правильные.Я могу на IDT7205 8кб купить и поставить,других не нашёл

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


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

это вы про ФИФО ? а какие тогда правильные.

 

Понимаете, ситуация у вас следующая: Допустим тактируете вы запись FIFO 80 МГц.

Вы заходите в процедуру pix_A(), ресетите буфер. Далее начианете искать фронт синхронизации. Частота считывания данных процом из FIFO, будет при этом порядка 100 кГц. Одновременно он заполняется данными на скорости 80 Мгц. Т.е. в 400 раз быстрее. Т.е. реально вы успеете считать 2 отсчета, и ФИФО буфер заткнется. (т.к. в нем стоит защита от переполнения). Далее вы считываете третий отсчет. И так как появилась свободная ячейка, ФИФО принимает еще один байт с АЦП. Затем, такая же ситуация с четвертым и последующими отсчетами. Т.е. картина следующая: первые, примерно 512 отсчетов заполняются на скорости 80 Мгц. все последующие заполняются на частоте вашего считывания.

Все хорошо, и вашего FIFO буффера достаточно, если порог синхронизации был найден в примерно в первых 256-ти отсчетах, т.к. после этого вы отрисовываете еще 253 отсчета (которые еще были оцифрованны на 80 Мгц). Но, чем дальше вы уходите при поиске фронта за первые 256 отсчетов, тем больше косячится конец буфера (т.к. все последующие отсчеты были занесены в буфер с частотой вашего считывания). Т.е. теоретически, если вы нашли фронт синхронизации за пределами первых 512 ти отсчетов, то вы как раз и отрисуете частокол, т.к. получиться эффект aliasing-а про который вы упоминали.(потому что вы с низкой частотой, выхватываете отсчеты из высокочастотного сигнала, а т.к. частоты не кратные, получается практически случайная картина).

 

Исходя из всего вышесказанного, можно сделать вывод, что ваш осцилл. будет работать "на ура", если будет находить фронты синхронизации, в первых 256 байтах ФИФО буфера. И как только, по каким либо причинам, он выходит за этот предел, начинаеться "каша".

 

Такчто, первое что нужно сделать - это исправить вашу программу - если нет фронта синхронизации в первых 256 ти байтах, то ресетить ФИФО, и искать заново. А по прошествии, допустим 10 попыток, если не нашелся фронт синхронизации, тупо отрисовывать оставшуюся часть буфера. Т.е. никогда не вылазить за первые 512 байт, т.к. там все равно информация собранная на другой частоте, а следовательно неправильная и отображению не подлежит!

 

Во вторых можно увеличить размер ФИФО буферов.

 

А вообще я бы посоветовал, взять ПЛИСку подороже, с внутренней памятью, и запрограммировать ее, чтобы она сама, напрямую загребала данные с АЦП, и на автомате искала фронты синхронизации. А процу доставался бы лишь готовый, синхронизированный массивчик для отображения на экране. ИМХО нефиг загружать проц такой работой, ибо MIPSов на это у него явно не достаточно ;) (Заодно сэкономите на буферах - они я смотрю не дешевые) ;)

 

 

Измененная процедура pix_A() будеу выглядеть вот так:

#define TIMEOUT             10
#define MAXN                  258

void pix_A(unsigned int8 y_pos_A) // рисуем кривую, типа синусоиды и пр.
{  unsigned int16 n;
    unsigned int8  try=TIMEOUT;
   while(try--){
      n=0;
      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
         if (n++>MAXN) break;// В этой попытке смотреть дальше неимеет смысла
      }while( adcA == 0);
      if (n>MAXN) contiune;// Начнем с начала
      do{ // ещё одна попытка синхронизации 
         Output_bit(READ_FIFO_A ,0);//PIN_C2
         adcA=input_b(); 
         Output_bit(READ_FIFO_A ,1); //PIN_C2
         if (n++>MAXN) break;// В этой попытке смотреть дальше неимеет смысла
      }while(input_b()== adcA ); //уже лучше,но всё равно плохо
      if (n>MAXN) contiune;// Начнем с начала
      //-------------------- синхронизация ---------------------------
      while(1){
         Output_bit(READ_FIFO_A ,0); //PIN_C2. разрешить
         adcA=input_b(); //чтение порта В 
         Output_bit(READ_FIFO_A ,1); //PIN_C2.запретить
         adcA = (adcA > 200) ? 200 : adcA; //ограничитель до выбранной величины
         adcA = 255 - adcA; // разворот на 180° по вертикали
         if (n++>MAXN) break;// В этой попытке смотреть дальше неимеет смысла
         if (syncA){
            if(adcA>sync_volume_A) continue; 
            else break;
         }else{
            if(adcA<=sync_volume_A+115) continue; 
            else break;
         } 
       }
       if (n>MAXN) contiune;// Начнем с начала
       else break;//Иначе выйдем из цикла и отрисуем кривую
   }
   curve_A(y_pos_A); // Сюда попадем только если нашли фронт синхронизации, либо исткло количество попыток
}

TIMEOUT - количество попыток синхронизации

MAXN - максимальное значение до которого ищем порог синхронизации.

 

Измененная процедура curve_A() будеу выглядеть вот так:

//--------------- собственно кривая ---------------------------
void curve_A(unsigned int8 y_pos_A){
   unsigned int8 x, y , yy;
   for(x=1;x<255;x++){ 
      yy = y;
      Output_bit(READ_FIFO_A ,0); //PIN_C2. разрешить
      adcA=input_b(); //чтение порта В 
      Output_bit(READ_FIFO_A ,1); //PIN_C2.запретить
      adcA = (adcA > 200) ? 200 : adcA; //ограничитель до выбранной величины
      y = (255 - adcA) + y_pos_A; // разворот на 180° по вертикали и сдвиг
      if (yy>y) front(x,yy,y); // Рисуем фронт A 
      if (yy<y) spad(x,yy,y); // Рисуем спад A 
      pixel(x,y,1); // Рисуем вершину A 
   } 
}

Я убрал массив, т.к. он не имеет смысла. Торопиться здесь некуда. Данные лежат в ФИФО буфере и никуда не денуться пока мы их не считаем. Хотя, если одновременно еще строить спектр то можно завести глобальный массив, и заполнить его в этой процедуре.

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


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

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