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

 
1 6 7 8 9 10 11 12
RU termostat #20.02.2005 13:25
+
-
edit
 

termostat

аксакал

> aliens6
Вот появились еще вопросики.
 


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

> aliens6
1.как на одну ногу послать байт?(возможно ли такое без всяких протоколов)
 


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

Если же информация не принимается чем либо, то посылать что-то не имеет смысла.


пример:

вывести на "ногу" PB4 значение переменной temp типа unsigned char, первым выводится бит_0

code text
  1.  
  2. char ctr = 0; // переменная счетчик
  3.  
  4. for (ctr; ctr< 8; ctr++) {
  5. // пока ctr не превышает 7 делать код до };
  6.  
  7. PORTB.4 = (temp >> ctr);
  8. // сдвинуть temp в право на ctr разрядов
  9. // и бит_0 результата сдвига вывести на ножку PB4
  10.  
  11. delay_ms(10);
  12. // пауза 10 мС - или столько сколько нужно
  13. // приемнику чтоб надежно считать бит.
  14.  
  15. };


Если нужно вывести бит_7 первым то:
PORTB.4 = (temp >> (7 - ctr));
// сдвинуть temp в право на (7 - ctr) разрядов


можно былоб вместо:

for(;;){

};

применить

while( ){

};

как впримере ниже.


> Guest
Можно конечно и тупо по таймеру выставлят в порт регистр перед этим его сдвинув.
 


нет, наверно тупо не надо :-)

могут пострадать не виновные! сидящие на других пинах этого порта.




> aliens6
2.как сделать задержку 0.012 мс в CodeVision?
 


Это задача 05 курса, далее:

либо help CodeVisionAVR

либо:
- учти что милисек это: ms
- а микросекунды: us
- 0.012 мс = 12 us

Реальную длительность паузы в МК можно проверить в VMLAB

> aliens6
3.Надо сделать такой вывод в порт, чтобы включался сначала
0 бит, потом 0и1, далее 0,1 и 2 и т.д.
Сдвиг не подходит. Помогите.
 


Сдвиг подходит, но не сдвиг порта.

Еще раз прочитай курс, задачу 01
и мои ответы на твои вопросы 3-4 стр. назад.

если "включался" == становился "1" то:

code text
  1.  
  2. char ctr = 0; // переменная счетчик
  3. PORTx = 0; // все нули = все выключены
  4.  
  5. while(ctr < 8) {
  6. // пока ctr не превышает 7 делать код до };
  7.  
  8. delay_ms(100); // пауза 100 мС
  9.  
  10. PORTx ^= (1 << ctr);
  11. // инвертировать бит с номером ctr
  12. // в порте (в регистре) PORTx
  13. // инвертировать значит: 1 -> 0   а  0 -> 1
  14.  
  15. ctr++;
  16. // инкрементировать == увеличить на 1
  17. //значение переменной ctr
  18.    
  19. };



если "включался" == становился "0" то в начале PORTx = 1;

можно былоб вместо:

while( ){

};

применить

for(;;){

};

как впримере выше.

=======

Не забудь о правильном объявлении используемых переменных и о заголовочных файлах .h

=======

Еще раз: точней формулируй вопросы, найди время и проштудируй задачи курса!

Используй поиск виндоус по папке где сохранил курс и по словам в файлах
Это сообщение редактировалось 20.02.2005 в 14:52
+
-
edit
 

aliens6

новичок
Я пытался делать также, но без инвертирования битов.

В CodeVision использую милисекундные задержки, а микросекундные все сомневался, то ли в мс 1000 микросекунд, то ли 100.

Курс я всегда держу под рукой, и если не знаю то ищу там.
 
RU termostat #20.02.2005 14:55
+
-
edit
 

Jony

новичок
Доброго времени суток!
В своем первом посте, не могу не отметить вклад termostata в виде курса в мое самообразование. Thancks!
Как и ожидалось, путь за знаниями лег через темный лес с граблями. Пользуюсь я следующим софтом: ICCAVR 6.30A и VMLAB 3.10. Поставил для себя конкретную задачу, сделать ШИМ регулятор на 2313, для обратной связи использовать компаратор в кристалле. Пробовал использовать аппаратный ШИМ (программно выдумывать мне вроде еще рано), но не получается плавно менять время импульса. Если останавливать таймер и загружать новое значение, частота падает, а длительность может увеличиться, уменьшиться, не измениться, а если «на ходу» пытаться (инкре-)декрементировать значение загруженное в таймер, на выходе тот же мусор, частота нормальная. Как быть?

