我必须使用微控制器,内存,屏幕等制作硬件项目.
是否可以制作一个独立的PDF /文档阅读器,它能够使用电池供电?
请注意我不想使用任何需要许可的技术.它必须是所有免费软件阅读器等,编程语言可以是汇编,C,Flash或任何.
我已经提交了PDF阅读器项目(独立硬件)的提案.许多人说这是不可能的.我该怎么办?
我使用AVR作为微控制器,使用ATMEGA8作为处理器(在微控制器内部).具有微控制器的板有4个LED.我能够刻录程序并点亮LED.但我无法达到特定的目的.
L1 L2 L3 L4
Run Code Online (Sandbox Code Playgroud)
这些是4个LED.在第一轮中,每个LED在3秒的间隙后亮起.最后一个LED(L4)在第一轮之后保持点亮.当第三轮开始时,每个LED以3秒的间隙点亮,当L4也是L3时,L3保持点亮照明,它继续......直到L1.
L1 L2 L3 L4
On
On On
On On On
On On On On
Run Code Online (Sandbox Code Playgroud)
但我无法做到这一点.因为我设置一个LED ON其他关闭.我甚至尝试添加一个小的时间间隔为10毫秒.我该怎么做呢 ?这就是我现在所拥有的:
#include<avr/io.h>
#include<util/delay.h>
DDRB = 0xFF; // input
//PORTB = 0xFF;
// ob00011110 --> on all --> binary
int i=0;
while(i<1) {
PORTB = 0b00010000; // first led on
_delay_ms(3000);
PORTB = 0b00001000; // second led on
_delay_ms(3000);
PORTB = 0b00000100; // third on
_delay_ms(3000);
PORTB = 0b00000010; // fourth on
_delay_ms(3000);
i += …Run Code Online (Sandbox Code Playgroud) 我试图使用相同的MISO,MOSI和CLOCK引脚同时控制两个SPI器件,但不同的SS引脚.
一个是来自SparkFun的Wifly 屏蔽,它使用SPI-to-UART芯片,另一个是MAX31855.
他们独立工作,但不是一起工作..
我正在使用的SPI-to-UART代码如下所示.我所做的唯一更改是在头文件中; 我设定select()并deselect()公开.
#include "SpiUart.h"
// See section 8.10 of the datasheet for definitions
// of bits in the Enhanced Features Register (EFR)
#define EFR_ENABLE_CTS 1 << 7
#define EFR_ENABLE_RTS 1 << 6
#define EFR_ENABLE_ENHANCED_FUNCTIONS 1 << 4
// See section 8.4 of the datasheet for definitions
// of bits in the Line Control Register (LCR)
#define LCR_ENABLE_DIVISOR_LATCH 1 << 7
// The original crystal …Run Code Online (Sandbox Code Playgroud) 从错误中我认为print()中的代码没有看到for()中的计数器.nb代码用于Propeller微控制器.for()过去没有问题.非常感谢
#include "simpletools.h" // for print on my microcontroller platform
void main(void) {
for(int x = 1; x <= 20; x++); {
// *** error next line> error: 'x' undeclared (first use in this function)
print("x = %d\n", x);
high(14);
pause(500);
low(14);
pause(500);
}
}
Run Code Online (Sandbox Code Playgroud) 我目前正在学习如何将HC08系列的freescale微控制器与codewarrior IDE(版本6.3)一起使用.我写了一个简单的程序,但无法编译.
#include <hidef.h>
#include "derivative.h"
void main(void) {
EnableInterrupts;
/* include your code here */
DDRA |= 0x03;
PTA |= 0x01;
unsigned int counter; << error here "Error : C2801: '}' missing
counter = 50000;
while(counter--);
PTA ^= 0x03;
for(;;) {
__RESET_WATCHDOG(); /* feeds the dog */
}
}
Run Code Online (Sandbox Code Playgroud)
知道它可能有什么问题吗?所有括号都匹配.也许它是微控制器具体的东西?
我收到一个十六进制值
uint8_t length = rx_dataframe.dlc// Current value of this in hex is 0x08
Run Code Online (Sandbox Code Playgroud)
我试图从这个值得到一个char值("8").根据ASCII表,十六进制值"8"是0x38.我试过直接添加"0"但在这里感到困惑
tx_buff_dlc[0]= (rx_dataframe.dlc)+"0";// I know its not currect but just thought
Run Code Online (Sandbox Code Playgroud)
tx_buff_dlc[0]=0x08+0x30将等于0x038并将获得"8"
有人可以解释如何在C中完成十六进制值的添加
感谢您抽出宝贵时间阅读.
我遇到的问题
我有:
main.h
Run Code Online (Sandbox Code Playgroud)
声明:
uint8_t u_newVar
Run Code Online (Sandbox Code Playgroud)
我也有
foo.h
Run Code Online (Sandbox Code Playgroud)
写道:
extern uint8_t u_newVar
Run Code Online (Sandbox Code Playgroud)
应用程序位于main.c中的无限while循环中,直到出现ISR.
在foo.c中,所述ISR在foo.c中调用一个函数.
在该函数中(如果你愿意,则为foo_function()):0x01被写入u_newVar.
最后,从中断返回到无限时,有一个"if"语句:
while(1){
if(u_newVar == 0x01){
uartTX_sendArray(st_uartRX_MessageContents->u_command, (sizeof st_uartRX_MessageContents->u_command));
uartTX_sendButtonPressData(st_uartRX_MessageContents->u32_value);
u_newVar = 0x00;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,应用程序永远不会进入if.如果它位于foo.c之后,这个"if"块将起作用
u_newVar = 0x01;
Run Code Online (Sandbox Code Playgroud)
线.
我试过的东西
我看着编译过的集合,我发现了什么样的东西让我感到难过.
如果我看一下main中的"if",这就是我所看到的:

因此它从SRAM中加载地址:0x011D的值,我可以确认它是0x01.
然后"CPI"将R24直接与0x01进行比较,这显然应该可行.
然后是"BREQ",如果相等则分支,并将程序计数器增加两次到下面的uart函数.也有道理.
然而这部分很奇怪.否则,使用"RJMP"跳转到当前所在的指令.除非我弄错了,否则这将永远锁定在这里?
那么,还记得当我提到在写入u_newVar之后将if块放入foo.c时吗?是的,这不是太有趣:

"if"应该在"u_newVar = 0x01"之后,但编译器太聪明并且如何优化它.这就是它始终在那里工作的原因.
我的Tiva C控制器有问题很奇怪,我想要一些帮助,基本上它在一条sprintf线上崩溃,没有明显的理由这样做.我的应用程序只是一个智能玩具,可以通过蓝牙在各种模式下进行控制.对于模式,我们使用有限状态机代码并读取玩具的当前加速度仅用于监控,并且每隔一段时间使用周期性定时器发送它,每隔几秒产生一次周期性中断以更新值.促进
现在,加速度的读取是通过一个简单的函数读取完成,直到尝试将该读数存储在字符串中,并且程序只是抛出一个硬故障.这个功能(读取加速度)在玩具车的所有其他模式下都能正常工作,除了这种新模式它始终崩溃并抛出硬故障错误.我目前的想法是,它可能是由于太多的函数调用所以堆栈已满,但我怎么知道堆栈是否已满?
这是它崩溃的线:
sprintf(acceleration,"x%.2f y%.2f z%.2f", X_Axis1, Y_Axis1, Z_Axis1);
Run Code Online (Sandbox Code Playgroud)
这是一个简单的sprintf存储从加速轴读出的值x,y和z为什么发生这种情况的任何想法然后存储在加速度变量?
这也是定时器处理程序里面keil的故障报告我用来调用一个ReadAccel()函数,我做的函数除了最近的一个以外的所有模式都有效,所以我想我会把函数放在定时器处理程序里面的函数中来节省一点从堆栈,但它仍然给出了一个严重的错误

如果有人可以重定向我如何判断这是否是一个堆栈完全错误我会非常感激,因为我认为这是它的本质.
void TIMER2A_Handler(void)
{
char acceleration[22];
RawX_Axis1=ReadAccelX();
X_Axis1 = RawX_Axis1 * 0.00390625+0.35;
RawY_Axis1=ReadAccelY();
Y_Axis1 = RawY_Axis1 * 0.00390625+0.08;
RawZ_Axis1=ReadAccelZ();
Z_Axis1 = (RawY_Axis1 * 0.00390625)+1.08;
sprintf(acceleration,"x%.2f y%.2f z%.2f",X_Axis1,Y_Axis1,Z_Axis1);
UARTSend(UART3_BASE,acceleration);
UARTCharPut(UART3_BASE,'\n');
TIMER2_RIS_R = 0xFFFFFFFF;
TIMER2_ICR_R = 0xFFFFFFFF;
}
Run Code Online (Sandbox Code Playgroud) 我知道这很接近于"愚蠢问题"类别,但我一直在研究如何在AVR 8-bit上启动加载后执行机器代码,并且已经了解到AVR 8上使用的哈佛架构 - 位MCU使得无法从闪存以外的任何地方执行代码.那么如何使用内联asm在运行时引入新的可执行代码呢?
ASCII值从0x00到0x7F.是否可以使用剩下的值(0x80到0xFF)来定义一些宏控制数据流?
例1:
#define I_AM_A_FLAG 0x80
#define GIVE_ME_A_1_BYTE_FLAG 0x81
#define GIVE_ME_SOME_TEXT 0x82
Run Code Online (Sandbox Code Playgroud)
Master [Tx] - GIVE_ME_A_1_BYTE_FLAG - > [Rx] Slave
Master [Rx] <------------ I_AM_A_FLAG ----------- [Tx] Slave
示例2:
主[Tx] - GIVE_ME_SOME_TEXT -----------------------> [Rx] Slave
Master [Rx] <------- -----"Hello World!我是一个文本\n"----------- [Tx] Slave