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

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


Знающий
****

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



на АЦП подаётся фиксированная частота оцифровки 80 МГц. С него 8бит идут на ФИФО, кот. в свою очередь тактируется частотой от 80 МГц до 625 кГц,посредством запрограммированной ПЛИСки, то есть это и есть переключатель развёртки и соответственно показания от 0.4 мкс до 51.2 мкс(за что мы с вами не так давно бились) оба канала имеют независимый переключатель, то есть одновременно можно наблюдать и 20 кГц и 2 МГц. На последнем фото импульсы подаются на нижний канал(0.4 мкс) .Но нормальный их вид как вы правильно заметили , это 1 период на весь экран.А тут вдруг такая мелкота и не пойму -откуда она берётся и почему потом пропадает? Причём частота оцифровки никоим образом не менялась(ну разве только какая-нить гармоника пролазит) такое вообще возможно?
На всякий случай вот тут схема.Кстати, что теперь будем делать с EEPROM? С картинками , как я понимаю, вопрос закрыт wink.gif


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 29 2008, 05:45
Сообщение #77


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

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



Цитата(andreichk @ Mar 28 2008, 01:34) *
А тут вдруг такая мелкота и не пойму -откуда она берётся и почему потом пропадает?

А раньше (до изменения программы) такое случалось?

Просто я сомтрю у вас FIFO буферы то всего по 512 байт. (я думал несколько Кб). Следовательно скорость считывания при отрисовке должна быть не меньше чем 1/2 от скорости заполнения данными АЦП.
Если она будет меньше, то на высоких частотах оцифровки возможна отрисовка неправильной картины (из-за перезаписи правильных значений новыми данными)

Чтобы этого избежать придется переписать процедуру curve_A() следующим образом:
Код
unsigned int8 Buf[256];
//--------------- собственно кривая ---------------------------
void curve_A(unsigned int8 y_pos_A){
   unsigned int8 x, y , yy;
   for(x=0;x<254;x++){
      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 = y;
      adcA = (Buf(x-1) > 200) ? 200 : Buf(x-1); //ограничитель до выбранной величины
      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
   }
}

Может быть это поможет....

Цитата(andreichk @ Mar 28 2008, 01:34) *
Кстати, что теперь будем делать с EEPROM? С картинками , как я понимаю, вопрос закрыт wink.gif

Кстати на счет EEPROM: не вижу подтягивающих резисторов на линиях SCL, SDA
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 29 2008, 09:27
Сообщение #78


Знающий
****

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



Цитата
А раньше (до изменения программы) такое случалось?

я думаю,что да, просто я не обращал внимания


adcA = (Buf(x-1) > 200) ? 200 : Buf(x-1); //ограничитель до выбранной величины
тут очепятка ? должно быть так-Buf[х-1]
Цитата
Может быть это поможет....

пока не понятно, но мне кажется , что ничего не изменилось

Цитата
Кстати на счет EEPROM: не вижу подтягивающих резисторов на линиях SCL, SDA

Упс, забыл нарисовать, на самом деле они есть и даже припаяны

Цитата
Просто я сомтрю у вас FIFO буферы то всего по 512 байт. (я думал несколько Кб). Следовательно скорость считывания при отрисовке должна быть не меньше чем 1/2 от скорости заполнения данными АЦП.
Если она будет меньше, то на высоких частотах оцифровки возможна отрисовка неправильной картины (из-за перезаписи правильных значений новыми данными)

тут мне не понятно- скорость считывания ФИФО устанавливает ПИК и она постоянная и всегда меньше
частоты АЦП, как быть?

кстати насчёт ФИФО, имеет ли смысл применить более ёмкую, напр.IDT7204 или даже IDT7205?

а может у меня вот это имеет место быть?

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


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 29 2008, 12:10
Сообщение #79


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

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



Цитата(andreichk @ Mar 29 2008, 17:27) *
adcA = (Buf(x-1) > 200) ? 200 : Buf(x-1); //ограничитель до выбранной величины
тут очепятка ? должно быть так-Buf[х-1]

Естественно!

Цитата(andreichk @ Mar 29 2008, 17:27) *
тут мне не понятно- скорость считывания ФИФО устанавливает ПИК и она постоянная и всегда меньше
частоты АЦП, как быть?
кстати насчёт ФИФО, имеет ли смысл применить более ёмкую, напр.IDT7204 или даже IDT7205?

Тут, помоему чем больше тем лучше. Ведь даже на 10 MIPS вы сможете обеспечить максимальную скорость считывания порядка единиц Мгц. А записывать данные вы можете до 80 Мгц!!!!

Цитата(andreichk @ Mar 29 2008, 17:27) *
а может у меня вот это имеет место быть?

