реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> С++ AVR, подскажите как короче записать
smk
сообщение Mar 20 2009, 14:25
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Как вот это записать короче? Суть - копировать бит переменной в нужный бит регистра PORTn.
Код
if(Num0 & 0b00000001) {seg_port_data_1 |= (1<<seg_pin_data_1);}
  else {seg_port_data_1 &= ~(1<<seg_pin_data_1);}
  if(Num0 & 0b00000010) {seg_port_data_2 |= (1<<seg_pin_data_2);}
  else {seg_port_data_1 &= ~(1<<seg_pin_data_2);}  
  if(Num0 & 0b00000100) {seg_port_data_4 |= (1<<seg_pin_data_4);}
  else {seg_port_data_1 &= ~(1<<seg_pin_data_4);}
  if(Num0 & 0b00001000) {seg_port_data_8 |= (1<<seg_pin_data_8);}
  else {seg_port_data_1 &= ~(1<<seg_pin_data_8);}

Вопрос вроде пустяковый, но иль лыжи не едут иль я их не смазал. Спасибо!


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Mar 20 2009, 15:13
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(smk @ Mar 20 2009, 17:25) *
Как вот это записать короче? Суть - копировать бит переменной в нужный бит регистра PORTn.
Код
if(Num0 & 0b00000001) {seg_port_data_1 |= (1<<seg_pin_data_1);}
  else {seg_port_data_1 &= ~(1<<seg_pin_data_1);}
  if(Num0 & 0b00000010) {seg_port_data_2 |= (1<<seg_pin_data_2);}
  else {seg_port_data_1 &= ~(1<<seg_pin_data_2);}  
  if(Num0 & 0b00000100) {seg_port_data_4 |= (1<<seg_pin_data_4);}
  else {seg_port_data_1 &= ~(1<<seg_pin_data_4);}
  if(Num0 & 0b00001000) {seg_port_data_8 |= (1<<seg_pin_data_8);}
  else {seg_port_data_1 &= ~(1<<seg_pin_data_8);}

Вопрос вроде пустяковый, но иль лыжи не едут иль я их не смазал. Спасибо!


Если биты Num0 нужно скопировать в один порт то можно так
Код
seg_port_data_1 &=0xf0 //зануляем младшие 4 бита
seg_port_data_1 |= Num0 & 0xf0 //копируе сразу 4 младших бита Num0 в порт seg_port_data_1


Вообще опишите задачу поточнее smile.gif
Может у неё есть решения попроще вашего smile.gif
Go to the top of the page
 
+Quote Post
xemul
сообщение Mar 20 2009, 15:26
Сообщение #3



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(mempfis_ @ Mar 20 2009, 18:13) *
Если биты Num0 нужно скопировать в один порт то можно так
Код
seg_port_data_1 &=0xf0 //зануляем младшие 4 бита
seg_port_data_1 |= Num0 & 0xf0 //копируе сразу 4 младших бита Num0 в порт seg_port_data_1

Наверное, таки:
Код
seg_port_data_1 |= Num0 & 0x0f; //копируе сразу 4 младших бита Num0 в порт seg_port_data_1

Если "иголки" в seg_port_data_1 недопустимы, то
Код
seg_port_data_1 ^= (Num0 ^ seg_port_data_1) & 0x0f;


Правда, я не понял задумку автора:
if(Num0 & 0b00000010) {seg_port_data_2 |= (1<<seg_pin_data_2);}
else {seg_port_data_1 &= ~(1<<seg_pin_data_2);}
и так далее
Скапипастил, но поправить забыл?
Go to the top of the page
 
+Quote Post
smk
сообщение Mar 20 2009, 15:51
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Мне нужно с ног контроллера управлять дешифратором адреса и семсегментного индикатора. Три ноги - адрес, четыре - цифра на семисегментном по адресу, один - погасить весь индикатор. Так вот ноги подойдут не все подряд, а те, что остались от UART, ADC и выходов шим таймера. Смысл кода - назначить ноги "вразброс" исходя из незанятых. Так что не в один порт. Вопрос - как проще скопировать 1 бит если его номер не совпадает с номером в оригинале и в копии?



Цитата
Скапипастил, но поправить забыл?


точно, елки!!! Спасибо!


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
bill_vs
сообщение Mar 20 2009, 18:32
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 16-04-05
Из: СПб
Пользователь №: 4 208



Цитата(smk @ Mar 20 2009, 17:25) *
Как вот это записать короче? Суть - копировать бит переменной в нужный бит регистра PORTn.

Если короче относится только к записи на С, в IARe можно так:
CODE
union
{
unsigned char Num0;
struct
{
unsigned char Num0_bit0:1;
unsigned char Num0_bit1:1;
unsigned char Num0_bit2:1;
unsigned char Num0_bit3:1;
};
};

