Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: С++ AVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
smk
Как вот это записать короче? Суть - копировать бит переменной в нужный бит регистра 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);}

Вопрос вроде пустяковый, но иль лыжи не едут иль я их не смазал. Спасибо!
mempfis_
Цитата(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
xemul
Цитата(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);}
и так далее
Скапипастил, но поправить забыл?
smk
Мне нужно с ног контроллера управлять дешифратором адреса и семсегментного индикатора. Три ноги - адрес, четыре - цифра на семисегментном по адресу, один - погасить весь индикатор. Так вот ноги подойдут не все подряд, а те, что остались от UART, ADC и выходов шим таймера. Смысл кода - назначить ноги "вразброс" исходя из незанятых. Так что не в один порт. Вопрос - как проще скопировать 1 бит если его номер не совпадает с номером в оригинале и в копии?



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


точно, елки!!! Спасибо!
bill_vs
Цитата(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;
...
smk
Короче относится и к записи и ко времени исполнения. Посмотрел Ваше предложение, 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++;
}
Qwertty
Мощно. Семь условий. Подход в лоб.
А что мешает 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);

Так бывает быстрее. Обычно оптимизатор с этим и сам справляется, но проконтроллировать стоит. В общем - смотреть листинг.
smk
Цитата
А что мешает Num0-Num6 поместить в массив. Индексом будет adres

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

А теперь вопрос: если у Вас  все будет намертво привязано к распиновке в схеме, тем самым не единого намека на портируемость данного фрагмента кода, зачем выдумывать на Си, и (о,ужас!) даже 300 байт сэкономили, когда на асме можно нарисовать 16 команд и забыть об этой проблеме как о страшном сне. ?
smk
Цитата
когда на асме можно нарисовать 16 команд и забыть об этой проблеме как о страшном сне. ?

ответ - я не владею АСМом.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.