Чтобы это проверить, нужно замерить реальную скорость выгребания данных из FIFO буфера (можно по по количеству ассемблерных инструкций после компиляции программы) И сравнить со скоростью записи в буфер
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 30 2008, 09:34
Сообщение #80


Знающий
****

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



Цитата(Илья @ Mar 29 2008, 13:10) *
Чтобы это проверить, нужно замерить реальную скорость выгребания данных из FIFO буфера (можно по по количеству ассемблерных инструкций после компиляции программы) И сравнить со скоростью записи в буфер

Ок, а с какого места нужно начинать считать эти инструкции?


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


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

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



Цитата(andreichk @ Mar 30 2008, 17:34) *
Ок, а с какого места нужно начинать считать эти инструкции?

Незнаю, как в CCS, но в MPLABe это делается очень просто, открываем Dissasebly listing, находим строчку начала цикла:
Код
   for(x=0;x<254;x++){
      Output_bit(READ_FIFO_A ,0); //PIN_C2. разрешить
      Buf[x]=input_b(); //чтение порта В
      Output_bit(READ_FIFO_A ,1); //PIN_C2.запретить
   }

И считаем сколько команд ушло на этот цикл wink.gif

Если в CCS такого нет, то может он хотябы отобразить текст откомпилированной программы? И если в нем возможна симуляция, то поставить BreakPoint на начало цикла, а затем посмотреть на какой строчке программа остановиться в асме. далее выполнять программу по шагам ассемблерных инструкций, пока не вернетесь снова на точку останова. Таким образом можно подсчитать количестов асм. инструкций.

Ну или в крайнем случае можно померять клоки осциллографом.
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 30 2008, 10:10
Сообщение #82


Знающий
****

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



есть такое дело

Цитата
.................... //--------------- собственно кривая ---------------------------
.................... void curve_A(unsigned int8 y_pos_A){
.................... unsigned int8 x, y , yy;
.................... for(x=0;x<254;x++){
*
26E4: MOVLB 1
26E6: CLRF x6B
26E8: MOVF x6B,W
26EA: SUBLW FD
26EC: BNC 2710
.................... Output_bit(READ_FIFO_A ,0); //PIN_C2. разрешить
26EE: BCF F8B.2
26F0: BCF F94.2
.................... Buf[x]=input_b(); //чтение порта В
26F2: CLRF 03
26F4: MOVF x6B,W
26F6: ADDLW 55
26F8: MOVWF FE9
26FA: MOVLW 00
26FC: ADDWFC 03,W
26FE: MOVWF FEA
2700: MOVLW FF
2702: MOVWF F93
2704: MOVFF F81,FEF
.................... Output_bit(READ_FIFO_A ,1); //PIN_C2.запретить
2708: BSF F8B.2
270A: BCF F94.2
.................... }
270C: INCF x6B,F
270E: BRA 26E8
.................... for(x=1;x<255;x++){
2710: MOVLW 01
2712: MOVWF x6B
2714: INCFSZ x6B,W
2716: BRA 271A
2718: BRA 27AA
.................... yy = y;
271A: MOVFF 16C,16D
.................... adcA = (Buf[x-1] > 200) ? 200 : Buf[x-1]; //ограничитель до выбранной величины
271E: MOVLW 01
2720: SUBWF x6B,W
2722: CLRF 03
2724: ADDLW 55
2726: MOVWF FE9
2728: MOVLW 00
272A: ADDWFC 03,W
272C: MOVWF FEA
272E: MOVF FEF,W
2730: SUBLW C8
2732: BC 2738
2734: MOVLW C8
2736: BRA 274A
2738: MOVLW 01
273A: SUBWF x6B,W
273C: CLRF 03
273E: ADDLW 55
2740: MOVWF FE9
2742: MOVLW 00
2744: ADDWFC 03,W
2746: MOVWF FEA
2748: MOVF FEF,W
274A: MOVWF x54
.................... y = (255 - adcA) + y_pos_A; // разворот на 180° по вертикали и сдвиг
274C: MOVLW FF
274E: BSF FD8.0
2750: SUBFWB x54,W
2752: ADDWF x6A,W
2754: MOVWF x6C
.................... adcA = y;
2756: MOVFF 16C,154
.................... if (yy>y) front(x,yy,y); // Рисуем фронт A
275A: MOVF x6D,W
275C: SUBWF x6C,W
275E: BC 2774
2760: MOVFF 16B,16E
2764: MOVFF 16D,16F
2768: MOVFF 16C,170
276C: MOVLB 0
276E: CALL 1DEC
2772: MOVLB 1
.................... if (yy<y) spad(x,yy,y); // Рисуем спад A
2774: MOVF x6C,W
2776: SUBWF x6D,W
2778: BC 278E
277A: MOVFF 16B,16E
277E: MOVFF 16D,16F
2782: MOVFF 16C,170
2786: MOVLB 0
2788: CALL 1E18
278C: MOVLB 1
.................... pixel(x,y,1); // Рисуем вершину A
278E: CLRF x8B
2790: MOVFF 16B,18A
2794: CLRF x8D
2796: MOVFF 16C,18C
279A: MOVLW 01
279C: MOVWF x8E
279E: MOVLB 0
27A0: CALL 0BE8
.................... }
27A4: MOVLB 1
27A6: INCF x6B,F
27A8: BRA 2714
.................... }
27AA: MOVLB 0
27AC: RETLW 00
....................
.................... //########################################


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


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


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

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



Цитата(andreichk @ Mar 30 2008, 18:10) *
есть такое дело

Да, это в принципе оно и есть. только не видать конца цикла, приведите еще несколько инструкций, чтобы точнее определить полное количество тактов. Я предполагаю, что конец цикла по адресу 0x270F
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 30 2008, 11:05
Сообщение #84


Знающий
****

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



Цитата(Илья @ Mar 30 2008, 12:00) *
Да, это в принципе оно и есть. только не видать конца цикла, приведите еще несколько инструкций, чтобы точнее определить полное количество тактов. Я предполагаю, что конец цикла по адресу 0x270F

заменил предыдущий пость на полный текст процедуры


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


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

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



Цитата(andreichk @ Mar 30 2008, 19:05) *
заменил предыдущий пость на полный текст процедуры


Цикл от 0x26E8 до 0x270E итого 18 интсрукций, по 1му такту и 1 инструкция 2 такта всего 20 тактов

Следовательно период считываения 2 мкс, а частота 500 кГц

Следовательно можно сделать вывод, что если частота заполнения FIFO будет больше чем 1 Мгц то за время считывания 255 отсчетов в FIFO положится более 512 новых значений и часть отсчетов просто перезапишется новыми.
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 30 2008, 11:39
Сообщение #86


Знающий
****

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



ну это понятно, что перепишется.А как это связано с образованием частокола и последующим его исчезновением?


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


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

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



Цитата(andreichk @ Mar 30 2008, 19:39) *
ну это понятно, что перепишется.А как это связано с образованием частокола и последующим его исчезновением?

А при какой частоте тактирования FIFO они возникают?

Вообще говоря цикл получился крайне не оптимальным. sad.gif

Совершенно напонятно зачем выполняются строчки:
Код
26F0: BCF F94.2
270A: BCF F94.2

Зачем каждый раз чистить TRIS???? А это уже 2 лишних такта!

Советую вам переписать следующим образом, должно получится гораздо компактнее:
Код
unsigned char * ptr=Buf;
x=2;
while(x++){
      LATC2=0;
      *ptr++=input_b(); //чтение порта В
      LATC2=1;
}

А вообще, похорошему нужно воспользоваться регистрами косвенной адресации (FSR) тогда указатель будет инкрементироваться автоматически после каждого присвоения.
Но тут уже без асма не обойтись.... wink.gif
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 30 2008, 13:03
Сообщение #88


Знающий
****

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



Цитата
А при какой частоте тактирования FIFO они возникают?

да собственно на всех восьми, но заметнее всего при 80ти МГц, то есть 0.4 мксек
Цитата
LATC2=0;

это что такое? sad.gif
Цитата
А вообще, похорошему нужно воспользоваться регистрами косвенной адресации (FSR) тогда указатель будет инкрементироваться автоматически после каждого присвоения.
Но тут уже без асма не обойтись.... wink.gif

тут я без поллитры не разберусь.
про Асм и FSR слышал, но живьём не видел 07.gif

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


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


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

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



Цитата(andreichk @ Mar 30 2008, 21:03) *
LATC2
это что такое? sad.gif

Это регистр защелок порта C, а 2 - номер бита.

если не работает можно попробывать сделать асмовскую вставку, незнаю как у вас в CCS, но в PICC это делается так:
Код
asm("BSF F8B.2");  //LATC2=1
asm("BCF F8B.2");  //LATC2=0

F8B - это адрес LATC, вообщето он должен быть прописан и можно писать так:
Код
asm("BSF LATC.2");  //LATC2=1
asm("BCF LATC.2");  //LATC2=0


А вообще тут что нету специалистов по CCS? подскажите человеку!!!! 1111493779.gif

Цитата
пытаюсь загрузить видео, не знаю можно уже посмотреть или нет?

Видео посметреть пока у меня не получается.... sad.gif
Go to the top of the page
 
+Quote Post
andreichk
сообщение Mar 30 2008, 13:38
Сообщение #90


Знающий
****

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



можно написать так
#asm
BSF F8B.2 //LATC2=1
#endasm
но он не хочет узнавать F8B.2
пишет- неопределённая переменная.
может чего в настройках компилятора недостаёт, буду разбираться

тут попробуйте
http://video.google.de/videoplay?docid=330...h&plindex=0

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


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

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

 


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


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