Краткий Курс - программирование AVR - часть V

 
1 6 7 8 9 10 11 12
+
-
edit
 

aliens6

новичок
п1 не понял.
 

Здравствуйте!

2-й пункт уже сам додумал.
п1. Есть число 0x04 и число 0xf0 как их соединить, чтобы получилось 0xf4

Вот сегодня появились еще вопросики:
1.Можно ли с помощью функции printf
вывести переменную в бинарном виде?
И где добыть таблицу кодов?
И можно ли с помощью putchar передать
результат АЦП ? А то с printf получилось,
но много она в памяти места занимает.

2.Прерывание по получению байта по УСАРТу
срабатывает после автоматического получения байта?
т.е. не надо никак посторонне получать байт, или
же оно срабатывает после функции getchar?

Извините за глупые вопросы.
Спасибо!
 
+
-
edit
 

aliens6

новичок
Господа а вы не обращали внимание на пакет Proteus?
Он эмулирует все! и ход по коду тоже есть. Куча всяких стандартных библиотек. Пакет можно найти на kazus.ru
 
RU termostat #27.02.2005 12:58
+
-
edit
 

termostat

аксакал

Внимание обращали, но большинство постепенно приходят к отладке прямо в устройстве или на макетке.

Мне щас только CodeVisionAVR нужен и на ПК удобный логер отправщик COM порта - я использую "Ком порт тул кит" Голикова. метод отладки (только нач. идея) в задаче 06.

На VMLABе реально требуетя (мне и сейчас) эмуляция именно МК - и именно осцилограф, чтоб посмотреть правильность временных диапазонов при реализации каких либо протоколов, или что на ногах происходит.
RU termostat #27.02.2005 14:18
+
-
edit
 

termostat

аксакал

> aliens6
2-й пункт уже сам додумал.
 


Вот это правильней всего!

> aliens6
п1. Есть число 0x04 и число 0xf0 как их соединить,
чтобы получилось 0xf4
 


сложить +ом

(0x04 + 0xf0) будет 0xf4

> aliens6
1.Можно ли с помощью функции printf
вывести переменную в бинарном виде?
 


Похоже нет (по хелпу).

Можно сдвигом и вот этим: &= ~1;
(это обнуление всех бит кроме нулевого)

каждый бит числа:
- записать в переменную temp
- вывести например putchar(temp + 48);

советую между ниблами (4 бита) сделать
пробел или подчеркивание: putchar('_');

бедет гораздо читабельней, если это для глаз выводится.

> aliens6
И можно ли с помощью putchar передать
результат АЦП ? А то с printf получилось,
но много она в памяти места занимает.
 


Если именно "передать" кудато для машинной обработки
то putchar - это то что нужно, и

форматированый для удобного восприятия человеком
вывод с помощью printf бессмысленен.

Если хочешь читать эти данные на экране то для
этого printf придуман, хотя можно и putchar


Еще раз повторю: Зачем начинающему постоянно боятся что не хватает памяти?

Возмите Мегу16 за 3,5 бакса (или Мегу8 за 2,6 на худой конец) - и
перестаньте боятся:

- что вам не хватит памяти,
- что не хватит ног МК,
- что на новое изделие вам придется изучать новый АВР

Не думайте об этих ужасах, а думайте как вам сделать то,
что вам нужно!

МЕГА16 и ни каких гвоздей, зато будете ее знать вдоль и поперек!

А вывод на экран делай printf - я думаю это правильно, раз так
сделал автор CodeVisionAVR в примерах.

Если я не спец то он наверно понимает что-то в прогрмировании.

> aliens6
2.Прерывание по получению байта по УСАРТу
срабатывает после автоматического получения байта?
т.е. не надо никак посторонне получать байт, или
же оно срабатывает после функции getchar?
 


Если оно разрешено то возникает как поступил байт, если
запрещено то просто флаг возникает.

я писал выше что нужно создать приемный буфер, и getchar
будет брать из буфера данные, а ВАРТ будет сегда чист и
готов к приему.

Конфигурируй МК с помошью Визада - не ошибешься!

> aliens6
Извините за глупые вопросы.
Спасибо!
 


Не извиняйся.
Старайся давать больше информации в вопросе.

+
-
edit
 

aliens6

новичок
termostat> Если именно "передать" кудато для машинной обработки
termostat> то putchar - это то что нужно, и
termostat> форматированый для удобного восприятия человеком
termostat> вывод с помощью printf бессмысленен.

Сегодня попробовал. На отладчике получаю всякие буквы. Может я не правильно что делаю:
int temp;
temp=ADCW;
putchar(temp);

termostat> Еще раз повторю: Зачем начинающему постоянно боятся что не хватает памяти?
termostat> Возмите Мегу16 за 3,5 бакса (или Мегу8 за 2,6 на худой конец) - и
termostat> перестаньте боятся:
termostat> - что вам не хватит памяти,
termostat> - что не хватит ног МК,
termostat> - что на новое изделие вам придется изучать новый АВР
termostat> Не думайте об этих ужасах, а думайте как вам сделать то,
termostat> что вам нужно!
termostat> МЕГА16 и ни каких гвоздей, зато будете ее знать вдоль и поперек!

Просто хочется с самого начала учиться правильно, а то вдруг потом не хватит памяти из-за этого, переучиваться придется. Сейчас для экспериментов использую мега8, постепенно перехожу на мега16(плату пока делаю)

Кстати, никто не знает как WinAVR к AVRStudio прикрутить?
 
RU termostat #27.02.2005 22:47
+
-
edit
 

termostat

аксакал

aliens6 >
попробовал. На отладчике получаю всякие буквы:
int temp;
temp=ADCW;
putchar(temp);
 


у тебя в варт выводится младший байт результата, а отображается так
как начтроен TTY - включи десятичный вид отображения
прямо в "Контрол Пэнел" VMLAB.


aliens6 >
Просто хочется с самого начала учиться правильно,
а то вдруг потом не хватит памяти из-за этого, переучиваться придется.
 


Использование printf (как и лбой другой функции)
ПО назначению - является ПРАВИЛЬНЫМ.
не бойся ее.


aliens6 >
использую мега8, постепенно перехожу на мега16(плату пока делаю)
 


Правильно, Все на Мега16!!!

aliens6 >
как WinAVR к AVRStudio прикрутить?
 


Через .COF наверно.


Но почитай стр 3 курса:

"WinAVR - Этот компилятор позволяет из эмулятора VMLAB
- управлять компиляцией,
- отладкой с движением по исходному коду на Си,
- редактированием кода на Си,
- перекомпиляцией проекта после внесения правок.

Т.е. вы устанавливаете WinAVR в директорию "по умолчанию"
C:\WinAVR и больше с ним не общаетесь!

Все делается автоматически из эмулятора VMLAB версии 3.9 и старше,
от написания кода на Си и до окончательной отладки!

Нужно скачать только файл:
WinAVR-20030913-bin-install.exe

~19 Mb и инсталлировать WinAVR. "

в VMLAB есть пример, я проверял он работает.

SAA

втянувшийся

Jony>
Если не секрет какова габаритная мощность?
 

Jony> Это не то чтобы импульсник, нечто большее — преобразователь частоты на 320 кВт.

.....ь, колотить 8-[]

Jony> Есть желание в обозримом будущем облагородить конструкцию, (для справки, там только операционников полтары сотни, а логики…...). Агрегаты промышленные, широко используются и сейчас, но морально уже давно пенсионеры. Наладчики, не первые пять лет работающие с установкой, до конца не знают как там все работает.
Jony>
Смотри в СВЧ не уйди
 

Jony> Даже представить эдакую микроволновку страшно ж—). [»]

Эт точно!!! Аж по коже мороз. ж-)

Кусков от софт. ШИМа не нашел, но могу порассуждать с тобой вместе, что бы найти более менее приемлемый выход из ситуации.

Что необходимо знать точно: Пределы регулирования (хотя бы скважность min..max). Частоту следования (опять же допустимые отклонения). Как я делал:

Решил что таймер с 16 битным счетчиком будет основным и задающим ТM. Так как задавать скважностью достаточно нелегко, просто вычислил минимальную длительность и максимальную ширину импульса W в отсчетах таймера ТM и общий период коллебания T в отсчетах таймера ТM. Далее для каждой ступени регулирования (там где приходится менять значение делителя, так как для достижения очередной ступени регулирования нехватает диапазона текущей ступени) построил вручную таблицу (значение делителя, диапазон в УЕ ж-) для W). В основном цикле (если надо делать что то еще) использовал только одно-словные комманды переходов, таким образом снизил в цикле генерации импульсов ШИМ кол-во комманд на одну ж-)), отказался от push/pop каких бы то небыло регистров в цикле генерации за счет использования для чтения таблицы и прочих нужд ШИМ фиксированных регистров, запрещал прерывания внутри цикла ШИМ. Регулирование производил сл. образом - внутри любого диапазона уменьшением ширины площадки W, до тех пор пока он не выйдет за пределы диапазона для заданного делителя, если вышел меняю делитель (политику выбираешь сам, либо в конце генерации площадки W, Либо в конце периода T, либо в произвольный момент).

Если есть что обсуждать, что бы не засорять эху можно на мыло.



 

SAA

втянувшийся

Пробовал один и тот же пример в CodeVision и ICC, на мой взгляд ICC умнее, если так можно выразиться.

а) От CAVR похоже невозможно добиться передачи параметров в функцию через регитср? По крайне мере его хелп утверждает что передает параметр в функцию только через DataStack.

Ау знатоки CAVR я ошибаюсь?

б) ICC дает возможность использовать глобальные регистры, для размещения в них глобальных данных и передает параметры через регистры.


У обоих в тестовом примере с оптимизацией не лады.
Прекрасно видно из кода что параметр передаваемый в функцию ни где далее не используется и все равно ICC теряет несколько комманд на сохранение и восстановление его значения. Почему то оба пакета начисто игнорируют декремент и инкремент, заменяя его на вычитанием из регистра константы?

А ICC делает совершенно немыслимые акработические номера с таким вот выражением

while((!Code)&&(ptr < &fnt[6]))
{
if(((*ptr)&0x88)==0x88) Code--;
}

сначало есстесвенно прячет в середину тела цикла TST и посылает на него JMP, но перед этим ставит код для Code-- (SBI чего то там). После TST есстесвенно бранч. Нахрена, увеличил цикл на одну команду!!! Логичнее было сделать в начале процедуры TST и послать в бранч.
Кстати CAVR также выделывает кренделя.

Нужно отметить что у ICC гораздо меньше startup по сравнению с CAVR.
Слабовато на мой взгляд с оптимизацией, за несколько лет работы с OPEN WATCOM я привык к практически без избыточной трансляции кода на Си.
 
RU termostat #01.03.2005 12:54
+
-
edit
 

termostat

аксакал

Тут наверно не найти зантоков компиляторов,
возможно на телесистемах есть:


Телесистемы - миниатюрные аудио и видео устройства

Телесистемы - миниатюрные аудио и видео устройства

// telesys.ru
 



Я советую CodeVisionAVR не из-за того что хорошо
знаю его, а потому что МНЕ на нем удобно работать.

Типичный подход любителя который я советую и
начинающим - на первом месте удобство и простота.

Когда я хотел посмотреть в VMLAB что творится в
переменной, я размещал ее в определенном регистре:

register int beta @10;

переменная beta будет в регистрах 10 и 11.
RU termostat #01.03.2005 12:55
+
-
edit
 

termostat

аксакал

> khvostoff
Я пытаюсь освоить написание программ на Си для АВРов.
Я написал программку, которая делает "синусоиду" из двух половинок параболы.
Сделать синусоиду из функции sin не получается - в 2313 не хватет памяти!
 


Синосоиду обычно генерируют табличным методом.
Вычисляют таблицу значений пропорциональных действующему
напряжению на промежутках разбиения четверти или половины синусоиды.

Вот пример таблицы для синуса из апноута ADuC845

code text
  1. unsigned char sin_values[64][2]=
  2. {{0x07, 0xFF},{0x08, 0xC8},{0x09, 0x8E},{0x0A, 0x51},{0x0B, 0x0F},
  3. {0x0B, 0xC4},{0x0C, 0x71},{0x0D, 0x12},{0x0D, 0xA7},{0x0E, 0x2E},
  4. {0x0E, 0xA5},{0x0F, 0x0D},{0x0F, 0x63},{0x0F, 0xA6},{0x0F, 0xD7},
  5. {0x0F, 0xF5},{0x0F, 0xFF},{0x0F, 0xF5},{0x0F, 0xD7},{0x0F, 0xA6},
  6. {0x0F, 0x63},{0x0F, 0x0D},{0x0E, 0xA5},{0x0E, 0x2E},{0x0D, 0xA7},
  7. {0x0D, 0x12},{0x0C, 0x71},{0x0B, 0xC4},{0x0B, 0x0F},{0x0A, 0x51},
  8. {0x09, 0x8E},{0x08, 0xC8},{0x07, 0xFF},{0x07, 0x36},{0x06, 0x70},
  9. {0x05, 0xAD},{0x04, 0xEF},{0x04, 0x3A},{0x03, 0x8D},{0x02, 0xEC},
  10. {0x02, 0x57},{0x01, 0xD0},{0x01, 0x59},{0x00, 0xF1},{0x00, 0x9B},
  11. {0x00, 0x58},{0x00, 0x27},{0x00, 0x09},{0x00, 0x00},{0x00, 0x09},
  12. {0x00, 0x27},{0x00, 0x58},{0x00, 0x9B},{0x00, 0xF1},{0x01, 0x59},
  13. {0x01, 0xD0},{0x02, 0x57},{0x02, 0xEC},{0x03, 0x8D},{0x04, 0x3A},
  14. {0x04, 0xEF},{0x05, 0xAD},{0x06, 0x70},{0x07, 0x36}};
  15.  
  16. void main (void)
  17. {
  18.         while (1)
  19.         {
  20.                 int i;
  21.                 for ( i = 0 ; i < 64; i++)
  22.                 {
  23.                         DACH = values[i][0];
  24.                         DACL = values[i][1];
  25.                 }
  26.         }
  27. }


Обычно достаточно и по 1 байту на каждый момент времени.

=======

В VMLAB есть пример 3-х фазной синусоиды,
посмотри его: 3phase.prj (там спец. ошибка в таблице!)

еще пример для 2313 SINEWAVE.PRJ

=======

Ты можешь найти исходники в google по словам вместе:
"sine wave" main char include define while

Вобщем то, что ищешь + слова обязательно присутствующие в Си коде.


> khvostoff
ввод данных с регистра не получается! PIND всегда равен 1,
вне зависимости от того посадил я ножку на землю или нет!

DDRB = 0xFF;
PORTD = 0x01; // подтянул вывод младшего разряда PORTD
DDRD = 0x7E; // сделал младший разряд регистра PORTD входом, а остальные - выходами
 


У тебя "0" бит7 и бит0 а не только бит0 !

> khvostoff
i=PIND; // Это я пытаюсь присвоить значение
из регистра D целой переменной i
 


Возможно нужно оперировать со сначением не всего регистра а нужной тебе ножки?

> khvostoff
if(i=0) goto rew2;
//Это проверка 0 в регистре или нет,
//если 0 то надо проверять ещё раз
 


goto rew2; - ни когда не случится! потому что:

= в Си это не "равно" а присвоить то что справа от знака = тому что слева.

Нужно писать i==0 так же и && ||

посмотри по Си это:
"Руководство полного идиота - язык Си" - Богатырев
http://avr123.nm.ru/c_book.rar (25 Кб)


> khvostoff
PORTB=(i-32)*(i-32)/32;
 


Вместо деления на 32 используй сдвиг числа в право
на нужную степень двойки - 32 это 2 в 5-ой

PORTB=((i-32)*(i-32))>>5;

это быстрей, хотя возможно при оптимизации
компилятор так и делает.

Для умножения - сдвиг влево.


Советую использовать CodeVisionAVR и ATmega16 - это по моему опыту.
RU khvostoff #01.03.2005 20:25
+
-
edit
 

khvostoff

новичок
Большое спасибо!
Ошибка была в ==!
А синусоиду из парабол я делаю исключительно из учебных целей. В боевом варианте таблица синуса и косинуса хранится в ППЗУ, извлекается в начале программы в ОЗУ и уже оттуда циклически выводится шестиразрядными кодами в регистры D и B. Получается генератр синуса и косинуса одновременно. Но ту программу мне написал приятель на ассемблере для увеличения частоты, а теперь мне нужно создать программу обработки результатов измерений.

Спасибо ещё раз!
 
+
-
edit
 

Serge77

модератор

SAA> ICC делает совершенно немыслимые акробатические номера с таким вот выражением
while((!Code)&&(ptr < &fnt[6]))
{
if(((*ptr)&0x88)==0x88) Code--;
}

Долго смотрел на это вот выражение. Много думал. Не могу отделаться от мысли, что на месте ICC я бы завернул такой акробатический номер с тем, кто мне такое подсунул..... ;^)))))))))))))))))

Конечно, я безнадёжно испорчен Бэйсиком, но неужели все настоящие программисты мыслят вот такими выражениями? И это называется читабельным?
RU termostat #02.03.2005 00:09
+
-
edit
 

termostat

аксакал

Да вот и мне не нравится посты с такими абракадабрами.

Я когда такие вижу даже не пытаюсь разобраться.
Начинающий народ пугается наверно тоже.

А что делать? свобода слова как ни как. А я за нее.

SAA

втянувшийся


SAA>> ICC делает совершенно немыслимые акробатические номера с таким вот выражением
Serge77> while((!Code)&&(ptr < &fnt[6]))
Serge77> {
Serge77> if(((*ptr)&0x88)==0x88) Code--;
Serge77> }
Serge77> Долго смотрел на это вот выражение. Много думал. Не могу отделаться от мысли, что на месте ICC я бы завернул такой акробатический номер с тем, кто мне такое подсунул..... ;^)))))))))))))))))

Наверное ты прав ж-), сам раньше очень не любил подобные выражения, обожал Вирта и Паскаль... И знаешь не заметил (нужно было написать некое подобия ядра для защищенного режима, а делать это на асме для 0x86 было совсем отвратительно, выбрал С++, в реинкарнации от Open Watcom) как стал раздражаться от синтаксиса Паскаля (хотя Вирта до сих пор ценю и уважаю, но уже за Модулу и Оберон ж-)) и с удовольствием (хочу заметить с эстетическим!) загонял в одну строку, то что с полгода назад считал извратом. Крайности это тоже плохо, читабельности само-собой это не добавляет (даже для себя через 1,5 месяца). Так что это одназначно - плохо.

Serge77> И это называется читабельным?

Это смотря для кого, для компилятора он более удобен. Я вот подумал, подумал и надумал, скажи вот это код более читабелен:

#define ADDR_END &fnt[6];

Code++;
while(Code != 0) /// знаю Code > 0 более читабельно, но плохо оптимизируется!
{
if(((*ptr)&0x88) == 0x88) Code--;
ptr++;
if(ptr == ADDR_END) break;
}

Дома попробую откомпилить, может и ICC считает так же как и ты :):)

Serge77> Конечно, я безнадёжно испорчен Бэйсиком, но неужели все настоящие программисты мыслят вот такими выражениями? [»]

Я специально делал такие выражения, что бы помочь компилятору, т.е. ты не прав, если знать что делает компилятор с твоей строкой и стремится к тому что бы строка полностью без избытка легла в код, то нужно "разжевывать" компилятору на его языке, к этому приучаешься быстро ж-).


;-) Нет заматерелые Си программисты мыслят примерно так:

while((!(Code -= (int)(((*ptr)&0x88)==0x88))) && (++ptr < &fnt[6])) {};

Хотя компилятор при этом генерит вообще не производительный код, хотя бы из за тайпкастинга BOOL в INT.



 

SAA

втянувшийся

termostat> Да вот и мне не нравится посты с такими абракадабрами.
termostat> Я когда такие вижу даже не пытаюсь разобраться.
termostat> Начинающий народ пугается наверно тоже.
[»]

Зря ты так категорично. А если бы ты увидел DSSP или FORTH? Для меня сначало то же китайской грамотой казалось и злился много, но вот однажды вник и понял - определенный смысл в этих языках есть, а потенциал еще больший. Просто огромный потенциал, но писать на них нужно только проникнувшись идеологией до самого мозга костей.

Кстати желающие могут попробовать FORTH для AVR, таки лучший интерпретатор чем BASIC.

PFAVR — An ANS Forth Implementation for the Atmel AVR

Хотя, боже упаси, против BASIC ни чего против не имею.
 
RU termostat #02.03.2005 14:59
+
-
edit
 

termostat

аксакал


Serge77 > И это называется читабельным?
 


Нет, читабельным называется и таковым является Си код в
АпликешнНоутах и ДатаШитах на МК и в инструкции к компилятору.

В них надо смотреть как делать правильно!

SAA > Это смотря для кого, для компилятора он более удобен.
 


Наверно нужно человека на первое место ставить а
не компилятор, пусть для обучающихся будет удобней.

SAA >
Я вот подумал, подумал и надумал...

while(Code != 0) // знаю Code > 0 более читабельно,
// но плохо оптимизируется!
 


наверно можно так: while(Code){}
про оптимизацию не задумываюсь, и

советую НАЧИНАЮЩИМ не использовать оптимизацию компилятора!

потому что: при внесении изменений в программу компилятор
может изменить компиляцию других ее участков в попытке
крутой оптимизации.

А без оптимизации вы можете спокойно подгонять-проверять
работу программы по участкам.

SAA >
Я специально делал такие выражения, что бы помочь компилятору,

если знать что делает компилятор с твоей строкой и стремится к
тому что бы строка полностью без избытка легла в код, то

нужно "разжевывать" компилятору на его языке
 


А нафига тагда компилятор, чтоб "разжованое" переваривать?

Наверно кто умеет разжевать, зная как компилятор это в АСМе
изобразит, може сам на АСМе написать.

Нее... пусть копилятор поработает на 100%.



SAA >
;-) Нет заматерелые Си программисты мыслят примерно так:

while((!(Code -= (int)(((*ptr)&0x88)==0x88))) && (++ptr < &fnt[6])) {};
 


Нет заматерелые Си программисты для МК (о чем этот топик)
мыслят примерно так как написан Си код в АпликешнНоутах
и ДАтаШитах на МК, в инструкции к Компилятору - если найдешь
там абру-кадабру сообщи со ссылкой на источник -

пусть начинающие посмотрят как НЕ надо делать!

AAS

новичок
termostat> Я вот подумал, подумал и надумал...
termostat> while(Code != 0) // знаю Code > 0 более читабельно,
termostat> // но плохо оптимизируется!
termostat> [/QUOTE]
termostat> наверно можно так: while(Code){}

Не очень хорошая мысль я думаю. Хотя бы уж так, что бы начинающие понимали:

while((bool)Code) {}

Помню по этому поводу, что нужно доказать что True = 1, False = 0, поскольку это еще менее очевидно начинающему.

termostat> [/QUOTE]
termostat> Нет заматерелые Си программисты для МК (о чем этот топик)
termostat> мыслят примерно так как написан Си код в АпликешнНоутах
termostat> и ДАтаШитах на МК, в инструкции к Компилятору - если найдешь
termostat> там абру-кадабру сообщи со ссылкой на источник -
termostat> пусть начинающие посмотрят как НЕ надо делать! [»]

Сколько смайлов я должен поставить рядом что бы фраза которую ты атакуешь казалась тебе безобидным юмором?

Но раз нашла коса на камень то:

APPNOTE AVR331

Ну вот например:

while(1)
{
key=getchar();
putchar(key);
delay(100);
}

А нужно бы как рекомендует Денис Ричи while(TRUE).

Или вот:
if(--buff_cnt == 0) // If buffer is empty:

Если уж быть последовательным, то нужно бы так:
buff_cnt--;
if(buff_cnt == 0) ....

Да и был бы он там Си в апп.ноутах, там все больше блоксхемы, да мнемоника.

Синтаксис и лексика языка была продумана настолько давно, что язык стал чем то безотносительным к платформе, буть то ПК,КПК или МК. И уж учится применению надо не в Ап.ноутах а в литературе на порядок старше. Могу прицепить "Веревка достаточной длины,чтобы... выстрелить себе в ногу" - это около 159 параграфов правил как писать на Си и С++ - 148Кб. Очень правильно будет почитать Страуструппа, но там все больше про С++.
 
+
-
edit
 

Serge77

модератор

Я тоже пошутил, у меня смайликов много было ! ;^))

Ещё одна полушутка: наверное писать на С для МК можно советовать только тем, кто уже знает и использует С на компьютерах. Всем остальным для МК лучше учить ассемблер или Бейсик, так на один барьер будет меньше (я имею в виду синтаксис С ).

Это мнение человека, не написавшего ни одной программы для МК (моё, в смысле) ;^))

SAA

втянувшийся

Кто нибудь знает реализацию ETHERNET и TCP/IP для обычного AVR, без ethernet модуля. Кто что может посоветовать?
 

pokos

аксакал

SAA> Кто нибудь знает реализацию ETHERNET и TCP/IP для обычного AVR, без ethernet модуля. Кто что может посоветовать? [»]
Без Ethernet-чипа всё равно не успеешь даже на скорости 10 Мбит/с - у протокола жёсткие временные ограничения.

 

Yuran

опытный

SAA> Кто нибудь знает реализацию ETHERNET и TCP/IP для обычного AVR, без ethernet модуля. Кто что может посоветовать? [»]

Я где то видел имлиментацию, но зачем если есть копеешные ethernet модуля с простым интерфейсом, не выгодно по любому, как экономически так и по техническим харакетристикам.
 
RU termostat #03.03.2005 14:06
+
-
edit
 

termostat

аксакал


> AAS
Помню по этому поводу, что нужно доказать что True = 1, False = 0,
поскольку это еще менее очевидно начинающему.
 


Начинаюшему ни чего не читающему вообще ни чего очевидным не станет,
поэтому что-то почитать придется если есть желание в чем то разобраться.

Есть много источников, я предлагаю свой краткий курс.

В нем написано, при первой же потребности понять что это - в задаче 01:


наша программа будет сидеть в цикле while() пока условие в скобках
истино - т.е. "не ноль" (не равно нулю) - на языке Си: !(0)
"!" - означает "не"

while(1) - очень частое применение этого цикла -
означает "Делать пока есть питание и нет прерывания" -
так как в скобках "не ноль" постоянно.

ВАЖНО: можно было написать любое число 5, 25, или 3...
Запомните! в Си:

"не ноль" это "истина"

"ложно" только "ноль" !!!


Т.е. я расчитывал именно на новичка, и что прочитав
он это поймет.



Вот еще источник по Си не относительно МК:

"Руководство полного идиота - язык Си" - Богатырев


Если условие есть НОЛЬ - то условие считается ложным.
Если условие есть НЕ НОЛЬ а ... -2, -1, 1, 2, 3, ... - то условие истинно.


> termostat
наверно можно так: while(Code){}
 


> AAS
Не очень хорошая мысль я думаю.

Хотя бы уж так, что бы начинающие понимали:
while((bool)Code) {}
 


Да я за! чтоб начинающие понимали, но вот твой код компилятор
не поймет, вот в чем беда.

Ты прежде чем выкладывать код проверь его на
компиляторе, че в пустую то топик забивать.

А что понятней:

while(Code){} или while((bool)Code) {}

Это пусть каждый решает для себя сам, только бы
компилятор понял что от него хотят.


> AAS
Сколько смайлов я должен поставить рядом что бы фраза
которую ты атакуешь казалась тебе безобидным юмором?

Но раз нашла коса на камень то:
APPNOTE AVR331 Ну вот например:
code text
  1. while(1)
  2. {
  3. key=getchar();
  4. putchar(key);
  5. delay(100);
  6. }


А нужно бы как рекомендует Денис Ричи
code text
  1. while(TRUE)
 


Да сколько смайлов не поставь, я все равно буду призывать не
вводить людей в заблуждение и не советовать того что не
будет работать

code text
  1. while(TRUE)


Рбатать НЕ БУДЕТ!

пока вы в программе не определите

#define TRUE !0
или
#define TRUE 1
или
#define TRUE (что нибудь не равное нулю)

ПОВТОРЯЮ если вы делаете программу на Си для МК то делайте так
как написан Си код в АпликешнНоутах и ДАтаШитах на МК, в инструкции
к Компилятору которым вы пользуетесь!


> AAS
Или вот:

if(--buff_cnt == 0) // If buffer is empty:

Если уж быть последовательным, то нужно бы так:

buff_cnt--;
if(buff_cnt == 0) ....
 


Да второй вариант более читабельный.

Даже смайликов не нужно ставить.

Но первый вариант (--buff_cnt == 0) аброй-кадаброй не
назовешь - действия написаны по порядку: декрементировать,
затем сравнить.

В курсе я давл совет, чтоб не гадать и не ошибится с
приоритетом операций поставьте скобок () побольше.

if ((--buff_cnt) == 0) это эквивалентно if (!(--buff_cnt))


> AAS
Да и был бы он там Си в апп.ноутах, там все больше
блоксхемы, да мнемоника.
 


Кто ищет тот найдет.

> AAS
Синтаксис и лексика языка была продумана настолько давно,
что язык стал чем то безотносительным к платформе, буть то
ПК,КПК или МК.
 


"безотносительным к платформе" или машинонезависимым - это
то свойство которое в Си и ценно.

> AAS
И уж учится применению надо не в Ап.ноутах а
в литературе на порядок старше.
 


Не надо старше, имено в АпНоутах все дано
приминительно ИМЕННО к МК ! а не вообще...

> AAS
Могу прицепить "Веревка
достаточной длины,чтобы... выстрелить себе в ногу" - это
около 159 параграфов правил как писать на Си и С++ - 148Кб.
Очень правильно будет почитать Страуструппа, но там все
больше про С++.
 


Я уж много раз повторяю, сразу выкладывай. чего спрашивать то?
Может человека, кому она понадобится, щас не на форуме.
А ему понадобится тебя не будет.

RU termostat #03.03.2005 14:08
+
-
edit
 

termostat

аксакал

> Srege77
Ещё одна полушутка: наверное писать на С для МК можно советовать только тем,
кто уже знает и использует С на компьютерах.

Всем остальным для МК лучше учить ассемблер или Бейсик, так на один барьер будет меньше (я имею в виду синтаксис С ).
 



Конечно если человек знает бэйсик, то на
нем можно и писать для МК, ведь есть прекрасные
"баском авр" "фаст авр" с кучей примеров.


Но если человек не знает ни Си ни Асма, то почему ты
думаешь что учить 3% Си это больший барьер чем учить
какуюто часть Асма?


Ведь в Си нужные для МК команды практически понятны
из значения слов которыми они обозначаются:
include define while do for if else switch putchar getchar

В Асме мнемоники являются абревиатурами от словосочетаний
обозначающих их действие, и думаю они менее очевидны для
человека просто знакомого с английским.

но даже если трудности равны и барьеры одинаково велики, то
наверно имеет смыл преодолеть тот барьер который открывает
много дорог, чем барьер АСМ который ведет тольк к
одному семейтсву МК.


SAA

втянувшийся

termostat> Но если человек не знает ни Си ни Асма, то почему ты
termostat> думаешь что учить 3% Си это больший барьер чем учить
termostat> какуюто часть Асма?

Хм, хм! Это очень трудный вопрос. Ведь если учить с ноля, то я думаю все равно что учить. Это субъективно, очень субъективно, например я учил ассемблер K580BM80 (ИК80А) по журналам "Радио", и думаю мне было все равно что учить (на тот момент кроме языка маш. команд МК-61 и школьного алгоритмического языка (как сказал преподаватель эта была Рапира) я ничего не знал. Зато было огромное стремление узнать А КАК ЭТО ГОВОРИТЬ С ВЫЧ. УСТРОЙСТВОМ на любом языке. Сейчас, я могу судить по своему опыту работы с молодежью, когда ПК распрастранен настолько, что школьники изучают его не по книге даже в глубокой деревне, ситуация прямо противоположна начинающий как правило владеет BASIC и PASCAL в объеме школьной программы, но совершенно не стремится УЗНАТЬ БОЛЬШЕ! Соотвественно это пораждает НЕ ЖЕЛАНИЕ знать что либо еще, так как того что знаешь - более чем достаточно. А знаичт нафиг Си и C++, они алгоритмически проигрывают Паскалю, а интутивными качествами проигрывают BASIC. Таким образом начинающий (я думаю что мы говорим о человеке возрастной категории 10...18 лет) видя Си в той эпостаси в какой он есть (а именно не по ключевым словам, а по операндам &,&&,||,|,!,<<,>> и осознав что язык более чем символичен, негативно воспринимает его по сравнению с тем чем владеет (PASCAL AND.OR,NOT,.....) и осваивать как правило не хочет. Оно и верно, на мой взгляд ,Си мало чем ушел от мнемоники. Еще раз оговорюсь, что обосновываю это только практикой работы с подрастающим поколением, не более!!!!

termostat> Ведь в Си нужные для МК команды практически понятны
termostat> из значения слов которыми они обозначаются:
termostat> include define while do for if else switch putchar getchar

Ну если быть точным, то не команды (прерогатива языков типо LOGO и ASM) а ключевые слова, а getchar(putchar) в данном контексте функции, что начинающему еще сложнее понять чем дерективы препороцессора #include, #define.

termostat> В Асме мнемоники являются абревиатурами от словосочетаний
termostat> обозначающих их действие, и думаю они менее очевидны для
termostat> человека просто знакомого с английским.

Ну позволь заметить что операции в Си еще мене очевидны чем команды в АСМ, OR A,B A = A|B; Для человека с алгеброй логики не знакомого. Легко рассуждать когда за плечами 5-6 лет образования в ВУЗе, и не ПОСТ совестком, а в том авторитарно-технократическом, времен 80х-90х, когда булевая алгебра являлась еще частью Высшей Математики. Что говорить о лексике Си, она гораздо сложднее и многобразнее лексем в АСМ, даже в объеме 3%.

termostat> но даже если трудности равны и барьеры одинаково велики, то
termostat> наверно имеет смыл преодолеть тот барьер который открывает
termostat> много дорог, чем барьер АСМ который ведет тольк к
termostat> одному семейтсву МК. [»]

Ну почему в таком случае ты не выбрал Паскаль, обще признано что он менее платформенно зависим чем Си?

P.S. Термостат, не воспринимай на свой счет, просто это правило полемики, относить что либо на свой счте не стоит.
 
AD Реклама Google — средство выживания форумов :)
RU termostat #04.03.2005 12:10
+
-
edit
 

termostat

аксакал


> SAA
Это очень трудный вопрос. Ведь если учить с ноля, то я думаю все равно что учить.
Это субъективно, очень субъективно
 


Именно о равенстве барьеров (= все равно что учить, если не знаешь ни
того ни другого) я и написал выше в ответе Сергею.

Но при этом я еще отметил не равенство результата
преодоления этих барьеров.


> SAA
операции в Си еще мене очевидны чем команды в АСМ,

OR A,B A = A|B; Для человека с алгеброй логики не знакомого...
 


Я честно говоря в твоем примере разницы в трудности для начинающего не замечаю:

на АСМе:

OR A,B - зная англ. пониятно что ИЛИ с A и В но не понятно где будет сохранен результат,
и "Для человека с алгеброй логики не знакомого" непонятно что делает ИЛИ.

на Си:

A = A|B; - понятно что резвльтвт будет в А так как проговаривается
формула так: А равно ...

но "Для человека с алгеброй логики не знакомого" непонятно что делает плочка |.


> SAA
почему в таком случае ты не выбрал Паскаль,
обще признано что он менее платформенно зависим чем Си?
 


Я выбрал Си следуя за производителям МК, они Си выбрали - на других языках (кроме АСМа) я не видел примеров в АпНоутах и ДатаШитах.


1 6 7 8 9 10 11 12

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru