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

 
1 2 3 4 5 6 7 12
+
-
edit
 

nagserg

новичок
Спасибо за ответы termostat, буду разбираться.
Кстати микроконтроллерами начал заниматься благодаря вашему курсу.
 

SAA

втянувшийся

А.С.>>> А программировать на С контроллер с 16 кбайт программной памяти мне кажется расточительством.
Yuran> Да нет, там код получается зачастую оптимальнее в случае сложных проектов, я даже не ожидал что он так хорошо оптимизирует (это я про CodeVision) [»]

Подтверждаю сейчас занят (практически все свободное время) одним проектом по доработке станка по настройке топливных насосов, так вот решил прменять 8515 (по памяти в два раза меньше всего то 8Mb) для трех задач (режимов) данного станка. Выбрал WinAVR (GCC) он довольно не плохо оптимизирует, и честно говоря думал буду не доволен, потому как код практически сразу вырос до 1,2К на одной рыбе. Но когда вписал уже все три задачи то дошел только до 2,3К, причем знаю где еще могу углы срезать ;) Самое неприятное было, то то как GCC взялся за битовую логику:

ну например if((value&0x20) != 0) - это явно работа над unsigned char который описывает value в определениях переменной (да еще и регистровой!!!) так он своллотяга норовит засунуть все это в два регистра 22, 23 и работать с INT. Честно говоря "упихиваюсь" иногда разводить косяки эти, вплоть до встроенного асма, благо он такой мощный у GCC. Помогает иногда прописывать так if((unsigned char)(value&0x20) !=0 ).


А вот напрмер такой код меня порадовал:

and r2,r2
jge ля-ля-ля

Это он так с оптимизировал if(value&0x80 != 0). Долго не мог врубиться и хотел его заставить выйти на sbrs. ;):D

 
RU termostat #19.12.2005 18:07
+
-
edit
 

termostat

аксакал

SAA> он своллотяга норовит засунуть все это в два регистра 22, 23 и работать с INT. Честно говоря "упихиваюсь" иногда разводить косяки эти, [»]

у него где то в документации написано что он пытается обычно ИНТами оперировать.

SAA

втянувшийся

SAA>> он своллотяга норовит засунуть все это в два регистра 22, 23 и работать с INT. Честно говоря "упихиваюсь" иногда разводить косяки эти, [»]
termostat> у него где то в документации написано что он пытается обычно ИНТами оперировать. [»]

Да написано, мол булевые операции проводятся над INT по умолчанию, но мне не понятно почему при этом не проходит явный тайпкастинг, например в некоторых случаях не помогает ничего:

if((unsigned char)(value&0x40) == 0x80) .....
if((unsigned char)(value&0x40) != 0) .....
if((unsigned char)(value&0x40) == 0) ....

и проходит только исключительно безобразная монструозная конструкция:

if((unsigned char)(value|(~0x40)) == 0xFF) .....

Вот только после этого GCC понимает что речь идет о битовых полях и ставит вместо двух регистров и кучи кода sbrc r22, 6!

Единственное что я не пробовал это применить именно БИТОВЫЕ ПОЛЯ, о которых говорилось выше постингом, через объединение. БИТОВЫЕ ПОЛЯ применять не рекомендуют во всех архитектурах, возможно с AVR другая ситуация. Хотя в мануале по WinAvrLib про битовые поля не слова. Сейчас попробую с оптимизацией и без, поставлю небольшой эксперемент над GCC:
code text
  1. typedef union{
  2.    unsigned char byte;
  3.    struct{
  4.      unsigned char b0 : 1;
  5.      unsigned char b1 : 1;
  6.      unsigned char b2 : 1;
  7.      unsigned char b3 : 1;
  8.      unsigned char b4 : 1;
  9.      unsigned char b5 : 1;
  10.      unsigned char b6 : 1;
  11.      unsigned char b7 : 1;
  12.    } bit_field;
  13. } as_bit_field_of_byte;
  14.  
  15. register as_bit_field_of_byte m asm("r19");
  16. ...........................
  17. ..........................
  18.  
  19.  if(m.bit_field.b2 == 1){
  20.     m.byte = 10;
  21.  }


так компилится, уже хорошо, теперь смотрим листинг:

code text
  1. if(m.bit_field.b2 == 1){
  2.  1ae:   83 2f           mov     r24, r19
  3.  1b0:   84 70           andi    r24, 0x04       ; 4
  4.  1b2:   88 23           and     r24, r24
  5.  1b4:   09 f0           breq    .+2             ; 0x1b8
  6.     m.byte = 10;
  7.  1b6:   3a e0           ldi     r19, 0x0A       ; 10
  8. }



Да!!!!!! :o Как видно из рук вон плохо поставлена работа с битовыми полями, т.е. так делать не стоит. А если поменять оптимизацию на O1?

code text
  1. if(m.bit_field.b2 == 1){
  2.  12c:   32 fd           sbrc    r19, 2
  3.     m.byte = 10;
  4.  12e:   3a e0           ldi     r19, 0x0A       ; 10
  5. }



Вот это дело! Проверим как поведет он себя с 7 битом.
code text
  1.  if(m.bit_field.b7 == 1){
  2.  12c:   33 23          and      r19, r19
  3.  12e:   0c f4           brge    .+2             ; 0x132
  4.     m.byte = 10;
  5.  130:   3a e0           ldi     r19, 0x0A       ; 10
  6.  }

Вот это дело, оптимизация по скорости. Значит можно пользоваться битовыми поями.
 
Это сообщение редактировалось 20.12.2005 в 08:39
+
-
edit
 

Alex870

новичок
Пишу в CodeVision 1.24.7b (есть еще 1.24.6 standart ломаный), эмулирую на VMLab 3.11. Пишу для ATmega8535. Есть такая удивительная штука: в VMLab не отрабатывают прерывания по таймеру. Создал в CodeVision простой проект, где указал использовать прерывание по переполнению таймера timer0, порограмма в эмуляторе запускается, но содержимое функции прерывания не выполняется, запустил этот же *.hex в дизассемблере AVRStudio 4 там все работает. Первым делом начал грешить на VMLab, но скомпилировав подобный проект из курса AVR-начинающим, получил то же самое, хотя там (в курсе) есть уже скомпилированный файл, так вот он работает нормально, а скомпилированный мной проект не работает, написал то же самое в ICC7 - та же ерунда. Подскажите что делать, без VMLab'a не могу. Спасибо!
So far, so good, so what...  
Это сообщение редактировалось 20.12.2005 в 15:07
+
-
edit
 

Alex870

новичок
Извините (неопытный) не туда написал. Я хотел попасть в топик к Termostat'у.
Ну если модераторы могут - перенесите эту тему туда. спасибо.
So far, so good, so what...  

at90

новичок
Пишу в CodeVision 1.24.7b
 


У тебя 1.24.7 ломанный или демаверсия?
 
+
-
edit
 

Alex870

новичок
не, 1.24.7b демо, а 1.24.6 ломаная
So far, so good, so what...  
+
-
edit
 

Alex870

новичок
Уважаемые участники! Ну не сочтите за труд, пожалуйста, кто пользуется CodeVision и VMLab создайте проект под ATmega8535 (12МГц) в CodeVision и напишите, ну что-то вроде:

code text
  1. char a = 0;
  2.  
  3. interrupt [TIM0_OVF] void timer0_ovf_isr(void)
  4. {
  5.  ++a;
  6.  PORTB = a;
  7. }


