我正在使用 Arduino 使用arduino-tiny core编程的 ATTiny85 进行视觉持久性显示。
它由一根带有 16 个 LED 的棒组成,它可以快速旋转以在空中“画”出一幅画。显示缓冲区由一个数组表示,每次定时器触发时都会输出其下一个索引。它使用连接到 INT0 的霍尔传感器来检测上死点,并将阵列索引归零。
它是一个 8 位处理器,我有 16 个 LED 连接到 LED 驱动器,所以我实际上使用两个阵列进行显示。
所以奇怪的是,当我用十字图案初始化显示时,它显示了一堆虚线;所以我先把它归零,以防内存中有一些随机的东西。现在它不显示任何东西(即使我在将其归零后直接将十字图案写入它)。我不知道发生了什么,有什么想法吗?
我之前让它只输出索引值,它跟踪的图片看起来像计数二进制,所以我认为硬件正在工作。
请注意,我没有使用 digitalWrite,因为它禁用了可能会导致计时中断的中断。
这是代码:(对不起,很多)
#define COLUMNCOUNT 180
const int datapin = 4;
const int clockpin = 0;
const int latchpin = 1;
const int rxpin = 3;
const int hallpin = 2;
volatile int columns0[COLUMNCOUNT];
volatile int columns1[COLUMNCOUNT];
volatile int counter = 0;
void setup()
{
pinMode(datapin, OUTPUT);
pinMode(clockpin, OUTPUT);
pinMode(latchpin, OUTPUT);
pinMode(rxpin, INPUT);
pinMode(hallpin, INPUT);
//make sure the arrays are all zeroed
for (int i = 0; i < COLUMNCOUNT; i++)
{
columns0[i] = 0;
columns1[i] = 0;
}
//make a cross pattern
columns0[0] = 255;
columns1[0] = 255;
columns0[45] = 255;
columns1[45] = 255;
columns0[90] = 255;
columns1[90] = 255;
columns0[135] = 255;
columns1[135] = 255;
//turn on the timer (prescale CK/16)
OCR1A = 255;
OCR1C = 255;
TCNT1 = 0;
TIMSK = _BV(OCIE1A);
TCCR1 = _BV(CTC1) | _BV(CS12) | _BV(CS10);
GIMSK = _BV(INT0);
sei();
}
void loop()
{
//nothing to do here
}
ISR(TIMER1_COMPA_vect)
{
if (counter < COLUMNCOUNT)
counter++;
outputWord(columns0[counter], columns1[counter]);
}
ISR(INT0_vect)
{
counter = 0;
}
void outputByte(int b)
{
int currentBit;
for (int i = 0; i < 8; i++)
{
currentBit = (b & 128) == 128;
PORTB = _BV(clockpin) | (currentBit ? _BV(datapin) : 0);
PORTB = PORTB ^ _BV(clockpin);
b <<= 1;
}
}
void outputWord(int hi, int lo)
{
outputByte(hi);
outputByte(lo);
PORTB = _BV(latchpin);
PORTB = 0;
}