...
Num0=0x0A;
...
PORTD_Bit4=Num0_bit0;
PORTD_Bit5=Num0_bit1;
PORTD_Bit6=Num0_bit2;
PORTD_Bit7=Num0_bit3;
...


Сообщение отредактировал bill_vs - Mar 20 2009, 18:36
Go to the top of the page
 
+Quote Post
smk
сообщение Mar 20 2009, 18:40
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Короче относится и к записи и ко времени исполнения. Посмотрел Ваше предложение, bill_vs. Это в WinAVR сработает? Для более полного понимания привожу весь обработчик прерывания.
Код
ISR(TIMER0_COMPB_vect)
{
adres++;
if(cloc==175) {cloc=0;U_disp();I_disp();}
if(adres==7) {adres=0;}
if(adres & 0b00000001) {seg_port_adres_1 |= (1<<seg_pin_adres_1);}
else {seg_port_adres_1 &= ~(1<<seg_pin_adres_1);}
if(adres & 0b00000010) {seg_port_adres_2 |= (1<<seg_pin_adres_2);}
else {seg_port_adres_2 &= ~(1<<seg_pin_adres_2);}
if(adres & 0b00000100) {seg_port_adres_4 |= (1<<seg_pin_adres_4);}
else {seg_port_adres_4 &= ~(1<<seg_pin_adres_4);}
if(cloc==175) {cloc=0; U_disp(); I_disp;}
if(adres==0)
{
  if(Num0 & 0b00000001) {seg_port_data_1 |= (1<<seg_pin_data_1);}
  else {seg_port_data_1 &= ~(1<<seg_pin_data_1);}
  if(Num0 & 0b00000010) {seg_port_data_2 |= (1<<seg_pin_data_2);}
  else {seg_port_data_2 &= ~(1<<seg_pin_data_2);}  
  if(Num0 & 0b00000100) {seg_port_data_4 |= (1<<seg_pin_data_4);}
  else {seg_port_data_4 &= ~(1<<seg_pin_data_4);}
  if(Num0 & 0b00001000) {seg_port_data_8 |= (1<<seg_pin_data_8);}
  else {seg_port_data_8 &= ~(1<<seg_pin_data_8);}
}
if(adres==1)
{
  if(Num1 & 0b00000001) {seg_port_data_1 |= (1<<seg_pin_data_1);}
  else {seg_port_data_1 &= ~(1<<seg_pin_data_1);}
  if(Num1 & 0b00000010) {seg_port_data_2 |= (1<<seg_pin_data_2);}
  else {seg_port_data_2 &= ~(1<<seg_pin_data_2);}  
  if(Num1 & 0b00000100) {seg_port_data_4 |= (1<<seg_pin_data_4);}
  else {seg_port_data_4 &= ~(1<<seg_pin_data_4);}
  if(Num1 & 0b00001000) {seg_port_data_8 |= (1<<seg_pin_data_8);}
  else {seg_port_data_8 &= ~(1<<seg_pin_data_8);}
}
if(adres==2)
{
  if(Num2 & 0b00000001) {seg_port_data_1 |= (1<<seg_pin_data_1);}
  else {seg_port_data_1 &= ~(1<<seg_pin_data_1);}
  if(Num2 & 0b00000010) {seg_port_data_2 |= (1<<seg_pin_data_2);}
  else {seg_port_data_2 &= ~(1<<seg_pin_data_2);}  
  if(Num2 & 0b00000100) {seg_port_data_4 |= (1<<seg_pin_data_4);}
  else {seg_port_data_4 &= ~(1<<seg_pin_data_4);}
  if(Num2 & 0b00001000) {seg_port_data_8 |= (1<<seg_pin_data_8);}
  else {seg_port_data_8 &= ~(1<<seg_pin_data_8);}  
}
if(adres==3)
{
  if(Num3 & 0b00000001) {seg_port_data_1 |= (1<<seg_pin_data_1);}
  else {seg_port_data_1 &= ~(1<<seg_pin_data_1);}
  if(Num3 & 0b00000010) {seg_port_data_2 |= (1<<seg_pin_data_2);}
  else {seg_port_data_2 &= ~(1<<seg_pin_data_2);}  
  if(Num3 & 0b00000100) {seg_port_data_4 |= (1<<seg_pin_data_4);}
  else {seg_port_data_4 &= ~(1<<seg_pin_data_4);}
  if(Num3 & 0b00001000) {seg_port_data_8 |= (1<<seg_pin_data_8);}
  else {seg_port_data_8 &= ~(1<<seg_pin_data_8);}  
}
if(adres==4)
{
  if(Num4 & 0b00000001) {seg_port_data_1 |= (1<<seg_pin_data_1);}
  else {seg_port_data_1 &= ~(1<<seg_pin_data_1);}
  if(Num4 & 0b00000010) {seg_port_data_2 |= (1<<seg_pin_data_2);}
  else {seg_port_data_2 &= ~(1<<seg_pin_data_2);}  
  if(Num4 & 0b00000100) {seg_port_data_4 |= (1<<seg_pin_data_4);}
  else {seg_port_data_4 &= ~(1<<seg_pin_data_4);}
  if(Num4 & 0b00001000) {seg_port_data_8 |= (1<<seg_pin_data_8);}
  else {seg_port_data_8 &= ~(1<<seg_pin_data_8);}    
}
if(adres==5)
{
  if(Num5 & 0b00000001) {seg_port_data_1 |= (1<<seg_pin_data_1);}
  else {seg_port_data_1 &= ~(1<<seg_pin_data_1);}
  if(Num5 & 0b00000010) {seg_port_data_2 |= (1<<seg_pin_data_2);}
  else {seg_port_data_2 &= ~(1<<seg_pin_data_2);}  
  if(Num5 & 0b00000100) {seg_port_data_4 |= (1<<seg_pin_data_4);}
  else {seg_port_data_4 &= ~(1<<seg_pin_data_4);}
  if(Num5 & 0b00001000) {seg_port_data_8 |= (1<<seg_pin_data_8);}
  else {seg_port_data_8 &= ~(1<<seg_pin_data_8);}  
}
if(adres==6)
{
  if(Num6 & 0b00000001) {seg_port_data_1 |= (1<<seg_pin_data_1);}
  else {seg_port_data_1 &= ~(1<<seg_pin_data_1);}
  if(Num6 & 0b00000010) {seg_port_data_2 |= (1<<seg_pin_data_2);}
  else {seg_port_data_2 &= ~(1<<seg_pin_data_2);}  
  if(Num6 & 0b00000100) {seg_port_data_4 |= (1<<seg_pin_data_4);}
  else {seg_port_data_4 &= ~(1<<seg_pin_data_4);}
  if(Num6 & 0b00001000) {seg_port_data_8 |= (1<<seg_pin_data_8);}
  else {seg_port_data_8 &= ~(1<<seg_pin_data_8);}  
}
cloc++;
}


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Mar 21 2009, 10:11
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Мощно. Семь условий. Подход в лоб.
А что мешает Num0-Num6 поместить в массив. Индексом будет adres
Код
uint8_t Nums[7];

