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

Rst7

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

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

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

    2

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


  1. --string_literals_in_flash в дополнительных опциях компилятора. В результате этого дела будет создан массив указателей на строки: DW a1 DW a2 ... a1: db "upor",0 a2: db "upor2",0 и т.д. Так должно быть.
  2. Я обычно поступаю так typedef char __flash * STR; .... // Сообщения основного меню __flash STR Message_MainMenu[]= { (STR)"Фотон-А", (STR)"Просмотр архива событий", (STR)"Перезапуск системы", (STR)"Конфигурация ПУ", (STR)"Конфигурация ППКП", (STR)"Конфигурация извещателей", (STR)"Конфигурация зон", (STR)"Конфигурация ТК", (STR)"Конфигурация БРА", (STR)"Конфигурация АПС", (STR)"Изменение адресов", (STR)"Отладка приборов" }; Ну оно же тебе пишет что с чем инкомпатибле, следовательно char __flash *GetEnumMes(char __flash * __flash *EnumMess, char dPrm, char fPrm)
  3. Нельзя при использовании модификатора с _z использовать вызов функции по указателю, т.к. IJMP имеет адрес в Z. Идея ясна?
  4. Хм, странно, я так понял, что __version_3 - это как раз по умолчанию. А поподробней, где ты нарыл применение этого модификатора?
  5. Mega48+HPS16A

    В два раза легко - вешаешь пищик между ДВУМЯ лапами и выводишь меандр на лапы в ПРОТИВОФАЗЕ - результат есть увеличение напряжения на пищике в два раза. С индуктивностью: Лапа проца на затвор транзистора, исток на землю, сток через дроссель на +. Пищалка в параллель дросселю. Начинай где-то с 1 миллигенри. Транзистор будет наверное КП505, он хорошо от 3 вольт открывается. Посмотри только осциллографом, чтобы на стоке импульс был не более 50В - для КП505 это максимум. ЗЫ Не забудь резистор 100к между затвором и истоком транзистора. И хороший кондер по питанию, а то такая схема много мусора дает.
  6. AVR + DataFlash

    А почему так нельзя??? Как надо, подскажите плиз :mellow: Потому что переход CS 0->1 есть признак окончания комманды и старт ее выполнения. А переход 1->0 соответственно начало комманды.
  7. Была такая проблема, правда наоборот - не инициализировались нулевые переменные - инициализировались 0xFF. Оказалось вот что - шился собственным программатором, а в софте ошибка была - не дописывался последний байт в прошивку, туда как раз попадало значение инициализации, оно становилось 0xFF и все. Посмотри, может у тебя тоже чего не дописывается?
  8. Причем токовые, чтобы не создавать лишнего сопротивления в линии. А так, согласен на 100%, будет очень хорошо работать.
  9. Да, Вы совершенно правы. Если взять диапазон 1В, то шум в 2-3 единицы окажется равным 2-3 мВ, а это достаточно много, если средний диапазон изменения сигнала 100-200 мВ. Правда, я ввел Вас в заблужение сказав про "микровольтовый сигнал". Подразумевались сотни мировольт. Т.е хотелось бы иметь точность близкую к 300-1000 мкВ. Но это в идеале. Без *20 будет шуметь меньше. Не будет шумов усилителя. Спрашивали выше какой контроллер - Tiny15 и Tiny26 - с одинаковыми результатами. Измеряется 1 раз в конце импульса (который, напомню, 50 мкс) - чтобы более-менее установилось напряжение на выходе дифф-усилителя. Эксперименты с изменением прескаллера вплоть до 1/2 показали, что на результат почти не влияет, но бывает, появляются пропущенные коды при большой частоте АЦП. Но не всегда, вообщем, понять особо не удалось - фазы луны какие-то. А при 200 кГц - все в порядке, если и есть какая-то гадость, то шумами усилителя она вполне маскируется.
  10. Про микровольтный сигнал. Использую в датчике T15 или T26. Измеряется импульс фототока с фотодиода. Включен x20 дифф режим и внутренний опорник 2.56 вольта. Импульс длительностью 50 мкс. Амплитуда в нормальном состоянии измеряется ~30 у.е. ADC (30*125мкв=3.75мв). Источник сигнала получается с эквивалентным сопротивлением 1МОм. Результат - шумит примерно +- 2..3 единицы. Вот такие результаты.
  11. Это чё-то из серии "ежли вы обижаете лордов нам - мы вам тоже написаем в щи" (с). Детский сад какой-то, право-слово... ;) Про ПИКи особо и речи-то не было. В треде только я их упоминал, и то всего лишь как еще более говеную чем АВР архитектуру. Вы хоть в курсе истории мелкопроцессоров, и знаете ли как ПИК расшифровывается? Периферийный Интерфейсный Контроллер, только-то и всего. Мне кажется слово еще более говеную прозвучало только сейчас. А я уж было подумал, что Вы сторонник... :) Я не хотел тут разводить по поводу того "какой проц лучше" и т.д. Просто так прозвучал Ваш пост "А вот на ПИК18 ....". Еще раз не хотел. Флейм мы тут действительно развели. Хотя сама постановка вопроса (первый пост) к этому и вела. Можно резюмировать. 1. На С++ не писать, писать на С 2. Глобальных переменных поменьше 3. Все грузить в регистры, потом сливать обратно 4. А вот если Atmel еще и комманды добавит - все будет нормально. Я думаю, можно закрывать тему или перемещаться в тему класса "Что лучше", если охота побазарить дальше.
  12. О да, пик - суперпроцессор. Не помню, помоему в 18 уже сделана арифметика с переносом, а давайте про любимую 16 серию. Надо выполнить простую вещь, например сложить два массива 16-битных чисел (напомню - указатели на int) for(..) { (*d)+=*s; s++;d++ } И смотрим в код. Во-первых - в пичке один индексный регистр, копирований значений - как грязи. Во-вторых - а нет же нормального сложения с переносом, надо так извращаться, просто дофига комманд на такую простую операцию, как +=. А теперь - серия 18 - массив переходит через границу странички и п...ц. Но вобщем я не о том, что пик - лайно, авр - вещь. Я про то, что есть некоторый набор требований, которые надо выполнять при программировании на AVR. Первое и самое главное - как можно меньше статических переменных. Если без них никак, тогда в начале процедуры нагрузить все в регистры, перед выходом - слить. То-есть так static char a; static char b; static char c; void foo(void) { char wa=a; char wb=b; char wc=c; //Теперь делаем чего надо wa...wc a=wa; b=wb; c=wc; } Нормально живет.
  13. Полностью согласен. Избыточное кол-во регистров не просто бесполезно, а довольно вредно, как всякая лишняя сущность. Уважаемый оратор выше упоминал про переключение контекста, там чем больше регистров - тем хуже. Впрочем, архитектура AVR студентами сделана, что уж с них взять... Все равно не пойму, почему вы считаете R0-R15 бесполезными? Потому что с непосредственными операндами не работают? Покажите какой нибудь алгоритм обработки, который только с иммедитейтом работает - думаю, не бывает таких. Всегда есть и промежуточные результаты, накопители и т.д. - все вполне ложится в нижние регистры. Другое дело, что грамотный компилятор должен оптимизировать код под их использование - это да. Нехватка индексных регистров - действительно серьезная неприятность, но уж очень сильно она сказывается при C++. Вывод - не пишите на цпп для AVR. На месте Atmel я бы вставил в новое ядро комманды для работы со стеком например в таком виде: DECSP VAL - sp-=val INCSP VAL - sp+=val LDSP Rx,DISP - rx=sp[disp] STSP Rx,DISP - sp[disp]=rx где val и disp - небольшие иммедитейты. Очень бы помогло сишному компилятору.
  14. AVR+HDD

    Видимо не сполна наелись, либо винт не поддерживал ATA1/2 :) http://www.t13.org/docs2004/e04153r0_Annex...l_cmd_usage.pdf - 80kb на странице 8, table 2 можно найти ATA команду - ENABLE 8-bit TRANSFERS. Ага, было дело... Только не работало почему-то. Не вспомню щас, такая же комманда/код была или нет, но факт - 16 бит и все.
  15. AVR+HDD

    http://www.interfacebus.com/IDE_HardDrive_...escription.html старые стандарты ATA1 и ATA2 (более быстрые и не нужны для связи с AVR), поддерживают 8-ми битные данные. НЕ ВЕРЬТЕ! 8 бит можно в регистры комманд просунуть. Буфер данных - только по 16 бит. Этим наелись, когда к спектруму цепляли. Приходилось доп. буфер старшего байта ставить, иначе - никак.
  16. Да лично мне вполне все понятно. Есть какой-то дятел, который ничего, кроме того, к чему привык, вокруг себя не видит. При этом считается супер-пупер разработчиком. Вот и напугал человека. А человек - молодец, не повелся и не принялся кричать на всех углах то, что он от этого дятла услышал. Человек пошел и спросил у людей, как они думают. Они его и успокоили (в нормальном смысле). Заодно показали, что не надо всегда верить таким дятлам без проверки. Вот и все. PS Да, я знаю, гоню. Обидеть никого не хотел. Просто до боли знакомая ситуация, которая, к сожалению, очень часто встречается.
  17. У них очень много мест, где делать. ;О) В Европпе, Аммерике, Аззии. И техпроцессы, соотв. от 0.8, до 0.18мк. И находяцца в 30-ке крупнейших ПП производителей (по крайней мере, раньше находилсь). А это уже не децсад. ;О) Я понимаю, что по всему миру цеха. Я не об этом. Я про то, что если есть производство с высокими требованиями (военка), то остальное (коммерческое) производство - не в валенках и грязных тельниках, а недалеко (скорее всего, также) по качеству от первого (военного).
  18. Что могу сказать. Применяем в изделиях и AVR (центральный мозг) и PIC (периферийные датчики). Работает как то, так и другое. Теперь правда выбрасываем PIC и из периферии, так как сильно усложнились задачи обработки, PIC просто не справляется, не говоря уже о том, что как только программа, скажем, из дерганья лапами проца (тут и пичок нормально) превращается в что-то более умное (чуть-чуть 16-ти битной математики), то все, блац, на пике весь мозг себе обламаешь, пока напишешь и отладишь, да и в небольшой проц поместишь. Кроме того есть личное мнение (можете попинать ногами). Atmel делает военку, Microchip - нет. А теперь, внимание, вопрос. Как вы думаете, те линии у Atmel, на которых коммерческие вещи делают, мужики в грязных ватниках обслуживают и все тяп-ляп делают, или все же фирма все в одном месте делает? Или имеет два ОТДЕЛЬНЫХ производства? Я думаю, нет. Мысль понятна?
  19. Да, господа, по поводу __root прогнал. Конечно, __noreturn не имеет отношения к __root. Я больше имел в виду __task. Для EWAVR отличия вот в чем. __noreturn не сохраняет контекст. __task также не сохраняет контекст, но если вы вызываете процедуру с __task, контекст сохраняется в ВЫЗЫВАЮЩЕЙ процедуре. Точнее, даже не контекст сохраняется, а вызывающая процедура устраивается так, чтобы не зависеть от изменения контекста.
  20. Случай нормальный. Я довольно долго иар каждый месяц переставлял :) Посему выработана технология: 1. Сначала uninstall 2. Прочищаем реестр везде где IAR и Rainbow Technology (А это авторы защиты) 3. Теперь шаманство: удаляем в каталоге WINDOWS/SYSTEM32 сл. файлы: 07.05.2004 15:36 1 025 clauth1.dll 07.05.2004 15:36 1 025 clauth2.dll 08.06.2004 08:05 341 lsprst7.dll 08.06.2004 08:05 355 lsprst7.tgz 24.09.2002 09:32 131 672 msvcrt.dli 08.06.2004 08:05 73 ssprs.dll 08.06.2004 08:05 87 ssprs.tgz 07.05.2004 15:36 1 025 sysprs7.dll 07.05.2004 15:36 1 025 sysprs7.tgz 4. Натягиваем по новой и телемаркет. Кажись все.
  21. Подавляет не ret. Подавляет сохранение регистров. Но как-то отличается от __root. Особо не разбирался. По поводу гемороя с передачей значений как указатели. Используя такой метод (с __x_z) можно за раз передать в функцию не 8 (R16-R23), а 12 (R16,R23,X,Z) байт БЕЗ ИСПОЛЬЗОВАНИЯ СТЕКА. В некоторых случаях очень удобно и позволяет повысить производительность. Единственное, нельзя сделать функцию с _z в любой комбинации, если используется вызов данной функции по указателю.
  22. Cуществует и __z_x и __x_z - соответственно, как передавать первый и второй указатель. По поводу только указателей - если очень надо, преобразуй например int в void * и передай, а потом наоборот. На форуме "Точка опоры" я писал про недокумментированные фичи иара, всякие "__raw", "__no_return" и прочее. Поищи там, давненько дело было. Также есть еще SBRA и CBRA - это коммады какие-то AVR, иар их может использовать. Что за хрень - не знаю.
  23. ПИ - регулятор

    ... На ассемблере достаточно проверить бит OVF. Да вообщем и на С можно, например, для IAR, if (SREG_Bit3) .... Только аккуратно надо с этим, рекомендуется посматривать в листинг, чего он там компилирует. Я для TCP/IP так бит переноса проверял (для расчета CRC).
  24. Возьми быстродействующий тригер Шмидта серии 74HC - это раз. Включи в конфигурации ICP распознавание по 3 семплам (Noise Canceller) - это два. Грамотно было бы еще после прихода ICP блокировать его следующий приход на время, задаваемое из расчета минимального времени между изменениями входного сигнала. В сумме все эти методы должны помочь. PS И не забывай о конденсаторах по питанию.
  25. Есть, но 2 но. 1. На С - откомпилируй, например, иаром, и из листинга возьми асм-код 2. Считает от 1 янв 2000г, а в унихе 1 янв 1970, довольно просто лечится вычитанием/прибавлением константы к количеству секунд. // Количество дней на начало месяца __flash int DMonth[]={0,31,59,90,120,151,181,212,243,273,304,334,365}; // Преобразование времени и даты в количество секунд после 01-01-2000 00:00 unsigned long TimeDate2Long(char hrs, char min,char sec,char day,char mon,char yrs) { unsigned long iday; iday=365*yrs+DMonth[mon-1]+(day - 1); iday=iday+(yrs>>2); if (mon>2||(yrs&3)>0) iday++; return(sec+60*(min+60*(hrs+24* iday))); } // Печать даты и времени по количеству секунд с 01-01-2000 00:00 void PrintTimeDate(char *p, unsigned long x) { char sec,min,hrs,mon,yrs; unsigned int day,iday,day4,yrs4; sec=x%60; min=(x/60)%60; hrs=(x/3600)%24; iday=x/86400; yrs4=x/((4*365+1)*86400); day4=iday%(4*365+1); iday=(day4==(31+28)); if (day4>=(31+28)) day4--; yrs=(yrs4<<2)+day4/365; day=day4%365; mon=0; while (DMonth[++mon]<=day); day-=DMonth[mon-1]; if (iday) day++; day++; if (yrs>99) yrs=0; sprintf_P(p,(STR)"%02d:%02d:%02d %02d-%02d-%02d",hrs,min,sec,day,mon,yrs); }
×
×
  • Создать...