我正在使用ATTiny85進行視覺顯示的持久性,使用arduino-tiny core通過Arduino編程。ATTiny陣列更新錯誤
它由一根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;
}
請注意'int'在'avr-gcc'中是16位,所以你可以通過切換到'unsigned char'來回收很多內存,這可能適合512B。 –
謝謝。這是一個8位處理器,所以我認爲每種數據類型都是8位;它是否正確? – stewartml
寄存器是8位的,但是您可以在C代碼中使用8,16和32位類型,編譯器會爲您處理。在這種特殊情況下,類型「int」是16位,但是在像這樣的嵌入式系統中,我使用'stdint.h'和顯式類型如'int8_t'和'int16_t'來避免混淆。 –