ISR(TIMER0_COMPB_vect)
{
uint8_t Num;
if(++adres > 6) adres = 0;
Num = Nums[adres];
// всяко разно
if(Num & 0b00000001) seg_port_data_1 |= (1<<seg_pin_data_1);  else seg_port_data_1 &= ~(1<<seg_pin_data_1);
if(Num & 0b00000010) seg_port_data_2 |= (1<<seg_pin_data_2);  else seg_port_data_2 &= ~(1<<seg_pin_data_2);  
if(Num & 0b00000100) seg_port_data_4 |= (1<<seg_pin_data_4);  else seg_port_data_4 &= ~(1<<seg_pin_data_4);
if(Num & 0b00001000) seg_port_data_8 |= (1<<seg_pin_data_8);  else seg_port_data_8 &= ~(1<<seg_pin_data_8);  
cloc++;
}

Для уменьшения времени в обработчике еще бывает полезно избавиться от else
Код
seg_port_data_1 &= ~(1<<seg_pin_data_1);
if(Num & 0b00000001) seg_port_data_1 |= (1<<seg_pin_data_1);

Так бывает быстрее. Обычно оптимизатор с этим и сам справляется, но проконтроллировать стоит. В общем - смотреть листинг.
Go to the top of the page
 
+Quote Post
smk
сообщение Mar 21 2009, 15:53
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
А что мешает Num0-Num6 поместить в массив. Индексом будет adres

Однако Спасибо! На 300 байт короче стало и записалось компактнее.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 21 2009, 16:24
Сообщение #9


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(smk @ Mar 20 2009, 18:51) *
Смысл кода - назначить ноги "вразброс" исходя из незанятых.

А теперь вопрос: если у Вас  все будет намертво привязано к распиновке в схеме, тем самым не единого намека на портируемость данного фрагмента кода, зачем выдумывать на Си, и (о,ужас!) даже 300 байт сэкономили, когда на асме можно нарисовать 16 команд и забыть об этой проблеме как о страшном сне. ?
Go to the top of the page
 
+Quote Post
smk
сообщение Mar 21 2009, 16:55
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
когда на асме можно нарисовать 16 команд и забыть об этой проблеме как о страшном сне. ?

ответ - я не владею АСМом.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th June 2025 - 06:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01546 секунд с 7
ELECTRONIX ©2004-2016