查看: 5633|回复: 12

MEGA1284P试用记录及心得 学习笔记(二) 板卡功能测试

[复制链接]
  • TA的每日心情
    开心
    2022-4-12 14:51
  • 签到天数: 163 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-11-12 09:23:11 | 显示全部楼层 |阅读模式
    分享到:
    这篇学习笔记仅围绕ATMEL官方提供的例程,做板卡功能测试,感兴趣的可以看一下。
    拿到板卡第一件事情就是上电,测试功能,但是除了按键按下相应指示灯点亮,没有发现大家分享的串口终端打印的一些消息。
    今天早上仔细过官方实例程序后,恍然大悟,程序有2种模式,一种是execute_demo_mode,另一种是execute_terminal_mode;
    第一种execute_demo_mode,在上电后什么都不做进入的该模式,只初始化IO端口、触摸和中断功能;
    第二种execute_terminal_mode,上电后按下SW1键和RESET键,松开RESET键,进入该模式,通过程序可以看到该模式有IO、串口、AD、中断初始化,进入该模式4个指示灯LED0-LED3闪烁,打开串口终端或串口调试助手(串口波特率为57600)后屏幕显示以下信息:
    AVR001.jpg
    输入相应功能,屏幕会打印出相关信息,如下:
    AVR002.jpg
    官方实例程序主函数部分代码如下:
    int main(void)
    {
    #if defined(__GNUC__ )
           /* Setup stdout to point to the correctusart (USART1). This is needed to
            *use the fdev_setup_stream() macro in GCC.
            */
           stdout = &usart1_str;
    #endif
           // Make sure to use lowest possible powerconsumption
           power_reduction_enable();
           // Enter terminal mode if SW1 is pressed,按下SW1进入终端模式
           if (!(PINB & (1 << PORTB1)))
    {
                  execute_terminal_mode();
           }     
    else
    {
                  execute_demo_mode();
           }
    }
    Demo_mode模式代码如下:
    static voidexecute_demo_mode(void)
    {
           // Status flags to indicate the re-burstfor touch library
           uint16_t status_flag = 0;
           uint16_t burst_flag = 0;
           io_init_demo_mode();   
           touch_init();
           sei();
           while (1) {
                  if (time_to_measure_touch) {
                         time_to_measure_touch =false;
                         MCUCR |= (1 << PUD);
                         do {
                                // One time measuretouch sensors
                                status_flag =qt_measure_sensors(current_time_ms_touch);
                                burst_flag =status_flag & QTLIB_BURST_AGAIN;
                                if (QT_KEY_DETECT()){
                                       PORTB &=~(1 << PORTB3);
                                }
                                else {
                                       PORTB |= (1<< PORTB3);
                                }
                         } while (burst_flag);
                  MCUCR &= ~(1 << PUD);
                  }
                  if (!(PINB & (1 <<PINB0))) {
                         // Turn LED0 on to indicateactive mode
                         DDRB |= (1 << DDB3) |(1 << DDB0);
                         DDRB &= ~((1 <<DDB2) | (1 << DDB1));
                         PORTB &= ~(1 <<PORTB0);
                         PORTB |= (1 <<PORTB2) | (1 << PORTB1);
                  }
                  if (!(PINB & (1 <<PINB1))){
                         // Turn LED2 on to indicatepower-save mode
                         DDRB |= (1 << DDB3) |(1 << DDB1);
                         DDRB &= ~((1 <<DDB2) | (1 << DDB0));
                         PORTB &= ~(1 <<PORTB1);
                         PORTB |= (1 <<PORTB2) | (1 << PORTB0);
                         /*
                          * Start asynchronous clocking of Timer/Counter2 using
                          * 32.768kHz crystal as clock source.
                          */
                         start32crystal();
                         enter_sleep(POWER_SAVE);
                         stop32crystal();
                  }
                  if (!(PINB & (1 <<PINB2))) {
                         // Turn LED3 on to indicatepower-down mode
                         DDRB |= (1 << DDB3) |(1 << DDB2);
                         DDRB &= ~(1 <<DDB1) & ~(1 << DDB0);
                         PORTB &= ~(1 <<PORTB2);
                         PORTB |= (1 <<PORTB1) | (1 << PORTB0);
                         enter_sleep(POWER_DOWN);
                  }
                  if (!(PINB & (1 <<PINB6))) {
                         // Disable pinchangeinterrupts (SW0:2)
                         PCICR = (0 << PCIE1);
                         adc_init();
                         timer1_lightdemo_init();
                         // Enable output for LEDcontrol of LED0:3
                         DDRB |= (1 << DDB3) |(1 << DDB2) | (1 << DDB1) | (1 << DDB0);
                         // Run light sensor demo aslong as PORTB6 is pulled low
                         while (!(PINB & (1<< PINB6))) {
                                /*
                                 * Update compare B value to adjust PWMaccording
                                 * to light sensor value
                                 */
                                OCR1B =read_adc(LIGHT_SENSOR);
                         }
                         stop_timer1_lightdemo();
                         // Set back to input fordemo mode
                         DDRB &= ~(1 <<DDB2) & ~(1 << DDB1) & ~(1 << DDB0);
                         touch_init();
                         // Clear Pin ChangeInterrupt flag 1
                         PCIFR= (1 << PCIF1);
                         // Enable pinchangeinterrupts (SW0:2)
                         PCICR = (1 << PCIE1);
                  }
           }
    }
    终端模式代码如下:
    static voidexecute_terminal_mode(void)
    {
           // Variable used for USART communication
           uint8_t data = 0;
           // Command buffer pointer used for USARTcommunication
           uint8_t cmd_buf_ptr = 0;
           // Command buffer used for USARTcommunication
           char cmd_buffer[MAX_CMD_BUFFER_LEN];
           // misc initialization
           io_init_terminal_mode();
           usart1_init();
           adc_init();
           // Enable interrupts
           sei();
           flash_leds(20);                            //进入该模式后,指示灯闪烁
           print_help();                         //串口输出显示信息
           printf(CMD_PROMPT);              //串口输出命令符
           while (1) {
                  // Read and handle incomming dataon usart1
                  data = usart1_getchar(); //获取串口输入字符
                  switch (data)                       
    {
                  case ASCII_CR:
                         if (cmd_buf_ptr > 0)
    {
                                usart1_putchar('\n');
                                cmd_buffer[cmd_buf_ptr]= '\0';
                                process_command(cmd_buffer);
                                cmd_buf_ptr = 0;
                         }
                         printf(CMD_PROMPT);
                         break;
                  case ASCII_BACKSPACE:
                         if (cmd_buf_ptr == 0) {
                                break;
                         }
                         printf("\b \b");
                         cmd_buf_ptr--;
                         break;
                  default:
                         if (cmd_buf_ptr >=MAX_CMD_BUFFER_LEN || data < ASCII_SPACE ) {
                                // Break if commandstring is too long/ignore non-printable characters
                                break;
                         }
                         cmd_buffer[cmd_buf_ptr++] =data;
                         usart1_putchar(data);
                         break;
                  }
           }
    }
    关于IO、串口、AD、中断初始化程序在init.c文件,官方例程蛮有学习意义的,建议大家仔细看一下,官方例程见附件:
    AVR370_MEGA_1284P_Xplained_Example_Application.zip (830.76 KB, 下载次数: 13)
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2014-2-12 10:49
  • 签到天数: 150 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-11-12 09:29:21 | 显示全部楼层
    代码呀代码呀,晕乎晕乎呀
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2013-12-16 10:30
  • 签到天数: 23 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-11-12 13:22:46 | 显示全部楼层
    支持楼主!!期待板子的调通!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-12 10:32
  • 签到天数: 295 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-11-12 13:30:12 | 显示全部楼层
    赞一个~~~~~~~~~~~~~~~~~~·
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-4-12 14:51
  • 签到天数: 163 天

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 2013-11-14 08:17:43 | 显示全部楼层
    pichen 发表于 2013-11-13 19:41
    无奈啊,还是不行!

    这种情况很无语!!

    1.   通过USB线连接板卡和电脑,按住板卡SW0和RESET键,先松开RESET键、再松开SW0键(详细请看使用指导)

    这一步有没有做啊?哈哈
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2013-12-16 10:30
  • 签到天数: 23 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-11-14 09:00:56 | 显示全部楼层
    wspytu 发表于 2013-11-14 08:17
    1.   通过USB线连接板卡和电脑,按住板卡SW0和RESET键,先松开RESET键、再松开SW0键(详细请看使用指导)

    ...

    做了,你是先按着这两个键再上电还是上电后再按这两个键,上电后选择串口模式的时间是多久?感觉很简单的一个问题,却老是不成功!!郁闷啊!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-4-12 14:51
  • 签到天数: 163 天

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 2013-11-14 09:05:11 | 显示全部楼层
    pichen 发表于 2013-11-14 09:00
    做了,你是先按着这两个键再上电还是上电后再按这两个键,上电后选择串口模式的时间是多久?感觉很简单的 ...

    我先上电,然后按住两个键(因为按复位键,单片机复位),松开RESET键后,松开SW0键,我一般一两秒就松开啊
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-4-12 14:51
  • 签到天数: 163 天

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 2013-11-14 09:12:42 | 显示全部楼层
    pichen 发表于 2013-11-14 09:00
    做了,你是先按着这两个键再上电还是上电后再按这两个键,上电后选择串口模式的时间是多久?感觉很简单的 ...

    我就按照这3步很正常唉,
    1.上电后按住RESET键和SW0键
    2.打开dos窗口
    3.配置串口模式,下载程序
    一直好用啊
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2013-12-16 10:30
  • 签到天数: 23 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-11-14 09:26:25 | 显示全部楼层
    wspytu 发表于 2013-11-14 09:12
    我就按照这3步很正常唉,
    1.上电后按住RESET键和SW0键
    2.打开dos窗口

    回去了再试试!!谢谢指点!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2013-10-12 09:59
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2013-11-14 13:09:45 | 显示全部楼层
    不错,挺好的,!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-21 13:57 , Processed in 0.202522 second(s), 34 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.