AVR studio в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение vitalik_1984 »

КАШАК писал(а):У меня такая проблема: раньше программировал в CodeVision, там включение/выключение определённого вывода делалось так:

Код: Выделить всё

PORTA.0=1;  // Включили нулевой пин порта А
PORTA.0=0;  // Выключили нулевой пин порта А


А сейчас перешел на AVR Studio. Как в нем включить/выключить определенный пин порта? Например 1-й пин порта B ?

Заранее спасибо :)

так как по стандарту СИ

Код: Выделить всё

PORTx |=(1<<Pxy);// установить бит Y В порту X
PORTx &=~(1<<Pxy); //снять бит Y в порту X
PORTx ^= 0x00000001; инвертировать нулевой бит

можно воспользоваться библиотекой макросов где прописано

Код: Выделить всё

#define _BV(x)  (1<<x)

тогда

Код: Выделить всё

PORTx |= _BV(Pxy);

или

Код: Выделить всё

#define SET(a) PORTx |= (1<<a)

тогда чтоб установить бит просто пишете

Код: Выделить всё

 SET(Px1);

Во всех примерах x это имя порта y это номер бита.
В поисках истины человек развивается.
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение КАШАК »

А если мне надо вывести на вывод порта последовательность команд, например число 0b11001001 ?

В CodeVision я делал так:

Код: Выделить всё

 unsigned char a;

 for(a=0; a<8; a++){
   PORTD.1=buf & 1<<a;
 }

, где buf=0b11001001;


Как это осуществить в AVR Studio?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение vitalik_1984 »

КАШАК писал(а):А если мне надо вывести на вывод порта последовательность команд, например число 0b11001001 ?

В CodeVision я делал так:

Код: Выделить всё

 unsigned char a;

 for(a=0; a<8; a++){
   PORTD.1=buf & 1<<a;
 }

, где buf=0b11001001;



Как это осуществить в AVR Studio?


так и делать

Код: Выделить всё

 unsigned char a;
   for(a=0; a<8; a++){
       if (buf & 1<<a){PORTD|=_bv(PD1);
       else PORTD&=~_bv(PD1)
   };

 }
, где buf=0b11001001;

А еще вариант - писать в кодевижне, а отлаживать в студии:)
Или посмотреть какой код в асме получается и перевести на си:)

Вот посмотрел -

Код: Выделить всё

AND  R30,R19 ;тут идет сравнение с вычисленной долгим путем(трудно понимаю в асме) значение
   BRNE _0x9 ;если не равно переходим к метке_0x9:
   CBI  0x1B,1 ;соответственно если равно ,то снимаем бит 1 в регистре 0x1B портА при моем тесте
   RJMP _0xA ;продолжаем работу дальше по переходу
_0x9:
   SBI  0x1B,1 ;перешли и устанавливаем бит 1 в регистре портА


Так что принцип реализации в си не сильно отличается от асма.

Обноление
инверсию бита пожно осуществить с помощью операции исключающего или

Код: Выделить всё

PORTB ^=0b00000010;


при каждом выполнении данного оператора бит1 будет меняться на противоположный.
Последний раз редактировалось vitalik_1984 Чт дек 01, 2011 17:32:32, всего редактировалось 4 раза.
В поисках истины человек развивается.
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение КАШАК »

Спасибо, я так и хотел сделать, но думал, что есть более простое решение :))
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение КАШАК »

У кого нибудь есть библиотека для работы с DS1307 ? Пробовал переписать библиотеку CodeVision, микра запустилась, но не могу нормально прочитать с неё время. В CodeVision чтение шло так:

Код: Выделить всё

*sec=bcd2bin(i2c_read(1));  // чтение секунд


А в AVR Studio библиотеки bcd.h нет. Как без неё сделать преобразование?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

Re: AVR studio 4 в вопросах и ответах

Сообщение Rusja2008 »

Можно простыми вычислениями. Когдато для себя писал библиотеку. Выглядит громоздко, зато работает без подключения объемистых библиотек.

Код: Выделить всё

#define transfer(data) ((((data&(1<<6))|(data&(1<<5))|(data&(1<<4)))*0x0A)>>4)+((data&(1<<3))|(data&(1<<2))|(data&(1<<1))|(data&0x01))

З.Ы. может кто сможет упростить вычисления напишете оч интересно :) .
Последний раз редактировалось Rusja2008 Вс окт 30, 2011 13:14:47, всего редактировалось 2 раза.
Не умееш - не берись, но не взявшись не научишся.
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение КАШАК »

Спасибо :))

А можно на с ассемблера из библиотеки CodeVision на AVR Studio? Вот, что написано в библиотеке bcd.h

Код: Выделить всё

#pragma asm_function+



unsigned char bcd2bin(unsigned char n)

{

#asm

    ld   r30,y

    swap r30

    andi r30,0xf

    mov  r26,r30

    lsl  r26

    lsl  r26

    add  r30,r26

    lsl  r30

    ld   r26,y+

    andi r26,0xf

    add  r30,r26

    ret

#endasm

}



unsigned char bin2bcd(unsigned char n)

{

#asm

    ld   r26,y+

    clr  r30

bin2bcd0:

    subi r26,10

    brmi bin2bcd1

    subi r30,-16

    rjmp bin2bcd0

bin2bcd1:

    subi r26,-10

    add  r30,r26

    ret

#endasm

}



#pragma asm_function-


Какой код будет занимать меньше места в памяти МК, этот на асме или вышепреведенный на С?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Rusja2008
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн окт 06, 2008 15:51:58
Откуда: Черкассы

Re: AVR studio 4 в вопросах и ответах

Сообщение Rusja2008 »

Ну вот чего не знаю так это ассемблера :( . Можно упростить заменив функцию дефайном (см. пост выше), код будет пару десятков байт если у Вас насколько критично с местом в памяти. Интереса ради сравните в CVA размер кода с библиотекой и с вычислениями без bcd.h.
Не умееш - не берись, но не взявшись не научишся.
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение КАШАК »

Размер кода не критичен, я пока учусь работать в AVR Studio. Просто стало интересно :)
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
demson
IT KT
Сообщения: 1309
Зарегистрирован: Пн авг 25, 2008 08:49:33
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение demson »

avrstudio5

Если писать ф-ю echotext("Некий_текст");

Код: Выделить всё

void echotext(char *text){
...
    for(a=0;*text!='\0';a++)// по буквам
    {
     for(i=0;i<6;i++){
      sm=sym[(*text)][i];
            WriteData(sm);      
        }
text++;
    }

}

где unsigned char sym - аски массив.
То имеем на выходе WriteData непонятные иероглифы, и строка в 2 раза длиннее одним словом utf8. как заставить передавать в аски кодировке в функцию?
например слово echotext("Спать");
в десятичной пишу 208 161 208 191 208 176 209 130 209 140
в спорах рождается ИСТИНА [AND] flud.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение vitalik_1984 »

demson писал(а):avrstudio5

Если писать ф-ю echotext("Некий_текст");

Код: Выделить всё

void echotext(char *text){
...
    for(a=0;*text!='\0';a++)// по буквам
    {
     for(i=0;i<6;i++){
      sm=sym[(*text)][i];
            WriteData(sm);      
        }
text++;
    }
}


где unsigned char sym - аски массив.
То имеем на выходе WriteData непонятные иероглифы, и строка в 2 раза длиннее одним словом utf8. как заставить передавать в аски кодировке в функцию?
например слово echotext("Спать");
в десятичной пишу 208 161 208 191 208 176 209 130 209 140

1.что означает строка
sm=sym[(*text)][i]; это вы тут передаете букву в функцию WriteData а что за переменная i ? у вас несколько строк?
2.почему вы передаете в функцию указатель на строку, а потом при вычислениях пытаетесь "прибавить" к буквам один?
text++; тут видимо звездочку пропустили.
В поисках истины человек развивается.
Аватара пользователя
demson
IT KT
Сообщения: 1309
Зарегистрирован: Пн авг 25, 2008 08:49:33
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение demson »

Это графический экран. Там растровая развертка.
sym хранит 6 вертикальных полосок. В общем если представить матрицу светодиодов с 6 столбцами и 8 строками, то в массиве каждый байт это столбец. i это номер столбца.

Я передаю адрес на то место памяти где лежит строка.
text++; прибавляю к указателю 1, то есть указатель теперь ссылается на следующую ячейку памяти.

Некий аналог: есть еепром, у каждой ячейки адрес есть. в каждую ячейку можно записать байт. Чтобы перейти к следующему надо сдвинуть адрес на один вперед. +=1

можно написать и так ( text[i] ) массив и есть указатель на первый элемент.

