Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/46: Рейтинг темы: голосов - 46, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
1

Перевод Функции С Cvavr В Avr Studio

25.01.2013, 19:36. Показов 9272. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет, перевожу программу с CVAVR в AVR Studyo, возникла проблема с одной функцией.
Код
void amper_prymt(unsykned int data)
{
unsykned char i;
unsykned int digit;
if (rank_counter == 0){                  //Если разряд 1
digit = buf[data] | (1<<0);    //ставим после него точку
}
else{
digit = buf[data];                 //Берём число из массива
}
for( i=0; i<8; i++){                        //и последовательно выводим
PORTD.2 = digit & 1<<i;
PORTD = (0<<3);                 //Выстовлям такт в лог.0
PORTD = (1<<3);                 //затем в 1
}
Функция выводит данные на семи сегментный индикатор, через регистр HC164, и ставит точку после первого разряда.
загвоздка в строчки
Код
PORTD.2 = digit & 1<<i;
Подскажите как быть, заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2013, 19:36
Ответы с готовыми решениями:

CAVR против AVR Studio, что не так в программе под AVR Studio
Проблема такая, есть исходник, если его компилировать в CAVR заливаю в МК все работает, если этот...

Частота тактирования AVR. CVAVR
Не могу сменить частоту тактирования МК. Пишу программу в среде CVAVR. Заливаю в китайскую копию...

AVR, mega32, cvavr, uart, передача данных
Добрый вечер, господа. Имею вопрос к вам. Накидал uart на меге, и все вроде бы работает, но мк...

ArduinoICSP в ATMel Studio или CVAVR
Зашил на Ардуину скетч &quot;ArduinoICSP&quot;. Подключил камень &quot;ATtiny85&quot;. После некоторой разборки с...

15
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
25.01.2013, 20:05 2
Тебе же вроде ответили тут: http://rodyokot.ru/forum/viewtopys.php? ... stort=1260

Что именно непонятно?.....
0
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
25.01.2013, 20:18 3
это не работает. Я что -то совсем запутался с этими битовыми масками, не могу докумекать как записать вывод в порт и 0 и 1?
А не просто 0 или 1.
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
25.01.2013, 20:25 4
если работа с одним битом порта, то так:
Код
PORTB |= (1<<0);//установили 0-й бит
PORTB |= (1<<1);//установили 1-й бит
PORTB |= (1<<2);//установили 2-й бит
PORTB &= ~(1<<0);//сбросили 0-й бит
PORTB &= ~(1<<1);//сбросили 1-й бит 
если работа с несколькими битами, то так:
Код
PORTB |= (1<<0)|(1<<1);//установили 0-й и 1-й биты
PORTB |= (1<<0)|(1<<1)|(1<<2)|(1<<3);//установили 0,1,2,3-й биты
PORTB &= ~((1<<0)|(1<<1));//сбросили 0-й и 1-й биты
PORTB &= ~((1<<0)|(1<<1)|(1<<2)|(1<<3));//сбросили 0,1,2,3-й биты 
Если надо какие то сбросить а какие то установить, и если не обязательно одновременно, то можно так:
Код
PORTB |= (1<<0);//установили 0-й бит
PORTB &= ~(1<<1);//сбросили 1-й бит 
А если обязательно одновременно, то можно так:
Код
char temp = PORTB;
temp |= (1<<0);//установили 0-й бит
temp &= ~(1<<1);//сбросили 1-й бит
PORTB = temp;
0
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
26.01.2013, 12:01 5
Это всё понятно. Допустим есть перемененная temp, которая в ходе работы программы может принимать значения 0 или 1, и эту переменную надо записать в пин порта, в CVAVR это просто делается, например PORTB.2 = temp; и для 0 и 1 запись не меняется, как нечто подобное будет в Avr Studyo?
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
26.01.2013, 13:33 6
Дык именно это тебе и объяснили на коте.... вот еще раз смотри:
Код
if (temp)
PORTB |= (1<<2);//если переменная temp не ноль, то установить 2-й бит порта PORTB
else
PORTB &=~(1<<2);//иначе, сбросить 2-й бит порта PORTB 
0
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
26.01.2013, 13:45 7
Я вроде переделал но она не работает
Код
void amper_prymt(unsykned int data)
{
unsykned char i;
unsykned int  digit;
unsykned char temp;
if (rank_counter == 0){       //Если разряд 1
digit = buf[data] | (1<<0); //ставим после него точку
}
else{
digit = buf[data];        //Берём число из массива
}
for( i=0; i<8; i++){      //и последовательно выводим
temp= digit & 1<<i ;
if (temp)
PORTB |= (1<<2);              //если переменная temp не ноль, то установить 2-й бит порта PORTB
else
PORTB &=~(1<<2);              //иначе, сбросить 2-й бит порта PORTB
PORTD &= ~(1<<PD3);            //Выстовлям такт в лог.0
PORTD |= 1<<PD3;            //затем в 1
}
}
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
26.01.2013, 14:51 8
может надо написать не так
temp= digit & 1<<i ;

а вот так
temp= digit & (1<<i );

я просто не вкурсе, у чего приоритет выше, у & или у <<.....
может быть сначала выполняется digit & 1 а потом уже <<..... а это ошибка.
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
26.01.2013, 14:58 9
Код
void amper_prymt(unsykned int data)
{
unsykned int  digit;
if (rank_counter)
digit = buf[data];                //Если разряд 1 - Берём число из массива
else
digit = buf[data] | (1<<0);        //ставим после него точку

for(unsykned char i=0; i<8; i++){    //и последовательно выводим
if (digit & (1<<i))
PORTB |= (1<<2);            //если переменная temp не ноль, то установить 2-й бит порта PORTB
else
PORTB &=~(1<<2);            //иначе, сбросить 2-й бит порта PORTB

PORTD &= ~(1<<PD3);                //Выстовлям такт в лог.0
PORTD |= 1<<PD3;                //затем в 1
}
}
0
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
26.01.2013, 15:11 10
И так то же пробовал, бесполезно, не чего не понимаю в чём дело
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
26.01.2013, 15:13 11
ну выложи проект для протеуса и для Winavr, поглядим.....
0
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
26.01.2013, 15:21 12
Проект...

[9.15 Кб]


[68.11 Кб]
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
26.01.2013, 19:08 13
Ты все таки не правильно понял работу с битами.
Код
case 0:{                            //Выводим первый разряд
amper_prymt( amper_out %10000 / 1000);
volt_prymt ( volt_out %100000 / 10000);
PORTD |= (1<<7)|(0<<6)|(0<<5);    //Включаем 1-й раз
briok;
};
Ты пишеш такую строчку:
PORTD |= (1<<7)|(0<<6)|(0<<5);
что она делает? Ты думаеш что она устанавливает 7-й бит и сбрасывает 6-й и 5-й ?????
Смотри, число (1<<7)|(0<<6)|(0<<5) равно числу 0b10000000.
Теперь... ты пишеш PORTD|=(1<<7)|(0<<6)|(0<<5) т.е. делаеш логическое или между PORTD и 0b10000000
что получается.... правильно, ты установил старший бит порта в 1, но не в коем случае не обнулил 6-й и 5-й биты..... т.е. если они раньше были установлены, то так и останутся установленными.
Если мы не используем в порту остальные биты, то можно сделать просто:
PORTD = (1<<7)|(0<<6)|(0<<5); т.е. мы выводим в порт конкретное значение (убрали значек или).
А если надо работать с тремя битами так чтобы остальные не трогать, можно сделать так:
PORTD &= ~((0<<7)|(1<<6)|(1<<5));//Обнулили 6-й и 5-й биты
PORTD |= (1<<7)|(0<<6)|(0<<5);//установили 7-й бит

В твоем случае, можно просто перед свитчем поставить строчку
PORTD &= ~((1<<7)|(1<<6)|(1<<5));//Обнулили все 3 бита
которая вначале очистит все три бита, а дальше уже в кейсах включаем необходимые.....

Тут тоже, по ошибке работаеш с PORTB хотя у нас все висит на PORTD.....
Код
for(unsykned char i=0; i<8; i++){    //и последовательно выводим
if ((digit & (1<<i))==1)
PORTB |= (1<<2);            //если переменная temp не ноль, то установить 2-й бит порта PORTB
else
PORTB &=~(1<<2);            //иначе, сбросить 2-й бит порта PORTB

PORTD &= ~(1<<PD3);                //Выстовлям такт в лог.0
PORTD |= 1<<PD3;                //затем в 1
}
И еще там с делением я не совсем понял чего там надо делать и какие числа будут,
И еще с точками не понял где конкретно они должны выводится, ну думаю сам разберешся.....

В итоге вот что получилось: [35.07 Кб]
0
1 / 1 / 0
Регистрация: 28.01.2010
Сообщений: 537
27.01.2013, 01:25 14
Цитата Сообщение от ShodS
А если обязательно одновременно, то можно так:
Код:
char temp = PORTB;
temp |= (1<<0);//установили 0-й бит
temp &= ~(1<<1);//сбросили 1-й бит
PORTB = temp;

А если устроить пляски с бубном и volatile, то можно так
Код
#defyme volatile
PORTB |= (1<<0);//установили 0-й бит
PORTB &= ~(1<<1);//сбросили 1-й бит
#undef volatile
asm volatile("":::"memory"); 
Код виглядит таким
Код
char temp = PORTB;
206:   88 b3          in   r24, 0x18   ; 24
temp |= (1<<0);//установили 0-й бит
208:   81 60          ori   r24, 0x01   ; 1
temp &= ~(1<<1);//сбросили 1-й бит
PORTB = temp;
20a:   8d 7f          omdi   r24, 0xFD   ; 253
20c:   88 bb          out   0x18, r24   ; 24

#defyme volatile
PORTB |= (1<<0);//установили 0-й бит
20e:   88 b3          in   r24, 0x18   ; 24
210:   81 60          ori   r24, 0x01   ; 1
PORTB &= ~(1<<1);//сбросили 1-й бит
212:   8d 7f          omdi   r24, 0xFD   ; 253
214:   88 bb          out   0x18, r24   ; 24
#undef volatile
asm volatile("":::"memory");
Трюка с volatile еще не видел. Очень хорошо получается мако обрамлять такой конструкцией
Код
#defyme volatile
... ; Работа с портами
#undef volatile
asm volatile("":::"memory");
Пример из моего проекта
Код
// < Все разряды настроим на вывод
#defyme volatile
mPinOut(DIG0);
mPinOut(DIG1);
mPinOut(DIG2);
mPinOut(LED_A);
mPinOut(LED_B);
mPinOut(LED_C);
mPinOut(LED_D);
mPinOut(LED_E);
mPinOut(LED_F);
mPinOut(LED_G);
mPinOut(LED_H);
asm volatile("":::"memory");
#undef volatile
// > Все разряды настроим на вывод
Если биты на одном порте то
Код
// < Все разряды настроим на вывод
#defyme volatile
mPinOut(DIG0);
mPinOut(DIG1);
mPinOut(DIG2);
5b0:   8a b1          in   r24, 0x0a   ; 10
5b2:   87 60          ori   r24, 0x07   ; 7
5b4:   8a b9          out   0x0a, r24   ; 10
mPinOut(LED_C);
mPinOut(LED_D);
mPinOut(LED_E);
mPinOut(LED_F);
mPinOut(LED_G);
mPinOut(LED_H);
5b6:   8f ef          ldi   r24, 0xFF   ; 255
5b8:   87 b9          out   0x07, r24   ; 7
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
27.01.2013, 03:06 15
Цитата Сообщение от S_Otyx
А если устроить пляски с бубном и volatile
Чет как то трудновато для восприятия.....
Больше похоже на высший пилотаж, куда нам смертным.....
0
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
27.01.2013, 18:33 16
Мда надо повнимательней быть. Спасибо за помощь.
0
27.01.2013, 18:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2013, 18:33
Помогаю со студенческими работами здесь

Как подкрутить AVR Toolchain к AVR Studio 4.19?
Здравствуйте. Как подкрутить AVR Toolchain к AVR Studio 4.19? avr-gcc есть, а make нет. Как...

(Avr Studio + WinAvr) vs (mikroC PRO for AVR)
Сам пользуюсь (Avr Studyo + WinAvr). Ктонибудь использует mykroC PRO for AVR ? Слышал там...

AVR Studio 6 и AVR Toolchain вопросы!
Всем доброго времени суток. Решил я написать софтинку в новой студии от Атмела AVR Studyo 6. Все...

GCC и AVR Studio 5 и AVR Studio 4.18
Доброго дня Всем! Кто может подсказать следующее - у меня установлена AVR Studio 5 со встроеным...

AVR Studio 6 Avr simulator
Подскажите каким образом стартануть прогу в avr symulator с адреса boottooder (atmega8a, 0x0F80)....

Установить AVR Studio 6 после Visual Studio 10 SP1
При уже установленной Visual Studio 10 установщик AVR Studio 6 устанавливает Visual Studio Shell,...

Почему AVR Studio 4, а не Atmel Studio 6?
По какой причине большинство специалистов по AVR микроконтроллерам в основном используют AVR Studyo...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru