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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

А так ?

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

#define getbit(reg, bit) ((reg&(1<<bit))!=0)

У "!=" приоритет выше, чем у "&". Я немного лохонулся в спешке :facepalm:
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

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

Сообщение R_ura »

Аlex писал(а):А так ?

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

#define getbit(reg, bit) ((reg&(1<<bit))!=0)

У "!=" приоритет выше, чем у "&". Я немного лохонулся в спешке :facepalm:


Работает..
и так
pin_1 = getbit(byte, 1);

и так
if(getbit(byte, 1)) pin_1 = 1;
else pin_1 = 0;

Большое спасибо..
SFOR
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт янв 01, 2013 13:55:45

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

Сообщение SFOR »

Здравствуйте !!!
помогите пожалуйста, нужно в исходнике предоставленным автором в теме "Умная зарядка NiMh AA аккумуляторов. http://www.radiokot.ru/forum/viewtopic.php?f=25&t=20002&start=360 " упрощенный вариант поменять шаг АЦП с 400 поменять на 380 ,что в моем случаи ,это то я сделал ..но с компилировать не получается - у автора hex 6КВ ,а меня 23 КВ :shock: . Сам немного программирую точнее учусь в AlgorithmBuilder , с codevisionavr вообще туго ...
Вложения
mk.7z
(12.35 КБ) 154 скачивания
Аватара пользователя
@nod
Встал на лапы
Сообщения: 98
Зарегистрирован: Вт июл 29, 2008 01:45:38
Откуда: Днепропетровск

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

Сообщение @nod »

@nod писал(а):делаю разводку печатки и для удобо... вобщем хочу поменять ноги проца в порту выхода сегментов, чтоб на печатке не пересекались


После осознания массива удалось переставить всё как хотелось!
Набросал некоторое пояснение, как я делал ( может кому-то понадобится).
И (уж не хотелось создавать новую тему) архив по теме "Термометр".
В архиве схема до переделки, переделка под DIP (перестановка портов индикатора и Далласа), и дальнейшее - TQFP.
Печатка. Файлики Протеуса тоже есть.
Всем спасибо!
С наступающим Новым годом!
Вложения
Соответствие и подмена сегментов.xls
(14.5 КБ) 189 скачиваний
Термометр АТмега8.7z
(326.7 КБ) 146 скачиваний
Аватара пользователя
AndTer
Поставщик валерьянки для Кота
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

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

Сообщение AndTer »

1. Подскажите пожалуйста команду для замены одного конкретного бита в байте1 другим конкретным битом из байта2. Т.е.

a1=0b01100101
a2=0b10001110

требуется заменить допустим 3 бит из a1 на 6 бит из а2. При этом байт а2 остаётся целым(сдвиг к нему нельзя применить).
Какое может быть универсальное решение (требуется подставлять лишь номера битов)?
(речь не идёт о логическом И или ИЛИ или НЕ, а именно о замене)...
Т.е. по аналогии с портами ввода/вывода:
PORTA.3=PINB.6

или оно будет работать?
Т.е. a1.3=a2.6
Просто у меня некуда вывести результат работы... Если только по USART...

2. То же самое только заменять сразу два бита из а1 на два бита а2 (два бита расположены последовательно)
Или так же придётся по одному биту? То есть две команды вместо 1... Или можно сразу два?

что то подсказывает надо через маску делать... но не помню... давно не программировал...
Сделать а1 "И" с маской, а потом сделать "ИЛИ" с а2? Хотя нет... не получится произвольные пары менять... сдвигать исходное нельзя... вводить временный байт не серьёзно... быстрее будет по единичным битам поменять...

Помогите с кодом... кто в курсе... а то кучу времени потрачу на отладку...
Глупый не задает вопросы. Глупый и так все знает.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

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

//Date    : 30.12.2013
//Chip type           : ATtiny13
//Clock frequency     : 1,000000 MHz

#include <tiny13.h>

unsigned char a1=0b01100101;
unsigned char a2=0b10001110;
bit exchange;
             
