Tag: avr gcc

预处理器:在令牌之前缺少二元运算符

我正在尝试在XMEGA微控制器中设置USART模块,并偶然发现我找不到的错误。 为清楚起见,我给你完整的代码。 因此,此头文件中没有任何内容丢失。 ( F_CPU在主文件中定义) #ifndef USART_H_ #define USART_H_ #include #define USART_BAUDRATE 4800 #define USART_BSCALE -3 #if USART_BSCALE < 0 #define USART_BSEL F_CPU / (pow(2,USART_BSCALE) * 16 * USART_BAUDRATE) – 1 #define USART_BAUD_REAL F_CPU / (pow(2,USART_BSCALE) * 16 * (USART_BSEL + 1)) #else #define USART_BSEL (1 / (pow(2,USART_BSCALE))) * (F_CPU / (16 * USART_BAUDRATE) – […]

Atmel / Arduino:ISR(TIMER0_OVF_vect)将无法编译(__vector_16中的“首次定义”)

我正在研究一种PWM调制器来“模拟”汽车发动机点火换向。 然后,我将用它驱动另一个微控制器,它处理从原始信号(发动机换向器)到干净输出电压的转换,通过RPM计数器的电流计。 这个项目也是我学习如何更好地控制微控制器的借口。 好吧,我写了一个小程序,使用timer0(8位),我需要触发两个中断服务程序(ISR): TIMER0_OVF_vect:溢出中断 TIMER0_COMPA_vect:比较时触发 我有以下function: void configureTimer0(parameters) { cli(); // Some maths TCCR0A = (1<<WGM01) | (1<<WGM00); // I tried to use the "Fast PWM" waveform generation mode TCCR0B &= 0b00110000; // 5th and 4th bits are reserved. Every other bits is set to 0. TCNT0 = 0; // Initialize counter value to […]

main.c中定义的宏在另一个包含的文件中不可见

我有多个C和H文件 在main.c我定义了一个宏,在ws_driver.c我想使用它。 ws_driver.h包含在main.c 。 main.c中 #define WS_PORT PORT_D8 #define WS_BIT D8 #define WS_DDR DDR_D8 #include “ws_driver.h” 在ws_dirver.c我有两个检查: ws_driver.c #include “ws_driver.h” #ifndef WS_PORT # error “WS_PORT not defined!” #endif #ifndef WS_BIT # error “WS_BIT not defined!” #endif 两者都失败了。 $ avr-gcc -std=gnu99 -mmcu=atmega328p -DF_CPU=16000000UL -Os -I. -I -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wno-main -Wno-strict-prototypes -Wno-comment -g2 […]

PID反馈和位置控制器,带直流电机/编码器

我很难让PID反馈和定位同时运行。 我计算RPM的想法是: 启动定时器并使用中断计数编码器脉冲。 使用一些简单的数学转换为RPM。 重置变量使用并重新开始。 我可以计算RPM,但之后我只能在计算后调用我的PID控制器(不管我想等多长时间才能获得良好的分辨率。)这会导致代码非常混乱。 是否有更简单的方法或我缺少的东西? 关于我的应用的信息:我正在使用直流电机/双磁编码器对Atmel ATmega328P进行编程,每转约600个脉冲(在齿轮箱之后)。 我想调用GoToTarget(#)并让电机在更新PID参数时转到该位置。 此外,它必须双向进行。

AVR-GCC中未定义的引用

我的main.c如下 #include #include #include #include #include “main.h” #include “globle.h” #include “LCD.h” int main() { … … … lcdInit(0xc0); lcdScreen(0); . . . return 0; } lcdInit(0xc0)的定义; 和lcdScreen(0); 在我的lcd.c文件中,我有一个头文件lcd.h,其中包含以下行: void lcdInit(char); void lcdScreen(char); 但我仍然得到: C:\ Documents and Settings \ Tanv \ My Documents \ my_project5 \ default /../ Main.c:95:> undefined>对`lcdInit’的引用 和 C:\ Documents and Settings \ […]

如何在C中为AVR-Studio编写自定义reset()函数?

所以我被分配了为AVR编译编写自定义reset()函数的任务。 我得到了这个信息 – “Atmega128和Pic24e在程序地址0x0处有复位中断。写一个函数reset()来复位程序。我也听说过强制系统重启的一种简单方法就是发送它进入无限循环。 叫我疯了,但这就像写作一样简单: function reset(){ goto 0x00000000; } 不确定你是否可以这样做,而不是寻找一个复杂的解释,因为我很确定这是一个通用的问题。 简短而甜蜜,如果你能:)

许多客户端打印后,Arduino(Uno)以太网客户端连接失败

我正在使用带有以太网盾的Arduino Uno。 发送许多HTTP请求后, client.println(…) ,连接时客户端开始失败。 失败的时间似乎是随机的,并且循环的序列读数可以在~1000到~7000之间的任何地方变化。 该错误与以太网发送缓冲区溢出无关(遵循此建议 ) 这是失败的代码: #include #include // Network constants byte mac[] = {0x00, 0x23, 0xdf, 0x82, 0xd4, 0x01}; byte ip[] = {/*REDACTED*/}; byte server[] = {/*REDACTED*/}; int port = /*REDACTED*/; Client client(server, port); // State int sequence; void setup(){ Ethernet.begin(mac, ip); Serial.begin(9600); sequence = 0; delay(1000); } void loop(){ httpPut(“/topic/:test/publish?sessionId=SESenanhygrp”); […]

如何使两个相同的指针类型不兼容

在某些体系结构上,可能需要为其他相同的对象使用不同的指针类型。 特别是对于哈佛架构CPU,您可能需要以下内容: uint8_t const ram* data1; uint8_t const rom* data2; 特别是这对于PICs的MPLAB C18(现已停产)中ROM / RAM指针的定义如何。 它甚至可以定义如下内容: char const rom* ram* ram strdptr; 这意味着RAM中的指针指向RAM中指向ROM中的字符串的指针(使用ram是没有必要的,因为默认情况下这个编译器在RAM中,为了清楚起见,只是添加了所有内容)。 这种语法的好处是编译器能够在您尝试以不兼容的方式分配时提醒您,例如ROM位置的地址到指向RAM的指针(类似于data1 = data2;或传递ROM)使用RAM指针指向函数的指针会产生错误)。 与此相反,在AVR-8的avr-gcc中,没有这种类型的安全性,因为它提供了访问ROM数据的function。 无法将指向RAM的指针与指向ROM的指针区分开来。 在某些情况下,这种类型的安全性对于捕获编程错误非常有益。 有没有办法以某种方式向指针添加类似的修饰符(例如通过预处理器,扩展到可以模仿这种行为的东西)来实现此目的? 甚至是一些警告不正当访问的东西? (在avr-gcc的情况下,尝试在不使用ROM访问function的情况下获取值)

