Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
29.11.2008, 05:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
УЧЕБНЫЙ ПРОЭКТ.
Потому как постоянно возникают вопросы у новичков во прсы по Си. (меня например).
Есть идея.
Создать УЧЕБНЫЙ ПРОЭКТ... отдельно для каждого компилятора и по каждому МК (PIC AVR ARM). В котором каждый мог бы добавлять свои участки кода. Описывать не функцию в целом, а только ОТДЕЛЬНЫЕ ПРИЁМЫ применения команд языка или компилятора. С подробными коментариями...
Для примера... (выдрал с форума Микрочип.Su)
Код:
|
//выборка из 16 битной переменой а, LOW и HIGH части
void LowHigh(unsigned int a)
{
unsigned char l;//объявим переменную для младшей части
unsigned char h;//объявим переменную для старшей части
l=(unsigned char)a;//перегрузим младшую часть
h=(unsigned char)(a››8);//перегрузим старшую часть
} |
Можно было бы дописывать в файл ПРОЭКТА вопросы, и по свободе кто то бы мог отвечать на те которые хочет/может. Ответов могло бы быть несколько на каждый. Ведь возможны разные варианты. Выбирать оптимальный.
Может и бредовая идея. Но мне бы сейчас пригодилась...
А сам бы мог писать по АСМ )))
Этот вопрос конечно не к тем кому это было бы, а к тем кто бы мог отвечать.. Будет ли у них желание ))))
А Вот и вопрос 1.
Идея, после вызофа функции проверять флаг Z или С, что бы не организовывать специальный флаг, А по флагу Z или C определять, функция отработала нормально или с ошибкой. Или эт невозможно? Неизвестно как компилятор фрмирует возврат из функции????? флаги Z С могут портится.
Код:
|
//пример со специальным флагом
void READINTEEPADRBUSY(address,value,eebusy)//чтение из ячейки внутренней епром, по адресу с проверкой если не занята
{
if(WR=0);
{
EEADR=address;
value=EEPROM_READ(void);
eebusy=0;
}
else eebusy=1;
}
//пример с флагом с(z)
void READINTEEPADRBUSY(address,value)//чтение из ячейки внутренней епром, по адресу с проверкой не занята
{
if(WR=0);
{
EEADR=address;
value=EEPROM_READ(void);
C=0;или Z
}
else C=1;или Z
}
//вызывающая процедура
if READINTEEPADRBUSY(address,value,eebusy)=1
{
cuntereeprom++
}
вопрос 2:
//как правильно написать декремент счётчика с проверкой на 0, так?
if (cunterroreeprom--)=0;
{
erroreeprom=1
} |
С уважением, спасибо за внимание )))))
|
|
|
|
29.11.2008, 12:41
|
|
Временная регистрация
Регистрация: 06.12.2007
Сообщений: 91
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Вместо этого
Код:
|
//выборка из 16 битной переменой а, LOW и HIGH части
void LowHigh(unsigned int a)
{
unsigned char l;//объявим переменную для младшей части
unsigned char h;//объявим переменную для старшей части
l=(unsigned char)a;//перегрузим младшую часть
h=(unsigned char)(a››8);//перегрузим старшую часть
} |
Код:
|
unsigned char lo,hi;
union
{
struct{
unsigned char lo;
unsigned char hi;
}bt;
unsigned int a;
}un1;
un1.a=0x1234;
lo=un1.bt.lo;//0x34
hi=un1.bt.hi;//0x12 |
Если есть необходимость в массиве интовских чисел, то просто объявляете то же самое через массив.
Код:
|
typedef union
{
struct{
unsigned char lo;
unsigned char hi;
}bt;
unsigned int a;
}un1;
un1 un[5];
un[0].a=0x1234;
un[1].a=0x5678;
lo=un[0].bt.lo; |
Очень удобно, когда разнородные данные нужно отправить через уарт.
Далее - битовые переменные для мелкокомпиляторов - это исключение, а не правило. всякие там зеро и карри допускаются только в хайтеке. И обозначаются CARRY и т.д. По-нормальному их лучше не юзать. Если нужно использовать битовые переменные, обозначайте их как часть структуры. Если хотите обнулить сразу все одной командой, опять используйте юнионы
Код:
|
union
{
struct{
unsigned flag1:1;
unsigned flag2:1;
unsigned free:6;
}flag;
unsigned char bit_pole;
}un1;
#define test un1.flag.flag1
#define clear_flagi() un1.bit_pole=0;
test=1;
clear_flagi(); |
Код:
|
вопрос 2:
//как правильно написать декремент счётчика с проверкой на 0, так?
if (cunterroreeprom--)=0;
{
erroreeprom=1
} |
Неправильно. Я даже не говорю о том, что вместо оператора сравнения стоит присваивание. Дело в том, что переменная уже может быть равна 0, делая декремент, результат сравнения уже не будет равным 0.
Правильнее вначале проверить на равно 0, а затем, в зависимости от результата, что-то делать.
Код не привожу, он тривиальный.
__________________
разум когда-нибудь победит... (с)
|
|
|
|
29.11.2008, 13:16
|
|
Временная регистрация
Регистрация: 06.12.2007
Сообщений: 91
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Прошу прощения, я ошибся. Существует такая вещь, как префикс и постфикс - порядок выполнения выражения. В Вашем случае правильно - сначала выполняется сравнение, а затем идет декремент.
Т.е
Код:
|
unsigned char ta;
ta=0;
if(--ta ==0)
{
ta=2;
}
// неправильно, сначала идет декремент, а затем сравнение |
Код:
|
unsigned char ta;
ta=0;
if(ta-- ==0)
{
ta=2;
}
// правильно, сначала идет сравнение, а затем декремент |
__________________
разум когда-нибудь победит... (с)
|
|
|
|
29.11.2008, 13:44
|
|
Прописка
Регистрация: 31.03.2005
Сообщений: 223
Сказал спасибо: 25
Сказали Спасибо 20 раз(а) в 14 сообщении(ях)
|
Всем привет! К сожалению пока ничем интересным поделиться не могу, так как программирую весьма средне, но хочу поделиться интересной информацией. На сайте 8052.com в разделе Code Library реализовано нечто подобное. Может быть взять это за основу? Только вот кто этим будет заниматься? Удачи!
|
|
|
|
29.11.2008, 14:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Сообщение от user_ushastyj
|
Прошу прощения, я ошибся. Существует такая вещь, как префикс и постфикс - порядок выполнения выражения. В Вашем случае правильно - сначала выполняется сравнение, а затем идет декремент.
|
У меня выполнение процедуры идёт после её инициализации, а нициализация устанавливает счётчик.
Так что не сильно принципиально, хотя, в общем случае это правильнее.. проверка перед декрементом.
Спасибо Вам, изучу. Мне на примерах всегда проще чем выуживать из описания.
Сообщение от Grey_Cat
|
На сайте 8052.com в разделе Code Library реализовано нечто подобное. Может быть взять это за основу? Только вот кто этим будет заниматься? Удачи!
|
Те же что и отвечает на ПОСТЫ. Идея в том что бы не разбрасывать по всем веткам, а собирать в ОДНОМ месте, и в том что бы оставлять только ЦЕНУЮ информацию, удаляя расуждения. Например кто то добавил вопрос. А кто то отвечяя, пишет ниже.
Типа FAQ. По каждому МК или компилятору в одном файле. Файл бы находился ПО одной ссылке. Примерно как в ВИКИПЕДИИ. Но наверное движок сайта не позволит так.
Для себя уже начал Собирать примеры в файл...
|
|
|
|
29.11.2008, 20:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Сообщение от picavr
|
Типа FAQ. По каждому МК или компилятору в одном файле.
|
Одним файлом FAQ по AVR PIC CVAVR WinAVR IAR Си - скачать:
http://avr123.nm.ru/avrfaq.rar
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
29.11.2008, 21:53
|
|
Временная регистрация
Регистрация: 12.01.2008
Сообщений: 96
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Для начала стоит ответить на вопрос, как писать слово проЕкт...
|
|
|
|
29.11.2008, 22:09
|
|
Гражданин KAZUS.RU
Регистрация: 24.06.2005
Сообщений: 535
Сказал спасибо: 262
Сказали Спасибо 216 раз(а) в 118 сообщении(ях)
|
Сообщение от MAXvaLL
|
Для начала стоит ответить на вопрос, как писать слово проЕкт...
|
Как это все круто изменило!
|
|
|
|
29.11.2008, 23:34
|
|
Временная регистрация
Регистрация: 12.01.2008
Сообщений: 96
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Кроме шуток. В тексте допустимы любые ошибки, но заголовок должен быть идеален. Иначе с самого начала все это воспринимается как-то не серьезно.
Сорри за оффтоп.
Неужели еще нет нормальных фак'ов по пикам и аврам?!?! 8O
|
|
|
|
30.11.2008, 01:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Можно просто не обращать внимание на подобные посты. Может скучно человеку, или охота поупражнятся на клавиатуре...
Сообщение от MAXvaLL
|
Неужели еще нет нормальных фак'ов по пикам и аврам?!?!8O
|
Нуу.. если уже всё есть в Факах - зачем тогда Форум ?
Читайте факи...
А потому что ВСЁ ТЕЧЁТ - ВСЁ ИЗМЕНЯЕТСЯ..... возникают новые вопросы и новые ответы на старые вопросы....
А Собственно. при чём PIC и AVR?... в них и так понятно
..... было сказано о СИ.
В общем ясно.. народу это не нужно )))))))))
закрываем тему ))))) и мучаемся по одиночке )))
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:36.
|
|