Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 阵列更新错误_Arduino_Avr - Fatal编程技术网

Arduino 阵列更新错误

Arduino 阵列更新错误,arduino,avr,Arduino,Avr,我正在使用ATTiny85制作视觉持久性显示,使用Arduino编程,使用 它由一根棍子组成,棍子上有16个LED,可以快速旋转,在空中“画”出一幅画。显示缓冲区由一个数组表示,该数组的下一个索引将在每次计时器触发时输出。它使用一个连接到INT0的霍尔传感器来感应上止点,在那里它将阵列索引归零 它是一个8位处理器,我有16个LED连接到LED驱动器,所以我实际上使用两个阵列来显示 奇怪的是,当我用一个十字图案初始化显示时,它显示了一堆虚线;所以我先把它归零,以防内存中有一些随机的东西。现在它不显

我正在使用ATTiny85制作视觉持久性显示,使用Arduino编程,使用

它由一根棍子组成,棍子上有16个LED,可以快速旋转,在空中“画”出一幅画。显示缓冲区由一个数组表示,该数组的下一个索引将在每次计时器触发时输出。它使用一个连接到INT0的霍尔传感器来感应上止点,在那里它将阵列索引归零

它是一个8位处理器,我有16个LED连接到LED驱动器,所以我实际上使用两个阵列来显示

奇怪的是,当我用一个十字图案初始化显示时,它显示了一堆虚线;所以我先把它归零,以防内存中有一些随机的东西。现在它不显示任何内容(即使我在归零后直接将交叉模式写入它)。我不知道发生了什么,有什么想法吗

我之前让它只输出索引值,它跟踪的图片看起来像是在计算二进制数,所以我认为硬件工作正常

请注意,我没有使用digitalWrite,因为它会禁用中断,这可能会导致计时中断

代码如下:(对不起,太多了)

#定义列计数180
常数int datapin=4;
常数int时钟引脚=0;
常数int闭锁销=1;
常数int rxpin=3;
常数int hallpin=2;
volatile int columns0[列计数];
volatile int columns1[COLUMNCOUNT];
易失性整数计数器=0;
无效设置()
{
引脚模式(数据引脚,输出);
引脚模式(时钟引脚,输出);
引脚模式(锁定引脚,输出);
pinMode(rxpin,输入);
引脚模式(霍尔引脚,输入);
//确保数组都归零
对于(int i=0;ib我已经弄明白了:这是一个SRAM问题。ATTiny85只有512字节的SRAM,因此它不能同时在内存中保存所有数据。我正在研究使用指令将数据存储在闪存中。

根据C标准,全局变量初始化为0。因此

//make sure the arrays are all zeroed
for (int i = 0; i < COLUMNCOUNT; i++)
{
  columns0[i] = 0;
  columns1[i] = 0;
}
可以重写为:

PINB = _BV(clockpin);
根据Atmel的数据表,它只编译成一条指令

pgmspace.h
提供的宏可以从闪存读取。请注意,在大多数AVR芯片中运行程序时,您不能更改闪存的内容


在处理如此多的数据时,请注意本地/全局变量和堆栈/堆冲突。

我还使用Attiny44进行了视觉持久化(POV)。(我作为ISP通过Arduino进行编程)

用户Ben Jackson关于保存SRAM内存的建议非常正确:我最初在数组中使用“int”,如果我尝试包含其他数组,我的Attiny会出错——然而,当我简单地将我的所有数组声明为“unsigned char”时,我的代码正常工作

下次我将订购attiny45或类似的,以获得更多的SRAM内存,并继续使用无符号字符进行数组声明。
谢谢大家的讨论!

注意,
int
avr gcc
中是16位的,所以你可以通过切换到
无符号字符来回收大量内存,这可能适合512B。谢谢。虽然它是一个8位处理器,所以我假设每种数据类型都是8位的;这是正确的吗?寄存器是8位的,但你可以使用8位、16位和8位C代码中的32位类型,编译器将为您处理。在这种特殊情况下,
int
类型为16位,但在这样的嵌入式系统上,我使用
stdint.h
和显式类型,如
int8_t
int16_t
,以避免混淆。非常感谢,我将尝试一下!
PORTB = PORTB ^ _BV(clockpin);
PINB = _BV(clockpin);