如何使用avr-gcc在C / C ++中执行预主要初始化?

为了确保一些初始化代码在main之前运行(使用Arduino / avr-gcc),我有如下代码: class Init { public: Init() { initialize(); } }; Init init; 理想情况下,我希望能够简单地写: initialize(); 但这不编译…… 是否有一种不那么冗长的方式来达到同样的效果? 注意:代码是Arduino草图的一部分,因此mainfunction是自动生成的,不能修改(例如在任何其他代码之前调用initialize )。 更新:理想情况下,初始化将在setup函数中执行,但在这种情况下,还有其他代码,具体取决于它在main之前发生。

在一个字节中转换两个ASCIIhex字符(两个ASCII字节)

我想将两个ASCII字节转换为一个hex字节。 例如。 0x30 0x43 => 0x0C , 0x34 0x46 => 0x4F … ASCII字节是0到9之间的数字或A和F之间的字母(仅大写),因此在0x30 … 0x39和0x41 … 0x46 我知道如何“构造” 0x4F与数字0x34和0x46 : 0x4F = 0x34 * 0x10 + 0x46 所以,实际上,我想以hex值转换一个ASCII字节。 为此,我可以构建和数组以将hex值分配给ASCII字符: 0x30 => 0x00 0x31 => 0x01 … 0x46 => 0x0F 但是,也许它有一个最“正确”的解决方案。 该程序将在AVRμC上运行并使用avr-gcc ,因此scanf() / printf()解决方案不适用。 你有个主意吗? 谢谢