Anonymous
Светодиодная матрица неправильно отображает данные со структур
Сообщение
Anonymous » 31 мар 2024, 14:51
Я только начал работать со светодиодной матрицей (16*16) и attiny85.
Текущая цель — включить светодиод в каждой строке, где номер светодиода — это количество ряд (я знаю, что светодиодная лента похожа на змею, пока это не имеет значения).
Итак, я написал байтовую матрицу[16][16] и вручную поместите цифру в целевые ячейки. Это сработало хорошо. После этого я заменяю байтовую матрицу[16][16] на матрицу RGB[16][16], где struct rgb {byte r, byte g, byte b, и это не `работает неправильно (см. фотографии ниже).
Функции светодиода:
Код: Выделить всё
#define LED PB0
#define byte unsigned char
struct rgb {
byte r;
byte g;
byte b;
};
void setBitHigh(byte pin) {
PORTB |= _BV(pin); // 1 tactDuration
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
PORTB &= ~_BV(pin); // 1 tactDuration
asm("nop");
asm("nop");
}
void setBitLow(byte pin) {
PORTB |= _BV(pin); // 1 tactDuration
asm("nop");
asm("nop");
PORTB &= ~_BV(pin); // 1 tactDuration
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
void trueByte(byte pin, byte intensity) {
for (int i = 7; i >= 0; i--) {
intensity & _BV(i) ? setBitHigh(pin) : setBitLow(pin);
}
}
void falseByte(byte pin) {
for (int i = 0; i < 8; i++) {
setBitLow(pin);
}
}
void setPixel(byte pin, rgb color) {
DDRB |= _BV(pin);
color.g > 0 ? trueByte(pin, color.g) : falseByte(pin);
color.r > 0 ? trueByte(pin, color.r) : falseByte(pin);
color.b > 0 ? trueByte(pin, color.b) : falseByte(pin);
}
хорошо работающий код:
Код: Выделить всё
void display(byte matrix[WIDTH][HEIGHT]) {
for (byte rowIdx = 0; rowIdx < WIDTH; rowIdx++) {
for (byte cellIdx = 0; cellIdx < HEIGHT; cellIdx++) {
setPixel(LED, {matrix[rowIdx][cellIdx], 0, 0});
}
}
}
byte m[WIDTH][HEIGHT] = {
{ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
...
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15}
};
int main() {
display(m);
}
результат:
Код НЕ работает хорошо:
Код: Выделить всё
void display(rgb matrix[WIDTH][HEIGHT]) {
for (byte rowIdx = 0; rowIdx < WIDTH; rowIdx++) {
for (byte cellIdx = 0; cellIdx < HEIGHT; cellIdx++) {
setPixel(LED, matrix[rowIdx][cellIdx]);
}
}
}
rgb m[WIDTH][HEIGHT] = {
{
{15, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0}
},
...
};
int main() {
display(m);
}
результат:
Буду рад любому совету...
Подробнее здесь:
https://stackoverflow.com/questions/782 ... structures
1711885868
Anonymous
Я только начал работать со светодиодной матрицей (16*16) и attiny85. Текущая цель — включить светодиод в каждой строке, где номер светодиода — это количество ряд (я знаю, что светодиодная лента похожа на змею, пока это не имеет значения). Итак, я написал байтовую матрицу[16][16] и вручную поместите цифру в целевые ячейки. Это сработало хорошо. После этого я заменяю байтовую матрицу[16][16] на матрицу RGB[16][16], где struct rgb {byte r, byte g, byte b, и это не `работает неправильно (см. фотографии ниже). Функции светодиода: [code]#define LED PB0 #define byte unsigned char struct rgb { byte r; byte g; byte b; }; void setBitHigh(byte pin) { PORTB |= _BV(pin); // 1 tactDuration asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); PORTB &= ~_BV(pin); // 1 tactDuration asm("nop"); asm("nop"); } void setBitLow(byte pin) { PORTB |= _BV(pin); // 1 tactDuration asm("nop"); asm("nop"); PORTB &= ~_BV(pin); // 1 tactDuration asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); } void trueByte(byte pin, byte intensity) { for (int i = 7; i >= 0; i--) { intensity & _BV(i) ? setBitHigh(pin) : setBitLow(pin); } } void falseByte(byte pin) { for (int i = 0; i < 8; i++) { setBitLow(pin); } } void setPixel(byte pin, rgb color) { DDRB |= _BV(pin); color.g > 0 ? trueByte(pin, color.g) : falseByte(pin); color.r > 0 ? trueByte(pin, color.r) : falseByte(pin); color.b > 0 ? trueByte(pin, color.b) : falseByte(pin); } [/code] хорошо работающий код: [code]void display(byte matrix[WIDTH][HEIGHT]) { for (byte rowIdx = 0; rowIdx < WIDTH; rowIdx++) { for (byte cellIdx = 0; cellIdx < HEIGHT; cellIdx++) { setPixel(LED, {matrix[rowIdx][cellIdx], 0, 0}); } } } byte m[WIDTH][HEIGHT] = { { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, ... { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15} }; int main() { display(m); } [/code] результат: [img]https://i.stack.imgur.com/c7dW8.jpg[/img] Код НЕ работает хорошо: [code]void display(rgb matrix[WIDTH][HEIGHT]) { for (byte rowIdx = 0; rowIdx < WIDTH; rowIdx++) { for (byte cellIdx = 0; cellIdx < HEIGHT; cellIdx++) { setPixel(LED, matrix[rowIdx][cellIdx]); } } } rgb m[WIDTH][HEIGHT] = { { {15, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0} }, ... }; int main() { display(m); } [/code] результат: [img]https://i.stack.imgur.com/0ykNX.jpg[/img] Буду рад любому совету... Подробнее здесь: [url]https://stackoverflow.com/questions/78250625/led-matrix-incorrectly-displays-data-from-structures[/url]