【发布时间】: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 代码。
注意:
通过转换代码,我的意思是更改 digitalWrite 和 pinMode 函数以直接使用 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