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

Rst7

Модератор
  • Постов

    4 619
  • Зарегистрирован

  • Победитель дней

    2

Весь контент Rst7


  1. Ну ядро - 68000 по системе комманд. Правда в отличии от оригинала - однотактовое. Система достойная. Слов нет. Конечно, если бы 68030 за основу взяли, было бы еще чуть получше. Гнусевый кодегенератор рулит однозначно, там частенько на асме руками хуже выходит ;) Так что подобный камень - очень серьезная альтернатива АРМ'ам. Хотя PPC - вроде как более круто, но и весовая категория у поверписишных камней повыше...
  2. Да нет, о чем разговор, конечно PPC рулит однозначно. Мне немного довелось попрограмить на нем (железо не разрабатывал), очень понравилось. Особо порадовал способ загрузки long'ов в регистры (за две комманды, сначала старшую, потом младшую половину), что не нарушает работы конвейера и burst-режима чтения из памяти. В этом отношении ARMы куда более кривоватые... Ну и конечно регистров много, это особая радость...
  3. В вашем исходнике никаких опросов готовности нет, кроме того, вы пытаетесь оптимизировать только ввод/вывод пакета через SPI. Я вам предложил оптимальный код. ЗЫ Мне кажется, вы взялись за задачу, вам непосильную, по причине не(до)понимания предмета ;)
  4. Как это - "так надо"? У вас быстродействие упало в 10 раз! Все из-за того, что вы неграмотно работаете с аппаратным SPI. Пока передается байт, надо готовить следующий, а не тупо ждать. В результате ваш код должен выглядеть так: void transSPI(CMDT command, MyByte8T address, MyByte8T *buffer, MyByte8T len) { MyByte8T dummyRX; MyByte8T dummyTX = 0xFF; if (len > 0x80 || len == 0) return; PORTB &= ~(1<<3); SPDR = command | (len & 0x7F); while(!(SPSR &(1 << SPIF))); SPDR = address; switch(command) { case READ_CMD: while(!(SPSR &(1 << SPIF))); SPDR=dummyTX; //Для приема первого байта if (--len) { do { while(!(SPSR &(1 << SPIF))); dummyRX=SPDR; SPDR=dummyTX; *buffer++=dummyRX; } while(--len); } while(!(SPSR &(1 << SPIF))); dummyRX=SPDR; *buffer++=dummyRX; break; case WRITE_CMD: do { dummyTX=*buffer++; while(!(SPSR &(1 << SPIF))); SPDR=dummyTX; } while(--len); break; } PORTB |= 1<<3; } Ну и конечно, возьмите IAR - код выглядит отлично: 3 typedef char CMDT; 4 typedef char MyByte8T; 5 6 #define READ_CMD 0x55 7 #define WRITE_CMD 0xAA 8 \ In segment CODE, align 2, keep-with-next 9 void transSPI(CMDT command, MyByte8T address, \ transSPI: 10 MyByte8T *buffer, MyByte8T len) 11 { \ 00000000 2F51 MOV R21, R17 12 MyByte8T dummyRX; 13 MyByte8T dummyTX = 0xFF; 14 15 if (len > 0x80 || len == 0) return; \ 00000002 3841 CPI R20, 129 \ 00000004 F560 BRCC ??transSPI_0 \ 00000006 2344 TST R20 \ 00000008 F151 BREQ ??transSPI_0 16 17 PORTB &= ~(1<<3); \ 0000000A 98C3 CBI 0x18, 0x03 18 19 SPDR = command | (len & 0x7F); \ 0000000C 2F14 MOV R17, R20 \ 0000000E 771F ANDI R17, 0x7F \ 00000010 2B10 OR R17, R16 \ 00000012 B91F OUT 0x0F, R17 20 while(!(SPSR &(1 << SPIF))); \ ??transSPI_1: \ 00000014 9B77 SBIS 0x0E, 0x07 \ 00000016 CFFE RJMP ??transSPI_1 21 SPDR = address; \ 00000018 B95F OUT 0x0F, R21 22 23 switch(command) \ 0000001A 5A0A SUBI R16, 170 \ 0000001C F0B9 BREQ ??transSPI_2 \ 0000001E 5A0B SUBI R16, 171 \ 00000020 F4E9 BRNE ??transSPI_3 24 { 25 case READ_CMD: 26 while(!(SPSR &(1 << SPIF))); \ ??transSPI_4: \ 00000022 9B77 SBIS 0x0E, 0x07 \ 00000024 CFFE RJMP ??transSPI_4 27 SPDR=dummyTX; //Для приема первого байта \ 00000026 EF0F LDI R16, 255 \ 00000028 B90F OUT 0x0F, R16 28 if (--len) \ 0000002A 954A DEC R20 \ 0000002C F049 BREQ ??transSPI_5 29 { 30 do 31 { 32 while(!(SPSR &(1 << SPIF))); \ ??transSPI_6: \ 0000002E 9B77 SBIS 0x0E, 0x07 \ 00000030 CFFE RJMP ??transSPI_6 33 dummyRX=SPDR; \ 00000032 B11F IN R17, 0x0F 34 SPDR=dummyTX; \ 00000034 B90F OUT 0x0F, R16 35 *buffer++=dummyRX; \ 00000036 01F9 MOVW R31:R30, R19:R18 \ 00000038 9311 ST Z+, R17 \ 0000003A 019F MOVW R19:R18, R31:R30 36 } 37 while(--len); \ 0000003C 954A DEC R20 \ 0000003E F7B9 BRNE ??transSPI_6 38 } 39 while(!(SPSR &(1 << SPIF))); \ ??transSPI_5: \ 00000040 9B77 SBIS 0x0E, 0x07 \ 00000042 CFFE RJMP ??transSPI_5 40 dummyRX=SPDR; \ 00000044 B11F IN R17, 0x0F 41 *buffer++=dummyRX; \ 00000046 01F9 MOVW R31:R30, R19:R18 \ 00000048 8310 ST Z, R17 \ 0000004A C008 RJMP ??transSPI_3 42 break; 43 case WRITE_CMD: 44 do 45 { 46 dummyTX=*buffer++; \ ??transSPI_2: \ 0000004C 01F9 MOVW R31:R30, R19:R18 \ 0000004E 9101 LD R16, Z+ \ 00000050 019F MOVW R19:R18, R31:R30 47 while(!(SPSR &(1 << SPIF))); \ ??transSPI_7: \ 00000052 9B77 SBIS 0x0E, 0x07 \ 00000054 CFFE RJMP ??transSPI_7 48 SPDR=dummyTX; \ 00000056 B90F OUT 0x0F, R16 49 } 50 while(--len); \ 00000058 954A DEC R20 \ 0000005A F7C1 BRNE ??transSPI_2 51 break; 52 } 53 PORTB |= 1<<3; \ ??transSPI_3: \ 0000005C 9AC3 SBI 0x18, 0x03 54 } \ ??transSPI_0: \ 0000005E 9508 RET А если __z модификатор поставить, то вообще ляпота: 3 typedef char CMDT; 4 typedef char MyByte8T; 5 6 #define READ_CMD 0x55 7 #define WRITE_CMD 0xAA 8 \ In segment CODE, align 2, keep-with-next 9 __z void transSPI(CMDT command, MyByte8T address, \ transSPI: 10 MyByte8T *buffer, MyByte8T len) 11 { \ 00000000 2F31 MOV R19, R17 12 MyByte8T dummyRX; 13 MyByte8T dummyTX = 0xFF; 14 15 if (len > 0x80 || len == 0) return; \ 00000002 3821 CPI R18, 129 \ 00000004 F538 BRCC ??transSPI_0 \ 00000006 2322 TST R18 \ 00000008 F129 BREQ ??transSPI_0 16 17 PORTB &= ~(1<<3); \ 0000000A 98C3 CBI 0x18, 0x03 18 19 SPDR = command | (len & 0x7F); \ 0000000C 2F12 MOV R17, R18 \ 0000000E 771F ANDI R17, 0x7F \ 00000010 2B10 OR R17, R16 \ 00000012 B91F OUT 0x0F, R17 20 while(!(SPSR &(1 << SPIF))); \ ??transSPI_1: \ 00000014 9B77 SBIS 0x0E, 0x07 \ 00000016 CFFE RJMP ??transSPI_1 21 SPDR = address; \ 00000018 B93F OUT 0x0F, R19 22 23 switch(command) \ 0000001A 5A0A SUBI R16, 170 \ 0000001C F0A1 BREQ ??transSPI_2 \ 0000001E 5A0B SUBI R16, 171 \ 00000020 F4C1 BRNE ??transSPI_3 24 { 25 case READ_CMD: 26 while(!(SPSR &(1 << SPIF))); \ ??transSPI_4: \ 00000022 9B77 SBIS 0x0E, 0x07 \ 00000024 CFFE RJMP ??transSPI_4 27 SPDR=dummyTX; //Для приема первого байта \ 00000026 EF0F LDI R16, 255 \ 00000028 B90F OUT 0x0F, R16 28 if (--len) \ 0000002A 952A DEC R18 \ 0000002C F039 BREQ ??transSPI_5 29 { 30 do 31 { 32 while(!(SPSR &(1 << SPIF))); \ ??transSPI_6: \ 0000002E 9B77 SBIS 0x0E, 0x07 \ 00000030 CFFE RJMP ??transSPI_6 33 dummyRX=SPDR; \ 00000032 B11F IN R17, 0x0F 34 SPDR=dummyTX; \ 00000034 B90F OUT 0x0F, R16 35 *buffer++=dummyRX; \ 00000036 9311 ST Z+, R17 36 } 37 while(--len); \ 00000038 952A DEC R18 \ 0000003A F7C9 BRNE ??transSPI_6 38 } 39 while(!(SPSR &(1 << SPIF))); \ ??transSPI_5: \ 0000003C 9B77 SBIS 0x0E, 0x07 \ 0000003E CFFE RJMP ??transSPI_5 40 dummyRX=SPDR; \ 00000040 B11F IN R17, 0x0F 41 *buffer++=dummyRX; \ 00000042 8310 ST Z, R17 \ 00000044 C006 RJMP ??transSPI_3 42 break; 43 case WRITE_CMD: 44 do 45 { 46 dummyTX=*buffer++; \ ??transSPI_2: \ 00000046 9101 LD R16, Z+ 47 while(!(SPSR &(1 << SPIF))); \ ??transSPI_7: \ 00000048 9B77 SBIS 0x0E, 0x07 \ 0000004A CFFE RJMP ??transSPI_7 48 SPDR=dummyTX; \ 0000004C B90F OUT 0x0F, R16 49 } 50 while(--len); \ 0000004E 952A DEC R18 \ 00000050 F7D1 BRNE ??transSPI_2 51 break; 52 } 53 PORTB |= 1<<3; \ ??transSPI_3: \ 00000052 9AC3 SBI 0x18, 0x03 54 } \ ??transSPI_0: \ 00000054 9508 RET
  5. Ах вот в чем дело, у вас тут ICC оказывается? Конечно! Вы хоть в код, который он генерит, заглядывали? Если нет, то ничего удивительного, что пауза между байтами у вас больше в 10 раз чем длительность передачи байта ;) - это я из другой, поднятой вами, темы почерпнул... Берите IAR или GNU-C и пишите следующий код (для передачи) void send(char *p, char len) { char temp; if (!len) return; do { temp=*p++; while(SPSR&(1<<SPIF)); SPDR=temp; } while(--len); } Поверьте, у вас будет нормальная скорость...
  6. Пробовал, не стреляет. В нее рассеяный магнитный поток не попадает, т.е выброс тот-же.
  7. Имеется в виду сквозной ток? Так в этой схеме он _ПРИНЦИПИАЛЬНО_ сквозной, _ОБА_ ключа должны быть открыты.
  8. Да ну 2 диода, конденсатор и дроссель будут дешевле драйвера верхнего ключа (которому, например, тот-же конденсатор надо снаружи ставить). А нас за это е...... ЗЫ А нижний ключ я вообще прямо с лапки ATTiny15 катаю, и ничего...
  9. Ага, теперь вкурил - такое тоже думал. Не очень нравится в данной схеме необходимость управления верхним транзистором, неизвестно, еще что проще будет - 2D+C+L или драйвер верхнего ключа. Если бы входное не превышало 20В, я бы верхний ключ сделал бы P-канальным и затвор прямо в наглую зацепил за сток нижнего ключа ;) - но у меня до 30 вольт входного, значит надо ограничивать напряжение на затворе ну и т.д.
  10. Ну на самый крайний случай можно доп. стабилитрон поставить; если он будет только переходные процессы давить - тогда роли в понижении КПД при установившемся режиме он не сыграет. Это я в железе посмотрю конечно. А поподробней, что есть "сдвоенный однотактный"? Набросок схемы можно?
  11. Дело в том, что просто нет трансформатора, т.е. вторичная цепь подключена к "хорошей" индуктивности. На деле это эквивалентно что не меняет сути, так что отвода от L2 не надо ;) Так моделируется это дело... Да, вот так хреново... Ну не совсем в LC, скажем так, выброс на индуктивности рассеяния уходит в конденсатор С2, потом из этого конденсатора в L3, а из L3 - в источник. Процессы там частично колебательные, частично не очень. Однако что вы подразумеваете под "не слишком хорошо ведет себя в переходных режимах"?
  12. В двух словах предыстория - по работе часто необходимо делать гальвано-отвязанные источники питания (обратноходовые), у которых трансформаторы имеют очень приличную индуктивность рассеяния из-за особенностей конструкции (большие напряжения развязки, длинные зазоры и т.д. - все это требования стандартов). В преобразователях наблюдается обычная в таких случаях картина - огромный выброс при закрытии ключа, который надо рассеять. При этом, конечно-же, идет борьба за КПД и несложность схемы. В старой советской книжке случайно наткнулся на схему рекуперации выброса, которую и решил попробовать (собственно клампер - в сером прямоугольнике): L2 - индуктивность рассеяния, L1 - индуктивность первичной обмотки трансформатора. Для моделирования собственно трансформатора нет, что и не важно. R1 - нагрузка, на ней 12В/400мА, на входе напряжения от 10 до 30 вольт. В общем результаты - без схемки в прямоугольнике (вместо нее - стабилитрон) КПД 60% в хорошую погоду, с клампером - 90% легко... Завтра попробую на живом железе. Есть какие-либо комментарии? Например, что это баян? ;)
  13. Попробуйте щупать напряжение сток-исток верхнего ключа в открытом состоянии.
  14. В новых кристалах - например в М88 out в PINx действительно приводит к инверсии установленных в 1 битов. Так что вы зря напали на человека, да еще и в таких выражениях...
  15. Расскажу кое-что из собственного опыта (т.к. занимаюсь разработкой пожарных извещателей в том числе): 1. Старый советский стандарт (на обычные дымовые извещатели) оговаривает пороги срабатывания по ослаблению света 800-950нм в диапазоне 0.2-0.05дБ/м. В EN54-7 (который, в частности, принят в Украине) оговаривается только нижний предел 0.05дБ/м, верхний предел определяется испытаниями на тестовых пожарах. Информация к размышлению: 0.2дБ/м - это примерно 4%. 2. Лучше измерять не ослабление, а именно рассеяние, обычно используется угол 120 градусов от оси излучателя. Кстати, интенсивность рассеяного света обратно пропорциональна лямбда^4, так что уменьшение длины волны излучателя только упрощает жизнь. 3. Имейте в виду, что обычно светоотдача светодиодов падает с температурой - нормальное явление 0.5P при 85 градусах, где P - мощность при 25 градусах, хотя ток через светодиод не меняется. Так что при измерении поглощения необходима хорошая термостабилизация, для измерения рассеяния можно ограничиться более простыми средствами...
  16. На M128 случайно объявил отладочную переменную в __eeprom и делал ей ++ в mainloop - через полчасика ячейка издохла, а mainloop был ~10мс => ~200000 циклов...
  17. Да вообще фигня получается, не стрельнет - это я ночью поразмышлял ;) RAMPX, RAMPY и RAMPZ - это регистры страницы для X,Y и Z. Допустим, мы подправим их адреса, но мы НЕ СМОЖЕМ узнать, с каким индексным регистром сейчас проц обращается к памяти, и какой регистр страницы надо использовать. Т.е. настоящей реализации v6 не получится, а получится обычный регистр страницы снаружи. Так что идея провалилась :(
  18. Эх, давно не брал я в руки шашек ;) Пошел искать, похоже нахрапом не получается, т.е. надо будет патчить компилятор. Вообщем, IDA нам поможет. Через денек-другой отпишусь.
  19. Уж не странички ли ОЗУ Вы хотите прикрутить? Т.е., если я правильно понял, out в RAMPZ хотите на out в порт заменить? А что, идея очень даже ничего... Надо поковыряться...
  20. Ну если сам регулируемый объект более-менее стабилен (ну, или, скажем так, предсказуем ;) ), то в автонастройке проблем нет - единичный импульс на вход, снятие отклика, расчет характеристик объекта и по ним расчет значений для пид-регулятора. Это дело искать гуглей. А если у вас объект меняет свои свойства случайным образом (или еще какая кака) - то это тема для диссера...
  21. Выделение мое... Может я неправильно Вас понял, но вы в своем посте сказали, что "Тогда отпадет необходимость в однопроцентниках" -> (лично я так понял, и любой ламер так поймет ;) ) можно ставить все что угодно. Против такого подхода я и возражаю!!!
  22. Вообще-то совет типа "ставьте что под руку попадется, а остальное откалибруем" ;) суть медвежья услуга ;) Дело в том, что у резисторов, которые имеют точность 10% и долговременная стабильность такого-же порядка. Значит вы один раз откалибруете ваш измеритель, а через годик-другой он поплывет и все. Если есть возможность перекалибровывать регулярно, тогда можно экономию навести, хотя 2-3 прецизионных резистора не увеличат себестоимость схемы особо. Лично я ставлю обычно C2-29 и не плачу. Кроме того, в применении именно C2-29 есть один плюс - их легко идентифицировать, т.е. убедиться, что это именно они, а применение номиналов из сетки E192, причем таких, которых нет в сетках E96 и хуже, позволяет недопустить запаивания "что под руку попалось" девочками-монтажницами ;)
  23. TOPxxx - разных как грязи... Работают ничего так, только не забываем супрессор на 400В после выпрямителя ;)
  24. а почему не устроил? из за темп дрейфа? Ну во-первых, проц у меня тогда был AT90S4433, там опорником и не пахло. А потом - мега8, но начальный разброс и нестабильность (от температуры тоже) - хуже некуда.
  25. Ну опорник на кристале имеет никакую точность. В моем случае он отпадает. В той схеме запитать опорник мне есть от чего, там еще +-9В для аналоговой части. Скажем так: опыт (да и теоретические рассуждения) показывает, что при уменьшении опорного напряжения характеристики АЦП (и без того не ахти) ухудшаются. Т.е. 5 лучше чем 2.5, хотя при 4.096 было-бы незаметно ухудшение, но в момент разработки прибора 4.096 был недоставаем. Да вообщем тоже не самый лучший вариант по точности. Самое интересное, что все изготовленные приборы не имели проблем в этой части схемы, однако пришлось выполнить на дискретных элементах источник питания -9В, т.к. 79L09 (отрицательный аналого 78L09) сильно звенела при резком изменении тока потребления (а в связи со взрывозащитой нельзя было установить на выходе конденсатор с большой емкостью, было всего примерно 0.5мкФ). За 78L09 такого замечено не было.
×
×
  • Создать...