flann 0 30 марта, 2008 Опубликовано 30 марта, 2008 · Жалоба можно написать так #asm BSF F8B.2 //LATC2=1 #endasm но он не хочет узнавать F8B.2 Попробуйте написать так: BSF 0x0F8B, 0x2 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 30 марта, 2008 Опубликовано 30 марта, 2008 (изменено) · Жалоба написал так, ошибок нет,но экран тухнет через пару сек #asm BSF 0xF8B.2//LATC2=0; #endasm *ptr++=input_b(); //чтение порта В #asm BCF 0xF8B.2//LATC2=1; #endasm Попробуйте написать так: BSF 0x0F8B, 0x2 всё равно тухнет просмотр видео состоялся? Изменено 30 марта, 2008 пользователем andreichk Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 30 марта, 2008 Опубликовано 30 марта, 2008 · Жалоба написал так, ошибок нет,но экран тухнет через пару сек Что значит тухнет экран? Весь? или только перестает рисоваться сигнал? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 30 марта, 2008 Опубликовано 30 марта, 2008 · Жалоба в самом прямом смысле тухнет.Пропадает не только линия,но и сетка и цифирьки. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 30 марта, 2008 Опубликовано 30 марта, 2008 · Жалоба в самом прямом смысле тухнет.Пропадает не только линия,но и сетка и цифирьки. При добавлении какой именно строчки такое происходит? Попробуйте модифицировать постепенно. просмотр видео состоялся? Нет, пишет: No matching videos. Не проще ли залить файлик на рапиду? ;) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 30 марта, 2008 Опубликовано 30 марта, 2008 · Жалоба вот этой *ptr++=input_b(); //чтение порта В ну тогда отсюда попробуйте http://forum.radiospec.ru/index.php?showtopic=6310 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 30 марта, 2008 Опубликовано 30 марта, 2008 · Жалоба вот этой *ptr++=input_b(); //чтение порта В попробуйте сделать так: *ptr=input_b(); //чтение порта В ptr++; Кстати, а приведите лучше дизассемблер, посмотрим что там ваш компилятор на компилировал ну тогда отсюда попробуйте http://forum.radiospec.ru/index.php?showtopic=6310 12 МБ.... я щас на диалапе, завтра качну по нормальному каналу :) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 30 марта, 2008 Опубликовано 30 марта, 2008 (изменено) · Жалоба .................... //#################################################################### .................... //--------------- собственно кривая --------------------------- .................... 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); } //############################################## :) Изменено 30 марта, 2008 пользователем andreichk Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 1 апреля, 2008 Опубликовано 1 апреля, 2008 · Жалоба всё равно тухнет.Я так думаю, что там всё правильно и нужно. Нет, вы не правы, там половина операций ненужна... но я заметил что не происходит инициализация указателя 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 тактов процессора... давайте лучше это строить, только я не знаю с какого боку подьезжать Ну вы хоть начните подъезжать!!! ;) Может вопросы по конкретнее появятся... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 1 апреля, 2008 Опубликовано 1 апреля, 2008 · Жалоба Илья, я уже запутался, что куда вписывать, сделайте плиз это за меня , а я сразу же проверю //#################################################################### 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 } } //######################################### Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 1 апреля, 2008 Опубликовано 1 апреля, 2008 · Жалоба добавил ptr=Buf; теперь ничего не затирает, но и не рисует кривую. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 1 апреля, 2008 Опубликовано 1 апреля, 2008 · Жалоба блин, инструкции перепутали :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: Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 1 апреля, 2008 Опубликовано 1 апреля, 2008 · Жалоба Да, конечно, засунуть бы ваш компилятор.... куда подальше ;) Я полагаю, что если перекинуть 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 получать адреса Сишных переменных... только вот не замечаю разницы(пока), но работает Особой разницы вы и не заметите... т.к. принципиально не правильно выбраны размеры буферов... кстати, вы ПЛИСку во время работы тормознуть можете? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 1 апреля, 2008 Опубликовано 1 апреля, 2008 · Жалоба .................... //#################################################################### .................... //--------------- собственно кривая --------------------------- .................... 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кб купить и поставить,других не нашёл Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 2 апреля, 2008 Опубликовано 2 апреля, 2008 · Жалоба это вы про ФИФО ? а какие тогда правильные. Понимаете, ситуация у вас следующая: Допустим тактируете вы запись 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 } } Я убрал массив, т.к. он не имеет смысла. Торопиться здесь некуда. Данные лежат в ФИФО буфере и никуда не денуться пока мы их не считаем. Хотя, если одновременно еще строить спектр то можно завести глобальный массив, и заполнить его в этой процедуре. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться