-
Постов
4 619 -
Зарегистрирован
-
Победитель дней
2
Весь контент Rst7
-
FreeScale (Motorola) ColdFire
Rst7 ответил Evgeny_CD тема в Все остальные микроконтроллеры
Ну ядро - 68000 по системе комманд. Правда в отличии от оригинала - однотактовое. Система достойная. Слов нет. Конечно, если бы 68030 за основу взяли, было бы еще чуть получше. Гнусевый кодегенератор рулит однозначно, там частенько на асме руками хуже выходит ;) Так что подобный камень - очень серьезная альтернатива АРМ'ам. Хотя PPC - вроде как более круто, но и весовая категория у поверписишных камней повыше... -
Да нет, о чем разговор, конечно PPC рулит однозначно. Мне немного довелось попрограмить на нем (железо не разрабатывал), очень понравилось. Особо порадовал способ загрузки long'ов в регистры (за две комманды, сначала старшую, потом младшую половину), что не нарушает работы конвейера и burst-режима чтения из памяти. В этом отношении ARMы куда более кривоватые... Ну и конечно регистров много, это особая радость...
-
В вашем исходнике никаких опросов готовности нет, кроме того, вы пытаетесь оптимизировать только ввод/вывод пакета через SPI. Я вам предложил оптимальный код. ЗЫ Мне кажется, вы взялись за задачу, вам непосильную, по причине не(до)понимания предмета ;)
-
Как это - "так надо"? У вас быстродействие упало в 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
-
Ах вот в чем дело, у вас тут 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); } Поверьте, у вас будет нормальная скорость...
-
Борьба с большой Lрасс трансформаторов
Rst7 ответил Rst7 тема в Вопросы аналоговой техники
Пробовал, не стреляет. В нее рассеяный магнитный поток не попадает, т.е выброс тот-же. -
Борьба с большой Lрасс трансформаторов
Rst7 ответил Rst7 тема в Вопросы аналоговой техники
Имеется в виду сквозной ток? Так в этой схеме он _ПРИНЦИПИАЛЬНО_ сквозной, _ОБА_ ключа должны быть открыты. -
Борьба с большой Lрасс трансформаторов
Rst7 ответил Rst7 тема в Вопросы аналоговой техники
Да ну 2 диода, конденсатор и дроссель будут дешевле драйвера верхнего ключа (которому, например, тот-же конденсатор надо снаружи ставить). А нас за это е...... ЗЫ А нижний ключ я вообще прямо с лапки ATTiny15 катаю, и ничего... -
Борьба с большой Lрасс трансформаторов
Rst7 ответил Rst7 тема в Вопросы аналоговой техники
Ага, теперь вкурил - такое тоже думал. Не очень нравится в данной схеме необходимость управления верхним транзистором, неизвестно, еще что проще будет - 2D+C+L или драйвер верхнего ключа. Если бы входное не превышало 20В, я бы верхний ключ сделал бы P-канальным и затвор прямо в наглую зацепил за сток нижнего ключа ;) - но у меня до 30 вольт входного, значит надо ограничивать напряжение на затворе ну и т.д. -
Борьба с большой Lрасс трансформаторов
Rst7 ответил Rst7 тема в Вопросы аналоговой техники
Ну на самый крайний случай можно доп. стабилитрон поставить; если он будет только переходные процессы давить - тогда роли в понижении КПД при установившемся режиме он не сыграет. Это я в железе посмотрю конечно. А поподробней, что есть "сдвоенный однотактный"? Набросок схемы можно? -
Борьба с большой Lрасс трансформаторов
Rst7 ответил Rst7 тема в Вопросы аналоговой техники
Дело в том, что просто нет трансформатора, т.е. вторичная цепь подключена к "хорошей" индуктивности. На деле это эквивалентно что не меняет сути, так что отвода от L2 не надо ;) Так моделируется это дело... Да, вот так хреново... Ну не совсем в LC, скажем так, выброс на индуктивности рассеяния уходит в конденсатор С2, потом из этого конденсатора в L3, а из L3 - в источник. Процессы там частично колебательные, частично не очень. Однако что вы подразумеваете под "не слишком хорошо ведет себя в переходных режимах"? -
Борьба с большой Lрасс трансформаторов
Rst7 опубликовал тема в Вопросы аналоговой техники
В двух словах предыстория - по работе часто необходимо делать гальвано-отвязанные источники питания (обратноходовые), у которых трансформаторы имеют очень приличную индуктивность рассеяния из-за особенностей конструкции (большие напряжения развязки, длинные зазоры и т.д. - все это требования стандартов). В преобразователях наблюдается обычная в таких случаях картина - огромный выброс при закрытии ключа, который надо рассеять. При этом, конечно-же, идет борьба за КПД и несложность схемы. В старой советской книжке случайно наткнулся на схему рекуперации выброса, которую и решил попробовать (собственно клампер - в сером прямоугольнике): L2 - индуктивность рассеяния, L1 - индуктивность первичной обмотки трансформатора. Для моделирования собственно трансформатора нет, что и не важно. R1 - нагрузка, на ней 12В/400мА, на входе напряжения от 10 до 30 вольт. В общем результаты - без схемки в прямоугольнике (вместо нее - стабилитрон) КПД 60% в хорошую погоду, с клампером - 90% легко... Завтра попробую на живом железе. Есть какие-либо комментарии? Например, что это баян? ;) -
Попробуйте щупать напряжение сток-исток верхнего ключа в открытом состоянии.
-
ASM: приказали долго жить?
Rst7 ответил OlegIvanov тема в AVR
В новых кристалах - например в М88 out в PINx действительно приводит к инверсии установленных в 1 битов. Так что вы зря напали на человека, да еще и в таких выражениях... -
Расскажу кое-что из собственного опыта (т.к. занимаюсь разработкой пожарных извещателей в том числе): 1. Старый советский стандарт (на обычные дымовые извещатели) оговаривает пороги срабатывания по ослаблению света 800-950нм в диапазоне 0.2-0.05дБ/м. В EN54-7 (который, в частности, принят в Украине) оговаривается только нижний предел 0.05дБ/м, верхний предел определяется испытаниями на тестовых пожарах. Информация к размышлению: 0.2дБ/м - это примерно 4%. 2. Лучше измерять не ослабление, а именно рассеяние, обычно используется угол 120 градусов от оси излучателя. Кстати, интенсивность рассеяного света обратно пропорциональна лямбда^4, так что уменьшение длины волны излучателя только упрощает жизнь. 3. Имейте в виду, что обычно светоотдача светодиодов падает с температурой - нормальное явление 0.5P при 85 градусах, где P - мощность при 25 градусах, хотя ток через светодиод не меняется. Так что при измерении поглощения необходима хорошая термостабилизация, для измерения рассеяния можно ограничиться более простыми средствами...
-
На M128 случайно объявил отладочную переменную в __eeprom и делал ей ++ в mainloop - через полчасика ячейка издохла, а mainloop был ~10мс => ~200000 циклов...
-
Да вообще фигня получается, не стрельнет - это я ночью поразмышлял ;) RAMPX, RAMPY и RAMPZ - это регистры страницы для X,Y и Z. Допустим, мы подправим их адреса, но мы НЕ СМОЖЕМ узнать, с каким индексным регистром сейчас проц обращается к памяти, и какой регистр страницы надо использовать. Т.е. настоящей реализации v6 не получится, а получится обычный регистр страницы снаружи. Так что идея провалилась :(
-
Эх, давно не брал я в руки шашек ;) Пошел искать, похоже нахрапом не получается, т.е. надо будет патчить компилятор. Вообщем, IDA нам поможет. Через денек-другой отпишусь.
-
Уж не странички ли ОЗУ Вы хотите прикрутить? Т.е., если я правильно понял, out в RAMPZ хотите на out в порт заменить? А что, идея очень даже ничего... Надо поковыряться...
-
Ну если сам регулируемый объект более-менее стабилен (ну, или, скажем так, предсказуем ;) ), то в автонастройке проблем нет - единичный импульс на вход, снятие отклика, расчет характеристик объекта и по ним расчет значений для пид-регулятора. Это дело искать гуглей. А если у вас объект меняет свои свойства случайным образом (или еще какая кака) - то это тема для диссера...
-
Выделение мое... Может я неправильно Вас понял, но вы в своем посте сказали, что "Тогда отпадет необходимость в однопроцентниках" -> (лично я так понял, и любой ламер так поймет ;) ) можно ставить все что угодно. Против такого подхода я и возражаю!!!
-
Вообще-то совет типа "ставьте что под руку попадется, а остальное откалибруем" ;) суть медвежья услуга ;) Дело в том, что у резисторов, которые имеют точность 10% и долговременная стабильность такого-же порядка. Значит вы один раз откалибруете ваш измеритель, а через годик-другой он поплывет и все. Если есть возможность перекалибровывать регулярно, тогда можно экономию навести, хотя 2-3 прецизионных резистора не увеличат себестоимость схемы особо. Лично я ставлю обычно C2-29 и не плачу. Кроме того, в применении именно C2-29 есть один плюс - их легко идентифицировать, т.е. убедиться, что это именно они, а применение номиналов из сетки E192, причем таких, которых нет в сетках E96 и хуже, позволяет недопустить запаивания "что под руку попалось" девочками-монтажницами ;)
-
Нужен самый дешевый AC/DC
Rst7 ответил torik тема в Силовая Преобразовательная Техника
TOPxxx - разных как грязи... Работают ничего так, только не забываем супрессор на 400В после выпрямителя ;) -
а почему не устроил? из за темп дрейфа? Ну во-первых, проц у меня тогда был AT90S4433, там опорником и не пахло. А потом - мега8, но начальный разброс и нестабильность (от температуры тоже) - хуже некуда.
-
Ну опорник на кристале имеет никакую точность. В моем случае он отпадает. В той схеме запитать опорник мне есть от чего, там еще +-9В для аналоговой части. Скажем так: опыт (да и теоретические рассуждения) показывает, что при уменьшении опорного напряжения характеристики АЦП (и без того не ахти) ухудшаются. Т.е. 5 лучше чем 2.5, хотя при 4.096 было-бы незаметно ухудшение, но в момент разработки прибора 4.096 был недоставаем. Да вообщем тоже не самый лучший вариант по точности. Самое интересное, что все изготовленные приборы не имели проблем в этой части схемы, однако пришлось выполнить на дискретных элементах источник питания -9В, т.к. 79L09 (отрицательный аналого 78L09) сильно звенела при резком изменении тока потребления (а в связи со взрывозащитой нельзя было установить на выходе конденсатор с большой емкостью, было всего примерно 0.5мкФ). За 78L09 такого замечено не было.