Страница 41 из 160

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

Добавлено: Сб окт 29, 2011 00:52:00
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 это номер бита.

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

Добавлено: Сб окт 29, 2011 20:18:33
КАШАК
А если мне надо вывести на вывод порта последовательность команд, например число 0b11001001 ?

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

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

 unsigned char a;

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

, где buf=0b11001001;
Как это осуществить в AVR Studio?

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

Добавлено: Сб окт 29, 2011 21:01:32
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 будет меняться на противоположный.

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

Добавлено: Сб окт 29, 2011 21:42:26
КАШАК
Спасибо, я так и хотел сделать, но думал, что есть более простое решение :))

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

Добавлено: Вс окт 30, 2011 11:50:48
КАШАК
У кого нибудь есть библиотека для работы с DS1307 ? Пробовал переписать библиотеку CodeVision, микра запустилась, но не могу нормально прочитать с неё время. В CodeVision чтение шло так:

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

*sec=bcd2bin(i2c_read(1));  // чтение секунд
А в AVR Studio библиотеки bcd.h нет. Как без неё сделать преобразование?

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

Добавлено: Вс окт 30, 2011 12:13:45
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))
З.Ы. может кто сможет упростить вычисления напишете оч интересно :) .

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

Добавлено: Вс окт 30, 2011 12:43:45
КАШАК
Спасибо :))

А можно на с ассемблера из библиотеки 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-
Какой код будет занимать меньше места в памяти МК, этот на асме или вышепреведенный на С?

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

Добавлено: Вс окт 30, 2011 13:13:46
Rusja2008
Ну вот чего не знаю так это ассемблера :( . Можно упростить заменив функцию дефайном (см. пост выше), код будет пару десятков байт если у Вас насколько критично с местом в памяти. Интереса ради сравните в CVA размер кода с библиотекой и с вычислениями без bcd.h.

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

Добавлено: Вс окт 30, 2011 13:16:14
КАШАК
Размер кода не критичен, я пока учусь работать в AVR Studio. Просто стало интересно :)

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

Добавлено: Вс окт 30, 2011 18:52:29
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

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

Добавлено: Вт ноя 01, 2011 23:15:46
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)]; это вы тут передаете букву в функцию WriteData а что за переменная i ? у вас несколько строк?
2.почему вы передаете в функцию указатель на строку, а потом при вычислениях пытаетесь "прибавить" к буквам один?
text++; тут видимо звездочку пропустили.

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

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

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

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

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

Проблема кроется не в коде. Он работает на другом компиляторе. Проблема в том что *text содержит utf8 строку а я хочу ascii

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

Добавлено: Чт ноя 03, 2011 14:42:49
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

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

Добавлено: Чт ноя 03, 2011 15:14:02
Engineer_Keen
Для начала:

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

sbi ADCSRA,6
in r16,adch
Читайте даташит внимательнее.
Установка флага ADSC никак не значит, что следующим тактом можно забирать готовые данные с АЦП.
Либо ждите установки ADIF в тупом цикле, либо работайте через прерывание, либо тупо ждите 14+ тактов столько тактов, сколько нужно при вашем прискалере...
Ну а стек и RETI вместо RET :facepalm:

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

Добавлено: Пт ноя 04, 2011 01:16:11
demson
Вернусь к кодировкам. в 4й студии все работает как часы.
Только 5я с utf8 проблемы создает.

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

Добавлено: Вс ноя 06, 2011 19:39:55
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

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

Добавлено: Вс ноя 06, 2011 21:52:11
Jack_A
Serhio писал(а):Подскажите пожалуйста как в АВРСтудио4 посмотреть время сколько длится задержка на асм с помощью точек останова? вот задержка:
Чего уж проще : на ret поставить точку останова, перед вызовом п/п задержки обнулить счетчик циклов -- и при останове получаем количество циклов, а если в Simulation options прписана частота кварца, то задержку получаем прямо в микро ( милли ) секундах.
Такой способ получения задержки самый дубовый, потому что в это время проц ничем другим не занят. Надо использовать таймерные прерывания.

Поэтому эта странная конструкция дает задержку 197142 циклов осциллятора, при 4MHz это ~ 49мс. Достаточно было и 2 регистров.

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

Добавлено: Пн ноя 07, 2011 21:45:10
men17
Делал программный, 3-х канальный ШИМ на ТИНИ13. Но? оказалось, что надо было под ТИНИ12. Мне всегда хватало Codevision, но не в этом случае... Прочитал в нете что AVR studio может мой код на СИ скомпилировать под ТИНИ12. Начал разбираться, но застрял. Вот скрин с сообщением. Подскажите, что делать дальше?
Весь экран почему то не дает прикрепить :cry: вот окно сообщений.

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

Добавлено: Чт ноя 10, 2011 20:34:06
Serhio
Jack_A писал(а):
Serhio писал(а):Подскажите пожалуйста как в АВРСтудио4 посмотреть время сколько длится задержка на асм с помощью точек останова? вот задержка:

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

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

Добавлено: Чт ноя 10, 2011 20:41:29
Gudd-Head
Serhio писал(а):Это на двух таймерах надо делать? :)
Зачем на двух? :)