void main(void)
{
// a1.3=a2.6
exchange= a2 & 0x40; // выделяем шестой бит в а2
a1&= 0xF7; // сбрасываем третий бит в а1
a1|= exchange << 3; // на место третьего бита в а1 ставим выделенный
}
Docendo discimus
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

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

Сообщение radio-kot »

как в itoa() результат выровнять вправо или подскажите другую функцию?

т.е. от числа 934 она выдает в массив числа 9 3 4 0, а хотелось бы более адекватного преобразования типа: 0 9 3 4
Будете проходить мимо- проходите!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

radio-kot писал(а):она выдает в массив числа 9 3 4 0
Это почему ? Число же не 9340. Строка будет "934", нули добавляйте сами, в зависимости от кол-ва символов.
Можно sprintf заюзать.
Аватара пользователя
AndTer
Поставщик валерьянки для Кота
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

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

Сообщение AndTer »

radio-kot писал(а):как в itoa() результат выровнять вправо или подскажите другую функцию?

т.е. от числа 934 она выдает в массив числа 9 3 4 0, а хотелось бы более адекватного преобразования типа: 0 9 3 4

Она выдаёт в массив не числа, а !символы! результат её работы является строка, а не число, а строковые переменные оканчиваются нулевым символом(не читаемым), а не нулём.
И если ты выведешь эту переменную в USART, например, то увидешь в терминале всё те же 934.

С какой целью применял эту функцию? Может надо было что то другое применить?

Если для часов, то попробуй формировать результат в spritf, а в нём, предварительно проверив первую декаду на меньше ли оно 10, добавлять символ 0 впереди...
Глупый не задает вопросы. Глупый и так все знает.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

хотелось бы более адекватного преобразования типа: 0 9 3 4

использовал код MBedder'а:

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

/* Speed optimized version */
char asc[6];

void uitoa1(unsigned int binval)
{
unsigned int temp,val;
char binc,atemp;

val=binval;

atemp='0'; temp=10000; while(val >= temp) {atemp++; val-=temp;}; *(asc+0)=atemp;
atemp='0'; temp=1000; while(val >= temp) {atemp++; val-=temp;}; *(asc+1)=atemp;
atemp='0'; temp=100; while(val >= temp) {atemp++; val-=temp;}; *(asc+2)=atemp;
atemp='0'; binc=(char)val; while(binc >= 10) {atemp++; binc-=10;}; *(asc+3)=atemp;
binc+='0'; *(asc+4)=binc;
*(asc+5)=0;
}


еще вариант:

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

/* Size optimized version */
char asc[6];

void uitoa2(unsigned int binval)
{
int step[]={10000,1000,100,10,1};
unsigned int temp,val;
char i,atemp;

val=binval;

 for (i=0; i<5; i++)
 {
  temp=step[i];
  atemp='0';
  while(val >= temp)
  {
   atemp++;
   val-=temp;
  }
  asc[i]=atemp;
 }
*(asc+5)=0;
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

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

Сообщение radio-kot »

Спасибо друзья! :))

особенно за код, в cvavr proteus работает и чуть быстрей штатной itoa() на 9999 потратил 280 тактов вместо 330.
заменил '0' на 0 и получил числа в массиве для вывода на 7 сегментник.

а про нули в конце строки в данном случае не то, так как 86 преобразует в 8600, а не в 0860
а 6785 преобразует в 6 7 8 5 без нуля. Она б и рада 0 записать да только я массив на 4 элемента всего объявил. :beer:
Будете проходить мимо- проходите!
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

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

for(i=3; i<= 0, data!=0; i--)
   {
      str[i]=data%10;
      data /=10;
   }
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
0867532
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб май 25, 2013 21:14:11
Откуда: Москва
Контактная информация:

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

Сообщение 0867532 »

Нужно выводить число на графический экран(ST7920)
Библиотека самописная.
Написал функцию вывода char и stringF соответственно.
Функция вывода переменной BOSS

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

void VideoDrawVar (int VideoCacheVar, unsigned int VideoDrawMode){
unsigned int VideoCacheVarLong;

if(VideoCacheVar<1000) { VideoCacheVarLong=3; }
if(VideoCacheVar<100) { VideoCacheVarLong=2; }
if(VideoCacheVar<10) { VideoCacheVarLong=1; }

itoa(VideoCacheVar,VideoVarCache);
if (VideoDrawMode==0) {
for (i=0; i<VideoCacheVarLong; i++){
VideoDrawCharNor(VideoVarCache[i]);
} }else{
for (i=0; i<VideoCacheVarLong; i++){
VideoDrawCharInv(VideoVarCache[i]);
} } }

Работает отлично, но не могу вызвать обновление экрана в прерывании(основной принцип работы девайса)
Пробовал Заменять на sprintf:

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

sprintf(VideoVarCache, "%d", BOSS);
VideoDrawStringF(VideoVarCache,0);

Или:

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

sprintf(VideoVarCache, "%d", BOSS);
for (i=0; i<20; i++) {
VideoDrawCharNor(VideoVarCache[i]); }

Контроллер просто перезапускается, зависает то есть.
Подскажите как быть...
Могу привести функции VideoDrawCharNor , VideoDrawCharInv, VideoDrawStringF. Но я думаю и так понятно как они работают.
Аватара пользователя
AndTer
Поставщик валерьянки для Кота
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

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

Сообщение AndTer »

0867532 писал(а):.

Может где перестарался с запретом прерываний и срабатывает сторожевой таймер? Может его иногда пинать собственноручно?
Глупый не задает вопросы. Глупый и так все знает.
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

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

Сообщение radio-kot »

unalex, а порядок цифр правильный получится?
Будете проходить мимо- проходите!
Аватара пользователя
0867532
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб май 25, 2013 21:14:11
Откуда: Москва
Контактная информация:

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

Сообщение 0867532 »

AndTer писал(а):Может где перестарался с запретом прерываний и срабатывает сторожевой таймер? Может его иногда пинать собственноручно?

Оказалось, компилятор забажился. Перезапустил CVAVR и норм.
Если возникнут вопросы - посмотрите на мой аватар.
SabitofF
Нашел транзистор. Понюхал.
Сообщения: 191
Зарегистрирован: Сб июн 26, 2010 12:08:42

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

Сообщение SabitofF »

доброй ночи, подскажите, почему у меня не работает ф-ция

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

while (PORTВ.5==0)

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

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

#include <tiny13.h>
#include <delay.h>

void main(void)
{
    PORTB=0b110000;
    DDRB=0b001111;
while (1)
    {
     
             while (PORTB.5==0)
             {
             PORTB=0b000101;
             delay_ms(100); 
             PORTB=0b001010;
             delay_ms(100);
             };
    };
}
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

Потому, что у вас PORTB.5 всегда равен 1. Если используете двоичное представление числа пишите 8 знаков после 0b, будет меньше путанины. Если это у вас кнопка нужно писать PINB.5
«И всё-таки она вертится!»
SabitofF
Нашел транзистор. Понюхал.
Сообщения: 191
Зарегистрирован: Сб июн 26, 2010 12:08:42

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

Сообщение SabitofF »

то есть не правильно настроены порты? Можете разъяснить как их правильно настраивать? И как подключить подтягивающий резистор к кнопке?
Заранее благодарен!

Apparatchik писал(а):пишите 8 знаков после 0b, будет меньше путанины.

но у attiny13 всего 6 портов, почему писать 8 символов?
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

SabitofF писал(а):то есть не правильно настроены порты? Можете разъяснить как их правильно настраивать? И как подключить подтягивающий резистор к кнопке?
Заранее благодарен!

http://www.123avr.com/02.htm Ищите абзац Порт в МК
SabitofF писал(а):но у attiny13 всего 6 портов, почему писать 8 символов?

Для тех пинов, которых "нету" ставьте нули.
«И всё-таки она вертится!»
Ответить

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