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

 
 
30 страниц V  « < 5 6 7 8 9 > »   
Closed TopicStart new topic
> SED1335,PIC18F4550 и LCD320x240, разбираем по косточкам модуль SED1335.c
Ilya_A
сообщение Mar 30 2008, 15:02
Сообщение #91


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

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



Цитата(andreichk @ Mar 30 2008, 21:38) *
можно написать так
#asm
BSF F8B.2 //LATC2=1
#endasm
но он не хочет узнавать F8B.2

Попробуйте написать так: BSF 0x0F8B, 0x2
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 30 2008, 15:19
Сообщение #92


Знающий
****

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



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

#asm
BSF 0xF8B.2//LATC2=0;
#endasm
*ptr++=input_b(); //чтение порта В
#asm
BCF 0xF8B.2//LATC2=1;
#endasm

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

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

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

Сообщение отредактировал andreichk - Mar 30 2008, 15:19


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 30 2008, 15:31
Сообщение #93


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

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



Цитата(andreichk @ Mar 30 2008, 23:19) *
написал так, ошибок нет,но экран тухнет через пару сек

Что значит тухнет экран? Весь? или только перестает рисоваться сигнал?
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 30 2008, 15:33
Сообщение #94


Знающий
****

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



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


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 30 2008, 15:50
Сообщение #95


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

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



Цитата(andreichk @ Mar 30 2008, 23:33) *
в самом прямом смысле тухнет.Пропадает не только линия,но и сетка и цифирьки.

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

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

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

Не проще ли залить файлик на рапиду? wink.gif
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 30 2008, 15:59
Сообщение #96


Знающий
****

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



вот этой
*ptr++=input_b(); //чтение порта В
ну тогда отсюда попробуйте
http://forum.radiospec.ru/index.php?showtopic=6310


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 30 2008, 16:04
Сообщение #97


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

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



Цитата(andreichk @ Mar 30 2008, 23:59) *
вот этой
*ptr++=input_b(); //чтение порта В

попробуйте сделать так:
Код
*ptr=input_b(); //чтение порта В
ptr++;

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

Цитата
ну тогда отсюда попробуйте
http://forum.radiospec.ru/index.php?showtopic=6310

12 МБ.... я щас на диалапе, завтра качну по нормальному каналу smile.gif
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 30 2008, 16:27
Сообщение #98


Знающий
****

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



Цитата
.................... //####################################################################
.................... //--------------- собственно кривая ---------------------------
.................... 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.gif я на 43 наснимал !!! 1111493779.gif

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

Цитата
//##############################################
void spectrum_analizator(void)
{
realfastfouriertransform( Buf,128,0);
}
//##############################################
smile.gif

Сообщение отредактировал andreichk - Mar 30 2008, 16:28


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 1 2008, 11:07
Сообщение #99


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

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



Цитата(andreichk @ Mar 31 2008, 00:27) *
всё равно тухнет.Я так думаю, что там всё правильно и нужно.

Нет, вы не правы, там половина операций ненужна... но я заметил что не происходит инициализация указателя 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.gif Они что не знают инструкции INCFSZ ???

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

Цитата(andreichk @ Mar 31 2008, 00:27) *
давайте лучше это строить, только я не знаю с какого боку подьезжать

Ну вы хоть начните подъезжать!!! wink.gif Может вопросы по конкретнее появятся...
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 1 2008, 11:44
Сообщение #100


Знающий
****

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



Илья, я уже запутался, что куда вписывать, сделайте плиз это за меня , а я сразу же проверю
Цитата
//####################################################################
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
}
}
//#########################################


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 1 2008, 12:57
Сообщение #101


Знающий
****

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



добавил ptr=Buf;
теперь ничего не затирает, но и не рисует кривую.


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 1 2008, 14:08
Сообщение #102


Знающий
****

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



блин, инструкции перепутали 05.gif и 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.gif


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 1 2008, 14:22
Сообщение #103


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

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



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

Я полагаю, что если перекинуть 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 получать адреса Сишных переменных...
Цитата
только вот не замечаю разницы(пока), но работает

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

кстати, вы ПЛИСку во время работы тормознуть можете?
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 1 2008, 14:33
Сообщение #104


Знающий
****

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



Цитата
.................... //####################################################################
.................... //--------------- собственно кривая ---------------------------
.................... 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кб купить и поставить,других не нашёл


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 2 2008, 10:23
Сообщение #105


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

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



Цитата(andreichk @ Apr 1 2008, 22:33) *
это вы про ФИФО ? а какие тогда правильные.


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

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

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

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

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


Измененная процедура 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
   }
}

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

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

 


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


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