一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
楼主: pla155
收起左侧

[其他DIY] 玩-iamusb的“2.4G NRF2401A ATMEGA48V单片机 2.4G 无线 遥控 收发器”

[复制链接]
 楼主| 发表于 2016-4-25 21:43 | 显示全部楼层
用接无线发射模块的接口正好可以驱动串行的液晶模块。
 楼主| 发表于 2017-3-6 20:34 | 显示全部楼层
本帖最后由 pla155 于 2017-3-6 20:40 编辑

这几天有时间,又拿出来这个遥控器玩。

GUICAI的固件进行了逆向,阅读了他的源码,有参考了网上的一些文档,对2401有了一点了解。
guicai 的源码是用汇编写的吗?感觉不像是C语言,代码还是很整齐的,很适合阅读。细节也很人性化。

用guicai的固件先刷一个遥控器,再用另一个遥控器接收,接收到信号,控制绿灯,很简单。

有兴趣的朋友来吧。


安鑫 NRF2401A ATMEGA48V 遥控器-固件.rar (485 Bytes, 下载次数: 2, 售价: 10 人民币)
安鑫 NRF2401A ATMEGA48V 遥控器-源码.rar (4.45 KB, 下载次数: 5, 售价: 10 人民币)

可惜这个板子的设计无线控制部分占用了串口的PIN脚,不然做个无线串口是很好玩的。
 楼主| 发表于 2017-3-6 20:47 | 显示全部楼层
以前学51单片机,用DPTR做指针,用的很顺手。

换了AVR,用Z做指针,还以为就是名字不一样,真是吃了大亏。

AVR单片机是以16位的字为单位组织ROM的,而Z指针是以字节为单位寻址的。

摘一段帮助文件里的说明:

LPM - Load Program Memory

Description:
Loads one byte pointed to by the Z register into the destination register Rd. This instruction features a 100% space effective constant initialization or constant data fetch. The program memory is organized in 16 bit words while the Z pointer is a byte address. Thus, the least significant bit of the Z pointer selects either low byte (ZLSB = 0) or high byte (ZLSB = 1). This instruction can address the first 64K bytes (32K words) of program memory. The Z pointer register can either be left unchanged by the operation, or it can be incremented. The increment does not apply to the RAMPZ register.

Devices with Self-Programming capability can use the LPM instruction to read the fuse and lock bit values. Refer to the device documentation for a detailed description.



这个指针问题真是浪费了我大量的脑细胞。
但是,受益匪浅,帮我耐心的一条一条的阅读了gicai的源码去找问题。

开始一直以为是对2401的理解错误,到最后坚信自己没有错,才开始找数据结构方面的问题。
终于恍然大悟。

光明前的黑暗是最黑的!!!
忍一下,再忍一下;过了就皆大欢喜。没挺过的次数远比成功的次数多。

开森,纪念一下。
发表于 2017-3-7 19:50 来自手机 | 显示全部楼层
代码学习了!
发表于 2017-3-7 19:50 来自手机 | 显示全部楼层
代码学习了!
发表于 2017-6-11 13:15 | 显示全部楼层
我给刷成遥控器了,长接5S切换码组,可以集成22*22遥控码
发表于 2017-6-11 21:38 来自手机 | 显示全部楼层
翻出个m88+24l01不知道怎么玩
 楼主| 发表于 2018-4-8 21:01 | 显示全部楼层
本帖最后由 pla155 于 2018-4-16 20:41 编辑

闲来无事,
0dBM实测,发射距离比较近,但可以满足穿一堵墙10米距离无错误。
如果不是住别墅,
实现把GPS模块放置在窗外,接收标准时间对时钟进行校准还是完全可以胜任的。

下一步做GPS无线授时,
中国的北斗出来了,
GPS模块应该会便宜,
做一批无线授时模块,一个放室外太阳能+手机锂电整点授时发射,
一个放室内接收,串口(或者SPI,I2C接口)输出标准时间,
当然,输出GPS定位信息也没问题,只是没有意义。

有没有感兴趣的?
GCC 里 想要实现 SBI  CBI指令,可以这样写:

PORTB  |=    1 << 6   ; 编译器会编译成汇编的   SBI   PORTB , 6
PORTB &= ~(1 << 6) ; 编译器会编译成汇编的   CBI   PORTB , 6



----------------------------------------------------------------------------------
    i = 0x055 ;
        for(j = 8 ; j!=0 ; j--)
          {
            nRF2401 |= BIT(PWR);
            if(i&0x080)
               nRF2401 &= ~BIT(PWR);
            i <<= 1 ;
          }
WINAVR的GCC编译器,效率真是太高了!!!
        ldi        r25          , 0x55         ;i = 0x055
        ldi        r24          , 0x08         ;j = 8
b6:   sbi        0x12       , 0              ; nRF2401 |= BIT(PWR)
        sbrc        r25        , 7             ;if(i&0x080)
        cbi        0x12        , 0             ;nRF2401 &= ~BIT(PWR)
        subi        r24        , 0x01        ; j--
        breq        .+4                         ; 0xc4   j!=0
        add        r25, r25                   ;i <<= 1 ;
        rjmp        .-14                        ; 0xb6
c4:   ret



 楼主| 发表于 2019-8-10 22:36 | 显示全部楼层
/*******************************************************************************
/* NE804H  STC89LE52 @ 24MHz  安鑫 nRF2401A 无线模块  
/******************************************************************************/
$NOMOD51                                                ; 取消预定义寄存器,避免不兼容          
/******************************************************************************/
#include <STC89C5xRC.H>
/******************************************************************************/
NAME        nRF2401A
/******************************************************************************/
nRF2401_PWR                BIT                P4.0
nRF2401_CE                BIT                P2.6
nRF2401_CS                BIT                P2.4
nRF2401_DR1                BIT                P2.2
nRF2401_CLK                BIT                P2.0
nRF2401_DATA        BIT                P3.7
/*************************************/
LED                                BIT                P3.2
/******************************************************************************/
?PR?MAIN?nRF2401A                                                  SEGMENT CODE                                                           
?PR?nRF2401_RX_PARA?nRF2401A                          SEGMENT CODE
/******************************************************************************/
        ORG   000H
        RSEG  ?PR?MAIN?nRF2401A
                                USING        0
MAIN:
                        MOV                SP                        , #040H
                        ; 预处理2041管脚,进入掉电模式
                        CLR                nRF2401_CE
                        CLR                nRF2401_CS
                        CLR                nRF2401_PWR
                        DJNZ        R7                        ,$
                        DJNZ        R7                        ,$
                        ; 清理内存
                        CLR                A
                        MOV                R0                        , A
JP0_MAIN:        MOV                @R0                        , A
                        DJNZ        R0                        , JP0_MAIN
                        ; Init UART @ 57600 bps-----
                        MOV                SCON                 , #050H ; 8位数据,可变波特率
                        MOV                T2CON                  , #034H  
                        MOV                RCAP2H                , #0FFH        ; 57600 @ 24MHz @ STC89LE52RC
                        MOV                TH2                        , #0FFH
                        MOV                RCAP2L                , #0F3H        ; STC89LE52RC
                        MOV                TL2                        , #0F3H
                        ; nRF2401 上电 -------------
                        SETB        nRF2401_PWR
                        MOV                R5                        , #100D         ; 250毫秒@24MHz
JP1_MAIN:        DJNZ        R7                        , $
                        DJNZ        R5                        , JP1_MAIN
                        ; 设置2401管脚电平,进入CONFIG模式
                        ;SETB        nRF2401_PWR
                        CLR                nRF2401_CE
                        SETB        nRF2401_DR1
                        CLR                nRF2401_CLK
                        CLR                nRF2401_DATA
                        DJNZ        R7                        ,$
                        DJNZ        R7                        ,$
                        SETB        nRF2401_CS
                        DJNZ        R7                        ,$
                        DJNZ        R7                        ,$
                        ; 写入15字节的配置字
                        MOV                DPTR                , #nRF2401_RX_PARA
                        ; 先发送高地址字节(已逆向排序),先发送字节高位
                        MOV                R5                        , #00FH
