我想使用printf在ARM微控制器的串行端口上显示文本.我无法这样做.任何帮助表示赞赏.
我的init_serial看起来像这样
void init_serial (void)
{
PINSEL0 = 0x00050000; /* Enable RXD1 TxD1 */
U1LCR = 0x00000083; /*8 bits, 1 Stop bit */
U1DLL = 0x000000C2; /*9600 Baud Rate @12MHz VPB Clock */
U1LCR = 0x00000003; /* DLAB=0*/
}
Run Code Online (Sandbox Code Playgroud)
这显然是错的.
为什么在调试应用程序时必须/建议关闭所有编译器优化?
背景
我正在使用一个8位微控制器(OKI 411),它有15K可用代码存储空间用于中断服务程序+ ROM区域/窗口(const全局变量)+代码.我们差不多吃了大约13K,所以在调试过程中打开最大可能的优化非常诱人.
我已经能够在我的PIC上运行输出,并且当我设置各种输出锁存器高/低时,可以使一堆LED跳开和关闭.但是,我在阅读状态时遇到了很多困难.
请参阅下面的代码.我设置了我的配置,并将TRISC定义为输入,将TRISB定义为输出.在无限循环中,我检查RC6是高电平还是低电平,并根据结果将整个B锁存器设置为高电平或低电平.
#include <htc.h>
__CONFIG(1, FOSC_IRC & FCMEN_OFF & IESO_OFF);
__CONFIG(2, PWRTEN_OFF & BOREN_OFF & WDTEN_OFF);
__CONFIG(3, MCLRE_OFF);
__CONFIG(4, STVREN_ON & LVP_OFF & DEBUG_OFF);
__CONFIG(5, 0xFFFF);
__CONFIG(6, 0xFFFF);
__CONFIG(7, 0xFFFF);
void main(void)
{
TRISC = 0xFF; // input
TRISB = 0x00; // output
while (1)
{
if (PORTCbits.RC6 == 0)
LATB = 0b00000000;
else
LATB = 0b11111111;
}
return;
}
Run Code Online (Sandbox Code Playgroud)
代码编译良好,没有警告或错误.如果我的代码逻辑只是将锁存器设置为高电平和低电平然后工作正常,但我无法成功读取引脚的状态.
有任何想法吗?
我正在使用PIC18F14K50和MPLAB v8.43以及HiTech ANSI C编译器.
我的连接是+ 5V到VDD(引脚1),VSS(引脚20)到地.我有+ 5V到C6(引脚8),以及从B7(引脚10)到地的100K电阻和LED.要切换RC6,我将电线连接/断开连接到C6.
??????????
+5v -? 01 20 ?- gnd
-? 02 19 ?- …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Atmel Atudio 6.但我不确定如何将.h文件添加到我的项目中.这是允许的吗?如果是这样,我该如何添加它们?
语言:C PIC:16F84A 程序:CCS PCW
当我编译下面的代码时,我的编译器抱怨FOR总是为真(也许int我不支持负值?):
#include <16F84A.h>
#FUSES XT
#use delay(clock=4M)
byte const display[10] = {63,6,91,79,102,109,124,7,127,103};
void main()
{
set_tris_b(0);
while(True)
{
int i;
for(i=9;i>=0;--i)
{
output_b(display[i]);
delay_ms(300);
}
}
}
Run Code Online (Sandbox Code Playgroud)
它的PIC倒计时项目,所以:9,8,7,6,5,4,3,2,1,0,9,8,7,6,5,4,3,2,1,0,9,8 ,7,6,......但它在第一个周期后停止.
我现在正在教我的朋友如何编程AVR微控制器.我们编写了这个小程序,它发送简单的莫尔斯式代码.
问题是,在用AVR-GCC和WinAVR对其进行加工后,a.out文件几乎为30KB,十六进制文件为11KB,因此它不适合attiny2313闪存.
WinAVR CMD: avr-gcc -mmcu=attiny2313 -Os -g main.c
AVR-objcopy命令: avr-objcopy -O ihex a.out a.hex
这是代码:
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>
void light_led(int ms)
{
PORTD |= (1 << 4);
_delay_ms(ms);
PORTD &= ~(1 << 4);
_delay_ms(1000);
}
void send_char(int c)
{
int i;
for(i = 1; i < 8+1; i++)
{
if(c & i) light_led(1000);
else light_led(500);
}
}
int main(void)
{
DDRD |= (1 << 4);
//char text[] = {'t', 'e', 's', 't'};
int i;
for(i …Run Code Online (Sandbox Code Playgroud) 我对使用javascript / nodejs编程微控制器感兴趣。
我首先得到了一个Arduino uno,并使用cylonjs对其进行了编程。我做了一个简单的机器人,但很快意识到这是行不通的,因为我需要始终将Arduino连接到计算机以运行节点程序。董事会还需要具有Wi-Fi,这样我就可以通过网络进行控制了。
有人建议我使用Arduino yun,因为它具有所有这些功能。这似乎很完美,但是我发现还有其他板也提供相同的功能,并且可以使用js。
还有很多(例如树莓派,但我不需要或不需要整个操作系统)
在查看了所有可行的电路板之后,我意识到tessel和espruino是专门为javascript制作的。
所以我的问题是,这些板之间的主要区别是什么,尤其是Arduino Yun,Tessel和espruino。
谢谢!
编辑:镶嵌模块看起来真的很昂贵,我可能不会使用它们。-只是普通的别针。
有一种RAII风格的C++模式,它通过创建一个没有成员并依赖于类的构造函数和析构函数的类来实现基于作用域的所有权(以及在函数返回时自动调用析构函数的事实).例如,标准std::lock_guard实现了这种模式.
我正在编程一个EFM32 ARM Cortex-M微控制器,并提出了这个使用类似风格的类:
#include <em_int.h>
class InterruptGuard final {
public:
explicit inline InterruptGuard() {
INT_Disable();
}
InterruptGuard(const InterruptGuard &other) = delete;
InterruptGuard(const InterruptGuard &&other) = delete;
inline ~InterruptGuard() {
INT_Enable();
}
InterruptGuard &operator=(const InterruptGuard &other) = delete;
InterruptGuard &operator=(const InterruptGuard &&other) = delete;
};
Run Code Online (Sandbox Code Playgroud)
因此,如果我想在具有多个return语句的函数内禁用中断,我可以确保它们将重新启用,而不必担心在每个return语句中显式重新启用它们.
注意:INT_Enable和INT_Disable函数实现一个计数器,因此它INT_Enable会做正确的事情,只有在真正需要启用时才启用中断.所以这个类应该是可以正确嵌套的.
void func() {
InterruptGuard guard;
// ...
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
当我使用这个模式,是编译器会做"正确的事"在这里,优化了对象(所以没有内存实际上是由这个类消费),只是内联INT_Enable和INT_Disable调用到使用功能InterruptGuard类?
我的应用程序要求将值存储在16位计数器中,但是由于pcb问题,它要求将计数器的低8位反转(01001110至01110010)。该代码以C(GCC)编写,并且计数器寄存器为“ int”类型(16位)。我的应用程序使用Atmel ATtiny 8位MCU。我知道,如果我将计数器寄存器声明为“ int”类型,则编译器将分配2个RAM单元。我是否只是使用掩码提取低位字节,然后重新排列位,然后使用类似的方式将它们粘贴回去?
counter = counter & 0x00 clear lower byte value
counter = counter + (register with the reversed 8 bits)
// Then, Replace lower byte value with new value
Run Code Online (Sandbox Code Playgroud)
应该行吗?谢谢