Кстати, по поводу первого примера из задач. Если писать в цикле PORTB++, в VMLab`e видим хороший меандр, а если просто PORTB=0x00; PORTB=0xff; то времена Tи<Тп разные. Меняем местами операнды Tп<Ти. Это так задумано?

 

SAA

втянувшийся

Jony> Пробовал использовать аппаратный ШИМ (программно выдумывать мне вроде еще рано),

Это еще и бесперспективно, только на кристалах у которых PWM отсутсвует.

Jony> но не получается плавно менять время импульса. Если останавливать таймер и загружать новое значение, частота падает, а длительность может увеличиться, уменьшиться, не измениться, а если «на ходу» пытаться (инкре-)декрементировать значение загруженное в таймер, на выходе тот же мусор, частота нормальная.

Теперь по порядку. Чем смотришь. Как конкретно декрементируешь (если Си, приведи подстрочник ассемблера). Строчки настройки PWM.


Мой ШИМ (AVR Builder) тоже на ходу перегружался, если надо могу кусок кода привести из билдера. На осциллографе наблюдал все нормально. Атмел даже пишет в ДШ:

Alternatively, the Timer/Counter1 can be configured to a PWM that operates at twice the speed as in the mode described
above. Then the Timer/Counter1 and the Output Compare Register1A - OCR1A and the Output Compare Register1B -
OCR1B, form a dual 8, 9, or 10-bit, free-running and glitch-free PWM with outputs on the PD5(OC1A) and PD4(OC1B)
pins.

Посмотри в ДШ какие красивые треугольнички нарисованны. По рисункам хорошо видно когда происходит перегрузка счетчика PWM.

Да ДШ я взял от Mega 163, но не думаю что с 2313 она сильно различается в рамках ШИМ.

Прикреплённые файлы:
 
 
RU termostat #22.02.2005 12:41
+
-
edit
 

termostat

аксакал

> Jony
termostat, Thancks!
 


спасибо!

> Jony
сделать ШИМ регулятор на 2313, для обратной связи использовать компаратор в кристалле.
 


2313 я как пример привел, для реальных НЕ серийных устройств советую ATmega16 или ATmega8.

говорят ATmega48 очень перспективен.

> Jony
Пробовал использовать аппаратный ШИМ (программно выдумывать мне вроде еще рано), но не получается плавно менять время импульса. Если останавливать таймер и загружать новое значение
 


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

Figure 32. Effects on Unsynchronized OCR1 Latching

пример в PWM2313.rar (5 КБ)

> Jony
Если писать в цикле PORTB++, в VMLab`e видим хороший меандр, а если PORTB=0x00; PORTB=0xff; то времена Tи<Тп разные.
 


при PORTB++; - каждый переход выполняется одним набором asm инструкций, во втором случае эти наборы наверно отличаются - можно посмотреть листинг програмы на АСМе - файл *.lst

Это поазывает что в Си мы не так четко контролируем МК как в асме, поэтому в компиляторе есть возможность вставки кусков асм кода если так нужно.
Прикреплённые файлы:
 
RU termostat #22.02.2005 12:43
+
-
edit
 

termostat

аксакал

CodeVisionAVR 1.24.5 появился с инструкцие по применению

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

Качайте, а то надо будет не найдете...

меня просили не выкладывать прямой линк

прицеп (.rar 340 байт)
Прикреплённые файлы:
 
+
-
edit
 

termostat> Это поазывает что в Си мы не так четко контролируем МК как в асме, поэтому в компиляторе есть возможность вставки кусков асм кода если так нужно. [»]

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


а) Выделение кучи для переменных.

автоматические переменные (стандартный Си - в фрейме стека 0x86)
статические переменные (стандартный Си - в статически линкуемом сегменте данных DATA 0x86)
динамически выделяемые переменные (стандартный Си - в динамически линкуемом сегменте (точнее его попросту нет, он планируется компиялтором в смещениях переменных, но как сегмент данных не инициализируется линкером BSS)
регистровые переменные (стандартный Си в регистрах)

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

б) Startup код.

Можно ли выключить его в CodeVision совсем, частично, заменить на свой?