JP2_MAIN:
                        CLR                A
                        MOVC        A                        , @A+DPTR
                        MOV                R7                        , #008H
JP3_MAIN:
                        RLC                A
                        MOV                nRF2401_DATA, C
                        NOP
                        NOP
                        SETB        nRF2401_CLK
                        NOP
                        NOP
                        CLR                nRF2401_CLK
                        DJNZ        R7                        , JP3_MAIN
                        INC                DPTR
                        DJNZ        R5                        , JP2_MAIN
                        ; 设置2401管脚电平,进入接收模式
                        DJNZ        R7                        ,$
                        DJNZ        R7                        ,$
                       
                        SETB        nRF2401_PWR
                        SETB        nRF2401_CE
                        CLR                nRF2401_CS
                        SETB        nRF2401_DR1
                        DJNZ        R7                        ,$
                        DJNZ        R7                        ,$
JP4_MAIN:        ; 采样,输出
                        MOV                C                        , nRF2401_DR1
                        MOV                LED                        , C
                        JNC                JP5_MAIN
                       
                        MOV                R5                        , #004H
JP0_RD2401:
                        MOV                R7                        , #008H
JP1_RD2401:        SETB        nRF2401_CLK
                        NOP
                        NOP
                        MOV                C                        , nRF2401_DATA
                        RLC                A
                        CLR                nRF2401_CLK
                        DJNZ        R7                        , JP1_RD2401
                        ;  送标识到串口
                        CLR                TI
                        MOV                SBUF                , A
                        JNB                TI                        , $
                        DJNZ        R5                        , JP0_RD2401

JP5_MAIN:        MOV                R5                        , #200D         ; 50毫秒@24MHz
JP6_MAIN:        DJNZ        R7                        , $
                        DJNZ        R5                        , JP6_MAIN
                           JMP                JP4_MAIN
/******************************************************************************/
        RSEG  ?PR?nRF2401_RX_PARA?nRF2401A
nRF2401_RX_PARA:
                        DB        020H                                                           ; MSB 通道2数据
                        DB        020H                                                           ; 通道1数据长度( 1 BIT为单位)
                          DB  000H , 000H , 000H, 000H , 020H ; 通道2地址  
                          DB  000H , 000H , 020H, 015H , 008H ; 通道1地址         201508
                          DB  063H                                                        ; 01100011B  24位地址,16位CRC,CRC使能
                        DB        06FH                                                        ; 0 1 1 011 11B 单通道,Burst模式,1Mbps,16MHz,0dBm
                          DB  005H                                                        ; LSB 频率 + 收发       
/* ----------------------------------------------------------------------------
     配合“鬼才”    的遥控器
                1:启用CRC16校验
                2:设置为接收模式
                3:禁止自动应答
                4:设置地址宽度3字节(地址为0x201508)
                5:使用2频道
                6:选择1Mbit传输速率
                7:4字节数据宽度
                8:启动接收.
                收到的4字节数据DAT1,DAT2,DAT3,DAT4含义为:
                DAT1=电池电压AD值(平时都是0xff,小于0xe9则欠压保护,对应电池电压约2v)
                DAT2=键码
                DAT3=键码
                DAT4=键码
                一共22个按键,每个按键对应1bit,按下为1,其中DAT4的bit1,bit0为保留位,始终是0                               
/******************************************************************************/
END         

 楼主| 发表于 2019-8-10 22:42 | 显示全部楼层
终于有时间在51单片机上实现nRF2401的控制。

Build target 'Target 1'
assembling RX_GuiCi.ASM...
linking...
Program Size: data=8.0 xdata=0 code=156
creating hex file from ".\Out\RX_GuiCi"...
".\Out\RX_GuiCi" - 0 Error(s), 0 Warning(s).


上面的代码编译后仅仅156字节,可以实现接收“鬼才”地遥控器,并在串口上发送4个字节的按键码。串口设置 57600,n , 8 , 1。

RX_GuiCi.rar (315 Bytes, 下载次数: 0, 售价: 10 人民币)

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-4-20 20:18 , Processed in 0.052465 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表