Это мне для проверки, и создайте проект в VMLab для теста этого примера. Если у вас все заработает скинте мне пожалуйста на мыло (alex870@mobijoys.com) оба проекта и откомпилированный hex (и напишите какие у Вас версии CV и VMLab. Я думаю это не отнимет у Вас много времени, ну минут 5 от силы. Зарание благодарен! Особенно если советом еще поможете.
So far, so good, so what...  

delay

новичок
--= UART =--
Долго провозился, эксперементируя с UART. Написал программу занова и заметил, что в LookRS 232 забыл указать скорость. Информация стала отобоажаться правильно, но почему-то по одному символу в строке.
А в COM Port Toolkit отображаются только некоторые символы. По одному- два- три. Остальные глотаются. Причем глотаться может начало, середина или конец слова.
Что еще я упустил в настройках мониторов.

Во второй задаче сказано, что в VMLAB можно наблюдать выполнение Си-кода. Может я упустил где-то описание, как это сделать. Пишу в ICC, CodeVision. Установлен WinAVR.
 
+
-
edit
 

Serge77

модератор

А нет ли программки, которая перекодирует ассемблерный текст из AVRstudio в VMlab ?
RU termostat #22.12.2005 07:32
+
-
edit
 

termostat

аксакал

Цель какая ?

Если просто отладить то редактируй-ассемблируй в студии, а отлаживай в ВМЛАБе.

А вообще отличия нужно в хелпе посмотреть.

Не пойму до сих пор нафига они "свой велосипед" изобрели?

=======

Я твою посылку получил !!! всего то год спустя...

NoS

новичок
Подскажите, где можно разузнать про ШИМ в АВР'е. Чувствую, что это достойная внимания штука, но ниче про нее не ведаю.
 
+
-
edit
 

Serge77

модератор

termostat> Цель какая ?
termostat> Если просто отладить то редактируй-ассемблируй в студии, а отлаживай в ВМЛАБе.

Цель простая - перевести программу в редактор, который я хоть немного изучил. Не хочу делать в голове путаницу из двух редакторов.

termostat> Я твою посылку получил !!! всего то год спустя... [»]

Мою? Какую?
RU termostat #22.12.2005 10:01
+
-
edit
 

termostat

аксакал

delay >
Во второй задаче сказано, что в VMLAB можно наблюдать выполнение Си-кода.

Пишу в ICC, CodeVision. Установлен WinAVR.
 


как это делать с WinAVR написано в Хелпе ВМЛАБа

как в других компиляторах - задачи курса: 3_new, 5 и 8

ключевое слово - файл .cof

Alex870 >
эмулирую на VMLab 3.11. Пишу для ATmega8535.
 


почитай в хелпе ВМЛАБ поддерживаемые МК - там нет ATmega8535.

Alex870 >
Создал в CodeVision простой проект, где указал использовать прерывание по переполнению таймера timer0
 


посмотри задачи курса: 3_new, 4 и 8

Alex870 >
кто пользуется CodeVision и VMLab создайте проект под ATmega8535 (12МГц) в CodeVision и напишите что-то вроде:

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
 


есть уже в задачах курса: многие и 8
RU termostat #22.12.2005 10:05
+
-
edit
 

termostat

аксакал

termostat>> Я твою посылку получил [»]
Serge77> Мою? Какую? [»]

тонкий тестолит для печатных плат накрученый на бутылку. Конечно забыл - я ж говорю уже год прошел !
RU termostat #22.12.2005 10:06
+
-
edit
 

termostat

аксакал

NoS> Подскажите, где можно разузнать про ШИМ в АВР'е. Чувствую, что это достойная внимания штука, но ниче про нее не ведаю. [»]

я делаю задачу.

а пока можно ДШ почитать, на русском языке на мегу128 есть на 1-й стр курса линк.

посмотреть АпНоуты AVR492 AVR345 и другие.

там вот еще:




и в библиотеке avrlib - линки были выше.
Это сообщение редактировалось 22.12.2005 в 10:16
+
-
edit
 

Serge77

модератор

termostat> тонкий тестолит для печатных плат накрученый на бутылку.

Помню! А как же это получилось?
RU termostat #22.12.2005 10:38
+
-
edit
 

termostat

аксакал

termostat>> тонкий тестолит для печатных плат накрученый на бутылку.
Serge77> Помню! А как же это получилось? [»]

вот такая она Москва - ОГРОМНАЯ ! :-)

+
-
edit
 

Alex870

новичок
> termostat

Извините, но Вы не правы, на счет того, что в VMLab 3.11 не поддерживает ATmega8535. Об этом даже на официальном сайте написано (что поддерживает), к тому же он выбирается в combobox'е. Более того, я пробовал и другие МК (у Вас в курсе ведь нет m8535). Ситуация та же. И еще, я писал, что Ваш hex в VMLab заработал, а скомпилированный мной проект этой же задачи работать отказался. Вот в чем тут причина может быть? Ну хоть напишите какими версиями VMLab и CodeVision Вы пользуетесь и если они ломаные, то где взять crack. Ну больше вариантов у меня нет.
Кстати, проверял скомпилированный проект в Proteus Pro - тоже работает!
So far, so good, so what...  
RU termostat #22.12.2005 15:47
+
-
edit
 

termostat

аксакал

Alex870> Извините, но Вы не правы, на счет того, что в VMLab 3.11 не поддерживает ATmega8535. Об этом даже на официальном сайте написано (что поддерживает), к тому же он выбирается в combobox'е.
 


я понимаю что ATmega8535 выбирается и симулируется - но список МК есть в ХЕЛПЕ и раз там его нет то это значит что симулятор может но не обязан его симулировать правильно.

Ваш hex в VMLab заработал, а скомпилированный мной проект этой же задачи работать отказался. Вот в чем тут причина может быть?
 



Прицепите сюда проект в виде архива .RAR посмотрим

Alex870> Кстати, проверял скомпилированный проект в Proteus Pro - тоже работает! [»]
 


Ваш или из курса ? и на каком МК ?


+
-
edit
 

Alex870

новичок
К письму прикреплен архив с задачей 3. Он сделан в ICC7, но, как я уже писал проблема проявляется и там и в CodeVision одинаково. Так же в архиве страничка с AVR simulator, debugger and IDE with WinAVR support, где дан список поддерживаемых МК, а в хэлпе нет потому, что при апдейте 3.10 -> 3.11 хэлп не меняется.
Единственно что, я из проекта задачи (из функции прерывания) убрал строки
putchar('R');
putchar('x');
когда компилировал, но я думаю это не могло повлиять на результат, просто компилятор не нашел прототипов этих функций, а в тексте задачи Вы не указали из какого хидера Вы их берете. В этом моменте я могу заблуждаться, так как Си недавно начал изучать, но компилятор мне написал, что не знает символ putchar.
Прикреплённые файлы:
 
So far, so good, so what...  
+
-
edit
 

Alex870

новичок
>Termostat
Вы были правы! Это глюк VMLab c ATmega8535, чего-то они там не дописали. Почему у меня не заработал Ваш проект из задачи 3 я не знаю, но я попробовал создать то же, о чем писал, только для AT90S8535 и все заработало! Попутный вопрос: есть ли у этих МК (S8535 и m8535) совместимость с низу вверх. Ну если я напишу под 90S, а потом в meg'у прошью будет работать? В принципе возможностей 90S мне достаточно, но есть mega.
So far, so good, so what...  

janus

втянувшийся
Попутный вопрос: есть ли у этих МК (S8535 и m8535) совместимость с низу вверх. Ну если я напишу под 90S, а потом в meg'у прошью будет работать? В принципе возможностей 90S мне достаточно, но есть mega. [»]
 

Если мне память не изменяет, у мег есть режим совместимости с 90S, включается фузом. Подробности в ДШ на мегу.
WBR, janus. http://janus.rbcmail.ru  
AD Реклама Google — средство выживания форумов :)
RU termostat #22.12.2005 20:13
+
-
edit
 

termostat

аксакал

Alex870 >
в архиве страничка amctools.com - где дан список поддерживаемых МК, а в хэлпе нет потому, что

при апдейте 3.10 -> 3.11 хэлп не меняется.
 


вы меня удивляете - деза за дезой!

у 3.10 vmlab.hlp 276 кб от 06-2004

у 3.11 vmlab.hlp 280 кб от 01-2005


на будующее -

интернет страничка это реклама, ананонс, а не документация!

документация это: "мануал" или "юзер гайд" или "хелп"

Alex870 >
компилятор не нашел прототипов этих функций, а в тексте задачи Вы не указали из какого хидера Вы их берете
 


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

и есть ведь хелп компилятора с поиком по ключевым словам и с примерами.

Alex870 >
есть ли у этих МК (S8535 и m8535) совместимость с низу вверх
 


есть но не полная, читай документы "мигрэйшн" в апноутах AVR

=======

но гораздо лучше ! и правильней это:

Использовать Мега16 -32 -64 -128 ONLY !
1 2 3 4 5 6 7 12

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