【问题标题】:What microcontroller to use / Converting Arduino c++ to AtmelStudio c++使用什么微控制器 / 将 Arduino c++ 转换为 AtmelStudio c++
【发布时间】:2021-08-05 02:22:52
【问题描述】:

我正在努力解决如何将在我的 ATMega2560 上运行的这个项目缩减为更小的独立芯片。这些是芯片的标准:

  • 24 个 GPIO 引脚,具有高、低、输入和 input_pullup 模式
  • 串行读取兼容性
  • 在内部振荡器上运行
  • 在 JLCPCB 零件库和库存中https://jlcpcb.com/parts
  • 希望成本低

我认为 ATMEGA328PB-AU 是一个有效的选择,但我仍然不确定。

我已经知道如何将 Atmel Studio 7 代码上传到任何 avr 芯片,只是不知道如何将我拥有的 arduino 代码转换为 Atmel Studio 7 代码。

注意: 通过转换代码,我的意思是更改 digitalWritepinMode 函数以直接使用 GPIO B、C、D 和 E 寄存器以提高效率,并将 delayMicroseconds() 更改为 _delay_ms

代码

typedef struct {
  unsigned int com : 4;
  unsigned int pin : 4;
} pair;

typedef struct {
  unsigned int A : 1;
  unsigned int B : 1;
  unsigned int C : 1;
  unsigned int D : 1;
  unsigned int E : 1;
  unsigned int F : 1;
  unsigned int G : 1;
} digit;

//hopefully these pins in the atmel studio 7 code will be defined by PB0, PB1, etc
//below the pin assignments are just random numbers
const byte comPins[8] = {1,2,3,4,5,6,7,8};
const byte regPins[16] = {9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};

const digit digits[] = {
  {1, 1, 1, 1, 1, 1, 0},
  {0, 1, 1, 0, 0, 0, 0},
  {1, 1, 0, 1, 1, 0, 1},
  {1, 1, 1, 1, 0, 0, 1},
  {0, 1, 1, 0, 0, 1, 1},
  {1, 0, 1, 1, 0, 1, 1},
  {1, 0, 1, 1, 1, 1, 1},
  {1, 1, 1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 0, 0, 1, 1}
};

const pair digitPins[][4][7] = {
  {
    {
      {0, 3},
      {1, 1},
      {2, 1},
      {3, 1},
      {3, 3},
      {1, 3},
      {2, 3}
    },
    {
      {0, 5},
      {1, 4},
      {2, 4},
      {3, 4},
      {3, 5},
      {1, 5},
      {2, 5}
    },
    {
      {8, 0},
      {8, 0},
      {8, 0},
      {8, 0},
      {8, 0},
      {8, 0},
      {8, 0}
    },
    {
      {8, 0},
      {8, 0},
      {8, 0},
      {8, 0},
      {8, 0},
      {8, 0},
      {8, 0}
    }
  },
  {
    {
      {7, 2},
      {6, 1},
      {5, 1},
      {4, 1},
      {4, 2},
      {6, 2},
      {5, 2}
    },
    {
      {7, 4},
      {6, 3},
      {5, 3},
      {4, 3},
      {4, 4},
      {6, 4},
      {5, 4}
    },
    {
      {7, 6},
      {6, 5},
      {5, 5},
      {4, 5},
      {4, 6},
      {6, 6},
      {5, 6}
    },
    {
      {0, 7},
      {1, 14},
      {2, 14},
      {3, 14},
      {3, 7},
      {1, 7},
      {2, 7}
    }
  },
  {
    {
      {3, 9},
      {2, 8},
      {1, 8},
      {0, 8},
      {0, 9},
      {2, 9},
      {1, 9}
    },
    {
      {3, 11},
      {2, 10},
      {1, 10},
      {0, 10},
      {0, 11},
      {2, 11},
      {1, 11}
    },
    {
      {3, 13},
      {2, 12},
      {1, 12},
      {0, 12},
      {0, 13},
      {2, 13},
      {1, 13}
    },
    {
      {8, 0},
      {8, 0},
      {8, 0},
      {8, 0},
      {8, 0},
      {8, 0},
      {8, 0}
    }
  },
  {
    {
      {7, 9},
      {6, 8},
      {5, 8},
      {4, 8},
      {4, 9},
      {6, 9},
      {5, 9}
    },
    {
      {7, 11},
      {6, 10},
      {5, 10},
      {4, 10},
      {4, 11},
      {6, 11},
      {5, 11}
    },
    {
      {7, 13},
      {6, 12},
      {5, 12},
      {4, 12},
      {4, 13},
      {6, 13},
      {5, 13}
    },
    {
      {8, 0},
      {8, 0},
      {8, 0},
      {8, 0},
      {8, 0},
      {8, 0},
      {8, 0}
    }
  }
};

bool pins[8][16];

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    byte b = Serial.read();
    //TODO
  }
  for (byte i = 0; i < 8; i++) {
    setComs(1);
    setPin(comPins[i], 3);
    for (int p = 0; p < 16; p++) {
      if (pins[i][p]) {
        setPin(regPins[p], 0);
      }else{
        setPin(regPins[p], 2);
      }
    }
    delayMicroseconds(2000);
    setComs(2);
    setPin(comPins[i], 0);
    for (int p = 0; p < 16; p++) {
      if (pins[i][p]) {
        setPin(regPins[p], 3);
      }else{
        setPin(regPins[p], 1);
      }
    }
    delayMicroseconds(2000);
  }
}

void setDigit(byte row, byte place, digit d) {
  if (digitPins[row][place][0].com != 8) {
    pins[digitPins[row][place][0].com][digitPins[row][place][0].pin] = d.A;
    pins[digitPins[row][place][1].com][digitPins[row][place][1].pin] = d.B;
    pins[digitPins[row][place][2].com][digitPins[row][place][2].pin] = d.C;
    pins[digitPins[row][place][3].com][digitPins[row][place][3].pin] = d.D;
    pins[digitPins[row][place][4].com][digitPins[row][place][4].pin] = d.E;
    pins[digitPins[row][place][5].com][digitPins[row][place][5].pin] = d.F;
    pins[digitPins[row][place][6].com][digitPins[row][place][6].pin] = d.G;
  }
}

void setComs(byte state) {
  for (byte i = 0; i < 8; i++) {
    setPin(comPins[i], state);
  }
}

void setPin(byte pin,byte state) {
  if (state == 0) {
    pinMode(pin, OUTPUT);
    digitalWrite(pin, LOW);
  }else if (state == 1) {
    pinMode(pin, INPUT);
  }else if (state == 2) {
    pinMode(pin, INPUT_PULLUP);
  }else{
    pinMode(pin, OUTPUT);
    digitalWrite(pin, HIGH);
  }
}

【问题讨论】:

  • 我投票结束这个问题,因为它是关于硬件选择的。
  • “使用什么部分”完全是题外话。使用 Atmel/Microchip 网站上的规格选择您的零件,阅读数据表。这不是软件问题。至于转换那些垃圾库函数,只要打开它们,抓住相关部分,制作你自己的.c和.h文件。如果你是一个真正的程序员,你永远不会回去。与 Studio 相比,Arduino UI 是一个玩具。最好的部分是,你会看到这些库真的是多么的臃肿和浪费。

标签: avr arduino-c++ atmelstudio


【解决方案1】:

您是否尝试过使用当前的 Microchip Studio(以前的 Atmel Studio)导入 Arduino 项目,是否可以使用此版本?

根据Microchip的描述,应该可以用Microchip Studio导入Arduino项目:

Microchip Studio 还可以将您的 Arduino® 草图导入为 C++ 项目为您提供从创客空间的简单过渡路径 到市场。

Quote from the offical Microchip Studio site

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多