Navigation

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    1. Home
    2. si
    S
    • Profile
    • Following
    • Followers
    • Topics
    • Posts
    • Best
    • Groups

    si

    @si

    0
    Reputation
    12
    Posts
    2
    Profile views
    0
    Followers
    0
    Following
    Joined Last Online

    si Follow

    Best posts made by si

    This user hasn't posted anything yet.

    Latest posts made by si

    • 温湿度传感器汇编代码
      uint32_t DATA(){
      __asm__(	//主机准备触发信号
      			"lui	a5,0x10012\n\t" //设置A1为输出模式
      			"addi	a5,a5,8\n\t"
      			"lw		a4,0(a5)\n\t"
      			"ori	a4,a4,1024\n\t"
      			"sw		a4,0(a5)\n\t"
      
      			"lui	a5,0x10012\n\t"//设置A1输出值为0,即输出低电平
      			"addi	a5,a5,12\n\t"
      			"lw		a4,0(a5)\n\t"
      			"andi	a4,a4,-1025\n\t"
      			"sw		a4,0(a5)\n\t"
      
      			"li a5,160000\n\t"//延时20ms,cpu为16MHZ,即16条指令为1us,160000x2/16=20000us,即20ms
      			"Delay_ms: addi a5,a5,-1\n\t"
      			"bnez a5,Delay_ms\n\t"
      
      			"lui	a5,0x10012\n\t"//设置A1输出1,即输出高电平
      			"addi	a5,a5,12\n\t"
      			"lw		a4,0(a5)\n\t"
      			"ori	a4,a4,1024\n\t"
      			"sw		a4,0(a5)\n\t"
      
      			"li a5,240\n\t"	//延时30us,240x2/16=30us,主机起始信号发送完毕
      			"Delay_us: addi a5,a5,-1\n\t"
      			"bnez a5,Delay_us\n\t"
      
      			"lui	a5,0x10012\n\t"//设置A1为输入模式,准备接收DHT11发送的响应信号
      			"addi	a5,a5,4\n\t"
      			"lw		a4,0(a5)\n\t"
      			"ori	a4,a4,1024\n\t"
      			"sw		a4,0(a5)\n\t"
      			//DHT11发送响应信号,读取此时A1口电平
      			"Check:lui	a5,0x10012\n\t"//判断低电平
      			"lw		a5,0(a5)\n\t"
      			"srli	a5,a5,0xa\n\t"
      			"andi a5,a5,1\n\t"
      			"beqz 	a5,Check\n\t"
      
      			"Check1:lui	a5,0x10012\n\t"//判断高电平
      			"lw		a5,0(a5)\n\t"
      			"srli	a5,a5,0xa\n\t"
      			"andi a5,a5,1\n\t"
      			"bnez 	a5,Check1\n\t"
      			//读取数据阶段,DHT11发送的数据以一段50us的低电平和一段高电平表示
      			//数据0的高电平阶段为26-28us,数据1的高电平阶段为70us
      			//因此等待低电平发送完毕后,再延时40us后读取A1口输入电平,若为高电平则是数据1,若为低电平则为数据0
      			"DQ: lui a5,0x10012\n\t" //首先读取低电平,并等待变为高电平
      			"lw a5,0(a5)\n\t"
      			"srli a5,a5,0xa\n\t"
      			"beqz a5,DQ\n\t"
      
      			"li a5,320\n\t"//低电平结束后,延时40us
      			"Delay_us1: addi a5,a5,-1\n\t"
      			"bnez a5,Delay_us1\n\t"
      
      			"li a4,1\n\t"//使用a3,a4寄存器来存储传感器数据
      			"li a3,1\n\t"
      			"li a0,0\n\t"
      			"li a6,0\n\t"//使用a6寄存器来存储计数次数
      			"li a2,31\n\t"
      			"li a7,39\n\t"
      
      			"DATA: lui a5,0x10012\n\t"//判断此时A1口电平,高电平则是数据1,低电平则是数据0
      			"lw a5,0(a5)\n\t"
      			"srli a5,a5,0xa\n\t"
      			"andi a5,a5,1\n\t"
      			"addi a6,a6,1\n\t"
      			"bnez a5,DATA1\n\t"
      
      			"DATA0: slli a3,a3,1\n\t"//读取数据0并存入a3,a4寄存器中
      			"ble a6,a2,DATA\n\t"
      			"slli a4,a4,1\n\t"
      			"ble a6,a7,DATA\n\t"
      			"j END\n\t"
      
      			"DATA1: slli a3,a3,1\n\t"//读取数据1并存入a3,a4寄存器中
      			"ori a3,a3,1\n\t"
      			"ble a6,a2,DATA\n\t"
      			"slli a4,a4,1\n\t"
      			"ori a4,a4,1\n\t"
      			"ble a6,a7,DATA\n\t"
      
      			"END: mv a0,a3\n\t"
      			"ret\n\t"
      			);
      }
      posted in Perf-V系列(RISC-V Core FPGA Board)
      S
      si
    • RE: 温湿度传感器代码问题

      @voil 精确延时还是要看板子的吧

      posted in Perf-V系列(RISC-V Core FPGA Board)
      S
      si
    • RE: perfv&蜂鸟&uart

      @voil
      core freq at 16001597Hz 这个打印是init.c里的,系统上电后执行的 第一段代码是名为start.S的这个程序,里面调用了_libc_init_array这个函数,而这个函数里又调用了_init这个函数,_init是定义在init.c里面的,所以在这儿执行了init.c这个函数,输出了core freq at 16001597Hz

      posted in Perf-V系列(RISC-V Core FPGA Board)
      S
      si
    • RE: 蜂鸟soc的引脚分配

      @voil 可以控制的,不过需要更改软核里面的定义,具体可以参考这个网址http://forum.perfv.org/?thread-19.htm

      posted in Perf-V系列(RISC-V Core FPGA Board)
      S
      si
    • RE: 温湿度传感器代码问题

      @chshwei
      --把微秒延时函数改成这样,cpu是16Mhz,一条指令的时间是1/16us,然后得出一个较为准确的时间。但是现在读传感器的读数不正确
      void delay_us(uint32_t cnt){
      asm("lw a5,-20(s0)\n\t"
      "li a4,8\n\t"
      "mul a5,a5,a4\n\t"
      "li a4,0\n\t"
      "Delay: addi a5,a5,-1\n\t"
      "bne a5,a4,Delay\n\t");
      }

      posted in Perf-V系列(RISC-V Core FPGA Board)
      S
      si
    • 温湿度传感器代码问题

      代码如下:

      #define DHT11_IO_OUT() {GPIO_REG(GPIO_OUTPUT_EN) |=(0x01<<D7);}
      #define DHT11_IO_IN() {GPIO_REG(GPIO_INPUT_EN) |= (0x01<<D7);}

      #define DHT11_DQ_IN1 GPIO_REG(GPIO_INPUT_VAL)>>D7
      #define DHT11_DQ_IN DHT11_DQ_IN1 & 0x00000001

      void delay_ms(uint32_t times);
      void delay_us(uint32_t times);

      void GPIO_SET(uint32_t pin_num,uint32_t pin_val,uint32_t pin_model);
      void Dht11Trig(void){

      DHT11_IO_OUT();
      
      GPIO_REG(GPIO_OUTPUT_VAL)&=~(0x01<<D7);
      
      delay_ms(20);
      
      GPIO_REG(GPIO_OUTPUT_VAL) |=(0x01<<D7);
      
      delay_us(18);
      

      }
      uint8_t Dht11Check(void){
      uint8_t retry=0;

      DHT11_IO_IN();
      
      
      while((GPIO_REG(GPIO_INPUT_VAL) >> D7 & 0x00000001==0)&&retry<100){
      	retry++;
      	delay_us(1);
      }
      
      if(retry>=100) return 1;
      
      while((GPIO_REG(GPIO_INPUT_VAL)>>D7&0x00000001!=0)&&retry<100){
      	retry++;
      	delay_us(1);
      }
      
      if(retry>=100) return 1;
      return 0;
      

      }
      uint8_t Dht11ReadBit(void){
      uint8_t retry=0;
      uint8_t i=0;
      //等待变为低电平
      while((GPIO_REG(GPIO_INPUT_VAL)>>D7&0x00000001==0)&&retry<100){
      retry++;
      delay_us(1);
      }

      //等待变为高电平
      while((GPIO_REG(GPIO_INPUT_VAL)>>D7&0x00000001!=0)&&i<100){
      	i++;
      	delay_us(1);
      }
      delay_us(40);
      if(GPIO_REG(GPIO_INPUT_VAL)>>D7&0x00000001!=0) return 1;
      return 0;
      

      }
      uint8_t Dht11ReadByte(void){
      uint8_t i,dat;
      dat=0;
      for(i=0;i<8;i++){
      dat<<=1;
      dat|=Dht11ReadBit();
      }
      return dat;
      }

      void delay_ms(uint32_t t){
      uint32_t i=0;

      for(i=0;i<t;i++){
      	delay_us(1000);
      }
      

      }
      void delay_us(uint32_t cnt)
      {
      uint32_t i = 0;

      cnt *= 16;
      
      for (i = 0; i < cnt; i++)
          __asm__ __volatile__ ("nop");
      

      }

      int main(int argc, char **argv)
      {

      Dht11Trig();
      
      uint8_t * temp;
      uint8_t *humi;
      uint8_t dat;
      uint8_t buf[5];
      uint8_t i;
      
      if(Dht11Check()==0){
      	for(i=0;i<5;i++){
      		buf[i]=Dht11ReadByte();
      		printf(" buf[i] %d\n",buf[i]);
      	}
      	if(buf[0]+buf[1]+buf[2]+buf[3]==buf[4]){
      		*humi=buf[0];
      		*temp=buf[2];
      		printf(" tem %d humi %d\n",&temp,&humi);
      	}
      }
      else printf("Error");
      

      return 0;
      }
      —————————————————————————————————————————
      传感器上的数据口我把它连接到了开发板的D7上,D7是一个inout型的IO口,在给D7一个触发信号后检测D7口电平信号的变化来实现温湿度传感器的数据采集,但现在好像无法采集到数据,麻烦各位大佬给菜鸟解惑,感谢!

      posted in Perf-V系列(RISC-V Core FPGA Board)
      S
      si
    • RE: 微秒级延时函数

      @zhangyue 那对于Perf-V上的E203来说,这个就应该是这样的,对吧?
      image

      posted in Perf-V系列(RISC-V Core FPGA Board)
      S
      si