P.S. Guest это тоже что и SAA, AAS (накрылся комп, потерял регистрацию). Видел как осуществляет а) и б) GCC для AVR (WinAVR) честно скажу очень не понравилось. При всей моей любви к C и C++ под 0x86 под RISC совершенно четко осязаю их ущербность, возможно я не прав, тогда твои ответы на а) и б) помогут восстановить статус-кво. Спасибо заранее.
 

Yuran

опытный

Это всем известно что С, С++ компиляторы для 8 биных AVR ещё не так отточены, как для x86, именно поэтому всё прогрессивное человечество использует когда припекает асм
B)
Если хочешь что-то понять как это работает скомпилируй сишный код и просмотри полученный код =) думаю частенько пользовался для x86, /FAs =)
 

Jony

новичок
SAA: Это еще и бесперспективно, только на кристалах у которых PWM отсутсвует.
 


Да, может быть, но 19,6 кГц не так уж и много для ШИМа при тактовой 10 МГц. Я вот и подумал, если можно сделать генератор на частоту в пол тактовой, то почему бы и ШИМ не догнать хотя бы до 100 кГц (если возможно)? Так что, перспектива как раз есть.
Вдохновили меня твои рисунки призадуматься на ДШ. В результате оказалось, что понимал кое-что неправильно, переводя с аглицкого, и понеслась душа в рай! Теперь осталось замедлить процесс изменения длительности, а то как-то мгновенно все происходит.

termostat: 2313 я как пример привел, для реальных НЕ серийных устройств советую ATmega16 или ATmega8.
 

2313 - подопытный кролик, ничего серьезного.

Figure 32. Effects on Unsynchronized OCR1 Latching
 

Читал и потому клюнул на это. Тем не менее глюк кривого написания кода имел место быть. Теперь просто использую синхронную загрузку. Все отлично. Спасибо за пример, обязательно оценю! (Доделаю свой девайс выложу на одобрение/поругание).

можно посмотреть листинг програмы на АСМе - файл *.lst
 

Смотрел. Разные. Для меня ASM пока полный мрак.

Так как на счет ШИМа, килогерц под сто?
 
RU termostat #23.02.2005 02:44
+
-
edit
 

termostat

аксакал

Guest> Термостат, не мог бы ты описать следующие вещи так как они происходят в CodeVisionAVR C. И как их избежать.
 


Я и вопросов то не понял, я ж не спец в МК и в програмировании ПК.

Если тебя интересуют эти вопросы посмотри мануал к компилятору или help - компилятор может не больше и не меньше того что там написано.
RU termostat #23.02.2005 03:20
+
-
edit
 

termostat

аксакал

Jony> Так как на счет ШИМа, килогерц под сто?
 


в тини26 фаст-шим есть 2 штуки - поищи и в Мегах

Atmel Corporation - Atmel AVR 8- and 32-bit Microcontrollers -

MicrocontrollersTouchMemoryAutomotiveWireless / RFMore Products
Product News
December 07, 2011Atmel Broadens Portfolio of Lowest Power, Highest Performance 32-bit AVR UC3 Microcontroller Solutions November 23, 2011Atmel Launches Complete Digital Audio Platform for Consumer Applications October 24, 2011Atmel Reduces Total System Cost by Integrating LCD Controller into Popular AVR XMEGA Family» More News  
Home > Microcontrollers > Atmel AVR 8- and 32-bit Microcontrollers
Print
Overview


// Дальше —
atmel.com
 


Мегу-48 советуют на 20 МГц 3 канала ШИМ 28 ног

Atmel Corporation - Atmel AVR 8- and 32-bit Microcontrollers - megaAVR

MicrocontrollersAtmel AVR 8- and 32-bit32-bit AVR UC3AVR XMEGAmegaAVRtinyAVRBattery ManagementAutomotive AVRAtmel ARM-based SolutionsMCU Wireless8051 ArchitectureTouchMemoryAutomotiveWireless / RFMore Products
Home > Microcontrollers > Atmel AVR 8- and 32-bit Microcontrollers > megaAVR > ATmega48
Print
ATmega48
Overview
Parameters


// Дальше —
atmel.com
 


дешовая!

Только вот ее VMLAB возможно не поддерживает, не знаю но в "железе" отлаживай как в задаче 6 примерно.

зато меги 16 и 8 поддерживает - изучи мегу 16 будет тебе один МК на все случаи жизни.

======

На Атмеле есть статьи про АлгоритмБилдер

http://atmel.com/dyn/resources/prod_documents/avr_builder.pdf