Проблема кроется не в коде. Он работает на другом компиляторе. Проблема в том что *text содержит utf8 строку а я хочу ascii
в спорах рождается ИСТИНА [AND] flud.
scv
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт ноя 04, 2010 20:47:50

Re: AVR studio 4 в вопросах и ответах

Сообщение scv »

Подскажите пожалуйста решение проблемы. Перый раз попробовал настроить АЦП (ATmega8) : одиночные преобразования, выравнивание слева, делитель 32, опорное -AVcc (5В)...Результат вывожу в порт D. Непонятно, почему 1,2,3 В выводятся как надо, а от 3.5 и до 5 - не выводиться ничего. АЦП начинает преобразование после нажатия кнопки (sbis PINB,1).

.include "m8def.inc"
ldi r16, 0b11111111
out DDRD,r16
sbi PORTB,1
ldi r16, 0b10000101
out ADCSRA, r16
ldi r16, 0b01100000
out ADMUX,r16
ldi r20,51
end:
sbis PINB,1
rcall obhod
rjmp end

obhod:
sbi ADCSRA,6
in r16,adch
clr r21

delenie:
sub r16,r20
brmi otr
inc r21
rjmp delenie

otr:
out portd,r21
reti
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: AVR studio 4 в вопросах и ответах

Сообщение Engineer_Keen »

Для начала:

Код: Выделить всё

sbi ADCSRA,6
in r16,adch

Читайте даташит внимательнее.
Установка флага ADSC никак не значит, что следующим тактом можно забирать готовые данные с АЦП.
Либо ждите установки ADIF в тупом цикле, либо работайте через прерывание, либо тупо ждите 14+ тактов столько тактов, сколько нужно при вашем прискалере...
Ну а стек и RETI вместо RET :facepalm:
Аватара пользователя
demson
IT KT
Сообщения: 1309
Зарегистрирован: Пн авг 25, 2008 08:49:33
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение demson »

Вернусь к кодировкам. в 4й студии все работает как часы.
Только 5я с utf8 проблемы создает.
в спорах рождается ИСТИНА [AND] flud.
Serhio
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Serhio »

Подскажите пожалуйста как в АВРСтудио4 посмотреть время сколько длится задержка на асм с помощью точек останова? вот задержка:

Delay: out PortB,Temp

ldi Temp1,1
ldi Temp2,1
ldi Temp3,2

Loop: dec Temp1
brne Loop

dec Temp2
brne Loop

dec Temp3
brne Loop

ret
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: AVR studio 4 в вопросах и ответах

Сообщение Jack_A »

Serhio писал(а):Подскажите пожалуйста как в АВРСтудио4 посмотреть время сколько длится задержка на асм с помощью точек останова? вот задержка:



Чего уж проще : на ret поставить точку останова, перед вызовом п/п задержки обнулить счетчик циклов -- и при останове получаем количество циклов, а если в Simulation options прписана частота кварца, то задержку получаем прямо в микро ( милли ) секундах.
Такой способ получения задержки самый дубовый, потому что в это время проц ничем другим не занят. Надо использовать таймерные прерывания.

Поэтому эта странная конструкция дает задержку 197142 циклов осциллятора, при 4MHz это ~ 49мс. Достаточно было и 2 регистров.
men17
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Пн июл 19, 2010 16:19:24

Re: AVR studio 4 в вопросах и ответах

Сообщение men17 »

Делал программный, 3-х канальный ШИМ на ТИНИ13. Но? оказалось, что надо было под ТИНИ12. Мне всегда хватало Codevision, но не в этом случае... Прочитал в нете что AVR studio может мой код на СИ скомпилировать под ТИНИ12. Начал разбираться, но застрял. Вот скрин с сообщением. Подскажите, что делать дальше?
Весь экран почему то не дает прикрепить :cry: вот окно сообщений.
Вложения
2011-11-07_224604.png
(2.29 КБ) 581 скачивание
Serhio
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень
Контактная информация:

Re: AVR studio 4 в вопросах и ответах

Сообщение Serhio »

Jack_A писал(а):
Serhio писал(а):Подскажите пожалуйста как в АВРСтудио4 посмотреть время сколько длится задержка на асм с помощью точек останова? вот задержка:




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


Это на двух таймерах надо делать? :)
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: AVR studio 4 в вопросах и ответах

Сообщение Gudd-Head »

Serhio писал(а):Это на двух таймерах надо делать? :)

Зачем на двух? :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ответить

Вернуться в «AVR»