我使用的是 ATMEGA16M1 微控制器和 MPLAB IDE。
我有以下函数可以写入端口。
void Lcd8_Write_String(char *a)
{
int i;
for(i=0;a[i]!='\0';i++)
Lcd8_Write_Char(a[i]);
}
void Lcd8_Write_Char(char a)
{
pinChange(RS,1); // => RS = 1
Lcd8_Port(a); //Data transfer
pinChange(EN,1); // => E = 1
_delay_ms(1);
pinChange(EN,0); // => E = 04
_delay_ms(1);
}
Run Code Online (Sandbox Code Playgroud)
我用 调用该函数Lcd8_Write_String("Hello World");。
我得到:
错误:将“Lcd8_Write_String”的参数 1 从指针传递到非封闭地址空间。
我该如何解决这个错误?
我使用 MPLabX IDE 5.4 和 XC8 编译器(一种 C/MPASM 混合编译器,具有名为 pic-as v.2.2 的驱动程序作为其汇编器)来编译/汇编一段简单的汇编代码并输出列表文件。
我的整个汇编代码:
PROCESSOR 16F84A
#include <xc.inc>
PSECT code
; a comment
org 00
addlw 01
addlw 02
addlw 03
clrw
loop: addlw 04
goto loop
end loop
Run Code Online (Sandbox Code Playgroud)
列表文件:
从 MPLab X IDE 的反汇编列表文件或通过 CLI 命令生成相同的结果:)$pic-as -mcpu=16F84A -Wa,-a MyAssemblyFile.S -o MyFolder/MyOutputFileName:
1 processor 16F84A
2 pagewidth 132
3 psect udata,global,class=RAM,space=1,delta=1,noexec
4 psect udata_bank0,global,class=BANK0,space=1,delta=1,noexec
5 psect code,global,class=CODE,delta=2
6 psect data,global,class=STRCODE,delta=2,noexec
7 psect edata,global,class=EEDATA,space=3,delta=2,noexec
8 0089
9 psect code …Run Code Online (Sandbox Code Playgroud) 考虑我们正在为裸机MCU编写固件,即没有操作系统.我被告知不可能(非法?)将参数传递给中断处理程序函数?
我不能准确理解为什么会这样?这有什么问题?
PS.是否可以在某些RTOS-es,嵌入式Linux等中进行,或者它从根本上是错误的?
(我不是母语,在术语方面可能不正确.抱歉.)
我通过无线电在AVR微控制器之间传输数据供个人使用,并希望客户能够证明传输数据的真实性,因为它来自一个授权客户端.这意味着我不要求不可否认性,并且能够预先定义共享密钥.我已经对不同的方法做了一些研究,发现我需要一些帮助来选择一个最符合我要求的方法.
请理解我不需要最高安全性.我只是想阻止潜在的脚本儿童邻居在几个小时内闯入.如果打入平均消费装备需要几个星期的时间,我会没事的.
我传输的消息尺寸相当小(不超过30个字节,只有几个字节的有效负载),频率不超过30条消息/分钟.
一个用例是运动检测器通过空中向处理单元发送消息,然后处理单元通过空中向灯开关发送另一个消息.请不要专注于运输.这个问题仅针对数据真实性.
我在具有非常有限的闪存和RAM的20 MHz AVR微控制器上运行客户端/服务器软件(在C中).所以我正在寻找一种具有小代码大小和RAM利用率的解决方案,同时仍然提供高数据速率.
我使用MD5实现(C)进行了一些性能测试,从20字节数据创建哈希值,发现它可能太慢了.我知道MD5实现本身并不能解决这个问题.我做的测试只是为了评估散列性能.
感谢您的评论
microcontroller cryptography avr authenticity cryptographic-hash-function
我住在一个流行的微控制器不易获得的国家.我能找到的唯一基于arm的是STM32F4 Discovery和STM32VL Discovery.后者更便宜,因此这是优选的.
所以问题是,我正朝着正确的方向前进吗?这些微控制器是否专门用于嵌入式编程?(我是初学者)如果有人能让我朝着正确的方向前进,那将会非常有帮助.
谢谢!
有没有人能给我一些实际的例子,其中SPI通信中的4种CPOL/CPHA配置模式是有用的吗?我理解他们是如何工作但却不知道何时使用它们.由于非标准的实现,我很快就读了一些关于兼容性的参考,这是怎么回事?
谢谢
之前我问了类似的问题,但答案并不完全是我想要的,所以这次我会提供更多细节.
我是第一次使用C语言编写微控制器.我有一个Android APP,允许用户选择颜色组合(RGB颜色),然后将颜色代码发送到微控制器.微控制器根据所选内容显示灯光.
我试图做的是能够一次读取四位数字.因此,如果发送的号码是2005001000200,我想做以下事情.
提取第一个数字并将其保存在一个名为mode的变量中.然后..提取下四个数字并将它们保存在一个名为red的变量中.然后......提取下四个数字并将它们保存在一个名为green的变量中.然后..提取最后四位数字并将它们保存在一个名为blue的变量中.所以输出应该是这样的......
模式= 2
红色= 0050
绿色= 0100
蓝色= 0200
如果我能看到一个例子来说明我想要做的事情那就太棒了.请记住,我是第一次编程微控制器.非常感谢!
我有一个微控制器,当一个事件,我希望它发送电子邮件.我知道如何在Java中使用电子邮件,但是如何将Java代码放在微控制器的C代码中呢?
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB |= 1 << PINB0; // = 0b00000001
DDRB &= ~(1 << PINB1);
PORTB |= 1 << PINB1;
DDRB |= 1 << PINB2;
while(1)
{
PORTB ^= 1 << PINB0;
if(bit_is_clear(PINB, 1)){
PORTB &= ~(1 << PINB2);
_delay_ms(100); //SLOW
}
else{
_delay_ms(10); //FAST
/////I want the Java code in here/////
PORTB ^= 1 << PINB2;
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
我正在使用Atmel Atmega8A微控制器.我正在制作一个简单的报警系统,如果B1针的电线断开,我想收到一封电子邮件或短信通知.
而且我只是一个高中生的新手,所以请不要过多问题...
哦,如果有人可以在C中为我做多线程,那会很好.我来自Java背景,因为那是他们在高中教的.
我的PIC18F87J11一次只能擦除1024个字节.有没有强迫它一次只擦除2个字节或更多?
我正在制作一个Bootloader,有时候只有一行HEX文件(16字节)更改为应用程序,所以我想用新的16字节替换内存中的那一行.如果我尝试擦除这16个字节,则自动擦除1024个字节.然后我被迫重写它们,这需要一些时间并降低Bootloader的速度.
是否有另一种方法可以在不擦除1024个字节的情况下从闪存中擦除某些内容?希望有.
谢谢!
我有以下程序......
"编写一个程序,以一定的延迟连续切换PORTB的所有位.使用Timer0,正常模式,没有预分频器选项."
#include….
void T0Delay()
int main ()
DDRB= 0xFF;
while (1) {
PORTB=0x55;
T0Delay();
PORTB=0xAA;
T0Delay();
}
void T0Delay ()
{
TCNT0=0x20;
TCCR0=0x01;
while ((TIFR&01)==0);
TCCR0=0;
TIFR=0x01;
}
Run Code Online (Sandbox Code Playgroud)
在"TODelay()"函数中,"while((TIFR&01)== 0)"的功能是什么?为什么这个循环设置TCCR0 = 0和TIFR = 0x01?有人可以解释这段代码吗?
microcontroller ×10
c ×4
embedded ×4
avr ×3
pic ×2
arm ×1
assembly ×1
atmega ×1
authenticity ×1
bootloader ×1
cortex-m ×1
cryptographic-hash-function ×1
cryptography ×1
embed ×1
java ×1
lstlisting ×1
microchip ×1
mplab ×1
pointers ×1
spi ×1
xc8 ×1