и его аналог - IAR visualSTATE for AVR:

http://atmel.com/dyn/resources/prod_documents/high_level_tool.pdf



Это сообщение редактировалось 23.02.2005 в 10:58
Jony>
SAA: Это еще и бесперспективно, только на кристалах у которых PWM отсутсвует.
 

Jony> Да, может быть, но 19,6 кГц не так уж и много для ШИМа при тактовой 10 МГц. Я вот и подумал, если можно сделать генератор на частоту в пол тактовой, то почему бы и ШИМ не догнать хотя бы до 100 кГц (если возможно)? Так что, перспектива как раз есть.

Хм! Это хорошо что есть желание ж-) Попробую сегодня откопать софтверный ШИМ для Tiny 26 хотя там есть аппаратный, но я почему то вколотил себе в бошку что смогу сделать быстрее софтверный ж-) Честно говоря он очень неровно работал, так как кроме ШИМ мне нужно было еще и обновлять семисегментный дисплей именно поэтому ушел на аппаратный, оказалось много проще. И сразу смерись с ограничением по регулированию очень маленькие площадки не сделать и скважность тоже так-себе, ну и возможно про Си тоже придется забыть.

P.S. Я так понимаю ты из импульсника хочешь выжать по максимуму ж-)? Смотри в СВЧ не уйди :) Тут есть грань где лучше использовать частоты от 25 КГц до 50 КГц на пермолое и гарантированно не палить ключи. Если не секрет какова габаритная мощность?

Guest aka SAA
 
Yuran> Если хочешь что-то понять как это работает скомпилируй сишный код и просмотри полученный код =) думаю частенько пользовался для x86, /FAs =) [»]

Выкачал, гляну. Если кому результаты интересны мыльте.


termostat> Если тебя интересуют эти вопросы посмотри мануал к компилятору или help - компилятор может не больше и не меньше того что там написано. [»]

Да вот думал на халяву проскочить ж-) Не хотелось тащить 3,8 мег.

Jony>> Так как на счет ШИМа, килогерц под сто?

termostat> в тини26 фаст-шим есть 2 штуки - поищи и в Мегах

Tiny26 самое оно! Я просто умиляюсь эти чипом ;-)
 
RU termostat #23.02.2005 10:59
+
-
edit
 

termostat

аксакал

Я посмотрел в код генераторе ICC Фаст PWM частота Клок/256
для Меги16 и Меги 48

Мега 48 имеет по-моему 6 каналов ШИМ, скорость при 20 МГц 78125 Гц
UA Tosha_443 #23.02.2005 16:45
+
-
edit
 

Tosha_443

втянувшийся
2Guest(SAA,AAS)
http://myavr.narod.ru/c_style.htm
там все более или менее доходчиво описано.
и, не помню, тут говорил или нет, но
программирование на С эффективно(в плане кода) только при максимальном приближении к ассемблеру.
Не ошибается тот, кто ничего не делает  
+
-
edit
 
Tosha_443> 2Guest(SAA,AAS)
Tosha_443> http://myavr.narod.ru/c_style.htm

Спасибо за ссылку.

Tosha_443> программирование на С эффективно(в плане кода) только при максимальном приближении к ассемблеру. [»]

;-) Хороший ответ. Т.е. оптимизацию компилятором отметаем на корню?!

 
UA Tosha_443 #24.02.2005 12:47
+
-
edit
 

Tosha_443

втянувшийся
да нет, но я на 30% ужимал код, когда делал конструкции, как в асме.
if (x==1 ) && (y==1){}
больше по обьему чем
if (x==1)
{(if y==1)
{}
}
может не очень понятный и удачный пример, но все же...
Не ошибается тот, кто ничего не делает  

SAA

втянувшийся

TO KIT и тем кто пользуется LCD NOKIA 3310.
Сегодня окончательно убедился в перспективности применения векторных шрифтов (хорошая экономия по памяти) для вывода на дисплей.
Почему экономил? Так AVR Builder же ;-), всего 1 К слов. Пока 271 слово с учетом шрифтов в век. формате (если можно так его назвать) до буквы "Н", работает вроде не плохо, надеюсь что хватит на всю кодовую странцу. Кому нужно как библиотеку для AVR Builder?
 
RU termostat #24.02.2005 14:51
+
-
edit
 

termostat

аксакал

SAA>
тем кто пользуется LCD NOKIA 3310.
SAA> Кому нужно как библиотеку для AVR Builder?
 


Ты лучше сразу выкладывай .zip - потому что кому то понадобится через месяц например а сейчас он тебя не спросит.

Как пользоваться AVR Builder и что это, повторю линк:
http://atmel.com/dyn/resources/prod_documents/avr_builder.pdf

AAS

новичок
termostat>
SAA>
termostat> тем кто пользуется LCD NOKIA 3310.
SAA>> Кому нужно как библиотеку для AVR Builder?
termostat>
 

termostat> Ты лучше сразу выкладывай .zip - потому что кому то понадобится через месяц например а сейчас он тебя не спросит.
[»]

Пришлось таки зарегится повтороно ж-)

Выкладываю проект для AVR Builder как тест страницы русских векторных шрифтов от А...Я, без Ъ, Ь знаков (забыл однако ;-)). На данных под шрифт сэкономил 48 байт, по сравнению с матричным шрифтом (растровым). Решайте сами много это или мало. Буду работать над масштабированием, хотя не совсем пока еще пронимаю насколько это нужно.

P.S. Что случается все время с Авиабазой, точнее случается каждый раз все чаще и чаще?
Прикреплённые файлы:
 
 
+
-
edit
 

aliens6

новичок
Здравствуйте!

Вопросики (только не бейте :) )
1.Можно соединить старшие биты,
с младшими битами с помощью простого сложения?
В калькуляторе проверил вроде складывает.
А то надо младшие ьиты одного порта
соединить со старшими битами другого.
2.Можно ли изменить один бит в переменной
типа unsigned char?Допустим есть неизвестное
значение (например 0b01010101-нагляднее), а
мне надо сделать 4 бит единицей

 
RU termostat #26.02.2005 05:22
+
-
edit
 

AAS

новичок
aliens6> 1.Можно соединить старшие биты,
aliens6> с младшими битами с помощью простого сложения?
aliens6> В калькуляторе проверил вроде складывает.
aliens6> А то надо младшие ьиты одного порта
aliens6> соединить со старшими битами другого.

Можно ж-), но только в частном случае. НО! Одно большое "НО", это не сединение одной части (нескольких бит) А с другой частью (несколькими битами) Б. Т.е. это не операция склейки, на самом деле это операция логического сложения А и Б, при этом Б или А должны быть сдвинуты на то кол-во бит, которое ты желаешь выбрать из А. Пример:

А = 000[10110]

Б = 000[111]00

Квадратными скобками выделены те биты которые я желаю объеденить (соединить) в результате они дадут мне стандартный байт, причем хочу что бы объединяемые биты Б были старшими, а биты А младшими.

Очевидно что Б нужно сдвинуть на 3 бита влево,

A = A << 3; // результат A = 11100000

При сдвиге влево А дополняется нулями с права, так как операция << именно это и подразумевает.

А = [111]00000
Б = 0000[10110]

С = А OR B; // C = 11110110

Ариф. сложение включает в себя еще и перенос в разрядной сетке, поэтому ариф. сложением можно объединять А и Б, только при условии что ни в одном из разрядов не произойдет перенос. Т.е. при наличии именно нулей как заполнителя, а не единиц. При попытке сложить арфмитически и логически одни и те же операнды не в частном случае одинаковый результат не получится:

А = 10101010
Б = 00000010

C = А OR B ; // C = 10101010

C = A + B; // C = 10101100

aliens6> 2.Можно ли изменить один бит в переменной
aliens6> типа unsigned char?Допустим есть неизвестное
aliens6> значение (например 0b01010101-нагляднее), а
aliens6> мне надо сделать 4 бит единицей [»]

Логическое сложение (операция ИЛИ), с байтом маской из четырех единиц.
 

Jony

новичок
Что—то на форум частенько не получается попасть.
termostat: Только вот ее VMLAB возможно не поддерживает…
 

Да чипы очень даже интересные. Жаль не симулируются VMLab`ом.
SSA: И сразу смерись с ограничением…
 

Смирение — последнее дело, надежда, как—говорится наш компас. А вдург?
P.S. Я так понимаю ты из импульсника хочешь выжать по максимуму ж-)
 

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

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

Даже представить эдакую микроволновку страшно ж—).
 
1 6 7 8 9 10 11 12

в начало страницы | новое
 
Поиск
Поддержка
Поддержи форум!
ЯндексЯндекс. ДеньгиХочу такую же кнопку
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru