|
Порты AVR и компиляция |
|
|
|
Sep 26 2007, 15:26
|
Группа: Участник
Сообщений: 12
Регистрация: 19-05-07
Пользователь №: 27 828

|
Очень долго работал с разными МК(51, в основном ARM) решил попробовать AVR вопросы: У этих AVR что нет удобного побитового доступа к портам? Какой компилятор делает наиболее красивый код?
|
|
|
|
|
 |
Ответов
|
Sep 28 2007, 22:37
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(SasaVitebsk @ Sep 28 2007, 00:02)  Выпад по поводу данных в EEPROM и FLASH - явно бредовый. Удобная вещь - она всегда удобная.
Зачем мне для обращения к Flash переменной обращаться ч/з подпрограмму?
Это просто яркий пример как можно всё с ног на голову поставить. Давайте посмотрим, на Вашем любимом IAR: Код #include <string.h>
__eeprom char eeString[]="Prived !"; char String[10]="ABCDEFGHIJ";
int main(void) { memcpy(String, (void const *)eeString, 10); memcpy((void *)eeString, String, 10); return 0; } Скомпилируйте этот код и пройдитесь по нему отладчиком, я думаю что результат Вас сильно порадует, особенно второй memcpy P.S Тока не нужно мне рассказывать что этот пример высосан из пальца... Прямое преобразование типов конечно вставлено специально, тока где и когда Вы наткнетесь на такой результат в реальной программе будете знать тока Вы и Ваш доктор в дурке (после отладки такого кода)
|
|
|
|
|
Sep 29 2007, 11:54
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(singlskv @ Sep 29 2007, 01:37)  P.S Тока не нужно мне рассказывать что этот пример высосан из пальца... Прямое преобразование типов конечно вставлено специально, тока где и когда Вы наткнетесь на такой результат в реальной программе будете знать тока Вы и Ваш доктор в дурке (после отладки такого кода)  Ок, аналогичный пример: Код char Str[]="Hello"; char SomeChar; int main(void) { memcpy( (void *)SomeChar, Str, sizeof(Str)); } Проблема здесь та же самая что и в вашем примере, и даже без переменных в eeprom. Поэтому можете также вместе с доктором ковырять и этот код. Ибо когда нет понимания, что происходит в программе и что может происходить - забудьте про (void *).
|
|
|
|
|
Sep 29 2007, 17:21
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(defunct @ Sep 29 2007, 15:54)  Ок, аналогичный пример: Код .................... Проблема здесь та же самая что и в вашем примере, и даже без переменных в eeprom. Ну все таки не совсем одно и тоже, я свой пример показал только с точки зрения потенциально проблемной части в использовании __eeprom, а в вашем примере просто нарисован баг который из-за преобразования типов не смог поймать компилятор. Насколько я знаю, в стандарте С вобще нет такого типа void __eeprom *  А вот теперь представьте себе: Код __eeprom char eeString[]="Prived !"; char String[10]="ABCDEFGHI"; int Int=1; long Long=2;
typedef struct { void *ptr; int size; } SomeData;
SomeData* MassivHrenZnaetSKakimiDannimy[10]; ...................... { MassivHrenZnaetSKakimiDannimy[0].ptr = eeString; MassivHrenZnaetSKakimiDannimy[0].size = sizeof(eeString); MassivHrenZnaetSKakimiDannimy[1].ptr = String; MassivHrenZnaetSKakimiDannimy[1].size = sizeof(String); MassivHrenZnaetSKakimiDannimy[2].ptr = ∬ MassivHrenZnaetSKakimiDannimy[2].size = sizeof(Int); MassivHrenZnaetSKakimiDannimy[3].ptr = &Long; MassivHrenZnaetSKakimiDannimy[3].size = sizeof(Long); ............................. ............................. ............................. memcpy(KudatoTam, MassivHrenZnaetSKakimiDannimy[x].ptr, MassivHrenZnaetSKakimiDannimy[x].size); .......................... .......................... } Хрен знает какие данные оказались не совсем хрен знает какими, а все по тому что кое кто придумал свой новый тип данных... __eeprom xxx
|
|
|
|
|
Sep 29 2007, 22:09
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(singlskv @ Sep 29 2007, 20:21)  Насколько я знаю, в стандарте С вобще нет такого типа void __eeprom *  Мы не обсуждали портируемость. В других компиляторах нет eeprom_write_byte();, а в некоторых процессорах нет eeprom  Цитата(singlskv @ Sep 29 2007, 20:21)  А вот теперь представьте себе: Код MassivHrenZnaetSKakimiDannimy[0].ptr = eeString; Получаем ошибку компилятора о несоответствии типов. Ту самую, которую в предыдущем примере вы задавили явным приведением к (void *). Ту самую, которую вы получите в WinAVR, если попытаетесь присвоть (void *) переменную типа (void EEMEM *) или prog_void. Цитата(singlskv @ Sep 29 2007, 21:42)  Где в этой проге можно написать cfg_EE = cfg_RAM ? Не поверите - именно там, где надо сохранить данные. Компилятор подставит для каждого байта вызов __eeput8_16, в котором именно там, где это необходимо будет запрет/разрешение прерываний. Поверьте, код будет практически идентичен eeprom_write_byte(), за которую вы агитируете. Для очень редких случаев есть вариант *((uint8_t *)&cfg_EE.Config.ParamA)[2] = byte; Что касается ресурса eeprom, то я не случайно взял конфиг - как наиболее общий случай, когда ресурса хватит даже самому пытливому пользователю. И не пытайтесь меня убедить, что я должен потратить лишнее время чтобы экономить ресурс там, где его и так с запасом - это все равно что агитировать писать на асме (со всеми вытекающими недостатками), чтобы втиснуть програму в 2к памяти при 8к на борту. Если же есть какие-либо специальные требования (ресурс, необходимость отслеживать окончание по прерыванию) - думать головой никто не отменял. Цитата(SergeiCh @ Sep 29 2007, 10:05)  Но лучше ( надеюсь, грамотные люди со мной согласятся) для конкретной задачи шевеления ногой писать макросы или online функции типа led_busy_on(), led_busy_off() и в коде использовать уже их. led_busy = 1, IMHO, хуже, разве что led_busy = ON  ... Почти согласен. Но писать для каждой ноги xxx_on(), xxx_off() - да, конечно так и делал раньше. Но теперь - on(LED); off(FLASH_CS); if(signal(KEY)) - тоже абсолютно портируемо на любой С-компилятор. И сгенеренный код будет идентичен тому, который надо написать вручную для xxx_on(); xxx_off();
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 29 2007, 22:36
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Сергей Борщ @ Sep 30 2007, 01:57)  Получаем ошибку компилятора о несоответствии типов. Ту самую, которую в предыдущем примере вы задавили явным приведением к (void *). Ту самую, которую вы получите в WinAVR, если попытаетесь присвоть (void *) переменную типа (void EEMEM *) или prog_void. Я даже и не сомневался что именно Вы укажите на это несоответствие  , этот код я даже и не пытался скомпилировать потому что очевидно одно из двух, если компилятор пропустит такой код, то все очень плохо и пользоваться __eeprom просто нельзя ни при каких обстоятельствах, а если не пропустит, то это говорит о том что типы которые придумал IAR(__eeprom xxx), Эээ... ну мягко говоря не являются таки типами..., по крайней мере в понимании С. Цитата Не поверите - именно там, где надо сохранить данные. Компилятор подставит для каждого байта вызов __eeput8_16, в котором именно там где это необходимо будет запрет/разрешение прерываний. Поверьте, код будет практически идентичен eeprom_write_byte(), за которую вы агитируете. Упс..., это где это я агитировал за использование eeprom_write_byte() ? Я этим ни разу не пользовался  У меня свои функции. Если Вас не затруднит ответьте таки конкретно на 2 моих вопроса из поста №37. Все равно не понимаю в чем Вы пытаетесь меня убедить. Цитата(sensor_ua @ Sep 30 2007, 02:21)  Код /* Wait for completion of previous write */ while(EECR & (1<<EEWE)); В том что я обязан висеть в этом цикле пока не закончится запись ? У меня это выглядит примерно так: Код //============================================================== // Автомат записи в EEPROM //============================================================== void EepromRun() {
if (EECR & (1<<EEWE)) return; // идет запись ? да, тогда отваливаем (другие дела)
if (CurrState == EE_FREE) { ................................... ...................................
} Цитата Запись заканчивается не сразу после засылки адреса и данных а после АППАРАТНОЙ записи - для мега16 это 8.5 ms типовое значение. Или Вы хотите сказать, что, буквы EEMEM автоматом вдруг делают неожидающей встроенную функцию static inline void __attribute__ ((always_inline)) eeprom_write_byte (uint8_t *addr,uint8_t value); ? (Может, она случайно  и неожидающая, но тогда ею пользоваться низзя) А не пробовали посмотреть, во что раскладывается аналогичная операция у IAR? Дык тоже инлайновый вариант. Если не используем встроенные функции или модификаторы, а боремся за отсутствие ожиданий при работе с EEPROM, то пример задачи не к месту - в обоих случаях нужно писать СВОЁ. Я НЕ пользуюсь ни IARовским ни каким другим вариантом доступа к EEPROM. У меня есть свой хорошо работающий автомат записи.
|
|
|
|
|
Sep 29 2007, 23:56
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(singlskv @ Sep 30 2007, 01:36)  Упс..., это где это я агитировал за использование eeprom_write_byte() ? Я этим ни разу не пользовался  У меня свои функции. Если речь идет о задаче-драйвере записи eeprom, то что мешает внутри нее использовать уже готовые механизмы компиляторов, e.g.: Код void EEPROM_Dispatch(void) { if (EECR & (1<<EEWE)) return; .... if (*(__eeprom U8 *)адрес != data to write) *(__eeprom U8 *)адрес = data to write; } Если вы даже не удосужились посмотреть и разобраться с кодом eeprom_read_byte()/eeprom_write_byte() пакета в котором работаете, и начали сразу городить что-то свое, то спорить с вами о возможностях IAR просто бесполезная трата времени. Цитата Я НЕ пользуюсь ни IARовским ни каким другим вариантом доступа к EEPROM. У меня есть свой хорошо работающий автомат записи. Порой глупо из-за какого-то принципа не пользоваться уже имеющимися механизмами. К тому же они нисколько не помешали бы вашему автомату, а наоборот сделали бы его более прозрачным/читаемым.
|
|
|
|
|
Sep 30 2007, 18:32
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(defunct @ Sep 30 2007, 03:56)  Если речь идет о задаче-драйвере записи eeprom, то что мешает внутри нее использовать уже готовые механизмы компиляторов, e.g.: Воспользовался Вашим советом: Код __eeprom unsigned char a=1; unsigned char b;
void SomeFunc() { b=2; }
void EEPROM_Run() { if (EECR & (1<<EEWE)) return; if (a != b) a=b; }
int main(void) { SomeFunc(); EEPROM_Run();
return 0; } IAR, получил 81 такт на выполнение EEPROM_Run(). Написал тоже самое(по функциональности) "ручками", скомпилировал на WinAvr и на IAR, и там и там получил 33 такта. (во всех случаях использовалась максимальная оптимизация) Если Вас устраивает такой оверхед - пользуйтесь, меня не устраивает. У меня для этого автомата максимальное время каждой стадии его работы чуть боле 100 тактов, при этом поддерживается запись в два блока памяти(копии) и попутно подсчет/сравнение СRC16 c уведомлением основной проги если были ошибки... Цитата Если вы даже не удосужились посмотреть и разобраться с кодом eeprom_read_byte()/eeprom_write_byte() пакета в котором работаете, и начали сразу городить что-то свое, то спорить с вами о возможностях IAR просто бесполезная трата времени. Вы знаете, именно так и поступаю, сначала ознакомление со штатными средствами, если меня устраивает, пользуюсь штатными, если нет, пишу свою реализацию. Кстати вот вам и примерчик: CRC16 и CRC8 CRC16 - пользуюсь встроенным, поскольку после изучения кода стало понятно что я просто ничего не смогу выиграть. CRC8 - очень медленно (для моих задач) , пользуюсь своим вариантом, причем их 2 на выбор, если памяти много - табличный, мало - другой быстрый вариант. Цитата Порой глупо из-за какого-то принципа не пользоваться уже имеющимися механизмами. К тому же они нисколько не помешали бы вашему автомату, а наоборот сделали бы его более прозрачным/читаемым. Понятнее...,но в 2,5 раза медленнее Принципы здесь не при чем. Цитата(Сергей Борщ @ Sep 30 2007, 11:59)  Ну, раз вы агитируете за WinAVR и доступ функциями, раз вы нигде до этого не упомянули, что вами используется закат солнца вручную - телепатически я сделал вывод, что вы агитиреуте за реализованный в avr-libc метод. Согласен, нужно было не расчитывать на телепатию собеседников и чуть пораньше объяснить что я имею в виду. А "закат солнца вручную" иногда очень эфективный метод  Цитата Это является расширением языка. Нормальные типы, ибо поддерживают все операции над данными - арифметику, присваивание, взятие адреса, обращение по указателю. Указатели на эти типы полностью аналогичны указателям на данные с __attribute__(("progmem")) и __attribute__(("EEPROM")), против которых (так получается) вы нас агитируете. Причем последние, в отличие от ИАРовских, не являются полноценными типами, ибо поддерживают только операцию взятия адреса и арифметику указателей. ИМХО, это не нормальные типы, и мои примеры это показали. Невозможность автоматического приведения указателя на такой тип к void* говорит именно о том что тип неполноценен. Считаю подход WinAvr(Gcc) в данном случае просто более честным. Цитата Но, извините, а вы эти данные только пишете, и никогда не читаете? Чаще конечно пишу, чтение в основном при первоначальной загрузке параметров. Но иногда нужно и чтение в процессе работы, поэтому чтение тоже интегрированно в этот автомат. Цитата Если все же читаете, то что мешает использовать простые и удобные встроенные возможности компилятора? Когда нужно быстро, пользоваться своим, а когда нужно медленно, то пользоваться библиотекой ? А зачем мне плодить сущности и увеличивать код ? Цитата Так я же и писал, что бывают случаи, когда надо работать головой и использовать нештатные решения. Но это не повод отказываться от удобных возможностей в остальных случаях. У меня такие случаи в каждом первом проекте.  Всегда нужно чего-нить писать во время основной работы...
|
|
|
|
|
Sep 30 2007, 19:30
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(singlskv @ Sep 30 2007, 21:32)  А "закат солнца вручную" иногда очень эфективный метод  Согласен, если выбора нет. А если он есть - смотря какой именно из парамеров оптимизировать  Цитата(singlskv @ Sep 30 2007, 21:32)  Невозможность автоматического приведения указателя на такой тип к void* говорит именно о том что тип неполноценен. Не готов сразу ответить. "Чистый" С вообще не знает про разные адресные пространства. Да и как вы физически представляете приведение указателя на одно адресное пространство к указателю на другое? Только используя __generic указатели, что хоть и влечет дикий оверхед, но тем не менее реализовано в IAR. Цитата(singlskv @ Sep 30 2007, 21:32)  Считаю подход WinAvr(Gcc) в данном случае просто более честным. На самом деле он просто не доделан  А пока он не только не честный, но как раз наоборот: Код uint8_t EEMEM EE_data; uint8_t PROGMEM Const[] = "Tipa test"; void Test() { uint8_t Tmp; Tmp = Const[0]; EE_data = Tmp; } На фоне того, что такое компилируется молча и без ошибок тот факт, что на самом деле копирование происходит из ОЗУ в ОЗУ по совпадающим адресам кажется несущественным. Допустить такую ошибку гораздо проще (сам наступал), чем нарваться на случай, когда критично время записи в eeprom или ее ресурс. Тут четко видна недоделанность, ибо попытка присвоить что-либо Const все же вызывает сообщение об ошибке "попытка записи в read-only". Цитата(singlskv @ Sep 30 2007, 21:32)  Чаще конечно пишу, чтение в основном при первоначальной загрузке параметров. И при этом данные, которые вы читаете, всегда представляют набор байтов? Не int, long, float, структуры, а именно голые байты? Если же данные осмысленны, то почему не воспользоваться предоставляемыми компилятором средствами? Цитата(singlskv @ Sep 30 2007, 21:32)  Когда нужно быстро, пользоваться своим, а когда нужно медленно, то пользоваться библиотекой ? Честно говоря, так бы и поступил. Ибо встроенные методы дают более читаемый код. И чем больше читаемого кода в программе, тем меньше вероятность ошибки. Цитата(singlskv @ Sep 30 2007, 21:32)  А зачем мне плодить сущности и увеличивать код ? Ну хорошо, наэкономите 40 байт памяти, а смысл, если ее все равно осталось полкило а то и больше? Читаемость упала, возможностей оптимизации у компилятора меньше. Ясное дело, если утаптываем, то резать придется везде. Цитата(singlskv @ Sep 30 2007, 21:32)  У меня такие случаи в каждом первом проекте.  Всегда нужно чего-нить писать во время основной работы... "У каждого есть свои маленькие недостатки" (с)"В джазе только девушки". Цитата(SasaVitebsk @ Sep 30 2007, 22:17)  В ближайшее время пойдёт xmega. Как уже объявлено, там будет память EEPROM в общем адресном пространстве. Я думаю IAR сохранит __eeprom. Таким образом портируемость программ у тех, кто использовал __eeprom - не пострадает. Даже если не сохранит - портируемость достигнется добавлением строчки #define __eeprom
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 30 2007, 20:04
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Сергей Борщ @ Sep 30 2007, 23:30)  На самом деле он просто не доделан  А пока он не только не честный, но как раз наоборот:[code] EEMEM PROGMEM На фоне того, что такое компилируется молча и без ошибок тот факт, что на самом деле копирование происходит из ОЗУ в ОЗУ по совпадающим адресам кажется несущественным. Допустить такую ошибку гораздо проще (сам наступал), чем нарваться на случай, когда критично время записи в eeprom или ее ресурс. Тут четко видна недоделанность, ибо попытка присвоить что-либо Const все же вызывает сообщение об ошибке "попытка записи в read-only". Здесь мы видимо принципиально по разному подходим к вопросу. EEMEM, PROGMEM я типами данных просто не считаю. Это, по моему мнению, просто те расширения компилятора которые позволяют отводить/инициализировать область в eeprom/flash. + взятие адреса для выяснения куда писать. Все. Собственно в описании к avr-lib их тока так и предполагается использовать. Цитата И при этом данные, которые вы читаете, всегда представляют набор байтов? Не int, long, float, структуры, а именно голые байты? Автомат оперирует на уровне блока байтов + CRC. Цитата Если же данные осмысленны, то почему не воспользоваться предоставляемыми компилятором средствами?Честно говоря, так бы и поступил. Ну хорошо, наэкономите 40 байт памяти, а смысл, если ее все равно осталось полкило а то и больше? Читаемость упала, возможностей оптимизации у компилятора меньше. Ясное дело, если утаптываем, то резать придется везде. Ну видимо у нас все-таки сильно разные задачки... Цитата Даже если не сохранит - портируемость достигнется добавлением строчки #define __eeprom Кстати о портируемости  , мой вариант кода эквивалентный коду из поста №54 скомпилировался без вопросов и на Gcc и на IAR
|
|
|
|
Сообщений в этой теме
allexmor Порты AVR и компиляция Sep 26 2007, 15:26 defunct Цитата(allexmor @ Sep 26 2007, 18:26) У э... Sep 26 2007, 16:01 Marian Цитата(allexmor @ Sep 26 2007, 18:26) Оче... Sep 26 2007, 16:38 kv_addr Цитата(Marian @ Sep 26 2007, 19:38) CVAVR... Sep 27 2007, 20:15 sensor_ua Цитататакого гонива как потребность применять 2 ко... Sep 26 2007, 16:48 defunct Цитата(sensor_ua @ Sep 26 2007, 19:48) Wr... Sep 26 2007, 22:19  allexmor Цитата(defunct @ Sep 27 2007, 02:19) Ну..... Sep 27 2007, 04:51 bodja74 Зато сразу IOPIN=0x5555AAAA; Sep 26 2007, 17:32 sensor_ua Фаворит IAR. WinAVR вполне юзабилен, но когда нужн... Sep 27 2007, 05:04 allexmor Цитата(sensor_ua @ Sep 27 2007, 09:04) Фа... Sep 27 2007, 05:08  alexander55 Цитата(allexmor @ Sep 27 2007, 09:08) Где... Sep 27 2007, 05:49 mdmitry WinAvr(gcc)+Eclipse - хорошая бесплатная связка дл... Sep 27 2007, 06:27 IJAR IMHO: После IAR другие компиляторы даже пробовать... Sep 27 2007, 06:51  defunct Цитата(IJAR @ Sep 27 2007, 09:51) IMHO: ... Sep 27 2007, 08:56   Qwertty Цитата(defunct @ Sep 27 2007, 12:56) Ну п... Sep 27 2007, 12:58    defunct Цитата(Qwertty @ Sep 27 2007, 15:58) Ну д... Sep 27 2007, 13:10     singlskv Цитата(defunct @ Sep 27 2007, 17:10) Вы х... Sep 27 2007, 14:48      defunct Цитата(singlskv @ Sep 27 2007, 17:48) А к... Sep 27 2007, 15:14       singlskv Цитата(defunct @ Sep 27 2007, 19:14) Отли... Sep 27 2007, 15:27        defunct Цитата(singlskv @ Sep 27 2007, 18:27) eeC... Sep 27 2007, 15:33         singlskv Цитата(defunct @ Sep 27 2007, 19:33) Это ... Sep 27 2007, 16:32     Qwertty Цитата(defunct @ Sep 27 2007, 17:10) Вы х... Sep 27 2007, 16:23    Сергей Борщ Цитата(Qwertty @ Sep 27 2007, 15:58) Ну д... Sep 27 2007, 14:23     Qwertty Цитата(Сергей Борщ @ Sep 27 2007, 18:23) ... Sep 27 2007, 16:36      singlskv Цитата(Qwertty @ Sep 27 2007, 20:36) Знач... Sep 27 2007, 17:49      Сергей Борщ Цитата(Qwertty @ Sep 27 2007, 19:36) Ну-н... Sep 28 2007, 08:27       Marian Цитата(Сергей Борщ @ Sep 28 2007, 11:27) ... Sep 28 2007, 15:16 GDI В CodeVision можно сделать несколько файлов в прое... Sep 27 2007, 09:09    defunct Цитата(singlskv @ Sep 29 2007, 20:21) Ну ... Sep 29 2007, 19:47     singlskv Цитата(defunct @ Sep 29 2007, 23:47) Да и... Sep 29 2007, 20:15      defunct Цитата(singlskv @ Sep 29 2007, 23:15) e=k... Sep 29 2007, 20:20       singlskv Цитата(defunct @ Sep 30 2007, 00:20) Ну и... Sep 29 2007, 20:30        defunct Цитата(singlskv @ Sep 29 2007, 23:30) [i]... Sep 29 2007, 20:40         singlskv Цитата(defunct @ Sep 30 2007, 00:40) Для ... Sep 29 2007, 20:58        SasaVitebsk Цитата(singlskv @ Sep 30 2007, 21:32) Вос... Sep 30 2007, 19:17      Сергей Борщ Цитата(singlskv @ Sep 30 2007, 01:36) а е... Sep 30 2007, 07:59       Qwertty Цитата(Сергей Борщ @ Sep 30 2007, 11:59) ... Sep 30 2007, 12:13        Proton Цитата(Qwertty @ Sep 30 2007, 19:13) Но в... Sep 30 2007, 12:42     Dog Pawlowa Цитата(Сергей Борщ @ Sep 30 2007, 01:09) ... Sep 30 2007, 18:38      singlskv Цитата(Dog Pawlowa @ Sep 30 2007, 22:38) ... Sep 30 2007, 18:44       Dog Pawlowa Цитата(singlskv @ Sep 30 2007, 21:44) Вы ... Oct 1 2007, 11:56      defunct Цитата(Dog Pawlowa @ Sep 30 2007, 21:38) ... Sep 30 2007, 22:44     Непомнящий Евгений to Сергей Борщ
Подскажите, а зачем нужна обвязка и... Oct 1 2007, 10:38      Сергей Борщ Цитата(Непомнящий Евгений @ Oct 1 2007, 13... Oct 1 2007, 11:16       defunct Цитата(Сергей Борщ @ Oct 1 2007, 14:16) К... Oct 1 2007, 11:36        Сергей Борщ Цитата(defunct @ Oct 1 2007, 14:36) Подро... Oct 1 2007, 11:51     SergeiCh Цитата(Сергей Борщ @ Sep 30 2007, 05:09) ... Oct 1 2007, 11:55  Сергей Борщ Цитата(singlskv @ Sep 29 2007, 01:37) Пря... Sep 29 2007, 12:46   singlskv Цитата(Сергей Борщ @ Sep 29 2007, 16:46) ... Sep 29 2007, 18:42 mdmitry Увы! Началась религиозная война!
По поводу... Sep 27 2007, 20:51 SasaVitebsk Преимущества они и в Африке преимущества.
Вы пре... Sep 28 2007, 23:06 SergeiCh Если хочется писать PORTB_0 = 1, это можно сделать... Sep 29 2007, 07:05 sensor_ua ЦитатаIAR дает нам простой инструмент доступа
Заме... Sep 29 2007, 19:56 sensor_ua ЦитатаГде в этой проге можно написать cfg_EE = cfg... Sep 29 2007, 21:05 singlskv Цитата(sensor_ua @ Sep 30 2007, 01:05) та... Sep 29 2007, 21:26 sensor_ua ЦитатаЯ НЕ пользуюсь ни IARовским ни каким другим ... Sep 29 2007, 23:01 sensor_ua ЦитатаEEMEM, PROGMEM я типами данных просто не счи... Oct 1 2007, 05:17 Rst7 Кстати, между прочим, переделав eeprom.s90 наприме... Oct 1 2007, 13:41 SasaVitebsk Цитата(Rst7 @ Oct 1 2007, 16:41) Кстати, ... Oct 1 2007, 18:04  Rst7 Цитата(SasaVitebsk @ Oct 1 2007, 21:04)
... Oct 2 2007, 06:42   SasaVitebsk Цитата(Rst7 @ Oct 2 2007, 09:42) Ээээ... ... Oct 2 2007, 11:39    Rst7 Цитата(SasaVitebsk @ Oct 2 2007, 14:39) Я... Oct 2 2007, 11:57 singlskv Цитата(Rst7 @ Oct 1 2007, 17:41) Кстати, ... Oct 2 2007, 18:06  Непомнящий Евгений Цитата(singlskv @ Oct 2 2007, 22:06) Може... Oct 3 2007, 04:22 sensor_ua ЦитатаБыла идея патчить кодегенератор, дабы он дел... Oct 2 2007, 14:18 Rst7 Цитата(sensor_ua @ Oct 2 2007, 17:18) Пыт... Oct 3 2007, 05:38 sensor_ua ЦитатаМожет все-таки стоит в подобных ситуациях оз... Oct 2 2007, 19:38 singlskv Цитата(sensor_ua @ Oct 2 2007, 23:38) А ... Oct 2 2007, 20:08 sensor_ua ЦитатаКак сохранить текущую конфигурацию прибора п... Oct 2 2007, 20:32 singlskv Цитата(sensor_ua @ Oct 3 2007, 00:32) Оза... Oct 2 2007, 20:56  defunct Цитата(singlskv @ Oct 2 2007, 23:56) Если... Oct 2 2007, 21:44  sensor_ua Цитата(singlskv @ Oct 2 2007, 23:56) Я и ... Oct 3 2007, 05:16 sensor_ua Цитатаон генерирует комманду записи в RAMPx, ее мо... Oct 3 2007, 06:58
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|