⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex_zmd.c

📁 PIC单片机从SPI
💻 C
📖 第 1 页 / 共 2 页
字号:
      ZMac_GetMyShortAddress()
   );
   printf("(press space to exit)\r\n\n");

   while(TRUE) {
      restart_wdt();
      if(bkbhit()) {
         if (bgetc()==' ') break;
      }
      count=ZMac_GetPacket(&remoteNode, &data, sizeof(data), 200);
      if (count)
      {
         if (showPercent == 'n')
            lcd_putd(data);
         else
         {
            if (!first) {
               good++;
               bad+=GetAbsDiff(data, lastdata)-1;
               percent=(int32)100*good/(good+bad);
               if (showPercent=='1')
                  lcd_putd(percent / 10);
               else
                  lcd_putd(percent);

               printf("\r\n%LU %LU %LU %U", data, good, bad, percent);
            }
            lastdata=data;
            first=0;
         }
      }
   }
}

void serial_test(void)
{
   char c=' ';

   printf("\r\n\nZRS232 Test CHAN=%U PAN=%LX ME=%LX DEST=%LX\r\n",
      ZPhy_GetChannel(),
      ZMac_GetMyPanId(),
      ZMac_GetMyShortAddress(),
      read_eeprom16(EE_DEST_ADDR)
   );
   printf("(press '!' to exit)\r\n\n");

   ZRS232Init();
   ZRS232Connect(read_eeprom16(EE_DEST_ADDR));

   do
   {
      restart_wdt();
      ZRS232Task();
      while (ZRS232kbhit())
      {
         c=ZRS232getc();
         putc(c);
      }
      while (bkbhit())
      {
         c=bgetc();
         if (c=='!')
            break;
         else
            ZRS232putc(c);
      }
   } while (c!='!');

   ZRS232Stop();
}

void write_test(void)
{
   ZMAC_NODE_INFO remoteNode;
   ZMD_EC ec;
   int16 good=0,total=0;
   int16 to;
   int16 count=0;
   int8 percent;
   char showPercent;

   ZMac_StartListen();  //temp

   showPercent=read_eeprom(EE_SHOW_PERCENT);

   remoteNode.panId=ZMac_GetMyPanId();
   remoteNode.shortAddress=read_eeprom16(EE_DEST_ADDR);
   remoteNode.addressMode=ZMAC_ADDRESS_MODE_SHORT;

   printf("\r\n\nWriting Packets CHAN=%U PAN=%LX ME=%LX DEST=%LX\r\n",
      ZPhy_GetChannel(),
      ZMac_GetMyPanId(),
      ZMac_GetMyShortAddress(),
      remoteNode.shortAddress.w
   );
   printf("(press space to exit)\r\n\n");

   to=1000;

   while(TRUE) {
      restart_wdt();
      delay_ms(1);
      if(bkbhit()) {
         if (bgetc()==' ') break;
      }
      to--;
      if (!to) {
         to=1000;
         count++;
         if (count>=999) {count=0;}
         ec=ZMac_PutPacket(&remoteNode, &count, sizeof(count));
         printf("%X\r\n",ec);

         if (showPercent=='n')
            lcd_putd(count);
         else
         {
            total++;
            if (!ec)
               good++;
            percent=(int32)100*good/total;
            if (showPercent=='1')
               lcd_putd(percent / 10);
            else
               lcd_putd(percent);
         }
      }
   }
}

void show_settings(void)
{
   printf("\r\n");
   printf("\r\nRF Channel: %U", ZPhy_GetChannel());
   printf("\r\nRF Power (0=max, 3=min): %U", read_eeprom(EE_POWER));
   printf("\r\nRF CSMA (1=yes, 2=direct): %U", read_eeprom(EE_CSMA));
   printf("\r\nPAN ID: 0x%LX", read_eeprom16(EE_PAN));
   printf("\r\nMY ADDRESS: 0x%LX", read_eeprom16(EE_MY_ADDR));
   printf("\r\nDEST ADDRESS: 0x%LX", read_eeprom16(EE_DEST_ADDR));
   printf("\r\nDisplay: %C", read_eeprom(EE_SHOW_PERCENT));
}

void configure(void)
{
   int16 v;
   char c;

   printf("\r\n");

   printf("\r\nRF Channel (0-10): ");
   c=bget_int();
   write_eeprom(EE_CHAN,c);
   ZPhy_SetChannel(c);

   printf("\r\nRF Power (0=max, 3=min): ");
   do
   {
      c=bgetc();
   } while ((c>'3')&&(c<'0'));
   putc(c);
   c-='0';
   ZPhy_SetTX(ZPHY_TX_MODE_NORMAL, c);
   write_eeprom(EE_POWER, c);

   printf("\r\nRF CSMA (1=yes, 2=direct): ");
   do
   {
      c=bgetc();
   } while ((c!='1')&&(c!='2'));
   putc(c);
   c-='0';
   write_eeprom(EE_CSMA, c);
   ZMac_SetTX(c, ZMAC_TX_SLOTTED_DISABLE);

   printf("\r\nPAN ID: ");
   v=bget_long();
   write_eeprom16(EE_PAN,v);
   ZMac_SetMyPanId(v);

   printf("\r\nMY ADDRESS: ");
   v=bget_long();
   write_eeprom16(EE_MY_ADDR,v);
   ZMac_SetMyShortAddress(v);

   printf("\r\nDEST ADDRESS: ");
   v=bget_long();
   write_eeprom16(EE_DEST_ADDR,v);

   printf("\r\nShow Percent (3, 1, or N): ");
   do
   {
      c=bgetc();
      c=tolower(c);
   } while ((c!='3')&&(c!='1')&&(c!='n'));
   write_eeprom(EE_SHOW_PERCENT,c);
}

void lcd_test(void) {
   int16 to;
   int16 temp;

   to=1000;
   temp=123;
   printf("\r\n\nLCD Test\r\n(press space to exit)\r\n\n");

   while (TRUE) {
      restart_wdt();
      if (bkbhit()) {
         if (bgetc()==' ') break;
      }
      delay_ms(1);
      to--;
      if (!to) {
         to=1000;
         lcd_putd(temp);
         temp+=111;
         if (temp>999) {temp=123;}
      }
   }
   lcd_clear();
}

void led_test(void) {
   int16 to;
   char c;

   to=1000;
   c=0;
   printf("\r\n\nTesting LEDs\r\n(press space to exit)\r\n\n");

   while(TRUE) {
      delay_ms(1);
      restart_wdt();
      to--;
      if(bkbhit()) {
         if (bgetc()==' ') break;
      }
      if (!to) {
         to=1000;
         if (bit_test(c,0)) output_low(PIN_LED1); else output_high(PIN_LED1);
         if (bit_test(c,1)) output_low(PIN_LED2); else output_high(PIN_LED2);
         if (bit_test(c,2)) output_low(PIN_LED3); else output_high(PIN_LED3);
         c++;
         if (c>=8) {c=0;}
      }
   }
}


void handle_command(char command) {
   switch(command) {
      case 'u':   //unmod carrier
         printf("\r\n\nGenerating unmodulated carrier wave on channel %U\r\n", read_eeprom(EE_CHAN));
         zmd_generate_cw(read_eeprom(EE_CHAN), 0);
         break;

      case 'm':
         printf("\r\n\nGenerating modulated carrier wave on channel %U\r\n", read_eeprom(EE_CHAN));
         zmd_generate_cw(read_eeprom(EE_CHAN), 1);
         break;

      case '?':
         show_settings();
         break;

      case 's':
         serial_test();
         break;

      case 'r':
         read_test();
         break;

      case 'p':
         packet_sniff();
         break;

      case 'c':
         configure();
         break;

      case 't':
         zmd_spi_test();
         break;

      case 'w':
         write_test();
         break;

      case 'l':
         lcd_test();
         break;

      case 'b':
         led_test();
         break;
   }
}

char menu(void) {
   char mode;

   printf("\r\n\nZIGBEE TEST\r\n\n");
   printf("?) Settings        C)onfigure\r\n");
   printf("U)nmod carrier     M)od carrier\r\n");
   printf("L)CD test          B)link LEDs\r\n");
   printf("R)ead test         W)rite test\r\n");
   printf("S)erial test       P)acket sniffer\r\n");
   printf("T)est SPI/Parallel\r\n");
   printf("Command: ");

   do {
      restart_wdt();
   } while (!bkbhit());

   mode=tolower(bgetc());
   putc(mode);

   return(mode);
}

void init(void)
{
   delay_ms(72);

   ZMac_Init();
   ZPhy_SetTX(ZPHY_TX_MODE_NORMAL, read_eeprom(EE_POWER));
   ZMac_SetTX(read_eeprom(EE_CSMA), ZMAC_TX_SLOTTED_DISABLE);

   lcd_clear();

   setup_adc_ports(NO_ANALOGS);

   LED_ON(PIN_LED1);
   LED_OFF(PIN_LED2);
   LED_OFF(PIN_LED3);

   if (read_eeprom(EE_MAGIC)!=0x58) {
      write_eeprom(EE_MAGIC,0x58);
      write_eeprom(EE_LAST_MODE,0);
      write_eeprom(EE_CHAN, 6);
      write_eeprom16(EE_PAN, 1);
      write_eeprom16(EE_MY_ADDR, 1);
      write_eeprom16(EE_DEST_ADDR, 2);
      write_eeprom(EE_POWER, 0);
      write_eeprom(EE_SHOW_PERCENT, 'n');
      write_eeprom(EE_CSMA, 1);
   }

   ZPhy_SetChannel(read_eeprom(EE_CHAN));
   ZMac_SetMyShortAddress(read_eeprom16(EE_MY_ADDR));
   ZMac_SetMyPanId(read_eeprom16(EE_PAN));
   ZMac_UseMyShortAddress();

   printf("\r\n\nED0: %U", zmd_read_reg(ZMD_ED0));

   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
}

void main(void) {
   char mode;

   init();

   while (TRUE) {

      if (read_eeprom(EE_LAST_MODE)==0) {
         mode=menu();
         write_eeprom(EE_LAST_MODE, mode);
      }
      else {
         mode=read_eeprom(EE_LAST_MODE);
      }

      handle_command(mode);

      write_eeprom(EE_LAST_MODE, 0);
   }
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -