标签: microcontroller

将参数从指针传递到非封闭地址空间时出错

我使用的是 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 从指针传递到非封闭地址空间。

我该如何解决这个错误?

c microcontroller pointers avr mplab

3
推荐指数
1
解决办法
3917
查看次数

向量地址从程序存储器的中间开始

我使用 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)

microcontroller assembly pic lstlisting xc8

3
推荐指数
1
解决办法
2025
查看次数

在中断处理程序中传递args

考虑我们正在为裸机MCU编写固件,即没有操作系统.我被告知不可能(非法?)将参数传递给中断处理程序函数?

我不能准确理解为什么会这样?这有什么问题?

PS.是否可以在某些RTOS-es,嵌入式Linux等中进行,或者它从根本上是错误的?

embedded microcontroller

2
推荐指数
2
解决办法
9832
查看次数

基本的高性能数据真实性

(我不是母语,在术语方面可能不正确.抱歉.)

我通过无线电在AVR微控制器之间传输数据供个人使用,并希望客户能够证明传输数据的真实性,因为它来自一个授权客户端.这意味着我不要求不可否认性,并且能够预先定义共享密钥.我已经对不同的方法做了一些研究,发现我需要一些帮助来选择一个最符合我要求的方法.

请理解我不需要最高安全性.我只是想阻止潜在的脚本儿童邻居在几个小时内闯入.如果打入平均消费装备需要几个星期的时间,我会没事的.

我传输的消息尺寸相当小(不超过30个字节,只有几个字节的有效负载),频率不超过30条消息/分钟.

一个用例是运动检测器通过空中向处理单元发送消息,然后处理单元通过空中向灯开关发送另一个消息.请不要专注于运输.这个问题仅针对数据真实性.

我在具有非常有限的闪存和RAM的20 MHz AVR微控制器上运行客户端/服务器软件(在C中).所以我正在寻找一种具有小代码大小和RAM利用率的解决方案,同时仍然提供高数据速率.

我使用MD5实现(C)进行了一些性能测试,从20字节数据创建哈希值,发现它可能太慢了.我知道MD5实现本身并不能解决这个问题.我做的测试只是为了评估散列性能.

感谢您的评论

microcontroller cryptography avr authenticity cryptographic-hash-function

2
推荐指数
1
解决办法
201
查看次数

用于嵌入式编程的微控制器

我住在一个流行的微控制器不易获得的国家.我能找到的唯一基于arm的是STM32F4 Discovery和STM32VL Discovery.后者更便宜,因此这是优选的.

所以问题是,我正朝着正确的方向前进吗?这些微控制器是否专门用于嵌入式编程?(我是初学者)如果有人能让我朝着正确的方向前进,那将会非常有帮助.

谢谢!

embedded microcontroller arm cortex-m

2
推荐指数
1
解决办法
389
查看次数

在SPI通信中使用CPOL/CPHA设置

有没有人能给我一些实际的例子,其中SPI通信中的4种CPOL/CPHA配置模式是有用的吗?我理解他们是如何工作但却不知道何时使用它们.由于非标准的实现,我很快就读了一些关于兼容性的参考,这是怎么回事?

谢谢

embedded microcontroller spi serial-communication

2
推荐指数
1
解决办法
9434
查看次数

你如何从数字中提取数字?

之前我问了类似的问题,但答案并不完全是我想要的,所以这次我会提供更多细节.

我是第一次使用C语言编写微控制器.我有一个Android APP,允许用户选择颜色组合(RGB颜色),然后将颜色代码发送到微控制器.微控制器根据所选内容显示灯光.

我试图做的是能够一次读取四位数字.因此,如果发送的号码是2005001000200,我想做以下事情.

提取第一个数字并将其保存在一个名为mode的变量中.然后..提取下四个数字并将它们保存在一个名为red的变量中.然后......提取下四个数字并将它们保存在一个名为green的变量中.然后..提取最后四位数字并将它们保存在一个名为blue的变量中.所以输出应该是这样的......

模式= 2

红色= 0050

绿色= 0100

蓝色= 0200

如果我能看到一个例子来说明我想要做的事情那就太棒了.请记住,我是第一次编程微控制器.非常感谢!

c microcontroller

2
推荐指数
2
解决办法
261
查看次数

如何将Java嵌入微控制器?

我有一个微控制器,当一个事件,我希望它发送电子邮件.我知道如何在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背景,因为那是他们在高中教的.

c java embed microcontroller

2
推荐指数
1
解决办法
4338
查看次数

如何擦除闪存的某些字节?

我的PIC18F87J11一次只能擦除1024个字节.有没有强迫它一次只擦除2个字节或更多?

我正在制作一个Bootloader,有时候只有一行HEX文件(16字节)更改为应用程序,所以我想用新的16字节替换内存中的那一行.如果我尝试擦除这16个字节,则自动擦除1024个字节.然后我被迫重写它们,这需要一些时间并降低Bootloader的速度.

是否有另一种方法可以在不擦除1024个字节的情况下从闪存中擦除某些内容?希望有.

谢谢!

embedded microcontroller microchip pic bootloader

2
推荐指数
1
解决办法
940
查看次数

不懂ATmega32定时器延迟程序

我有以下程序......

"编写一个程序,以一定的延迟连续切换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?有人可以解释这段代码吗?

c microcontroller avr atmega

2
推荐指数
1
解决办法
775
查看次数